diff --git a/Readme.md b/Readme.md deleted file mode 100644 index 2986f2a..0000000 --- a/Readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# UT2341 (unofficial) Release GIT repository - -checkout official page : https://github.com/Azarael/UT2341 diff --git a/Readme.txt b/Readme.txt new file mode 100644 index 0000000..69b3b05 --- /dev/null +++ b/Readme.txt @@ -0,0 +1,36 @@ +UT2341WeaponsReduced - ChaCha (2022) +=>> Based on very good UT2341 Mod from Azarael +=>> I decided to extract only the weapon parts because... it I want full UT99 I have it on my computer :) + +Behavior: +=> A reduced version of UT2341 with only weapons (except translocator) and instagib + +Installation: +=> Copy files and enable one of the mutator: + UT2341WeaponsReduced.UT2341Instagib + UT2341WeaponsReduced.UT2341Replacement + +=> If you are on a server add the .u to ServerPackages + dopy redirect files + +Configuration: + ++ You can now configure wich weapon to replace with UT99 one: + +[UT2341WeaponsReduced.UT2341Replacement] +bReplaceAssaultRifle = True +bReplaceBioRifle = True +bReplaceONSMineLayer = True +bReplaceShockRifle = True +bReplaceLinkGun = True +bReplaceMinigun = True +bReplaceFlakCannon = True +bReplaceONSGrenadeLauncer = True +bReplaceRocketLauncher = True +bReplaceSniperRifle = True +bReplaceClassicSniperRifle = True +bReplaceRedeemer = True +bReplacePainter = True +bReplaceStartWeapons = True + +Version History: +v1a (11/22): Initial release \ No newline at end of file diff --git a/Redirect/UT2341WeaponsReducedv1a.u.uz2 b/Redirect/UT2341WeaponsReducedv1a.u.uz2 new file mode 100644 index 0000000..582ffc4 Binary files /dev/null and b/Redirect/UT2341WeaponsReducedv1a.u.uz2 differ diff --git a/Redirect/UT2341Weapons_Anims.ukx.uz2 b/Redirect/UT2341Weapons_Anims.ukx.uz2 new file mode 100644 index 0000000..c094c22 Binary files /dev/null and b/Redirect/UT2341Weapons_Anims.ukx.uz2 differ diff --git a/Redirect/UT2341Weapons_SM.usx.uz2 b/Redirect/UT2341Weapons_SM.usx.uz2 new file mode 100644 index 0000000..9acfe2b Binary files /dev/null and b/Redirect/UT2341Weapons_SM.usx.uz2 differ diff --git a/Redirect/UT2341Weapons_Sounds.uax.uz2 b/Redirect/UT2341Weapons_Sounds.uax.uz2 new file mode 100644 index 0000000..e228fd0 Binary files /dev/null and b/Redirect/UT2341Weapons_Sounds.uax.uz2 differ diff --git a/Redirect/UT2341Weapons_Tex.utx.uz2 b/Redirect/UT2341Weapons_Tex.utx.uz2 new file mode 100644 index 0000000..11564f4 Binary files /dev/null and b/Redirect/UT2341Weapons_Tex.utx.uz2 differ diff --git a/Run.sh b/Run.sh index fcb41e3..de17b4e 100644 --- a/Run.sh +++ b/Run.sh @@ -33,7 +33,7 @@ function del_ServerActors() { } function getmodprefix() { - _File=$(find $OUTPUT_DIR/System -type f -iname "UT2341Weapons*\.u" -exec basename {} \; | sort -nr | head -n 1) + _File=$(find $OUTPUT_DIR/System -type f -iname "UT2341WeaponsReducedv*\.u" -exec basename {} \; | sort -nr | head -n 1) BaseName="${_File%.*}" echo "$BaseName" } diff --git a/Sources/Classes/DamType_BioGel.uc b/Sources/Classes/DamType_BioGel.uc new file mode 100644 index 0000000..fc13268 --- /dev/null +++ b/Sources/Classes/DamType_BioGel.uc @@ -0,0 +1,13 @@ +class DamType_BioGel extends WeaponDamageType + abstract; + +defaultproperties +{ + WeaponClass=Class'UT2341WeaponsReducedv1a.UT2341BioRifle' + DeathString="%o drank a glass of %k's dripping green load." + FemaleSuicide="%o slimed herself." + MaleSuicide="%o slimed himself." + bDetonatesGoop=True + bDelayedDamage=True + DeathOverlayMaterial=Shader'XGameShaders.PlayerShaders.LinkHit' +} diff --git a/Sources/Classes/DamType_Enforcer.uc b/Sources/Classes/DamType_Enforcer.uc new file mode 100644 index 0000000..fd63636 --- /dev/null +++ b/Sources/Classes/DamType_Enforcer.uc @@ -0,0 +1,21 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class DamType_Enforcer extends WeaponDamageType; + +defaultproperties +{ + WeaponClass=Class'UT2341WeaponsReducedv1a.UT2341Enforcer' + DeathString="%k riddled %o full of holes with the Enforcer." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + DamageOverlayTime=0.900000 + GibPerterbation=1.000000 + KDamageImpulse=2000.000000 + VehicleDamageScaling=0.250000 +} diff --git a/Sources/Classes/DamType_Flak.uc b/Sources/Classes/DamType_Flak.uc new file mode 100644 index 0000000..4bcdd58 --- /dev/null +++ b/Sources/Classes/DamType_Flak.uc @@ -0,0 +1,28 @@ +class DamType_Flak extends WeaponDamageType + abstract; + +var sound FlakMonkey; //OBSOLETE + +static function IncrementKills(Controller Killer) +{ + local xPlayerReplicationInfo xPRI; + + xPRI = xPlayerReplicationInfo(Killer.PlayerReplicationInfo); + if ( xPRI != None ) + { + xPRI.flakcount++; + if ( (xPRI.flakcount == 15) && (UnrealPlayer(Killer) != None) ) + UnrealPlayer(Killer).ClientDelayedAnnouncementNamed('FlackMonkey',15); + } +} + +defaultproperties +{ + WeaponClass=Class'UT2341WeaponsReducedv1a.UT2341FlakCannon' + DeathString="%o was ripped to shreds by %k's flak cannon." + FemaleSuicide="%o was perforated by her own flak." + MaleSuicide="%o was perforated by his own flak." + bDelayedDamage=True + bBulletHit=True + VehicleMomentumScaling=0.500000 +} diff --git a/Sources/Classes/DamType_FlakShell.uc b/Sources/Classes/DamType_FlakShell.uc new file mode 100644 index 0000000..a55272e --- /dev/null +++ b/Sources/Classes/DamType_FlakShell.uc @@ -0,0 +1,10 @@ +class DamType_FlakShell extends DamType_Flak; + +defaultproperties +{ + FemaleSuicide="%o blew herself up with a flak shell." + MaleSuicide="%o blew himself up with a flak shell." + bDetonatesGoop=True + bThrowRagdoll=True + GibPerterbation=0.250000 +} diff --git a/Sources/Classes/DamType_Hammer.uc b/Sources/Classes/DamType_Hammer.uc new file mode 100644 index 0000000..fa19d23 --- /dev/null +++ b/Sources/Classes/DamType_Hammer.uc @@ -0,0 +1,16 @@ +class DamType_Hammer extends WeaponDamageType + abstract; + +defaultproperties +{ + WeaponClass=Class'UT2341WeaponsReducedv1a.UT2341Hammer' + DeathString="%o got smeared by %k's piston." + FemaleSuicide="%o threw her weight around once too often." + MaleSuicide="%o threw his weight around once too often." + bAlwaysGibs=True + bDetonatesGoop=True + bKUseOwnDeathVel=True + KDamageImpulse=1000.000000 + KDeathVel=850.000000 + KDeathUpKick=300.000000 +} diff --git a/Sources/Classes/DamType_MinigunBullet.uc b/Sources/Classes/DamType_MinigunBullet.uc new file mode 100644 index 0000000..e046c7c --- /dev/null +++ b/Sources/Classes/DamType_MinigunBullet.uc @@ -0,0 +1,15 @@ +class DamType_MinigunBullet extends WeaponDamageType + abstract; + +defaultproperties +{ + WeaponClass=Class'UT2341WeaponsReducedv1a.UT2341Minigun' + DeathString="%k's minigun turned %o into a leaky piece of meat." + FemaleSuicide="%o turned the minigun on herself." + MaleSuicide="%o turned the minigun on himself." + bRagdollBullet=True + bBulletHit=True + FlashFog=(X=600.000000) + KDamageImpulse=2000.000000 + VehicleDamageScaling=0.650000 +} diff --git a/Sources/Classes/DamType_Pulse.uc b/Sources/Classes/DamType_Pulse.uc new file mode 100644 index 0000000..a6bf271 --- /dev/null +++ b/Sources/Classes/DamType_Pulse.uc @@ -0,0 +1,21 @@ +class DamType_Pulse extends WeaponDamageType + abstract; + +static function GetHitEffects(out class HitEffects[4], int VictemHealth ) +{ + HitEffects[0] = class'HitSmoke'; +} + +defaultproperties +{ + WeaponClass=Class'UT2341WeaponsReducedv1a.UT2341PulseGun' + DeathString="%o ate %k's burning plasma death." + FemaleSuicide="%o fried herself with her own plasma blast." + MaleSuicide="%o fried himself with his own plasma blast." + bDetonatesGoop=True + bDelayedDamage=True + FlashFog=(X=700.000000) + DamageOverlayMaterial=Shader'XGameShaders.PlayerShaders.LinkHit' + DamageOverlayTime=0.500000 + VehicleDamageScaling=0.670000 +} diff --git a/Sources/Classes/DamType_RipperBlade.uc b/Sources/Classes/DamType_RipperBlade.uc new file mode 100644 index 0000000..b64eb68 --- /dev/null +++ b/Sources/Classes/DamType_RipperBlade.uc @@ -0,0 +1,21 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class DamType_RipperBlade extends WeaponDamageType; + +defaultproperties +{ + WeaponClass=Class'UT2341WeaponsReducedv1a.UT2341Ripper' + DeathString="%k ripped a chunk of meat out of %o with the Ripper." + FemaleSuicide="%o shredded herself." + MaleSuicide="%o shredded himself." + bAlwaysSevers=True + bRagdollBullet=True + bBulletHit=True + GibPerterbation=1.000000 + KDamageImpulse=6000.000000 + VehicleDamageScaling=0.000000 +} diff --git a/Sources/Classes/DamType_RipperBladeHead.uc b/Sources/Classes/DamType_RipperBladeHead.uc new file mode 100644 index 0000000..0185003 --- /dev/null +++ b/Sources/Classes/DamType_RipperBladeHead.uc @@ -0,0 +1,42 @@ +/************************************************************* +* +* +* +*************************************************************/ +class DamType_RipperBladeHead extends WeaponDamageType + abstract; + +var class KillerMessage; + +static function IncrementKills(Controller Killer) +{ + local xPlayerReplicationInfo xPRI; + + if ( PlayerController(Killer) == None ) + return; + + PlayerController(Killer).ReceiveLocalizedMessage( Default.KillerMessage, 0, Killer.PlayerReplicationInfo, None, None ); + xPRI = xPlayerReplicationInfo(Killer.PlayerReplicationInfo); + if ( xPRI != None ) + { + xPRI.headcount++; + if ( (xPRI.headcount == 15) && (UnrealPlayer(Killer) != None) ) + UnrealPlayer(Killer).ClientDelayedAnnouncementNamed('HeadHunter',15); + } +} + +defaultproperties +{ + KillerMessage=Class'XGame.SpecialKillMessage' + WeaponClass=Class'UT2341WeaponsReducedv1a.UT2341Ripper' + DeathString="%k took off %o's head with the Ripper." + FemaleSuicide="%o took her own head off with a razorblade." + MaleSuicide="%o took his own head off with a razorblade." + bAlwaysSevers=True + bSpecial=True + bRagdollBullet=True + bBulletHit=True + GibPerterbation=1.000000 + KDamageImpulse=6000.000000 + VehicleDamageScaling=0.000000 +} diff --git a/Sources/Classes/DamType_Rocket.uc b/Sources/Classes/DamType_Rocket.uc new file mode 100644 index 0000000..2db14c2 --- /dev/null +++ b/Sources/Classes/DamType_Rocket.uc @@ -0,0 +1,27 @@ +class DamType_Rocket extends WeaponDamageType + abstract; + +static function GetHitEffects(out class HitEffects[4], int VictimHealth ) +{ + HitEffects[0] = class'HitSmoke'; + + if( VictimHealth <= 0 ) + HitEffects[1] = class'HitFlameBig'; + else if ( FRand() < 0.8 ) + HitEffects[1] = class'HitFlame'; +} + +defaultproperties +{ + WeaponClass=Class'UT2341WeaponsReducedv1a.UT2341RocketLauncher' + DeathString="%o was smacked down by %k's rocket launcher." + FemaleSuicide="%o fired her rocket prematurely." + MaleSuicide="%o fired his rocket prematurely." + bDetonatesGoop=True + bDelayedDamage=True + bThrowRagdoll=True + bFlaming=True + GibPerterbation=0.150000 + KDamageImpulse=20000.000000 + VehicleMomentumScaling=1.300000 +} diff --git a/Sources/Classes/DamType_ShockRifleBeam.uc b/Sources/Classes/DamType_ShockRifleBeam.uc new file mode 100644 index 0000000..3012812 --- /dev/null +++ b/Sources/Classes/DamType_ShockRifleBeam.uc @@ -0,0 +1,14 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class DamType_ShockRifleBeam extends DamTypeShockBeam; + +defaultproperties +{ + WeaponClass=Class'UT2341WeaponsReducedv1a.UT2341ShockRifle' + DeathString="%k inflicted mortal damage upon %o with the shock rifle." + DamageOverlayMaterial=Shader'UT2341Weapons_Tex.ASMD.ASMDShockHitShader' +} diff --git a/Sources/Classes/DamType_ShockRifleProjectile.uc b/Sources/Classes/DamType_ShockRifleProjectile.uc new file mode 100644 index 0000000..7d55275 --- /dev/null +++ b/Sources/Classes/DamType_ShockRifleProjectile.uc @@ -0,0 +1,13 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class DamType_ShockRifleProjectile extends DamTypeShockBall; + +defaultproperties +{ + WeaponClass=Class'UT2341WeaponsReducedv1a.UT2341ShockRifle' + DamageOverlayMaterial=Shader'UT2341Weapons_Tex.ASMD.ASMDShockHitShader' +} diff --git a/Sources/Classes/DamType_ShockRifleProjectileCombo.uc b/Sources/Classes/DamType_ShockRifleProjectileCombo.uc new file mode 100644 index 0000000..ae4ce14 --- /dev/null +++ b/Sources/Classes/DamType_ShockRifleProjectileCombo.uc @@ -0,0 +1,12 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class DamType_ShockRifleProjectileCombo extends DamTypeShockCombo; + +defaultproperties +{ + WeaponClass=Class'UT2341WeaponsReducedv1a.UT2341ShockRifle' +} diff --git a/Sources/Classes/DamType_SniperHeadShot.uc b/Sources/Classes/DamType_SniperHeadShot.uc new file mode 100644 index 0000000..b3deb13 --- /dev/null +++ b/Sources/Classes/DamType_SniperHeadShot.uc @@ -0,0 +1,16 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class DamType_SniperHeadShot extends DamTypeClassicHeadshot; + +defaultproperties +{ + WeaponClass=Class'UT2341WeaponsReducedv1a.UT2341SniperRifle' + DeathString="%k put a bullet in %o's head." + DamageOverlayTime=0.900000 + GibPerterbation=1.000000 + VehicleDamageScaling=0.850000 +} diff --git a/Sources/Classes/DamType_SniperShot.uc b/Sources/Classes/DamType_SniperShot.uc new file mode 100644 index 0000000..0779437 --- /dev/null +++ b/Sources/Classes/DamType_SniperShot.uc @@ -0,0 +1,17 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class DamType_SniperShot extends DamTypeClassicSniper; + +defaultproperties +{ + WeaponClass=Class'UT2341WeaponsReducedv1a.UT2341SniperRifle' + DeathString="%k put a hole in %o." + bRagdollBullet=True + GibPerterbation=1.000000 + KDamageImpulse=4000.000000 + VehicleDamageScaling=0.250000 +} diff --git a/Sources/Classes/DamType_SuperShockRifleBeam.uc b/Sources/Classes/DamType_SuperShockRifleBeam.uc new file mode 100644 index 0000000..c584aa2 --- /dev/null +++ b/Sources/Classes/DamType_SuperShockRifleBeam.uc @@ -0,0 +1,18 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class DamType_SuperShockRifleBeam extends DamTypeShockBeam; + +defaultproperties +{ + WeaponClass=Class'UT2341WeaponsReducedv1a.UT2341SuperShockRifle' + DeathString="%k inflicted mortal damage upon %o with the shock rifle." + bLocationalHit=False + bAlwaysSevers=True + DamageOverlayMaterial=Shader'UT2341Weapons_Tex.SuperShock.SuperShockHitShader' + VehicleDamageScaling=0.050000 + VehicleMomentumScaling=0.050000 +} diff --git a/Sources/Classes/EnforcerShellCasing.uc b/Sources/Classes/EnforcerShellCasing.uc new file mode 100644 index 0000000..2cffa6d --- /dev/null +++ b/Sources/Classes/EnforcerShellCasing.uc @@ -0,0 +1,27 @@ +class EnforcerShellCasing extends Actor; + +var RangeVector StartVelocityRange; + +simulated function PostBeginPlay() +{ + Velocity.X = StartVelocityRange.X.Min + FRand() * (StartVelocityRange.X.Max - StartVelocityRange.X.Min); + Velocity.Y = StartVelocityRange.Y.Min + FRand() * (StartVelocityRange.Y.Max - StartVelocityRange.Y.Min); + Velocity.Z = StartVelocityRange.Z.Min + FRand() * (StartVelocityRange.Z.Max - StartVelocityRange.Z.Min); + Velocity = Velocity >> Rotation; +} + +simulated function Landed(vector HitLocation) +{ + Destroy(); +} + +defaultproperties +{ + StartVelocityRange=(X=(Min=-25.000000,Max=100.000000),Y=(Min=-250.000000,Max=250.000000),Z=(Min=200.000000,Max=300.000000)) + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'UT2341Weapons_SM.shell.ShellcasingX' + Physics=PHYS_Falling + LifeSpan=1.000000 + CollisionRadius=0.000000 + CollisionHeight=0.000000 +} diff --git a/Sources/Classes/FX_BioExplosion.uc b/Sources/Classes/FX_BioExplosion.uc new file mode 100644 index 0000000..eb4cea6 --- /dev/null +++ b/Sources/Classes/FX_BioExplosion.uc @@ -0,0 +1,87 @@ +class FX_BioExplosion extends Emitter; + +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter0 + UseCollision=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(Z=-650.000000) + DampingFactorRange=(X=(Min=0.700000,Max=0.700000),Y=(Min=0.700000,Max=0.700000),Z=(Min=0.700000,Max=0.700000)) + 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)) + ColorMultiplierRange=(X=(Min=0.600000,Max=0.600000),Z=(Min=0.400000,Max=0.400000)) + Opacity=0.850000 + FadeOutStartTime=0.800000 + SpinCCWorCW=(X=0.750000) + SpinsPerSecondRange=(X=(Min=0.500000,Max=1.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScale(0)=(RelativeTime=0.140000,RelativeSize=0.100000) + SizeScaleRepeats=1.000000 + StartSizeRange=(X=(Min=18.000000,Max=18.000000),Y=(Min=18.000000,Max=18.000000),Z=(Min=18.000000,Max=18.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=2.000000,Max=2.000000) + StartVelocityRange=(X=(Min=-300.000000,Max=300.000000),Y=(Min=-300.000000,Max=300.000000),Z=(Min=-100.000000,Max=500.000000)) + End Object + Emitters(0)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_BioExplosion.SpriteEmitter0' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter1 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + BlendBetweenSubdivisions=True + 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)) + ColorMultiplierRange=(X=(Min=0.000000,Max=0.000000),Z=(Min=0.300000,Max=0.300000)) + Opacity=0.600000 + FadeOutStartTime=0.380000 + CoordinateSystem=PTCS_Relative + MaxParticles=2 + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=6.000000) + StartSizeRange=(X=(Min=14.000000,Max=14.000000),Y=(Min=14.000000,Max=14.000000),Z=(Min=14.000000,Max=14.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'ExplosionTex.Framed.exp7_frames' + TextureUSubdivisions=4 + TextureVSubdivisions=4 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(1)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_BioExplosion.SpriteEmitter1' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter4 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.600000,Max=0.600000),Z=(Min=0.580000,Max=0.580000)) + Opacity=0.430000 + FadeOutStartTime=0.460000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Max=0.100000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=3.000000) + StartSizeRange=(X=(Min=35.000000,Max=35.000000),Y=(Min=35.000000,Max=35.000000),Z=(Min=35.000000,Max=35.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'EpicParticles.Flares.FlashFlare1' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(2)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_BioExplosion.SpriteEmitter4' + + bNoDelete=False +} diff --git a/Sources/Classes/FX_EnforcerMuzFlash.uc b/Sources/Classes/FX_EnforcerMuzFlash.uc new file mode 100644 index 0000000..3520711 --- /dev/null +++ b/Sources/Classes/FX_EnforcerMuzFlash.uc @@ -0,0 +1,108 @@ +class FX_EnforcerMuzFlash extends Emitter; + +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter4 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + TriggerDisabled=False + 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.126000 + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=3.000000) + StartSizeRange=(X=(Min=8.000000,Max=8.000000),Y=(Min=8.000000,Max=8.000000),Z=(Min=20.000000,Max=20.000000)) + DrawStyle=PTDS_AlphaBlend + Texture=Texture'EpicParticles.Smoke.Smokepuff' + LifetimeRange=(Min=1.400000,Max=1.400000) + SpawnOnTriggerRange=(Min=1.000000,Max=1.000000) + SpawnOnTriggerPPS=50000.000000 + End Object + Emitters(0)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_EnforcerMuzFlash.SpriteEmitter4' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter5 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UniformSize=True + AutomaticInitialSpawning=False + TriggerDisabled=False + 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)) + ColorMultiplierRange=(Y=(Min=0.900000,Max=0.900000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.380000 + FadeOutStartTime=0.030300 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=-0.400000,Max=-0.400000)) + StartSizeRange=(X=(Min=15.000000,Max=15.000000),Y=(Min=15.000000,Max=15.000000),Z=(Min=15.000000,Max=15.000000)) + Texture=Texture'AW-2004Particles.Fire.SmokeFragment' + LifetimeRange=(Min=0.201000,Max=0.201000) + SpawnOnTriggerRange=(Min=1.000000,Max=1.000000) + SpawnOnTriggerPPS=50000.000000 + End Object + Emitters(1)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_EnforcerMuzFlash.SpriteEmitter5' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter6 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + TriggerDisabled=False + 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)) + ColorMultiplierRange=(Y=(Min=0.600000,Max=0.600000),Z=(Min=0.300000,Max=0.300000)) + Opacity=0.390000 + FadeOutStartTime=0.110550 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=0.300000,Max=0.300000)) + SizeScale(0)=(RelativeTime=0.370000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=25.000000,Max=25.000000),Y=(Min=40.000000,Max=40.000000),Z=(Min=40.000000,Max=40.000000)) + Texture=Texture'EpicParticles.Flares.FlashFlare1' + LifetimeRange=(Min=0.201000,Max=0.201000) + SpawnOnTriggerRange=(Min=1.000000,Max=1.000000) + SpawnOnTriggerPPS=50000.000000 + End Object + Emitters(2)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_EnforcerMuzFlash.SpriteEmitter6' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter8 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + TriggerDisabled=False + 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)) + ColorMultiplierRange=(Y=(Min=0.400000,Max=0.400000),Z=(Min=0.300000,Max=0.300000)) + Opacity=0.630000 + FadeOutStartTime=0.080400 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=0.500000,Max=0.500000)) + SizeScale(0)=(RelativeTime=0.140000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=8.000000,Max=8.000000),Y=(Min=8.000000,Max=8.000000),Z=(Min=8.000000,Max=8.000000)) + Texture=Texture'XEffects.Skins.MuzFlashRocket_t' + LifetimeRange=(Min=0.201000,Max=0.201000) + SpawnOnTriggerRange=(Min=1.000000,Max=1.000000) + SpawnOnTriggerPPS=50000.000000 + End Object + Emitters(3)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_EnforcerMuzFlash.SpriteEmitter8' + + bNoDelete=False + bHardAttach=True +} diff --git a/Sources/Classes/FX_FlakChunkGlow.uc b/Sources/Classes/FX_FlakChunkGlow.uc new file mode 100644 index 0000000..6174ea7 --- /dev/null +++ b/Sources/Classes/FX_FlakChunkGlow.uc @@ -0,0 +1,29 @@ +//============================================================================= +// FlakTrail +//============================================================================= +class FX_FlakChunkGlow extends Emitter; + +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter0 + FadeOut=True + RespawnDeadParticles=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(Y=(Min=0.500000,Max=0.500000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.280000 + FadeOutStartTime=0.040000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + StartSizeRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000)) + InitialParticlesPerSecond=5000.000000 + Texture=Texture'AW-2004Particles.Weapons.BoloBlob' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(0)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_FlakChunkGlow.SpriteEmitter0' + + AutoDestroy=True + bNoDelete=False +} diff --git a/Sources/Classes/FX_PickupRespawn.uc b/Sources/Classes/FX_PickupRespawn.uc new file mode 100644 index 0000000..2f44d2c --- /dev/null +++ b/Sources/Classes/FX_PickupRespawn.uc @@ -0,0 +1,45 @@ +class FX_PickupRespawn extends Emitter; + +simulated function PostBeginPlay() +{ + Super.PostBeginPlay(); + if ( Level.NetMode == NM_DedicatedServer ) + LifeSpan = 0.15; + else if ( Level.GetLocalPlayerController().BeyondViewDistance(Location, CullDistance) ) + LifeSpan = 0.01; + else + PlaySound(sound'WeaponSounds.item_respawn'); +} + +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter1 + UseCollision=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(Z=3.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)) + FadeOutStartTime=0.220000 + MaxParticles=14 + StartLocationRange=(X=(Min=-20.000000,Max=20.000000),Y=(Min=-20.000000,Max=20.000000),Z=(Min=-12.000000,Max=12.000000)) + SpinCCWorCW=(X=0.750000) + SpinsPerSecondRange=(X=(Min=0.500000,Max=1.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScaleRepeats=1.000000 + StartSizeRange=(X=(Min=16.000000,Max=16.000000),Y=(Min=16.000000,Max=16.000000),Z=(Min=16.000000,Max=16.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=1.200000,Max=1.200000) + InitialDelayRange=(Min=0.400000,Max=0.400000) + StartVelocityRange=(X=(Min=-8.000000,Max=8.000000),Y=(Min=-8.000000,Max=8.000000)) + End Object + Emitters(0)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PickupRespawn.SpriteEmitter1' + + AutoDestroy=True + bNoDelete=False +} diff --git a/Sources/Classes/FX_PulseBeamEnd.uc b/Sources/Classes/FX_PulseBeamEnd.uc new file mode 100644 index 0000000..fe2a9ad --- /dev/null +++ b/Sources/Classes/FX_PulseBeamEnd.uc @@ -0,0 +1,155 @@ +class FX_PulseBeamEnd extends Emitter; + +defaultproperties +{ + Begin Object Class=BeamEmitter Name=BeamEmitter0 + BeamDistanceRange=(Min=70.000000,Max=70.000000) + DetermineEndPointBy=PTEP_Distance + RotatingSheets=1 + LowFrequencyNoiseRange=(X=(Max=10.000000),Y=(Max=10.000000),Z=(Max=10.000000)) + LowFrequencyPoints=2 + HighFrequencyNoiseRange=(X=(Min=-8.000000,Max=8.000000),Y=(Min=-8.000000,Max=8.000000),Z=(Min=-8.000000,Max=8.000000)) + HighFrequencyPoints=4 + HFScaleFactors(0)=(FrequencyScale=(X=0.400000,Y=0.400000,Z=0.400000),RelativeLength=0.280000) + HFScaleRepeats=10.000000 + UseHighFrequencyScale=True + BranchProbability=(Min=1.000000,Max=1.000000) + BranchSpawnAmountRange=(Min=5.000000,Max=5.000000) + LinkupLifetime=True + FadeOut=True + FadeIn=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.000000,Max=0.500000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.460000 + FadeOutStartTime=2.000000 + FadeInEndTime=2.000000 + CoordinateSystem=PTCS_Relative + StartLocationShape=PTLS_Sphere + SphereRadiusRange=(Max=5.000000) + SizeScale(0)=(RelativeTime=0.500000,RelativeSize=-1.000000) + SizeScaleRepeats=1.000000 + StartSizeRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000)) + InitialParticlesPerSecond=10.000000 + Texture=Texture'AW-2004Particles.Energy.BeamBolt1a' + LifetimeRange=(Min=0.601000,Max=0.601000) + StartVelocityRange=(X=(Min=-20.000000,Max=20.000000),Y=(Min=-20.000000,Max=20.000000),Z=(Min=-20.000000,Max=20.000000)) + End Object + Emitters(0)=BeamEmitter'UT2341WeaponsReducedv1a.FX_PulseBeamEnd.BeamEmitter0' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter5 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.900000,Max=0.900000),Y=(Min=0.800000,Max=0.800000),Z=(Min=0.700000,Max=0.700000)) + Opacity=0.780000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=4.700000,Max=4.700000)) + StartSizeRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.LargeSpot' + LifetimeRange=(Min=9.000000,Max=9.000000) + End Object + Emitters(1)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseBeamEnd.SpriteEmitter5' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter6 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.000000,Max=0.300000),Y=(Min=0.800000,Max=0.800000),Z=(Min=0.500000,Max=0.500000)) + Opacity=0.260000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=4.700000,Max=4.700000)) + StartSizeRange=(X=(Min=24.000000,Max=24.000000),Y=(Min=24.000000,Max=24.000000),Z=(Min=24.000000,Max=24.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.BoloBlob' + LifetimeRange=(Min=9.000000,Max=9.000000) + End Object + Emitters(2)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseBeamEnd.SpriteEmitter6' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter0 + SpinParticles=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.000000,Max=0.300000),Z=(Min=0.000000,Max=0.200000)) + Opacity=0.910000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=-4.700000,Max=-4.700000)) + StartSpinRange=(X=(Min=-1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.000000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.000000) + StartSizeRange=(X=(Min=42.000000,Max=42.000000),Y=(Min=42.000000,Max=42.000000),Z=(Min=42.000000,Max=42.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.BurnFlare' + LifetimeRange=(Min=9.000000,Max=9.000000) + End Object + Emitters(3)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseBeamEnd.SpriteEmitter0' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter1 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.000000,Max=0.100000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.810000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=5.700000,Max=5.700000)) + StartSpinRange=(X=(Min=-1.000000,Max=1.000000)) + StartSizeRange=(X=(Min=54.000000,Max=54.000000),Y=(Min=54.000000,Max=54.000000),Z=(Min=54.000000,Max=54.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'EpicParticles.Flares.FlickerFlare' + LifetimeRange=(Min=9.000000,Max=9.000000) + End Object + Emitters(4)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseBeamEnd.SpriteEmitter1' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter2 + UseCollision=True + FadeOut=True + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(Z=-50.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)) + ColorMultiplierRange=(X=(Min=0.200000,Max=0.200000),Z=(Min=0.400000,Max=0.400000)) + Opacity=0.400000 + FadeOutStartTime=0.450000 + CoordinateSystem=PTCS_Relative + MaxParticles=9 + SpinCCWorCW=(X=0.750000) + SpinsPerSecondRange=(X=(Min=0.500000,Max=1.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScale(0)=(RelativeTime=0.140000,RelativeSize=0.100000) + SizeScaleRepeats=1.000000 + StartSizeRange=(X=(Min=7.000000,Max=7.000000),Y=(Min=7000000.000000,Max=7.000000),Z=(Min=7.000000,Max=7.000000)) + ParticlesPerSecond=10.000000 + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=1.000000,Max=1.000000) + StartVelocityRange=(X=(Min=-35.000000,Max=45000000.000000),Y=(Min=-45.000000,Max=45.000000),Z=(Min=-35.000000,Max=80.000000)) + End Object + Emitters(5)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseBeamEnd.SpriteEmitter2' + + bNoDelete=False +} diff --git a/Sources/Classes/FX_PulseBeamFlash3rd.uc b/Sources/Classes/FX_PulseBeamFlash3rd.uc new file mode 100644 index 0000000..07d6370 --- /dev/null +++ b/Sources/Classes/FX_PulseBeamFlash3rd.uc @@ -0,0 +1,61 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class FX_PulseBeamFlash3rd extends Emitter; + +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter13 + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.200000,Max=0.200000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.240000 + FadeOutStartTime=0.110550 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=0.300000,Max=0.300000)) + SizeScale(0)=(RelativeTime=0.370000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=36.000000,Max=36.000000),Y=(Min=36.000000,Max=36.000000),Z=(Min=25.000000,Max=25.000000)) + ParticlesPerSecond=5.000000 + InitialParticlesPerSecond=1000.000000 + Texture=Texture'EpicParticles.Flares.FlashFlare1' + LifetimeRange=(Min=0.200000,Max=0.200000) + End Object + Emitters(0)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseBeamFlash3rd.SpriteEmitter13' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter14 + FadeOut=True + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + TriggerDisabled=False + 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)) + ColorMultiplierRange=(X=(Min=0.000000,Max=0.000000),Y=(Min=0.400000,Max=0.400000),Z=(Min=0.000000)) + Opacity=0.370000 + FadeOutStartTime=0.110550 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=0.500000,Max=0.500000)) + SizeScale(0)=(RelativeTime=0.140000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=18.000000,Max=18.000000),Y=(Min=18.000000,Max=18.000000),Z=(Min=18.000000,Max=18.000000)) + ParticlesPerSecond=5.000000 + InitialParticlesPerSecond=1000.000000 + Texture=Texture'XEffects.Skins.MuzFlashRocket_t' + LifetimeRange=(Min=0.200000,Max=0.200000) + End Object + Emitters(1)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseBeamFlash3rd.SpriteEmitter14' + + bNoDelete=False + bHardAttach=True +} diff --git a/Sources/Classes/FX_PulseImpact.uc b/Sources/Classes/FX_PulseImpact.uc new file mode 100644 index 0000000..89e795e --- /dev/null +++ b/Sources/Classes/FX_PulseImpact.uc @@ -0,0 +1,115 @@ +class FX_PulseImpact extends Emitter; + +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter0 + UseCollision=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + DampRotation=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(Z=-400.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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.400000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.370000 + FadeOutStartTime=0.240000 + CoordinateSystem=PTCS_Relative + MaxParticles=8 + SpinsPerSecondRange=(X=(Min=1.000000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000)) + RotationDampingFactorRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=20.000000,Max=20.000000)) + SizeScale(0)=(RelativeTime=0.170000,RelativeSize=1.000000) + SizeScale(1)=(RelativeTime=0.370000) + StartSizeRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000)) + InitialParticlesPerSecond=5000.000000 + Texture=Texture'AW-2004Particles.Weapons.HardSpot' + LifetimeRange=(Min=2.000000,Max=2.000000) + StartVelocityRange=(X=(Min=50.000000,Max=170.000000),Y=(Min=-250.000000,Max=250.000000),Z=(Min=20.000000,Max=350.000000)) + End Object + Emitters(0)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseImpact.SpriteEmitter0' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter2 + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + UseSizeScale=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.600000,Max=0.600000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.800000 + FadeOutStartTime=0.360000 + FadeInEndTime=0.360000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.HardSpot' + LifetimeRange=(Min=2.000000,Max=2.000000) + End Object + Emitters(1)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseImpact.SpriteEmitter2' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter3 + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.600000,Max=0.600000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.140000 + FadeOutStartTime=0.360000 + FadeInEndTime=0.360000 + CoordinateSystem=PTCS_Relative + MaxParticles=5 + SpinsPerSecondRange=(X=(Max=4.600000)) + StartSpinRange=(X=(Min=-1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.070000) + SizeScale(1)=(RelativeTime=0.370000,RelativeSize=1.000000) + SizeScaleRepeats=1.020000 + StartSizeRange=(X=(Min=80.000000,Max=80.000000),Y=(Min=80.000000,Max=80.000000),Z=(Min=80.000000,Max=80.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'VMParticleTextures.LeviathanParticleEffects.LeviathanMGUNFlare' + LifetimeRange=(Min=0.801000,Max=0.801000) + End Object + Emitters(2)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseImpact.SpriteEmitter3' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter4 + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.600000,Max=0.600000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.190000 + FadeOutStartTime=0.245000 + FadeInEndTime=0.225000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Max=0.600000)) + StartSpinRange=(X=(Min=-1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=3.000000) + SizeScale(1)=(RelativeTime=0.560000,RelativeSize=0.100000) + StartSizeRange=(X=(Min=40.000000,Max=40.000000),Y=(Min=40.000000,Max=40.000000),Z=(Min=40.000000,Max=40.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.BoloBlob' + LifetimeRange=(Min=0.500000,Max=0.500000) + End Object + Emitters(3)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseImpact.SpriteEmitter4' + + AutoDestroy=True + bNoDelete=False +} diff --git a/Sources/Classes/FX_PulseMuzFlash.uc b/Sources/Classes/FX_PulseMuzFlash.uc new file mode 100644 index 0000000..81673ce --- /dev/null +++ b/Sources/Classes/FX_PulseMuzFlash.uc @@ -0,0 +1,119 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class FX_PulseMuzFlash extends Emitter; + +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter13 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + TriggerDisabled=False + 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)) + ColorMultiplierRange=(X=(Min=0.200000,Max=0.200000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.240000 + FadeOutStartTime=0.110550 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=0.300000,Max=0.300000)) + SizeScale(0)=(RelativeTime=0.370000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=36.000000,Max=36.000000),Y=(Min=36.000000,Max=36.000000),Z=(Min=25.000000,Max=25.000000)) + Texture=Texture'EpicParticles.Flares.FlashFlare1' + LifetimeRange=(Min=0.201000,Max=0.201000) + SpawnOnTriggerRange=(Min=1.000000,Max=1.000000) + SpawnOnTriggerPPS=50000.000000 + End Object + Emitters(0)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseMuzFlash.SpriteEmitter13' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter14 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + TriggerDisabled=False + 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)) + ColorMultiplierRange=(X=(Min=0.000000,Max=0.000000),Y=(Min=0.400000,Max=0.400000),Z=(Min=0.000000)) + Opacity=0.370000 + FadeOutStartTime=0.110550 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=0.500000,Max=0.500000)) + SizeScale(0)=(RelativeTime=0.140000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=18.000000,Max=18.000000),Y=(Min=18.000000,Max=18.000000),Z=(Min=18.000000,Max=18.000000)) + Texture=Texture'XEffects.Skins.MuzFlashRocket_t' + LifetimeRange=(Min=0.201000,Max=0.201000) + SpawnOnTriggerRange=(Min=1.000000,Max=1.000000) + SpawnOnTriggerPPS=50000.000000 + End Object + Emitters(1)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseMuzFlash.SpriteEmitter14' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter0 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + TriggerDisabled=False + 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)) + ColorMultiplierRange=(X=(Min=0.600000,Max=0.600000),Y=(Min=0.700000,Max=0.700000),Z=(Min=0.200000,Max=0.200000)) + Opacity=0.800000 + FadeOutStartTime=0.032000 + CoordinateSystem=PTCS_Relative + MaxParticles=3 + SpinsPerSecondRange=(X=(Max=0.500000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=3.000000) + StartSizeRange=(X=(Min=9.000000,Max=9.000000),Y=(Min=9.000000,Max=9.000000),Z=(Min=9.000000,Max=9.000000)) + Texture=Texture'XEffectMat.Shock.ShockComboFlash' + LifetimeRange=(Min=0.400000,Max=0.400000) + SpawnOnTriggerRange=(Min=2.000000,Max=2.000000) + SpawnOnTriggerPPS=50000.000000 + End Object + Emitters(2)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseMuzFlash.SpriteEmitter0' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter1 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + TriggerDisabled=False + 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)) + ColorMultiplierRange=(X=(Min=0.300000,Max=0.300000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.810000 + FadeOutStartTime=0.032000 + CoordinateSystem=PTCS_Relative + MaxParticles=3 + SpinsPerSecondRange=(X=(Max=0.500000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=3.000000) + StartSizeRange=(X=(Min=9.000000,Max=9.000000),Y=(Min=9.000000,Max=9.000000),Z=(Min=9.000000,Max=9.000000)) + Texture=Texture'AW-2004Particles.Energy.BurnFlare' + LifetimeRange=(Min=0.400000,Max=0.400000) + SpawnOnTriggerRange=(Min=2.000000,Max=2.000000) + SpawnOnTriggerPPS=50000.000000 + End Object + Emitters(3)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseMuzFlash.SpriteEmitter1' + + bNoDelete=False + bHardAttach=True +} diff --git a/Sources/Classes/FX_PulseProjectile.uc b/Sources/Classes/FX_PulseProjectile.uc new file mode 100644 index 0000000..529a3ea --- /dev/null +++ b/Sources/Classes/FX_PulseProjectile.uc @@ -0,0 +1,145 @@ +class FX_PulseProjectile extends Emitter; + +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter0 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.500000),Y=(Min=0.829000,Max=0.829000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.430000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=0.700000,Max=0.700000)) + StartSizeRange=(X=(Min=12.000000,Max=12.000000),Y=(Min=12.000000,Max=12.000000),Z=(Min=12.000000,Max=12.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.AirBlast' + LifetimeRange=(Min=9.000000,Max=9.000000) + End Object + Emitters(0)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseProjectile.SpriteEmitter0' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter2 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.500000),Y=(Min=0.829000,Max=0.829000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.430000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=-1.900000,Max=-1.900000)) + StartSizeRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.EclipseCircle' + LifetimeRange=(Min=9.000000,Max=9.000000) + End Object + Emitters(1)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseProjectile.SpriteEmitter2' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter3 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.500000),Y=(Min=0.829000,Max=0.829000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.930000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=1.000000) + SpinsPerSecondRange=(X=(Min=-4.000000,Max=-4.000000)) + StartSizeRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.BurnFlare' + LifetimeRange=(Min=9.000000,Max=9.000000) + End Object + Emitters(2)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseProjectile.SpriteEmitter3' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter6 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.900000),Y=(Min=0.829000,Max=0.829000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.930000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=1.000000) + SpinsPerSecondRange=(X=(Min=6.000000,Max=6.000000)) + StartSizeRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.BurnFlare' + LifetimeRange=(Min=9.000000,Max=9.000000) + End Object + Emitters(3)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseProjectile.SpriteEmitter6' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter7 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.900000),Y=(Min=0.829000,Max=0.829000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.390000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=1.000000) + SpinsPerSecondRange=(X=(Min=6.000000,Max=6.000000)) + StartSizeRange=(X=(Min=14.000000,Max=14.000000),Y=(Min=14.000000,Max=14.000000),Z=(Min=14.000000,Max=14.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'XEffectMat.Shock.shock_flare_a' + LifetimeRange=(Min=9.000000,Max=9.000000) + End Object + Emitters(4)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseProjectile.SpriteEmitter7' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter8 + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.829000,Max=0.829000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.140000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=1.000000) + SpinsPerSecondRange=(X=(Min=0.200000,Max=0.200000)) + SizeScaleRepeats=10.000000 + StartSizeRange=(X=(Min=40.000000,Max=40.000000),Y=(Min=40.000000,Max=40.000000),Z=(Min=40.000000,Max=40.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar2' + LifetimeRange=(Min=9.000000,Max=9.000000) + End Object + Emitters(5)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseProjectile.SpriteEmitter8' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter9 + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.900000),Y=(Min=0.829000,Max=0.829000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.140000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=1.000000) + SpinsPerSecondRange=(X=(Min=-0.200000,Max=-0.200000)) + SizeScaleRepeats=10.000000 + StartSizeRange=(X=(Min=40.000000,Max=40.000000),Y=(Min=40.000000,Max=40.000000),Z=(Min=40.000000,Max=40.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar2' + LifetimeRange=(Min=9.000000,Max=9.000000) + End Object + Emitters(6)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseProjectile.SpriteEmitter9' + + bNoDelete=False +} diff --git a/Sources/Classes/FX_PulseProjectileNew.uc b/Sources/Classes/FX_PulseProjectileNew.uc new file mode 100644 index 0000000..f6a11db --- /dev/null +++ b/Sources/Classes/FX_PulseProjectileNew.uc @@ -0,0 +1,145 @@ +class FX_PulseProjectileNew extends Emitter; + +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter42 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.500000),Y=(Min=0.829000,Max=0.829000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.330000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=0.700000,Max=0.700000)) + StartSizeRange=(X=(Min=13.799999,Max=13.799999),Y=(Min=13.799999,Max=13.799999),Z=(Min=13.799999,Max=13.799999)) + ParticlesPerSecond=1.000000 + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.AirBlast' + LifetimeRange=(Min=1.000000,Max=1.000000) + WarmupTicksPerSecond=2.000000 + RelativeWarmupTime=1.000000 + End Object + Emitters(0)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseProjectileNew.SpriteEmitter42' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter43 + FadeOut=True + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.500000),Y=(Min=0.829000,Max=0.829000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.280000 + FadeOutStartTime=0.255510 + CoordinateSystem=PTCS_Relative + MaxParticles=4 + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=-1.900000,Max=-1.900000)) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=8.050000,Max=8.050000),Y=(Min=8.050000,Max=8.050000),Z=(Min=8.050000,Max=8.050000)) + ParticlesPerSecond=2.000000 + InitialParticlesPerSecond=4.000000 + Texture=Texture'AW-2004Particles.Energy.EclipseCircle' + LifetimeRange=(Min=0.501000,Max=0.501000) + WarmupTicksPerSecond=2.000000 + RelativeWarmupTime=2.000000 + End Object + Emitters(1)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseProjectileNew.SpriteEmitter43' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter44 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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.930000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=1.000000) + SpinsPerSecondRange=(X=(Min=-4.000000,Max=-4.000000)) + StartSizeRange=(X=(Min=11.500000,Max=11.500000),Y=(Min=11.500000,Max=11.500000),Z=(Min=11.500000,Max=11.500000)) + ParticlesPerSecond=1.000000 + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.BurnFlare' + LifetimeRange=(Min=1.000000,Max=1.000000) + WarmupTicksPerSecond=2.000000 + RelativeWarmupTime=1.000000 + End Object + Emitters(2)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseProjectileNew.SpriteEmitter44' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter62 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.900000),Y=(Min=0.829000,Max=0.829000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.930000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=1.000000) + SpinsPerSecondRange=(X=(Min=6.000000,Max=6.000000)) + StartSizeRange=(X=(Min=11.500000,Max=11.500000),Y=(Min=11.500000,Max=11.500000),Z=(Min=11.500000,Max=11.500000)) + ParticlesPerSecond=1.000000 + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.BurnFlare' + LifetimeRange=(Min=1.000000,Max=1.000000) + WarmupTicksPerSecond=2.000000 + RelativeWarmupTime=1.000000 + End Object + Emitters(3)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseProjectileNew.SpriteEmitter62' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter63 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.900000),Y=(Min=0.829000,Max=0.829000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.410000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=1.000000) + SpinsPerSecondRange=(X=(Min=1.500000,Max=1.500000)) + StartSizeRange=(X=(Min=16.100000,Max=16.100000),Y=(Min=16.100000,Max=16.100000),Z=(Min=16.100000,Max=16.100000)) + ParticlesPerSecond=1.000000 + InitialParticlesPerSecond=1000.000000 + Texture=Texture'XEffectMat.Shock.shock_flare_a' + LifetimeRange=(Min=1.000000,Max=1.000000) + WarmupTicksPerSecond=2.000000 + RelativeWarmupTime=1.000000 + End Object + Emitters(4)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseProjectileNew.SpriteEmitter63' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter65 + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.900000),Y=(Min=0.829000,Max=0.829000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.240000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=1.000000) + SpinsPerSecondRange=(X=(Min=-0.200000,Max=-0.200000)) + SizeScaleRepeats=10.000000 + StartSizeRange=(X=(Min=46.000000,Max=46.000000),Y=(Min=46.000000,Max=46.000000),Z=(Min=46.000000,Max=46.000000)) + ParticlesPerSecond=1.000000 + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar2' + LifetimeRange=(Min=1.000000,Max=1.000000) + WarmupTicksPerSecond=2.000000 + RelativeWarmupTime=1.000000 + End Object + Emitters(5)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_PulseProjectileNew.SpriteEmitter65' + + bNoDelete=False +} diff --git a/Sources/Classes/FX_RedeemerExplosion.uc b/Sources/Classes/FX_RedeemerExplosion.uc new file mode 100644 index 0000000..6b2a078 --- /dev/null +++ b/Sources/Classes/FX_RedeemerExplosion.uc @@ -0,0 +1,291 @@ +class FX_RedeemerExplosion extends Emitter; + +defaultproperties +{ + Begin Object Class=MeshEmitter Name=MeshEmitter13 + StaticMesh=StaticMesh'Editor.TexPropSphere' + UseMeshBlendMode=False + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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.270000 + FadeOutStartTime=0.370000 + MaxParticles=2 + SpinCCWorCW=(X=1.000000,Y=1.000000,Z=1.000000) + SpinsPerSecondRange=(X=(Min=1.000000,Max=14.000000),Y=(Min=1.000000,Max=4.000000),Z=(Min=1.000000,Max=4.000000)) + StartSpinRange=(X=(Min=1.000000,Max=1.000000),Y=(Max=1.000000),Z=(Min=1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.370000,RelativeSize=4.500000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=26.000000) + InitialParticlesPerSecond=10.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(0)=MeshEmitter'UT2341WeaponsReducedv1a.FX_RedeemerExplosion.MeshEmitter13' + + Begin Object Class=MeshEmitter Name=MeshEmitter15 + StaticMesh=StaticMesh'ParticleMeshes.Complex.ExplosionSphere' + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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.430000 + FadeOutStartTime=0.370000 + MaxParticles=2 + StartSpinRange=(X=(Min=1.000000,Max=1.000000),Y=(Min=1.000000,Max=1.000000),Z=(Min=1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.370000,RelativeSize=4.500000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=26.000000) + StartSizeRange=(X=(Min=0.470000,Max=0.470000),Y=(Min=0.470000,Max=0.470000),Z=(Min=0.310000,Max=0.310000)) + InitialParticlesPerSecond=20.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(1)=MeshEmitter'UT2341WeaponsReducedv1a.FX_RedeemerExplosion.MeshEmitter15' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter15 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(Y=(Min=0.900000,Max=0.900000),Z=(Min=0.600000,Max=0.600000)) + Opacity=0.460000 + FadeOutStartTime=0.380000 + MaxParticles=2 + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=16.000000) + StartSizeRange=(X=(Min=400.000000,Max=400.000000),Y=(Min=400.000000,Max=400.000000),Z=(Min=400.000000,Max=400.000000)) + InitialParticlesPerSecond=1000.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'EpicParticles.Flares.FlashFlare1' + LifetimeRange=(Min=2.000000,Max=2.000000) + End Object + Emitters(2)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RedeemerExplosion.SpriteEmitter15' + + Begin Object Class=MeshEmitter Name=MeshEmitter19 + StaticMesh=StaticMesh'ParticleMeshes.Complex.ExplosionRing' + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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.150000 + FadeOutStartTime=0.370000 + MaxParticles=2 + StartSpinRange=(X=(Min=1.000000,Max=1.000000),Y=(Min=1.000000,Max=1.000000),Z=(Min=1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.370000,RelativeSize=3.500000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=12.000000) + StartSizeRange=(X=(Min=1.810000,Max=1.810000),Y=(Min=1.810000,Max=1.810000),Z=(Min=1.810000,Max=1.810000)) + InitialParticlesPerSecond=10.000000 + LifetimeRange=(Min=1.500000,Max=1.500000) + End Object + Emitters(3)=MeshEmitter'UT2341WeaponsReducedv1a.FX_RedeemerExplosion.MeshEmitter19' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter16 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(Z=(Min=0.800000,Max=0.800000)) + Opacity=0.680000 + FadeOutStartTime=0.460000 + MaxParticles=2 + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=12.000000) + StartSizeRange=(X=(Min=425.000000,Max=425.000000),Y=(Min=425.000000,Max=425.000000),Z=(Min=425.000000,Max=425.000000)) + InitialParticlesPerSecond=1000.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'EpicParticles.Flares.FlashFlare1' + LifetimeRange=(Min=2.000000,Max=2.000000) + End Object + Emitters(4)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RedeemerExplosion.SpriteEmitter16' + + Begin Object Class=MeshEmitter Name=MeshEmitter20 + StaticMesh=StaticMesh'ParticleMeshes.Complex.ExplosionRing' + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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.060000 + FadeOutStartTime=0.370000 + MaxParticles=1 + StartSpinRange=(X=(Min=1.000000,Max=1.000000),Y=(Min=1.000000,Max=1.000000),Z=(Min=1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.370000,RelativeSize=2.500000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=7.000000) + StartSizeRange=(X=(Min=3.370000,Max=3.370000),Y=(Min=3.370000,Max=3.370000),Z=(Min=0.310000,Max=0.310000)) + InitialParticlesPerSecond=1000.000000 + LifetimeRange=(Min=0.500000,Max=0.500000) + End Object + Emitters(5)=MeshEmitter'UT2341WeaponsReducedv1a.FX_RedeemerExplosion.MeshEmitter20' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter4 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + BlendBetweenSubdivisions=True + 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)) + ColorMultiplierRange=(Y=(Min=0.900000,Max=0.900000),Z=(Min=0.600000,Max=0.600000)) + FadeOutStartTime=0.380000 + MaxParticles=2 + StartLocationRange=(Z=(Max=40.000000)) + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=6.000000) + StartSizeRange=(X=(Min=122.000000,Max=122.000000),Y=(Min=122.000000,Max=122.000000),Z=(Min=122.000000,Max=122.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'ExplosionTex.Framed.exp2_frames' + TextureUSubdivisions=4 + TextureVSubdivisions=4 + LifetimeRange=(Min=2.000000,Max=2.000000) + InitialDelayRange=(Max=0.100000) + End Object + Emitters(6)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RedeemerExplosion.SpriteEmitter4' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter5 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + BlendBetweenSubdivisions=True + Acceleration=(Z=40.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)) + ColorMultiplierRange=(Y=(Min=0.900000,Max=0.900000),Z=(Min=0.600000,Max=0.600000)) + Opacity=0.800000 + FadeOutStartTime=0.380000 + MaxParticles=2 + StartLocationRange=(Z=(Min=511.000000,Max=511.000000)) + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=6.000000) + StartSizeRange=(X=(Min=128.000000,Max=128.000000),Y=(Min=128.000000,Max=128.000000),Z=(Min=128.000000,Max=128.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'ExplosionTex.Framed.exp2_frames' + TextureUSubdivisions=4 + TextureVSubdivisions=4 + LifetimeRange=(Min=2.000000,Max=2.000000) + InitialDelayRange=(Min=0.200000,Max=0.500000) + End Object + Emitters(7)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RedeemerExplosion.SpriteEmitter5' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter9 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + BlendBetweenSubdivisions=True + Acceleration=(Z=10.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)) + ColorMultiplierRange=(Y=(Min=0.900000,Max=0.900000),Z=(Min=0.600000,Max=0.600000)) + Opacity=0.610000 + FadeOutStartTime=0.380000 + MaxParticles=2 + StartLocationRange=(Z=(Min=371.000000,Max=371.000000)) + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=6.000000) + StartSizeRange=(X=(Min=131.000000,Max=131.000000),Y=(Min=131.000000,Max=131.000000),Z=(Min=131.000000,Max=131.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'ExplosionTex.Framed.exp7_frames' + TextureUSubdivisions=4 + TextureVSubdivisions=4 + LifetimeRange=(Min=3.300000,Max=3.300000) + InitialDelayRange=(Min=0.400000,Max=0.400000) + End Object + Emitters(8)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RedeemerExplosion.SpriteEmitter9' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter11 + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + BlendBetweenSubdivisions=True + Acceleration=(Z=40.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)) + ColorMultiplierRange=(Y=(Min=0.900000,Max=0.900000),Z=(Min=0.600000,Max=0.600000)) + Opacity=0.390000 + FadeOutStartTime=0.360000 + FadeInEndTime=0.140000 + StartLocationRange=(X=(Min=-490.000000,Max=490.000000),Y=(Min=-490.000000,Max=490.000000),Z=(Min=566.000000,Max=729.000000)) + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=6.000000) + StartSizeRange=(X=(Min=93.000000,Max=93.000000),Y=(Min=93.000000,Max=93.000000),Z=(Min=93.000000,Max=93.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'ExplosionTex.Framed.exp2_frames' + TextureUSubdivisions=4 + TextureVSubdivisions=4 + LifetimeRange=(Min=2.000000,Max=2.000000) + InitialDelayRange=(Min=0.700000,Max=0.700000) + End Object + Emitters(9)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RedeemerExplosion.SpriteEmitter11' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter12 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(Z=286.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)) + ColorMultiplierRange=(Y=(Min=0.900000,Max=0.900000),Z=(Min=0.800000,Max=0.800000)) + Opacity=0.410000 + FadeOutStartTime=0.234000 + MaxParticles=2 + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=12.000000) + StartSizeRange=(X=(Min=145.000000,Max=145.000000),Y=(Min=145.000000,Max=145.000000),Z=(Min=145.000000,Max=145.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'EpicParticles.Flares.BurnFlare1' + LifetimeRange=(Min=2.300000,Max=2.300000) + End Object + Emitters(10)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RedeemerExplosion.SpriteEmitter12' + + AutoDestroy=True + bNoDelete=False + bNetTemporary=True + RemoteRole=ROLE_DumbProxy + Style=STY_Masked + bDirectional=True +} diff --git a/Sources/Classes/FX_RipperExplosion.uc b/Sources/Classes/FX_RipperExplosion.uc new file mode 100644 index 0000000..eb349dc --- /dev/null +++ b/Sources/Classes/FX_RipperExplosion.uc @@ -0,0 +1,135 @@ +class FX_RipperExplosion extends Emitter; + +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter0 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + BlendBetweenSubdivisions=True + 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)) + ColorMultiplierRange=(Y=(Min=0.900000,Max=0.900000),Z=(Min=0.500000,Max=0.500000)) + Opacity=0.620000 + FadeOutStartTime=0.380000 + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=6.000000) + StartSizeRange=(X=(Min=16.000000,Max=16.000000),Y=(Min=16.000000,Max=16.000000),Z=(Min=16.000000,Max=16.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'ExplosionTex.Framed.exp7_frames' + TextureUSubdivisions=4 + TextureVSubdivisions=4 + LifetimeRange=(Min=0.601000,Max=0.601000) + InitialDelayRange=(Min=0.400000,Max=0.400000) + End Object + Emitters(0)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RipperExplosion.SpriteEmitter0' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter18 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + BlendBetweenSubdivisions=True + 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)) + ColorMultiplierRange=(Y=(Min=0.900000,Max=0.900000),Z=(Min=0.900000,Max=0.900000)) + Opacity=0.820000 + FadeOutStartTime=0.380000 + MaxParticles=2 + StartLocationRange=(X=(Min=4.000000,Max=4.000000),Y=(Min=4.000000,Max=4.000000),Z=(Min=4.000000,Max=4.000000)) + SpinsPerSecondRange=(X=(Min=-0.100000,Max=-0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=6.000000) + StartSizeRange=(X=(Min=14.000000,Max=14.000000),Y=(Min=14.000000,Max=14.000000),Z=(Min=14.000000,Max=14.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'ExplosionTex.Framed.exp2_frames' + TextureUSubdivisions=4 + TextureVSubdivisions=4 + LifetimeRange=(Min=0.601000,Max=0.601000) + InitialDelayRange=(Max=0.040000) + End Object + Emitters(1)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RipperExplosion.SpriteEmitter18' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter21 + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(Z=90.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.140000 + FadeOutStartTime=0.250000 + FadeInEndTime=0.160000 + MaxParticles=2 + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=6.000000) + StartSizeRange=(X=(Min=25.000000,Max=25.000000),Y=(Min=25.000000,Max=25.000000),Z=(Min=25.000000,Max=25.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'EpicParticles.Smoke.Smokepuff2' + LifetimeRange=(Min=1.400000,Max=1.400000) + End Object + Emitters(2)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RipperExplosion.SpriteEmitter21' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter22 + UseCollision=True + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(Y=(Min=0.940000,Max=0.940000),Z=(Min=0.840000,Max=0.840000)) + Opacity=0.510000 + FadeOutStartTime=0.286000 + FadeInEndTime=0.013000 + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=13.000000) + StartSizeRange=(X=(Min=25.000000,Max=25.000000),Y=(Min=25.000000,Max=25.000000),Z=(Min=25.000000,Max=25.000000)) + InitialParticlesPerSecond=1000.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'EpicParticles.Flares.FlashFlare1' + LifetimeRange=(Min=0.700000,Max=0.700000) + End Object + Emitters(3)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RipperExplosion.SpriteEmitter22' + + Begin Object Class=SparkEmitter Name=SparkEmitter1 + LineSegmentsRange=(Min=1.000000,Max=1.000000) + TimeBetweenSegmentsRange=(Min=0.200000,Max=0.200000) + FadeOut=True + RespawnDeadParticles=False + AutomaticInitialSpawning=False + Acceleration=(Z=-1200.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)) + ColorMultiplierRange=(Y=(Min=0.700000,Max=0.700000),Z=(Min=0.300000,Max=0.300000)) + Opacity=0.540000 + FadeOutStartTime=0.282470 + MaxParticles=14 + StartSizeRange=(X=(Min=50.000000,Max=50.000000),Y=(Min=50.000000,Max=50.000000),Z=(Min=50.000000,Max=50.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=0.701000,Max=0.701000) + InitialDelayRange=(Min=0.040000,Max=0.040000) + StartVelocityRange=(X=(Min=-700.000000,Max=700.000000),Y=(Min=-700.000000,Max=700.000000),Z=(Min=-700.000000,Max=700.000000)) + End Object + Emitters(4)=SparkEmitter'UT2341WeaponsReducedv1a.FX_RipperExplosion.SparkEmitter1' + + bNoDelete=False +} diff --git a/Sources/Classes/FX_RipperProjTrail.uc b/Sources/Classes/FX_RipperProjTrail.uc new file mode 100644 index 0000000..b4d67cf --- /dev/null +++ b/Sources/Classes/FX_RipperProjTrail.uc @@ -0,0 +1,190 @@ +class FX_RipperProjTrail extends Emitter; + +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter64 + UseDirectionAs=PTDU_Normal + FadeOut=True + SpinParticles=True + UseSizeScale=True + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(X=-100.000000,Y=8.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)) + ColorMultiplierRange=(Y=(Min=0.500000,Max=0.500000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.200000 + FadeOutStartTime=0.190000 + CoordinateSystem=PTCS_Relative + MaxParticles=13 + StartLocationRange=(Y=(Min=-5.000000,Max=-5.000000)) + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=2.000000,Max=2.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + StartSizeRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000)) + ParticlesPerSecond=13.000000 + InitialParticlesPerSecond=50000.000000 + Texture=Texture'EpicParticles.Flares.SoftFlare' + LifetimeRange=(Min=1.000000,Max=1.000000) + WarmupTicksPerSecond=1.000000 + RelativeWarmupTime=1.000000 + End Object + Emitters(0)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RipperProjTrail.SpriteEmitter64' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter66 + UseCollision=True + FadeOut=True + FadeIn=True + SpinParticles=True + UseSizeScale=True + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(X=-10.000000,Z=-40.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)) + ColorMultiplierRange=(Y=(Min=0.700000,Max=0.700000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.320000 + FadeOutStartTime=0.110000 + FadeInEndTime=0.110000 + CoordinateSystem=PTCS_Relative + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=2.000000,Max=2.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + StartSizeRange=(X=(Min=12.000000,Max=15.000000),Y=(Min=12.000000,Max=15.000000),Z=(Min=12.000000,Max=15.000000)) + ParticlesPerSecond=1.000000 + InitialParticlesPerSecond=50000.000000 + Texture=Texture'EpicParticles.Flares.FlickerFlare' + LifetimeRange=(Min=1.400000,Max=1.400000) + StartVelocityRange=(X=(Min=-30.000000,Max=-30.000000),Y=(Min=-20.000000,Max=20.000000),Z=(Max=10.000000)) + WarmupTicksPerSecond=1.000000 + RelativeWarmupTime=1.000000 + End Object + Emitters(1)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RipperProjTrail.SpriteEmitter66' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter67 + UseDirectionAs=PTDU_Normal + FadeOut=True + FadeIn=True + SpinParticles=True + UseSizeScale=True + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(X=-100.000000,Y=-12.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)) + ColorMultiplierRange=(Y=(Min=0.500000,Max=0.500000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.200000 + FadeOutStartTime=0.350000 + FadeInEndTime=0.020000 + CoordinateSystem=PTCS_Relative + MaxParticles=13 + StartLocationRange=(Y=(Min=6.000000,Max=6.000000)) + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=2.000000,Max=2.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + StartSizeRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000)) + ParticlesPerSecond=13.000000 + InitialParticlesPerSecond=50000.000000 + Texture=Texture'EpicParticles.Flares.SoftFlare' + LifetimeRange=(Min=1.000000,Max=1.000000) + WarmupTicksPerSecond=1.000000 + RelativeWarmupTime=1.000000 + End Object + Emitters(2)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RipperProjTrail.SpriteEmitter67' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter68 + UseDirectionAs=PTDU_Normal + FadeOut=True + FadeIn=True + SpinParticles=True + UseSizeScale=True + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(X=-110.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)) + ColorMultiplierRange=(Y=(Min=0.500000,Max=0.500000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.200000 + FadeOutStartTime=0.350000 + FadeInEndTime=0.020000 + CoordinateSystem=PTCS_Relative + MaxParticles=13 + StartLocationRange=(X=(Min=-4.000000,Max=-4.000000)) + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=2.000000,Max=2.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + StartSizeRange=(X=(Min=15.000000,Max=15.000000),Y=(Min=15.000000,Max=15.000000),Z=(Min=15.000000,Max=15.000000)) + ParticlesPerSecond=13.000000 + InitialParticlesPerSecond=50000.000000 + Texture=Texture'EpicParticles.Flares.SoftFlare' + LifetimeRange=(Min=1.000000,Max=1.000000) + WarmupTicksPerSecond=1.000000 + RelativeWarmupTime=1.000000 + End Object + Emitters(3)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RipperProjTrail.SpriteEmitter68' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter69 + FadeOut=True + FadeIn=True + SpinParticles=True + UseSizeScale=True + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(X=-70.000000,Y=-10.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)) + ColorMultiplierRange=(Y=(Min=0.500000,Max=0.500000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.700000 + FadeOutStartTime=0.800000 + FadeInEndTime=0.020000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + StartLocationRange=(X=(Min=-1.000000,Max=-1.000000),Y=(Min=6.000000,Max=6.000000)) + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=2.000000,Max=2.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + StartSizeRange=(X=(Min=9.000000,Max=9.000000),Y=(Min=9.000000,Max=9.000000),Z=(Min=9.000000,Max=9.000000)) + ParticlesPerSecond=1.000000 + InitialParticlesPerSecond=50000.000000 + Texture=Texture'EpicParticles.Flares.SoftFlare' + LifetimeRange=(Min=1.000000,Max=1.000000) + StartVelocityRange=(Y=(Min=-1.000000,Max=-1.000000)) + WarmupTicksPerSecond=1.000000 + RelativeWarmupTime=1.000000 + End Object + Emitters(4)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RipperProjTrail.SpriteEmitter69' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter70 + FadeOut=True + FadeIn=True + SpinParticles=True + UseSizeScale=True + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(X=-70.000000,Y=10.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)) + ColorMultiplierRange=(Y=(Min=0.500000,Max=0.500000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.700000 + FadeOutStartTime=0.350000 + FadeInEndTime=0.020000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + StartLocationRange=(X=(Min=-1.000000,Max=-1.000000),Y=(Min=-5.000000,Max=-5.000000)) + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=2.000000,Max=2.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + StartSizeRange=(X=(Min=9.000000,Max=9.000000),Y=(Min=9.000000,Max=9.000000),Z=(Min=9.000000,Max=9.000000)) + ParticlesPerSecond=1.000000 + InitialParticlesPerSecond=50000.000000 + Texture=Texture'EpicParticles.Flares.SoftFlare' + LifetimeRange=(Min=1.000000,Max=1.000000) + StartVelocityRange=(Y=(Min=-1.000000,Max=-1.000000)) + WarmupTicksPerSecond=1.000000 + RelativeWarmupTime=1.000000 + End Object + Emitters(5)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RipperProjTrail.SpriteEmitter70' + + bNoDelete=False + bDirectional=True +} diff --git a/Sources/Classes/FX_RocketExplosion.uc b/Sources/Classes/FX_RocketExplosion.uc new file mode 100644 index 0000000..7da08e2 --- /dev/null +++ b/Sources/Classes/FX_RocketExplosion.uc @@ -0,0 +1,196 @@ +class FX_RocketExplosion extends Emitter; + +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter0 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + BlendBetweenSubdivisions=True + 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)) + ColorMultiplierRange=(Y=(Min=0.900000,Max=0.900000),Z=(Min=0.600000,Max=0.600000)) + Opacity=0.720000 + FadeOutStartTime=0.380000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=6.000000) + StartSizeRange=(X=(Min=16.000000,Max=16.000000),Y=(Min=16.000000,Max=16.000000),Z=(Min=16.000000,Max=16.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'ExplosionTex.Framed.exp7_frames' + TextureUSubdivisions=4 + TextureVSubdivisions=4 + LifetimeRange=(Min=0.601000,Max=0.601000) + InitialDelayRange=(Min=0.400000,Max=0.400000) + End Object + Emitters(0)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RocketExplosion.SpriteEmitter0' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter16 + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + Disabled=True + Backup_Disabled=True + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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.740000 + FadeOutStartTime=0.080000 + FadeInEndTime=0.080000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=28.000000,Max=28.000000),Y=(Min=28.000000,Max=28.000000),Z=(Min=28.000000,Max=28.000000)) + InitialParticlesPerSecond=1000.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'EpicParticles.Flares.FlashFlare1' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(1)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RocketExplosion.SpriteEmitter16' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter18 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + BlendBetweenSubdivisions=True + 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)) + ColorMultiplierRange=(Y=(Min=0.800000,Max=0.800000),Z=(Min=0.500000,Max=0.500000)) + Opacity=0.820000 + FadeOutStartTime=0.380000 + CoordinateSystem=PTCS_Relative + MaxParticles=2 + StartLocationRange=(X=(Min=4.000000,Max=4.000000),Y=(Min=4.000000,Max=4.000000),Z=(Min=4.000000,Max=4.000000)) + SpinsPerSecondRange=(X=(Min=-0.100000,Max=-0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=6.000000) + StartSizeRange=(X=(Min=14.000000,Max=14.000000),Y=(Min=14.000000,Max=14.000000),Z=(Min=14.000000,Max=14.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'ExplosionTex.Framed.exp2_frames' + TextureUSubdivisions=4 + TextureVSubdivisions=4 + LifetimeRange=(Min=0.801000,Max=0.801000) + End Object + Emitters(2)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RocketExplosion.SpriteEmitter18' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter21 + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(Z=60.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.140000 + FadeOutStartTime=0.250000 + FadeInEndTime=0.160000 + MaxParticles=2 + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=6.000000) + StartSizeRange=(X=(Min=25.000000,Max=25.000000),Y=(Min=25.000000,Max=25.000000),Z=(Min=25.000000,Max=25.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'EpicParticles.Smoke.Smokepuff2' + LifetimeRange=(Min=2.400000,Max=2.400000) + End Object + Emitters(3)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RocketExplosion.SpriteEmitter21' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter22 + UseCollision=True + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(Y=(Min=0.480000,Max=0.480000),Z=(Min=0.260000,Max=0.260000)) + Opacity=0.730000 + FadeOutStartTime=0.030000 + FadeInEndTime=0.015000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=13.000000) + StartSizeRange=(X=(Min=25.000000,Max=25.000000),Y=(Min=25.000000,Max=25.000000),Z=(Min=25.000000,Max=25.000000)) + InitialParticlesPerSecond=1000.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'EpicParticles.Flares.FlashFlare1' + LifetimeRange=(Min=1.300000,Max=1.300000) + End Object + Emitters(4)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RocketExplosion.SpriteEmitter22' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter5 + UseCollision=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(Z=-1500.000000) + DampingFactorRange=(X=(Min=0.450000,Max=0.450000),Y=(Min=0.450000,Max=0.450000),Z=(Min=0.450000,Max=0.450000)) + 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)) + ColorMultiplierRange=(Y=(Min=0.700000,Max=0.700000),Z=(Min=0.500000,Max=0.500000)) + Opacity=0.860000 + FadeOutStartTime=0.800000 + MaxParticles=12 + SpinCCWorCW=(X=0.750000) + SpinsPerSecondRange=(X=(Min=0.500000,Max=1.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScale(0)=(RelativeTime=0.140000,RelativeSize=0.100000) + SizeScaleRepeats=1.000000 + StartSizeRange=(X=(Min=6.000000,Max=6.000000),Y=(Min=6.000000,Max=6.000000),Z=(Min=6.000000,Max=6.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.HardSpot' + LifetimeRange=(Min=0.950000,Max=0.950000) + InitialDelayRange=(Min=0.140000,Max=0.140000) + StartVelocityRange=(X=(Min=-300.000000,Max=400.000000),Y=(Min=-400.000000,Max=400.000000),Z=(Min=-400.000000,Max=700.000000)) + End Object + Emitters(5)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RocketExplosion.SpriteEmitter5' + + Begin Object Class=SparkEmitter Name=SparkEmitter1 + LineSegmentsRange=(Min=1.000000,Max=1.000000) + TimeBetweenSegmentsRange=(Min=0.200000,Max=0.200000) + FadeOut=True + RespawnDeadParticles=False + AutomaticInitialSpawning=False + Acceleration=(Z=-1200.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)) + ColorMultiplierRange=(Y=(Min=0.700000,Max=0.700000),Z=(Min=0.300000,Max=0.300000)) + Opacity=0.540000 + FadeOutStartTime=0.282470 + MaxParticles=14 + StartSizeRange=(X=(Min=50.000000,Max=50.000000),Y=(Min=50.000000,Max=50.000000),Z=(Min=50.000000,Max=50.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=0.801000,Max=0.801000) + InitialDelayRange=(Min=0.100000,Max=0.100000) + StartVelocityRange=(X=(Min=-700.000000,Max=700.000000),Y=(Min=-700.000000,Max=700.000000),Z=(Min=-700.000000,Max=700.000000)) + End Object + Emitters(6)=SparkEmitter'UT2341WeaponsReducedv1a.FX_RocketExplosion.SparkEmitter1' + + bNoDelete=False +} diff --git a/Sources/Classes/FX_RocketTrail.uc b/Sources/Classes/FX_RocketTrail.uc new file mode 100644 index 0000000..ed1f047 --- /dev/null +++ b/Sources/Classes/FX_RocketTrail.uc @@ -0,0 +1,159 @@ +class FX_RocketTrail extends Emitter; + +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter8 + FadeOut=True + SpinParticles=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(Y=(Min=0.500000,Max=0.500000),Z=(Min=0.300000,Max=0.300000)) + Opacity=0.200000 + FadeOutStartTime=0.520000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + StartLocationRange=(X=(Min=-18.000000,Max=-18.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=13.000000) + StartSizeRange=(X=(Min=55.000000,Max=55.000000),Y=(Min=55.000000,Max=55.000000),Z=(Min=55.000000,Max=55.000000)) + InitialParticlesPerSecond=1.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'EpicParticles.Flares.BurnFlare1' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(0)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RocketTrail.SpriteEmitter8' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter11 + FadeOut=True + SpinParticles=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(Y=(Min=0.880000,Max=0.880000),Z=(Min=0.680000,Max=0.680000)) + Opacity=0.430000 + FadeOutStartTime=0.460000 + CoordinateSystem=PTCS_Relative + MaxParticles=2 + StartLocationRange=(X=(Min=-18.000000,Max=-18.000000)) + SpinsPerSecondRange=(X=(Max=0.100000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=13.000000) + StartSizeRange=(X=(Min=55.000000,Max=55.000000),Y=(Min=55.000000,Max=55.000000),Z=(Min=55.000000,Max=55.000000)) + InitialParticlesPerSecond=2.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'EpicParticles.Flares.FlashFlare1' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(1)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RocketTrail.SpriteEmitter11' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter12 + FadeOut=True + SpinParticles=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(Y=(Min=0.700000,Max=0.700000),Z=(Min=0.500000,Max=0.500000)) + Opacity=0.430000 + FadeOutStartTime=0.460000 + CoordinateSystem=PTCS_Relative + MaxParticles=2 + StartLocationRange=(X=(Min=-18.000000,Max=-18.000000)) + SpinsPerSecondRange=(X=(Max=0.100000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=13.000000) + StartSizeRange=(X=(Min=85.000000,Max=85.000000),Y=(Min=85.000000,Max=85.000000),Z=(Min=85.000000,Max=85.000000)) + InitialParticlesPerSecond=2.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'EpicParticles.Flares.FlickerFlare' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(2)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RocketTrail.SpriteEmitter12' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter13 + FadeOut=True + FadeIn=True + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + Acceleration=(Z=100.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)) + ColorMultiplierRange=(X=(Min=0.800000,Max=0.800000),Y=(Min=0.800000,Max=0.800000),Z=(Min=0.800000,Max=0.800000)) + Opacity=0.360000 + FadeOutStartTime=0.460000 + FadeInEndTime=0.100000 + MaxParticles=30 + SpinsPerSecondRange=(X=(Max=0.100000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=0.900000) + StartSizeRange=(X=(Min=7.000000,Max=15.000000),Y=(Min=7.000000,Max=15.000000),Z=(Min=7.000000,Max=15.000000)) + InitialParticlesPerSecond=20.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'EpicParticles.Smoke.Smokepuff' + LifetimeRange=(Min=1.000000,Max=1.000000) + StartVelocityRange=(Y=(Min=-20.000000,Max=20.000000),Z=(Min=-20.000000,Max=10.000000)) + End Object + Emitters(3)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RocketTrail.SpriteEmitter13' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter14 + FadeOut=True + FadeIn=True + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + Acceleration=(Z=100.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)) + ColorMultiplierRange=(X=(Min=0.100000,Max=0.100000),Y=(Min=0.100000,Max=0.100000),Z=(Min=0.100000,Max=0.100000)) + Opacity=0.200000 + FadeOutStartTime=0.040080 + FadeInEndTime=0.100000 + MaxParticles=30 + StartLocationRange=(X=(Min=-18.000000,Max=-18.000000)) + SpinsPerSecondRange=(X=(Max=0.100000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=0.200000) + StartSizeRange=(X=(Min=6.000000,Max=12.000000),Y=(Min=6.000000,Max=12.000000),Z=(Min=6.000000,Max=12.000000)) + InitialParticlesPerSecond=20.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'EpicParticles.Smoke.Smokepuff' + LifetimeRange=(Min=0.501000,Max=0.501000) + InitialDelayRange=(Min=0.010000,Max=0.010000) + StartVelocityRange=(Y=(Min=-20.000000,Max=20.000000),Z=(Min=-20.000000,Max=10.000000)) + End Object + Emitters(4)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RocketTrail.SpriteEmitter14' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter15 + SpinParticles=True + UseRegularSizeScale=False + UniformSize=True + Acceleration=(Z=60.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)) + ColorMultiplierRange=(Y=(Min=0.600000,Max=0.600000),Z=(Min=0.300000,Max=0.300000)) + Opacity=0.170000 + FadeOutStartTime=0.501000 + CoordinateSystem=PTCS_Relative + MaxParticles=30 + StartLocationRange=(X=(Min=-18.000000,Max=-18.000000)) + SpinsPerSecondRange=(X=(Max=0.100000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=0.500000) + StartSizeRange=(X=(Min=1.000000,Max=13.000000),Y=(Min=1.000000,Max=13.000000),Z=(Min=1.000000,Max=13.000000)) + InitialParticlesPerSecond=20.000000 + Texture=Texture'EpicParticles.Flares.SoftFlare' + LifetimeRange=(Min=0.500000,Max=0.500000) + StartVelocityRange=(X=(Min=-150.000000,Max=-50.000000),Y=(Min=-20.000000,Max=20.000000),Z=(Min=-20.000000,Max=10.000000)) + End Object + Emitters(5)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_RocketTrail.SpriteEmitter15' + + bNoDelete=False +} diff --git a/Sources/Classes/FX_ShockRifleBeamEffect.uc b/Sources/Classes/FX_ShockRifleBeamEffect.uc new file mode 100644 index 0000000..93e9357 --- /dev/null +++ b/Sources/Classes/FX_ShockRifleBeamEffect.uc @@ -0,0 +1,164 @@ +/************************************************************* +* +* +* +*************************************************************/ + +/* +class FX_ShockRifleBeamEffect extends Emitter; + +defaultproperties +{ + Begin Object Class=BeamEmitter Name=BeamEmitter0 + BeamDistanceRange=(Min=800.000000,Max=800.000000) + DetermineEndPointBy=PTEP_Distance + LowFrequencyNoiseRange=(Z=(Max=1.000000)) + FadeOut=True + UseSizeScale=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000)) + Opacity=0.200000 + FadeOutStartTime=1.500000 + MaxParticles=8 + Name="ShockBeam" + StartSizeRange=(X=(Min=16.000000,Max=16.000000),Y=(Min=16.000000,Max=16.000000),Z=(Min=16.000000,Max=16.000000)) + InitialParticlesPerSecond=5000.000000 + Texture=Texture'EpicParticles.Beams.WhiteStreak01aw' + LifetimeRange=(Min=3.000000,Max=3.000000) + StartVelocityRange=(X=(Min=20.000000,Max=20.000000)) + End Object + Emitters(0)=BeamEmitter'BeamEmitter0' + + Begin Object Class=BeamEmitter Name=BeamEmitter1 + BeamDistanceRange=(Min=800.000000,Max=800.000000) + DetermineEndPointBy=PTEP_Distance + LowFrequencyNoiseRange=(X=(Max=1.000000),Y=(Min=-0.500000,Max=0.500000),Z=(Max=1.000000)) + HighFrequencyPoints=17 + HFScaleFactors(0)=(FrequencyScale=(X=1.000000,Y=1.000000,Z=3.000000),RelativeLength=0.520000) + FadeOut=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.600000,Max=0.600000)) + Opacity=0.070000 + FadeOutStartTime=1.500000 + MaxParticles=8 + Name="ShockBeam2" + StartSizeRange=(X=(Min=3.000000,Max=3.000000),Y=(Min=3.000000,Max=3.000000),Z=(Min=3.000000,Max=3.000000)) + InitialParticlesPerSecond=5000.000000 + Texture=Texture'AS_FX_TX.Beams.HotBolt_1' + LifetimeRange=(Min=3.000000,Max=3.000000) + StartVelocityRange=(X=(Min=20.000000,Max=20.000000)) + End Object + Emitters(1)=BeamEmitter'BeamEmitter1' + + Begin Object Class=BeamEmitter Name=BeamEmitter2 + BeamDistanceRange=(Min=800.000000,Max=800.000000) + DetermineEndPointBy=PTEP_Distance + LowFrequencyNoiseRange=(X=(Min=-10.000000,Max=-1.000000),Y=(Min=-10.000000,Max=-0.500000),Z=(Min=-10.000000,Max=-1.000000)) + HighFrequencyPoints=17 + HFScaleFactors(0)=(FrequencyScale=(X=1.000000,Y=1.000000,Z=3.000000),RelativeLength=0.520000) + FadeOut=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.600000,Max=0.600000)) + Opacity=0.030000 + FadeOutStartTime=1.500000 + MaxParticles=8 + Name="ShockBeam3" + StartSizeRange=(X=(Min=3.000000,Max=3.000000),Y=(Min=3.000000,Max=3.000000),Z=(Min=3.000000,Max=3.000000)) + InitialParticlesPerSecond=5000.000000 + Texture=Texture'AS_FX_TX.Beams.HotBolt_1' + LifetimeRange=(Min=3.000000,Max=3.000000) + StartVelocityRange=(X=(Min=20.000000,Max=20.000000)) + End Object + Emitters(2)=BeamEmitter'BeamEmitter2' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter1 + FadeOut=True + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.600000,Max=0.600000),Y=(Min=0.400000,Max=0.400000)) + Opacity=0.330000 + FadeOutStartTime=0.540000 + MaxParticles=15 + Name="ShockTrail" + SpinsPerSecondRange=(X=(Max=0.200000)) + StartSpinRange=(X=(Max=0.100000)) + StartSizeRange=(X=(Min=30.000000,Max=30.000000),Y=(Min=30.000000,Max=30.000000),Z=(Min=30.000000,Max=30.000000)) + InitialParticlesPerSecond=10.000000 + Texture=Texture'AS_FX_TX.Flares.Laser_Flare' + LifetimeRange=(Min=3.000000,Max=3.000000) + StartVelocityRange=(X=(Min=680.000000,Max=680.000000)) + End Object + Emitters(3)=SpriteEmitter'SpriteEmitter1' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter2 + FadeOut=True + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.600000,Max=0.600000)) + Opacity=0.270000 + FadeOutStartTime=0.540000 + MaxParticles=15 + Name="ShockTrail2" + SpinsPerSecondRange=(X=(Max=0.200000)) + StartSpinRange=(X=(Max=1.000000)) + StartSizeRange=(X=(Min=30.000000,Max=30.000000),Y=(Min=30.000000,Max=30.000000),Z=(Min=30.000000,Max=30.000000)) + InitialParticlesPerSecond=10.000000 + Texture=Texture'AS_FX_TX.Flares.Laser_Flare' + LifetimeRange=(Min=3.000000,Max=3.000000) + StartVelocityRange=(X=(Max=480.000000)) + End Object + Emitters(4)=SpriteEmitter'SpriteEmitter2' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter3 + FadeOut=True + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.300000,Max=0.300000),Y=(Min=0.400000,Max=0.400000)) + Opacity=0.340000 + FadeOutStartTime=0.540000 + MaxParticles=15 + Name="ShockTrailfaint" + SpinsPerSecondRange=(X=(Max=0.100000)) + StartSpinRange=(X=(Max=1.000000)) + StartSizeRange=(X=(Min=30.000000,Max=30.000000),Y=(Min=30.000000,Max=30.000000),Z=(Min=30.000000,Max=30.000000)) + InitialParticlesPerSecond=13.000000 + Texture=Texture'EpicParticles.Flares.SoftFlare' + LifetimeRange=(Min=3.000000,Max=3.000000) + StartVelocityRange=(X=(Max=480.000000)) + End Object + Emitters(5)=SpriteEmitter'SpriteEmitter3' +} +*/ + +// xEmitter version +class FX_ShockRifleBeamEffect extends ShockBeamEffect; + +simulated function SpawnImpactEffects(rotator HitRot, vector EffectLoc) +{ + //Spawn(class'ShockImpactFlare',,, EffectLoc, HitRot); + //Spawn(class'ShockImpactRing',,, EffectLoc, HitRot); + //Spawn(class'ShockImpactScorch',,, EffectLoc, Rotator(-HitNormal)); + //Spawn(class'ShockExplosionCore',,, EffectLoc+HitNormal*8, HitRot); + Spawn(class'FX_ShockRifleImpact',,, EffectLoc, HitRot); +} + +defaultproperties +{ + Texture=Texture'UT2341Weapons_Tex.ASMD.ASMDBeamTex' + Skins(0)=Texture'UT2341Weapons_Tex.ASMD.ASMDBeamTex' +} diff --git a/Sources/Classes/FX_ShockRifleBeamMuzFlash.uc b/Sources/Classes/FX_ShockRifleBeamMuzFlash.uc new file mode 100644 index 0000000..95e0e6c --- /dev/null +++ b/Sources/Classes/FX_ShockRifleBeamMuzFlash.uc @@ -0,0 +1,75 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class FX_ShockRifleBeamMuzFlash extends ShockBeamMuzFlash; + + +/* + Begin Object Class=SpriteEmitter Name=SpriteEmitter22 + FadeOut=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + 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)) + ColorMultiplierRange=(X=(Min=0.300000,Max=0.300000),Y=(Min=0.700000,Max=0.700000)) + FadeOutStartTime=0.060000 + MaxParticles=1 + Name="ShockMuzzle" + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=3.000000) + StartSizeRange=(X=(Min=6.000000,Max=6.000000),Y=(Min=6.000000,Max=6.000000),Z=(Min=6.000000,Max=6.000000)) + Texture=Texture'XEffectMat.Shock.ShockComboFlash' + LifetimeRange=(Min=0.400000,Max=0.400000) + End Object + Emitters(0)=SpriteEmitter'SpriteEmitter22' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter23 + FadeOut=True + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + 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)) + ColorMultiplierRange=(X=(Min=0.600000,Max=0.600000),Y=(Min=0.800000,Max=0.800000)) + Opacity=0.800000 + FadeOutStartTime=0.060000 + MaxParticles=1 + Name="ShockFlare" + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=3.000000) + StartSizeRange=(X=(Min=12.000000,Max=12.000000),Y=(Min=12.000000,Max=12.000000),Z=(Min=12.000000,Max=12.000000)) + Texture=Texture'EpicParticles.Flares.BurnFlare1' + LifetimeRange=(Min=0.400000,Max=0.400000) + End Object + Emitters(1)=SpriteEmitter'SpriteEmitter23' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter24 + FadeOut=True + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + 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)) + ColorMultiplierRange=(X=(Min=0.700000,Max=0.700000),Y=(Min=0.600000,Max=0.600000)) + Opacity=0.590000 + FadeOutStartTime=0.060000 + MaxParticles=1 + Name="SpriteEmitter24" + SpinsPerSecondRange=(X=(Max=0.010000)) + StartSpinRange=(X=(Max=0.700000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=3.000000) + StartSizeRange=(X=(Min=16.000000,Max=16.000000),Y=(Min=16.000000,Max=16.000000),Z=(Min=16.000000,Max=16.000000)) + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar2' + LifetimeRange=(Min=0.400000,Max=0.400000) + End Object + Emitters(2)=SpriteEmitter'SpriteEmitter24' + */ + +defaultproperties +{ + Skins(0)=FinalBlend'UT2341Weapons_Tex.ASMD.ASMDFlashFB' +} diff --git a/Sources/Classes/FX_ShockRifleComboVortex.uc b/Sources/Classes/FX_ShockRifleComboVortex.uc new file mode 100644 index 0000000..68c083c --- /dev/null +++ b/Sources/Classes/FX_ShockRifleComboVortex.uc @@ -0,0 +1,1030 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class FX_ShockRifleComboVortex extends Emitter; + + + + + +/* + + + + Begin Map + Begin Actor Class=Emitter Name=Emitter1 + Begin Object Class=MeshEmitter Name=MeshEmitter0 + StaticMesh=StaticMesh'Editor.TexPropSphere' + UseMeshBlendMode=False + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.400000,Max=0.400000)) + Opacity=0.160000 + FadeOutStartTime=0.370000 + MaxParticles=1 + Name="BallExplosion" + StartSpinRange=(X=(Min=1.000000,Max=1.000000),Z=(Min=1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.680000,RelativeSize=2.500000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=5.000000) + StartSizeRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.400000,Max=0.400000),Z=(Min=0.400000,Max=0.400000)) + InitialParticlesPerSecond=10.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(0)=MeshEmitter'myLevel.Emitter1.MeshEmitter0' + + Begin Object Class=MeshEmitter Name=MeshEmitter3 + StaticMesh=StaticMesh'Editor.TexPropSphere' + UseMeshBlendMode=False + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.600000,Max=0.600000)) + Opacity=0.160000 + FadeOutStartTime=0.370000 + MaxParticles=1 + Name="BallInnerExplosion" + StartSpinRange=(X=(Min=1.000000,Max=1.000000),Z=(Min=1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.620000,RelativeSize=2.500000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=0.100000,Max=0.100000),Y=(Min=0.100000,Max=0.100000),Z=(Min=0.100000,Max=0.100000)) + InitialParticlesPerSecond=10.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(1)=MeshEmitter'myLevel.Emitter1.MeshEmitter3' + + Begin Object Class=MeshEmitter Name=MeshEmitter4 + StaticMesh=StaticMesh'XGame_rc.BombEffectMesh' + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.600000,Max=0.600000)) + Opacity=0.400000 + FadeOutStartTime=0.370000 + MaxParticles=1 + Name="VortexInnerSwirl" + SpinsPerSecondRange=(X=(Min=5.000000,Max=5.000000),Y=(Min=5.000000,Max=5.000000),Z=(Min=5.000000,Max=5.000000)) + StartSpinRange=(X=(Min=1.000000,Max=1.000000),Y=(Max=1.000000),Z=(Min=1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.620000,RelativeSize=2.000000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=5.000000) + StartSizeRange=(X=(Min=0.600000,Max=0.600000),Y=(Min=0.600000,Max=0.600000),Z=(Min=0.600000,Max=0.600000)) + InitialParticlesPerSecond=10.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(2)=MeshEmitter'myLevel.Emitter1.MeshEmitter4' + + Begin Object Class=MeshEmitter Name=MeshEmitter5 + StaticMesh=StaticMesh'XGame_rc.BombEffectMesh' + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.600000,Max=0.600000)) + Opacity=0.400000 + FadeOutStartTime=0.370000 + MaxParticles=1 + Name="VortexSwirl" + SpinsPerSecondRange=(X=(Min=5.000000,Max=5.000000),Y=(Min=5.000000,Max=5.000000),Z=(Min=5.000000,Max=5.000000)) + StartSpinRange=(X=(Min=-1.000000,Max=-1.000000),Y=(Min=-1.000000,Max=-1.000000),Z=(Min=-1.000000,Max=-1.000000)) + SizeScale(0)=(RelativeTime=0.750000,RelativeSize=2.000000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=0.700000,Max=0.700000),Y=(Min=0.700000,Max=0.700000),Z=(Min=0.700000,Max=0.700000)) + InitialParticlesPerSecond=10.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(3)=MeshEmitter'myLevel.Emitter1.MeshEmitter5' + + Begin Object Class=MeshEmitter Name=MeshEmitter6 + StaticMesh=StaticMesh'XGame_rc.BombEffectMesh' + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.600000,Max=0.600000)) + Opacity=0.190000 + FadeOutStartTime=0.370000 + MaxParticles=1 + Name="VortexOuterSwirl" + SpinsPerSecondRange=(X=(Min=5.000000,Max=5.000000),Y=(Min=5.000000,Max=5.000000),Z=(Min=5.000000,Max=5.000000)) + StartSpinRange=(X=(Min=-1.000000,Max=-1.000000),Y=(Min=-1.000000,Max=-1.000000),Z=(Min=-1.000000,Max=-1.000000)) + SizeScale(0)=(RelativeTime=0.750000,RelativeSize=2.600000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=5.000000) + StartSizeRange=(X=(Min=0.800000,Max=0.800000),Y=(Min=0.800000,Max=0.800000),Z=(Min=0.800000,Max=0.800000)) + InitialParticlesPerSecond=10.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(4)=MeshEmitter'myLevel.Emitter1.MeshEmitter6' + + Begin Object Class=MeshEmitter Name=MeshEmitter7 + StaticMesh=StaticMesh'XGame_rc.BombEffectMesh' + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.600000,Max=0.600000),Y=(Min=0.600000,Max=0.600000)) + Opacity=0.190000 + FadeOutStartTime=0.370000 + MaxParticles=1 + Name="VortexOuterSwirl2" + SpinsPerSecondRange=(X=(Min=3.000000,Max=3.000000),Y=(Min=3.000000,Max=3.000000),Z=(Min=3.000000,Max=3.000000)) + StartSpinRange=(X=(Min=-1.000000,Max=-1.000000),Y=(Min=-1.000000,Max=-1.000000),Z=(Min=-1.000000,Max=-1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.700000) + StartSizeRange=(X=(Min=0.900000,Max=0.900000),Y=(Min=0.900000,Max=0.900000),Z=(Min=0.900000,Max=0.900000)) + InitialParticlesPerSecond=10.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(5)=MeshEmitter'myLevel.Emitter1.MeshEmitter7' + + Begin Object Class=MeshEmitter Name=MeshEmitter8 + StaticMesh=StaticMesh'Editor.TexPropSphere' + UseMeshBlendMode=False + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.600000,Max=0.600000)) + FadeOutStartTime=0.370000 + MaxParticles=1 + Name="SmallBall" + StartSpinRange=(X=(Min=1.000000,Max=1.000000),Z=(Min=1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.170000,RelativeSize=4.000000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=17.000000) + StartSizeRange=(X=(Min=0.040000,Max=0.040000),Y=(Min=0.040000,Max=0.040000),Z=(Min=0.040000,Max=0.040000)) + InitialParticlesPerSecond=10.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(6)=MeshEmitter'myLevel.Emitter1.MeshEmitter8' + + Begin Object Class=MeshEmitter Name=MeshEmitter9 + StaticMesh=StaticMesh'Editor.TexPropSphere' + UseMeshBlendMode=False + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.400000,Max=0.400000)) + Opacity=0.150000 + FadeOutStartTime=0.370000 + MaxParticles=1 + Name="Ball2" + StartSpinRange=(X=(Min=1.000000,Max=1.000000),Z=(Min=1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.370000,RelativeSize=2.000000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=6.000000) + StartSizeRange=(X=(Min=0.390000,Max=0.390000),Y=(Min=0.390000,Max=0.390000),Z=(Min=0.390000,Max=0.390000)) + InitialParticlesPerSecond=10.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(7)=MeshEmitter'myLevel.Emitter1.MeshEmitter9' + + Begin Object Class=MeshEmitter Name=MeshEmitter10 + StaticMesh=StaticMesh'ParticleMeshes.Complex.IonSphere' + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.390000,Max=0.390000),Z=(Min=0.700000,Max=0.700000)) + Opacity=0.680000 + FadeOutStartTime=0.370000 + MaxParticles=1 + Name="ShockWave" + StartSpinRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=1.000000,Max=1.000000),Z=(Min=0.250000,Max=0.250000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.500000) + StartSizeRange=(X=(Min=1.200000,Max=1.200000),Y=(Min=1.200000,Max=1.200000),Z=(Min=0.100000,Max=0.100000)) + InitialParticlesPerSecond=10.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(8)=MeshEmitter'myLevel.Emitter1.MeshEmitter10' + + Begin Object Class=MeshEmitter Name=MeshEmitter11 + StaticMesh=StaticMesh'ParticleMeshes.Complex.IonSphere' + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.440000,Max=0.440000),Z=(Min=0.600000,Max=0.600000)) + Opacity=0.150000 + FadeOutStartTime=0.370000 + MaxParticles=1 + Name="Shockwave2" + StartSpinRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=1.000000,Max=1.000000),Z=(Min=0.250000,Max=0.250000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.500000) + StartSizeRange=(X=(Min=1.100000,Max=1.100000),Y=(Min=1.100000,Max=1.100000),Z=(Min=0.100000,Max=0.100000)) + InitialParticlesPerSecond=10.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(9)=MeshEmitter'myLevel.Emitter1.MeshEmitter11' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter0 + RespawnDeadParticles=False + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.400000,Max=0.400000)) + Opacity=0.480000 + MaxParticles=1 + Name="Flare" + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=50.000000,Max=50.000000),Y=(Min=50.000000,Max=50.000000),Z=(Min=50.000000,Max=50.000000)) + InitialParticlesPerSecond=10.000000 + Texture=Texture'EpicParticles.Flares.FlashFlare1' + LifetimeRange=(Min=0.500000,Max=0.500000) + End Object + Emitters(10)=SpriteEmitter'myLevel.Emitter1.SpriteEmitter0' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter1 + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.300000,Max=0.300000)) + Opacity=0.190000 + MaxParticles=1 + Name="Flare2" + SpinsPerSecondRange=(X=(Max=0.400000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=180.000000,Max=180.000000),Y=(Min=180.000000,Max=180.000000),Z=(Min=180.000000,Max=180.000000)) + InitialParticlesPerSecond=10.000000 + Texture=Texture'EpicParticles.Flares.FlashFlare1' + LifetimeRange=(Min=0.500000,Max=0.500000) + End Object + Emitters(11)=SpriteEmitter'myLevel.Emitter1.SpriteEmitter1' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter2 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.500000,Max=0.500000)) + Opacity=0.490000 + FadeOutStartTime=0.280000 + MaxParticles=1 + Name="FlareWhole" + SpinsPerSecondRange=(X=(Max=0.200000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=220.000000,Max=220.000000),Y=(Min=220.000000,Max=220.000000),Z=(Min=220.000000,Max=220.000000)) + InitialParticlesPerSecond=10.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar2' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(12)=SpriteEmitter'myLevel.Emitter1.SpriteEmitter2' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter3 + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.000000,Max=0.000000),Y=(Min=0.400000,Max=0.400000)) + Opacity=0.080000 + MaxParticles=1 + Name="FlareFinal" + SpinsPerSecondRange=(X=(Max=0.200000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=210.000000,Max=210.000000),Y=(Min=210.000000,Max=210.000000),Z=(Min=210.000000,Max=210.000000)) + InitialParticlesPerSecond=10.000000 + Texture=Texture'AW-2004Particles.Energy.PurpleSwell' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(13)=SpriteEmitter'myLevel.Emitter1.SpriteEmitter3' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter4 + UseDirectionAs=PTDU_Normal + ProjectionNormal=(X=40.000000) + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.000000,Max=0.600000),Y=(Min=0.700000,Max=0.700000)) + Opacity=0.200000 + FadeOutStartTime=0.340000 + MaxParticles=1 + Name="RingTex" + SpinsPerSecondRange=(X=(Min=0.300000,Max=0.330000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.500000) + StartSizeRange=(X=(Min=150.000000,Max=150.000000),Y=(Min=150.000000,Max=150.000000),Z=(Min=150.000000,Max=150.000000)) + InitialParticlesPerSecond=10.000000 + Texture=Texture'AW-2004Particles.Fire.BlastMark' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(14)=SpriteEmitter'myLevel.Emitter1.SpriteEmitter4' + + Begin Object Class=MeshEmitter Name=MeshEmitter12 + StaticMesh=StaticMesh'ParticleMeshes.Complex.IonSphere' + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.100000,Max=0.100000),Z=(Min=0.500000,Max=0.500000)) + Opacity=0.200000 + FadeOutStartTime=0.370000 + MaxParticles=1 + Name="ShockwaveInner" + StartSpinRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=1.000000,Max=1.000000),Z=(Min=0.250000,Max=0.250000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.500000) + StartSizeRange=(X=(Min=0.800000,Max=0.800000),Y=(Min=0.800000,Max=0.800000),Z=(Min=0.230000,Max=0.230000)) + InitialParticlesPerSecond=10.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(15)=MeshEmitter'myLevel.Emitter1.MeshEmitter12' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter5 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.600000,Max=0.600000),Y=(Min=0.600000,Max=0.600000)) + FadeOutStartTime=0.280000 + MaxParticles=1 + Name="ShockVortexSpin" + SpinsPerSecondRange=(X=(Min=0.800000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=240.000000,Max=240.000000),Y=(Min=240.000000,Max=240.000000),Z=(Min=240.000000,Max=240.000000)) + InitialParticlesPerSecond=10.000000 + Texture=Texture'AW-2004Particles.Energy.BurnFlare' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(16)=SpriteEmitter'myLevel.Emitter1.SpriteEmitter5' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter6 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.500000,Max=0.500000)) + Opacity=0.400000 + FadeOutStartTime=0.280000 + MaxParticles=1 + Name="Vortex2" + SpinsPerSecondRange=(X=(Min=-1.000000,Max=-1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=240.000000,Max=240.000000),Y=(Min=240.000000,Max=240.000000),Z=(Min=240.000000,Max=240.000000)) + InitialParticlesPerSecond=10.000000 + Texture=Texture'AW-2004Particles.Energy.BurnFlare' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(17)=SpriteEmitter'myLevel.Emitter1.SpriteEmitter6' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter8 + UseCollision=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(X=-10.000000,Y=-10.000000,Z=-10.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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.600000,Max=0.600000)) + FadeOutStartTime=0.496000 + MaxParticles=18 + Name="Sparks" + SpinCCWorCW=(X=0.750000) + SpinsPerSecondRange=(X=(Min=0.500000,Max=1.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=0.100000) + SizeScaleRepeats=6.000000 + StartSizeRange=(X=(Min=17.000000,Max=17.000000),Y=(Min=17.000000,Max=17.000000),Z=(Min=17.000000,Max=17.000000)) + InitialParticlesPerSecond=5000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=1.600000,Max=1.600000) + StartVelocityRange=(X=(Min=-270.000000,Max=270.000000),Y=(Min=-270.000000,Max=270.000000),Z=(Min=-270.000000,Max=270.000000)) + End Object + Emitters(18)=SpriteEmitter'myLevel.Emitter1.SpriteEmitter8' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter7 + UseCollision=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(X=-10.000000,Y=-10.000000,Z=-10.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)) + ColorMultiplierRange=(X=(Min=0.700000,Max=0.700000),Y=(Min=0.600000,Max=0.600000)) + FadeOutStartTime=0.816000 + MaxParticles=15 + Name="Sparks2" + SpinCCWorCW=(X=0.750000) + SpinsPerSecondRange=(X=(Min=0.500000,Max=1.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=0.100000) + SizeScaleRepeats=6.000000 + StartSizeRange=(X=(Min=17.000000,Max=17.000000),Y=(Min=17.000000,Max=17.000000),Z=(Min=17.000000,Max=17.000000)) + InitialParticlesPerSecond=5000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=1.600000,Max=1.600000) + StartVelocityRange=(X=(Min=-110.000000,Max=110.000000),Y=(Min=-110.000000,Max=110.000000),Z=(Min=-110.000000,Max=110.000000)) + End Object + Emitters(19)=SpriteEmitter'myLevel.Emitter1.SpriteEmitter7' + + bLightChanged=True + Level=LevelInfo'myLevel.LevelInfo0' + Region=(Zone=LevelInfo'myLevel.LevelInfo0',ZoneNumber=1) + Tag="Emitter" + PhysicsVolume=DefaultPhysicsVolume'myLevel.DefaultPhysicsVolume0' + Location=(X=-55.284935,Y=-242.478378,Z=96.000000) + bUnlit=False + CollisionRadius=1144.854126 + CollisionHeight=809.534119 + ColLocation=(X=71.000000,Y=-16.000000) + bSelected=True + End Actor + Begin Surface + End Surface + End Map + + + +*/ + +defaultproperties +{ + Begin Object Class=MeshEmitter Name=MeshEmitter0 + StaticMesh=StaticMesh'Editor.TexPropSphere' + UseMeshBlendMode=False + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.400000,Max=0.400000)) + Opacity=0.250000 + FadeOutStartTime=0.370000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + StartSpinRange=(X=(Min=1.000000,Max=1.000000),Z=(Min=1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.680000,RelativeSize=2.500000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=5.000000) + StartSizeRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.400000,Max=0.400000),Z=(Min=0.400000,Max=0.400000)) + InitialParticlesPerSecond=1000.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(0)=MeshEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.MeshEmitter0' + + Begin Object Class=MeshEmitter Name=MeshEmitter3 + StaticMesh=StaticMesh'Editor.TexPropSphere' + UseMeshBlendMode=False + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.600000,Max=0.600000)) + Opacity=0.160000 + FadeOutStartTime=0.370000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + StartSpinRange=(X=(Min=1.000000,Max=1.000000),Z=(Min=1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.650000,RelativeSize=2.500000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=0.100000,Max=0.100000),Y=(Min=0.100000,Max=0.100000),Z=(Min=0.100000,Max=0.100000)) + InitialParticlesPerSecond=1000.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(1)=MeshEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.MeshEmitter3' + + Begin Object Class=MeshEmitter Name=MeshEmitter4 + StaticMesh=StaticMesh'XGame_rc.BombEffectMesh' + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.600000,Max=0.600000)) + Opacity=0.400000 + FadeOutStartTime=0.370000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=5.000000,Max=5.000000),Y=(Min=5.000000,Max=5.000000),Z=(Min=5.000000,Max=5.000000)) + StartSpinRange=(X=(Min=1.000000,Max=1.000000),Y=(Max=1.000000),Z=(Min=1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.620000,RelativeSize=2.000000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=5.000000) + StartSizeRange=(X=(Min=0.600000,Max=0.600000),Y=(Min=0.600000,Max=0.600000),Z=(Min=0.600000,Max=0.600000)) + InitialParticlesPerSecond=1000.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(2)=MeshEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.MeshEmitter4' + + Begin Object Class=MeshEmitter Name=MeshEmitter5 + StaticMesh=StaticMesh'XGame_rc.BombEffectMesh' + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.600000,Max=0.600000)) + Opacity=0.400000 + FadeOutStartTime=0.370000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=5.000000,Max=5.000000),Y=(Min=5.000000,Max=5.000000),Z=(Min=5.000000,Max=5.000000)) + StartSpinRange=(X=(Min=-1.000000,Max=-1.000000),Y=(Min=-1.000000,Max=-1.000000),Z=(Min=-1.000000,Max=-1.000000)) + SizeScale(0)=(RelativeTime=0.760000,RelativeSize=2.000000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=0.700000,Max=0.700000),Y=(Min=0.700000,Max=0.700000),Z=(Min=0.700000,Max=0.700000)) + InitialParticlesPerSecond=1000.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(3)=MeshEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.MeshEmitter5' + + Begin Object Class=MeshEmitter Name=MeshEmitter6 + StaticMesh=StaticMesh'XGame_rc.BombEffectMesh' + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.600000,Max=0.600000)) + Opacity=0.190000 + FadeOutStartTime=0.370000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=5.000000,Max=5.000000),Y=(Min=5.000000,Max=5.000000),Z=(Min=5.000000,Max=5.000000)) + StartSpinRange=(X=(Min=-1.000000,Max=-1.000000),Y=(Min=-1.000000,Max=-1.000000),Z=(Min=-1.000000,Max=-1.000000)) + SizeScale(0)=(RelativeTime=0.790000,RelativeSize=2.600000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=5.000000) + StartSizeRange=(X=(Min=0.800000,Max=0.800000),Y=(Min=0.800000,Max=0.800000),Z=(Min=0.800000,Max=0.800000)) + InitialParticlesPerSecond=1000.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(4)=MeshEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.MeshEmitter6' + + Begin Object Class=MeshEmitter Name=MeshEmitter7 + StaticMesh=StaticMesh'XGame_rc.BombEffectMesh' + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.600000,Max=0.600000)) + Opacity=0.190000 + FadeOutStartTime=0.370000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=3.000000,Max=3.000000),Y=(Min=3.000000,Max=3.000000),Z=(Min=3.000000,Max=3.000000)) + StartSpinRange=(X=(Min=-1.000000,Max=-1.000000),Y=(Min=-1.000000,Max=-1.000000),Z=(Min=-1.000000,Max=-1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.700000) + StartSizeRange=(X=(Min=0.900000,Max=0.900000),Y=(Min=0.900000,Max=0.900000),Z=(Min=0.900000,Max=0.900000)) + InitialParticlesPerSecond=1000.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(5)=MeshEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.MeshEmitter7' + + Begin Object Class=MeshEmitter Name=MeshEmitter8 + StaticMesh=StaticMesh'Editor.TexPropSphere' + UseMeshBlendMode=False + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.600000,Max=0.600000)) + FadeOutStartTime=0.370000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + StartSpinRange=(X=(Min=1.000000,Max=1.000000),Z=(Min=1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.220000,RelativeSize=4.000000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=17.000000) + StartSizeRange=(X=(Min=0.040000,Max=0.040000),Y=(Min=0.040000,Max=0.040000),Z=(Min=0.040000,Max=0.040000)) + InitialParticlesPerSecond=1000.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(6)=MeshEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.MeshEmitter8' + + Begin Object Class=MeshEmitter Name=MeshEmitter9 + StaticMesh=StaticMesh'Editor.TexPropSphere' + UseMeshBlendMode=False + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.400000,Max=0.400000)) + Opacity=0.150000 + FadeOutStartTime=0.370000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + StartSpinRange=(X=(Min=1.000000,Max=1.000000),Z=(Min=1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.390000,RelativeSize=2.000000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=6.000000) + StartSizeRange=(X=(Min=0.390000,Max=0.390000),Y=(Min=0.390000,Max=0.390000),Z=(Min=0.390000,Max=0.390000)) + InitialParticlesPerSecond=1000.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(7)=MeshEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.MeshEmitter9' + + Begin Object Class=MeshEmitter Name=MeshEmitter10 + StaticMesh=StaticMesh'ParticleMeshes.Complex.IonSphere' + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.100000,Max=0.100000),Z=(Min=0.500000,Max=0.500000)) + Opacity=0.730000 + FadeOutStartTime=0.370000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + StartSpinRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=1.000000,Max=1.000000),Z=(Min=0.250000,Max=0.250000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.500000) + StartSizeRange=(X=(Min=1.200000,Max=1.200000),Y=(Min=1.200000,Max=1.200000),Z=(Min=0.100000,Max=0.100000)) + InitialParticlesPerSecond=1000.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(8)=MeshEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.MeshEmitter10' + + Begin Object Class=MeshEmitter Name=MeshEmitter11 + StaticMesh=StaticMesh'ParticleMeshes.Complex.IonSphere' + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.100000,Max=0.100000),Z=(Min=0.500000,Max=0.500000)) + Opacity=0.200000 + FadeOutStartTime=0.370000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + StartSpinRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=1.000000,Max=1.000000),Z=(Min=0.250000,Max=0.250000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.500000) + StartSizeRange=(X=(Min=1.100000,Max=1.100000),Y=(Min=1.100000,Max=1.100000),Z=(Min=0.100000,Max=0.100000)) + InitialParticlesPerSecond=1000.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(9)=MeshEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.MeshEmitter11' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter0 + RespawnDeadParticles=False + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.400000,Max=0.400000)) + Opacity=0.480000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=50.000000,Max=50.000000),Y=(Min=50.000000,Max=50.000000),Z=(Min=50.000000,Max=50.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'EpicParticles.Flares.FlashFlare1' + LifetimeRange=(Min=0.500000,Max=0.500000) + End Object + Emitters(10)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.SpriteEmitter0' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter1 + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.300000,Max=0.300000)) + Opacity=0.190000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Max=0.400000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=180.000000,Max=180.000000),Y=(Min=180.000000,Max=180.000000),Z=(Min=180.000000,Max=180.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'EpicParticles.Flares.FlashFlare1' + LifetimeRange=(Min=0.500000,Max=0.500000) + End Object + Emitters(11)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.SpriteEmitter1' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter2 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.500000,Max=0.500000)) + Opacity=0.490000 + FadeOutStartTime=0.280000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Max=0.200000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=220.000000,Max=220.000000),Y=(Min=220.000000,Max=220.000000),Z=(Min=220.000000,Max=220.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar2' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(12)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.SpriteEmitter2' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter3 + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.000000,Max=0.000000),Y=(Min=0.400000,Max=0.400000)) + Opacity=0.080000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Max=0.200000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=210.000000,Max=210.000000),Y=(Min=210.000000,Max=210.000000),Z=(Min=210.000000,Max=210.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.PurpleSwell' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(13)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.SpriteEmitter3' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter4 + UseDirectionAs=PTDU_Normal + ProjectionNormal=(X=40.000000) + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.000000,Max=0.600000),Y=(Min=0.700000,Max=0.700000)) + Opacity=0.200000 + FadeOutStartTime=0.340000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=0.300000,Max=0.330000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.500000) + StartSizeRange=(X=(Min=150.000000,Max=150.000000),Y=(Min=150.000000,Max=150.000000),Z=(Min=150.000000,Max=150.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Fire.BlastMark' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(14)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.SpriteEmitter4' + + Begin Object Class=MeshEmitter Name=MeshEmitter12 + StaticMesh=StaticMesh'ParticleMeshes.Complex.IonSphere' + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.100000,Max=0.100000),Z=(Min=0.500000,Max=0.500000)) + Opacity=0.200000 + FadeOutStartTime=0.370000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + StartSpinRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=1.000000,Max=1.000000),Z=(Min=0.250000,Max=0.250000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.500000) + StartSizeRange=(X=(Min=0.800000,Max=0.800000),Y=(Min=0.800000,Max=0.800000),Z=(Min=0.230000,Max=0.230000)) + InitialParticlesPerSecond=1000.000000 + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(15)=MeshEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.MeshEmitter12' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter5 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.500000,Max=0.500000)) + FadeOutStartTime=0.280000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=0.800000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=240.000000,Max=240.000000),Y=(Min=240.000000,Max=240.000000),Z=(Min=240.000000,Max=240.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.BurnFlare' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(16)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.SpriteEmitter5' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter6 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.500000,Max=0.500000)) + Opacity=0.400000 + FadeOutStartTime=0.280000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=-1.000000,Max=-1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=240.000000,Max=240.000000),Y=(Min=240.000000,Max=240.000000),Z=(Min=240.000000,Max=240.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.BurnFlare' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(17)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.SpriteEmitter6' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter8 + UseCollision=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(X=-10.000000,Y=-10.000000,Z=-10.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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.600000,Max=0.600000)) + FadeOutStartTime=0.512000 + MaxParticles=24 + SpinCCWorCW=(X=0.750000) + SpinsPerSecondRange=(X=(Min=0.500000,Max=1.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScale(0)=(RelativeTime=0.140000,RelativeSize=0.100000) + SizeScaleRepeats=1.000000 + StartSizeRange=(X=(Min=17.000000,Max=17.000000),Y=(Min=17.000000,Max=17.000000),Z=(Min=17.000000,Max=17.000000)) + InitialParticlesPerSecond=5000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=1.600000,Max=1.600000) + StartVelocityRange=(X=(Min=-200.000000,Max=200.000000),Y=(Min=-200.000000,Max=200.000000),Z=(Min=-200.000000,Max=200.000000)) + End Object + Emitters(18)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleComboVortex.SpriteEmitter8' + + AutoDestroy=True + bNoDelete=False + bNetInitialRotation=True +} diff --git a/Sources/Classes/FX_ShockRifleImpact.uc b/Sources/Classes/FX_ShockRifleImpact.uc new file mode 100644 index 0000000..829df66 --- /dev/null +++ b/Sources/Classes/FX_ShockRifleImpact.uc @@ -0,0 +1,281 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class FX_ShockRifleImpact extends Emitter; + +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter27 + UseCollision=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(X=-1500.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)) + ColorMultiplierRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.800000,Max=0.800000)) + FadeOutStartTime=0.800000 + SpinCCWorCW=(X=0.750000) + SpinsPerSecondRange=(X=(Min=0.500000,Max=1.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScale(0)=(RelativeTime=0.140000,RelativeSize=0.100000) + SizeScaleRepeats=1.000000 + StartSizeRange=(X=(Min=12.000000,Max=12.000000),Y=(Min=12.000000,Max=12.000000),Z=(Min=12.000000,Max=12.000000)) + InitialParticlesPerSecond=5000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=2.000000,Max=2.000000) + End Object + Emitters(0)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleImpact.SpriteEmitter27' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter28 + UseCollision=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(Z=-1500.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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.500000,Max=0.500000)) + Opacity=0.860000 + FadeOutStartTime=0.800000 + SpinCCWorCW=(X=0.750000) + SpinsPerSecondRange=(X=(Min=0.500000,Max=1.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScale(0)=(RelativeTime=0.140000,RelativeSize=0.100000) + SizeScaleRepeats=1.000000 + StartSizeRange=(X=(Min=18.000000,Max=18.000000),Y=(Min=18.000000,Max=18.000000),Z=(Min=18.000000,Max=18.000000)) + InitialParticlesPerSecond=5000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=2.000000,Max=2.000000) + StartVelocityRange=(X=(Min=-400.000000,Max=700.000000),Y=(Min=-400.000000,Max=400.000000),Z=(Min=-300.000000,Max=400.000000)) + End Object + Emitters(1)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleImpact.SpriteEmitter28' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter29 + UseDirectionAs=PTDU_Normal + ProjectionNormal=(X=1.000000,Z=0.000000) + FadeOut=True + RespawnDeadParticles=False + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.500000,Max=0.500000)) + Opacity=0.490000 + FadeOutStartTime=0.600000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Max=0.200000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=30.000000,Max=30.000000),Y=(Min=30.000000,Max=30.000000),Z=(Min=30.000000,Max=30.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.AirBlast' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(2)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleImpact.SpriteEmitter29' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter31 + UseDirectionAs=PTDU_Normal + ProjectionNormal=(X=1.000000,Z=0.000000) + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.500000,Max=0.500000)) + Opacity=0.880000 + FadeOutStartTime=0.600000 + FadeInEndTime=0.060000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Max=0.200000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=50.000000,Max=50.000000),Y=(Min=50.000000,Max=50.000000),Z=(Min=50.000000,Max=50.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.HardSpot' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(3)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleImpact.SpriteEmitter31' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter32 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.500000,Max=0.500000)) + Opacity=0.790000 + FadeOutStartTime=0.600000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + StartLocationRange=(Z=(Min=10.000000,Max=10.000000)) + SpinsPerSecondRange=(X=(Min=0.500000,Max=0.900000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=20.000000,Max=20.000000),Y=(Min=20.000000,Max=20.000000),Z=(Min=20.000000,Max=20.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(4)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleImpact.SpriteEmitter32' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter33 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.500000,Max=0.500000)) + Opacity=0.790000 + FadeOutStartTime=0.600000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + StartLocationRange=(Z=(Min=10.000000,Max=10.000000)) + SpinsPerSecondRange=(X=(Min=0.900000,Max=2.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=20.000000,Max=20.000000),Y=(Min=20.000000,Max=20.000000),Z=(Min=20.000000,Max=20.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(5)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleImpact.SpriteEmitter33' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter34 + UseDirectionAs=PTDU_Normal + ProjectionNormal=(X=1.000000,Z=0.000000) + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.500000,Max=0.500000)) + Opacity=0.790000 + FadeOutStartTime=0.600000 + FadeInEndTime=0.060000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Max=0.200000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=74.000000,Max=74.000000),Y=(Min=74.000000,Max=74.000000),Z=(Min=74.000000,Max=74.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar2' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(6)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleImpact.SpriteEmitter34' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter35 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.600000,Max=0.600000),Y=(Min=0.700000,Max=0.700000)) + Opacity=0.490000 + FadeOutStartTime=0.600000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + StartLocationRange=(Z=(Min=20.000000,Max=20.000000)) + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=20.000000,Max=20.000000),Y=(Min=20.000000,Max=20.000000),Z=(Min=20.000000,Max=20.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'EpicParticles.Flares.FlashFlare1' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(7)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleImpact.SpriteEmitter35' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter41 + UseDirectionAs=PTDU_Normal + ProjectionNormal=(X=1.000000,Z=0.000000) + FadeOut=True + RespawnDeadParticles=False + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.500000,Max=0.500000)) + Opacity=0.370000 + FadeOutStartTime=0.600000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Max=0.200000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=34.000000,Max=34.000000),Y=(Min=34.000000,Max=34.000000),Z=(Min=34.000000,Max=34.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.AirBlast' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(8)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleImpact.SpriteEmitter41' + + Begin Object Class=BeamEmitter Name=BeamEmitter6 + BeamDistanceRange=(Min=200.000000,Max=200.000000) + DetermineEndPointBy=PTEP_Distance + LowFrequencyNoiseRange=(X=(Max=10.000000),Y=(Max=10.000000),Z=(Max=10.000000)) + LowFrequencyPoints=2 + HighFrequencyNoiseRange=(X=(Min=-10.000000,Max=10.000000),Y=(Min=-10.000000,Max=10.000000),Z=(Min=-10.000000,Max=10.000000)) + HFScaleFactors(0)=(FrequencyScale=(X=0.400000,Y=0.400000,Z=0.400000),RelativeLength=0.280000) + UseHighFrequencyScale=True + BranchProbability=(Min=1.000000,Max=1.000000) + BranchSpawnAmountRange=(Min=5.000000,Max=5.000000) + LinkupLifetime=True + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.500000,Max=0.500000)) + Opacity=0.380000 + FadeOutStartTime=2.000000 + FadeInEndTime=2.000000 + CoordinateSystem=PTCS_Relative + StartLocationShape=PTLS_Sphere + SphereRadiusRange=(Max=25.000000) + SizeScale(0)=(RelativeTime=0.520000,RelativeSize=-1.000000) + SizeScaleRepeats=1.000000 + StartSizeRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.BeamBolt1a' + LifetimeRange=(Min=0.500000,Max=0.750000) + StartVelocityRange=(X=(Min=-20.000000,Max=20.000000),Y=(Min=-20.000000,Max=20.000000),Z=(Min=-20.000000,Max=20.000000)) + End Object + Emitters(9)=BeamEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleImpact.BeamEmitter6' + + bNoDelete=False +} diff --git a/Sources/Classes/FX_ShockRifleMuzFlash3rd.uc b/Sources/Classes/FX_ShockRifleMuzFlash3rd.uc new file mode 100644 index 0000000..1175479 --- /dev/null +++ b/Sources/Classes/FX_ShockRifleMuzFlash3rd.uc @@ -0,0 +1,42 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class FX_ShockRifleMuzFlash3rd extends ShockProjMuzFlash3rd; + +/* +defaultproperties +{ + mNumPerFlash=1 + mParticleType=PT_Mesh + mStartParticles=0 + mMaxParticles=6 + mLifeRange(0)=0.130000 + mLifeRange(1)=0.130000 + mRegenRange(0)=0.000000 + mRegenRange(1)=0.000000 + mSpawnVecB=(Z=0.000000) + mSpeedRange(0)=0.000000 + mSpeedRange(1)=0.000000 + mPosRelative=True + mAirResistance=0.000000 + mRandOrient=True + mSizeRange(0)=0.350000 + mSizeRange(1)=0.400000 + mGrowthRate=3.200000 + mColorRange(0)=(R=50) + mColorRange(1)=(R=50) + mAttenKa=0.000000 + mRandTextures=True + mMeshNodes(0)=StaticMesh'XEffects.MinigunFlashMesh' + Skins(0)=FinalBlend'XGameShaders.WeaponShaders.ShockMuzFlash3rdFinal' + Style=STY_Additive +} +*/ + +defaultproperties +{ + Skins(0)=FinalBlend'UT2341Weapons_Tex.ASMD.ASMDMuzFlash3rdFinal' +} diff --git a/Sources/Classes/FX_ShockRifleProjectile.uc b/Sources/Classes/FX_ShockRifleProjectile.uc new file mode 100644 index 0000000..228303d --- /dev/null +++ b/Sources/Classes/FX_ShockRifleProjectile.uc @@ -0,0 +1,125 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class FX_ShockRifleProjectile extends Emitter; + +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter0 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.100000,Max=0.100000),Y=(Min=0.500000,Max=0.500000)) + Opacity=0.400000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=9.000000,Max=9.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + StartSizeRange=(X=(Min=90.000000,Max=90.000000),Y=(Min=90.000000,Max=90.000000),Z=(Min=60.000000,Max=60.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + End Object + Emitters(0)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleProjectile.SpriteEmitter0' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter1 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.800000,Max=0.800000)) + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=9.000000,Max=9.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + StartSizeRange=(X=(Min=14.60000,Max=14.60000),Y=(Min=14.60000,Max=14.60000),Z=(Min=14.60000,Max=14.600000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'XEffectMat.Shock.shock_mark_heat' + End Object + Emitters(1)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleProjectile.SpriteEmitter1' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter2 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.000000,Max=0.000000),Y=(Min=0.450000,Max=0.450000)) + Opacity=0.400000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=-9.000000,Max=-9.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + StartSizeRange=(X=(Min=90.000000,Max=90.000000),Y=(Min=90.000000,Max=90.000000),Z=(Min=90.000000,Max=90.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + End Object + Emitters(2)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleProjectile.SpriteEmitter2' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter3 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.840000,Max=0.840000),Y=(Min=0.000000,Max=0.000000),Z=(Min=0.800000,Max=0.800000)) + Opacity=0.260000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=-9.000000,Max=-9.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + StartSizeRange=(X=(Min=40.000000,Max=40.000000),Y=(Min=40.000000,Max=40.000000),Z=(Min=40.000000,Max=40.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.EclipseCircle' + End Object + Emitters(3)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleProjectile.SpriteEmitter3' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter4 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.800000,Max=0.800000)) + Opacity=0.200000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=0.680000) + SpinsPerSecondRange=(X=(Min=9.000000,Max=9.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + StartSizeRange=(X=(Min=20.000000,Max=20.000000),Y=(Min=20.000000,Max=20.000000),Z=(Min=20.000000,Max=20.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.PurpleSwell' + End Object + Emitters(4)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleProjectile.SpriteEmitter4' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter5 + SpinParticles=True + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(X=(Min=0.800000,Max=0.800000)) + Opacity=0.130000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinCCWorCW=(X=1.000000) + SpinsPerSecondRange=(X=(Min=0.050000,Max=0.050000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(Y=(Max=1.000000),Z=(Max=1.000000)) + StartSizeRange=(X=(Min=100.000000,Max=100.000000),Y=(Min=100.000000,Max=100.000000),Z=(Min=100.000000,Max=100.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'EpicParticles.Flares.FlickerFlare2' + End Object + Emitters(5)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_ShockRifleProjectile.SpriteEmitter5' + + bNoDelete=False +} diff --git a/Sources/Classes/FX_ShockRifleProjectileMuzFlash.uc b/Sources/Classes/FX_ShockRifleProjectileMuzFlash.uc new file mode 100644 index 0000000..a9e7345 --- /dev/null +++ b/Sources/Classes/FX_ShockRifleProjectileMuzFlash.uc @@ -0,0 +1,12 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class FX_ShockRifleProjectileMuzFlash extends ShockProjMuzFlash; + +defaultproperties +{ + Skins(0)=FinalBlend'UT2341Weapons_Tex.ASMD.ASMDMuzFlash1stFinal' +} diff --git a/Sources/Classes/FX_SniperRifleBeamEffect.uc b/Sources/Classes/FX_SniperRifleBeamEffect.uc new file mode 100644 index 0000000..d68ab1f --- /dev/null +++ b/Sources/Classes/FX_SniperRifleBeamEffect.uc @@ -0,0 +1,88 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class FX_SniperRifleBeamEffect extends xEmitter; + +var vector HitNormal; + +replication +{ + reliable if(bNetInitial && Role == ROLE_Authority) + HitNormal; +} + +simulated function PostNetBeginPlay() +{ + if (Role < ROLE_Authority) + SpawnEffects(); +} + +function AimAt(Vector hl, Vector hn, float Charge) +{ + HitNormal = hn; + mSpawnVecA = hl; + + if (Level.NetMode != NM_DedicatedServer) + SpawnEffects(); +} + + +simulated function SpawnImpactEffects(rotator HitRot, vector EffectLoc) +{ + Spawn(class'pclImpactSmoke',,, EffectLoc, HitRot); +} + +simulated function bool CheckMaxEffectDistance(PlayerController P, vector SpawnLocation) +{ + return !P.BeyondViewDistance(SpawnLocation,3000); +} + +simulated function SpawnEffects() +{ + local xWeaponAttachment Attachment; + + if (Instigator != None) + { + if ( Instigator.IsFirstPerson() ) + { + if ( (Instigator.Weapon == None) || Instigator.Weapon.WeaponCentered() || (Instigator.Weapon.Instigator == None) ) + SetLocation( Instigator.Location ); + else + SetLocation( Instigator.Weapon.GetEffectStart() ); + } + else + { + Attachment = xPawn(Instigator).WeaponAttachment; + if ( Attachment != None && (Level.TimeSeconds - Attachment.LastRenderTime) < 1 ) + SetLocation( Attachment.GetTipLocation() ); + else + SetLocation( Instigator.Location ); + } + } + + if (EffectIsRelevant(mSpawnVecA + HitNormal*2,false) && HitNormal != Vect(0,0,0)) + SpawnImpactEffects(Rotator(HitNormal), mSpawnVecA + HitNormal*2); +} + +defaultproperties +{ + mParticleType=PT_Beam + mMaxParticles=3 + mLifeRange(0)=0.100000 + mRegenDist=150.000000 + mSizeRange(0)=2.000000 + mSizeRange(1)=2.000000 + mColorRange(0)=(B=0) + mColorRange(1)=(B=0) + mAttenKa=0.100000 + bReplicateInstigator=True + bReplicateMovement=False + RemoteRole=ROLE_SimulatedProxy + NetPriority=3.000000 + LifeSpan=0.100000 + Skins(0)=Texture'XEffectMat.Ion.painter_beam' + Style=STY_Additive +} diff --git a/Sources/Classes/FX_SniperRifleBeamEffectBlue.uc b/Sources/Classes/FX_SniperRifleBeamEffectBlue.uc new file mode 100644 index 0000000..4172df7 --- /dev/null +++ b/Sources/Classes/FX_SniperRifleBeamEffectBlue.uc @@ -0,0 +1,11 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class FX_SniperRifleBeamEffectBlue extends FX_SniperRifleBeamEffect; + +defaultproperties +{ +} diff --git a/Sources/Classes/FX_SniperRifleMuzFlash.uc b/Sources/Classes/FX_SniperRifleMuzFlash.uc new file mode 100644 index 0000000..4028a06 --- /dev/null +++ b/Sources/Classes/FX_SniperRifleMuzFlash.uc @@ -0,0 +1,120 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class FX_SniperRifleMuzFlash extends Emitter; + +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter10 + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UniformSize=True + AutomaticInitialSpawning=False + TriggerDisabled=False + Acceleration=(X=6.000000,Z=80.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.080000 + FadeOutStartTime=0.120000 + FadeInEndTime=0.120000 + MaxParticles=16 + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=0.610000,RelativeSize=-2.000000) + StartSizeRange=(X=(Min=14.000000,Max=14.000000),Y=(Min=14.000000,Max=14.000000),Z=(Min=14.000000,Max=14.000000)) + DrawStyle=PTDS_AlphaBlend + Texture=Texture'EpicParticles.Smoke.Smokepuff' + LifetimeRange=(Min=1.100000,Max=1.100000) + SpawnOnTriggerRange=(Min=7.000000,Max=7.000000) + SpawnOnTriggerPPS=7.000000 + End Object + Emitters(0)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_SniperRifleMuzFlash.SpriteEmitter10' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter14 + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + TriggerDisabled=False + 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.070000 + FadeOutStartTime=0.800000 + FadeInEndTime=0.240000 + MaxParticles=7 + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=3.000000) + StartSizeRange=(X=(Min=16.000000,Max=16.000000),Y=(Min=16.000000,Max=16.000000),Z=(Min=16.000000,Max=16.000000)) + DrawStyle=PTDS_AlphaBlend + Texture=Texture'EpicParticles.Smoke.Smokepuff' + LifetimeRange=(Min=2.000000,Max=2.000000) + SpawnOnTriggerRange=(Min=7.000000,Max=7.000000) + SpawnOnTriggerPPS=7.000000 + End Object + Emitters(1)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_SniperRifleMuzFlash.SpriteEmitter14' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter12 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + TriggerDisabled=False + 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)) + ColorMultiplierRange=(Y=(Min=0.800000,Max=0.800000),Z=(Min=0.400000,Max=0.400000)) + Opacity=0.500000 + FadeOutStartTime=0.110550 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=0.500000,Max=0.500000)) + SizeScale(0)=(RelativeTime=0.280000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=20.000000,Max=20.000000),Y=(Min=20.000000,Max=20.000000),Z=(Min=20.000000,Max=20.000000)) + Texture=Texture'XEffects.Skins.MuzFlashFlak_t' + LifetimeRange=(Min=0.201000,Max=0.201000) + SpawnOnTriggerRange=(Min=1.000000,Max=1.000000) + SpawnOnTriggerPPS=50000.000000 + End Object + Emitters(2)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_SniperRifleMuzFlash.SpriteEmitter12' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter13 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + TriggerDisabled=False + 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)) + ColorMultiplierRange=(Y=(Min=0.700000,Max=0.700000),Z=(Min=0.300000,Max=0.300000)) + Opacity=0.600000 + FadeOutStartTime=0.110550 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Min=0.300000,Max=0.300000)) + SizeScale(0)=(RelativeTime=0.370000,RelativeSize=2.000000) + StartSizeRange=(X=(Min=80.000000,Max=80.000000),Y=(Min=80.000000,Max=80.000000),Z=(Min=80.000000,Max=80.000000)) + Texture=Texture'EpicParticles.Flares.FlashFlare1' + LifetimeRange=(Min=0.201000,Max=0.201000) + SpawnOnTriggerRange=(Min=1.000000,Max=1.000000) + SpawnOnTriggerPPS=50000.000000 + End Object + Emitters(3)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_SniperRifleMuzFlash.SpriteEmitter13' + + bNoDelete=False + bHardAttach=True +} diff --git a/Sources/Classes/FX_SniperTracerTrail.uc b/Sources/Classes/FX_SniperTracerTrail.uc new file mode 100644 index 0000000..1c5ebd5 --- /dev/null +++ b/Sources/Classes/FX_SniperTracerTrail.uc @@ -0,0 +1,15 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class FX_SniperTracerTrail extends TransTrail; + +defaultproperties +{ + mLifeRange(0)=0.250000 + mLifeRange(1)=0.250000 + mColorRange(0)=(B=10,G=10,R=180) + mColorRange(1)=(B=10,G=10,R=180) +} diff --git a/Sources/Classes/FX_SniperTracerTrailBlue.uc b/Sources/Classes/FX_SniperTracerTrailBlue.uc new file mode 100644 index 0000000..e7eda12 --- /dev/null +++ b/Sources/Classes/FX_SniperTracerTrailBlue.uc @@ -0,0 +1,13 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class FX_SniperTracerTrailBlue extends FX_SniperTracerTrail; + +defaultproperties +{ + mColorRange(0)=(B=180,R=10) + mColorRange(1)=(B=180,R=10) +} diff --git a/Sources/Classes/FX_SniperWallHitEffect.uc b/Sources/Classes/FX_SniperWallHitEffect.uc new file mode 100644 index 0000000..782f175 --- /dev/null +++ b/Sources/Classes/FX_SniperWallHitEffect.uc @@ -0,0 +1,56 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class FX_SniperWallHitEffect extends SniperWallHitEffect; + +simulated function SpawnEffects() +{ + local rotator ReverseRot; + local PlayerController PC; + local vector Dir, LinePos, LineDir; + local bool bViewed; + + PlaySound(ImpactSounds[Rand(6)],, 2.5*TransientSoundVolume,,200); + + PC = Level.GetLocalPlayerController(); + if ( (PC != None) && (PC.ViewTarget != None) && (VSize(PC.Viewtarget.Location - Location) < 3000*PC.FOVBias) ) + { + Spawn(class'LongBulletDecal'); + bViewed = true; + } + + if ( !PhysicsVolume.bWaterVolume ) + { + ReverseRot = rotator(-1 * vector(Rotation)); + if ( bViewed ) + Spawn(class'pclImpactSmoke',,,,ReverseRot); + Spawn(class'SmallExplosion',,,,ReverseRot); + Spawn(class'WallSparks',,,,ReverseRot); + } + + if ( FireStart != vect(0,0,0) ) + { + // see if local player controller near bullet, but missed + if ( (PC != None) && (PC.Pawn != None) ) + { + Dir = Normal(Location - FireStart); + LinePos = (FireStart + (Dir dot (PC.Pawn.Location - FireStart)) * Dir); + LineDir = PC.Pawn.Location - LinePos; + if ( VSize(LineDir) < 150 ) + { + SetLocation(LinePos); + if ( FRand() < 0.5 ) + PlaySound(sound'Impact3Snd',,,,80); + else + PlaySound(sound'Impact7Snd',,,,80); + } + } + } +} + +defaultproperties +{ +} diff --git a/Sources/Classes/FX_SuperShockMuzFlash.uc b/Sources/Classes/FX_SuperShockMuzFlash.uc new file mode 100644 index 0000000..64df8ee --- /dev/null +++ b/Sources/Classes/FX_SuperShockMuzFlash.uc @@ -0,0 +1,8 @@ +class FX_SuperShockMuzFlash extends ShockMuzFlash; + +#exec OBJ LOAD FILE=XEffectMat.utx + +defaultproperties +{ + Skins(0)=Texture'UT2341Weapons_Tex.SuperShock.SuperShockSparkle' +} diff --git a/Sources/Classes/FX_SuperShockMuzFlash3rd.uc b/Sources/Classes/FX_SuperShockMuzFlash3rd.uc new file mode 100644 index 0000000..35e4c3a --- /dev/null +++ b/Sources/Classes/FX_SuperShockMuzFlash3rd.uc @@ -0,0 +1,6 @@ +class FX_SuperShockMuzFlash3rd extends ShockMuzFlash3rd; + +defaultproperties +{ + Skins(0)=Texture'UT2341Weapons_Tex.SuperShock.SuperShockSparkle' +} diff --git a/Sources/Classes/FX_SuperShockRifleBeamEffect.uc b/Sources/Classes/FX_SuperShockRifleBeamEffect.uc new file mode 100644 index 0000000..3b262f4 --- /dev/null +++ b/Sources/Classes/FX_SuperShockRifleBeamEffect.uc @@ -0,0 +1,60 @@ +// xEmitter version +class FX_SuperShockRifleBeamEffect extends ShockBeamEffect; + +simulated function SpawnImpactEffects(rotator HitRot, vector EffectLoc) +{ + //Spawn(class'ShockImpactFlare',,, EffectLoc, HitRot); + //Spawn(class'ShockImpactRing',,, EffectLoc, HitRot); + //Spawn(class'ShockImpactScorch',,, EffectLoc, Rotator(-HitNormal)); + //Spawn(class'ShockExplosionCore',,, EffectLoc+HitNormal*8, HitRot); + Spawn(class'FX_SuperShockRifleImpact',,, EffectLoc, HitRot); +} + +simulated function SpawnEffects() +{ + local ShockBeamCoil Coil; + local xWeaponAttachment Attachment; + + if (Instigator != None) + { + if ( Instigator.IsFirstPerson() ) + { + if ( (Instigator.Weapon != None) && (Instigator.Weapon.Instigator == Instigator) ) + SetLocation(Instigator.Weapon.GetEffectStart()); + else + SetLocation(Instigator.Location); + log("Attempting to spawn MuzFlash"); + Spawn(MuzFlashClass,,, Location); + } + else + { + Attachment = xPawn(Instigator).WeaponAttachment; + if (Attachment != None && (Level.TimeSeconds - Attachment.LastRenderTime) < 1) + SetLocation(Attachment.GetTipLocation()); + else + SetLocation(Instigator.Location + Instigator.EyeHeight*Vect(0,0,1) + Normal(mSpawnVecA - Instigator.Location) * 25.0); + log("Attempting to spawn MuzFlash3"); + Spawn(MuzFlash3Class); + } + } + + if ( EffectIsRelevant(mSpawnVecA + HitNormal*2,false) && (HitNormal != Vect(0,0,0)) ) + SpawnImpactEffects(Rotator(HitNormal),mSpawnVecA + HitNormal*2); + + if ( (!Level.bDropDetail && (Level.DetailMode != DM_Low) && (VSize(Location - mSpawnVecA) > 40) && !Level.GetLocalPlayerController().BeyondViewDistance(Location,0)) + || ((Instigator != None) && Instigator.IsFirstPerson()) ) + { + Coil = Spawn(CoilClass,,, Location, Rotation); + if (Coil != None) + Coil.mSpawnVecA = mSpawnVecA; + } +} + +defaultproperties +{ + CoilClass=Class'XEffects.ShockBeamCoilB' + MuzFlashClass=Class'UT2341WeaponsReducedv1a.FX_SuperShockMuzFlash' + MuzFlash3Class=Class'UT2341WeaponsReducedv1a.FX_SuperShockMuzFlash3rd' + Texture=Texture'UT2341Weapons_Tex.SuperShock.SuperShockBeamTex' + Skins(0)=Texture'UT2341Weapons_Tex.SuperShock.SuperShockBeamTex' +} diff --git a/Sources/Classes/FX_SuperShockRifleBeamMuzFlash.uc b/Sources/Classes/FX_SuperShockRifleBeamMuzFlash.uc new file mode 100644 index 0000000..e2d4245 --- /dev/null +++ b/Sources/Classes/FX_SuperShockRifleBeamMuzFlash.uc @@ -0,0 +1,75 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class FX_SuperShockRifleBeamMuzFlash extends ShockBeamMuzFlash; + + +/* + Begin Object Class=SpriteEmitter Name=SpriteEmitter22 + FadeOut=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + 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)) + ColorMultiplierRange=(X=(Min=0.300000,Max=0.300000),Y=(Min=0.700000,Max=0.700000)) + FadeOutStartTime=0.060000 + MaxParticles=1 + Name="ShockMuzzle" + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=3.000000) + StartSizeRange=(X=(Min=6.000000,Max=6.000000),Y=(Min=6.000000,Max=6.000000),Z=(Min=6.000000,Max=6.000000)) + Texture=Texture'XEffectMat.Shock.ShockComboFlash' + LifetimeRange=(Min=0.400000,Max=0.400000) + End Object + Emitters(0)=SpriteEmitter'SpriteEmitter22' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter23 + FadeOut=True + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + 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)) + ColorMultiplierRange=(X=(Min=0.600000,Max=0.600000),Y=(Min=0.800000,Max=0.800000)) + Opacity=0.800000 + FadeOutStartTime=0.060000 + MaxParticles=1 + Name="ShockFlare" + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=3.000000) + StartSizeRange=(X=(Min=12.000000,Max=12.000000),Y=(Min=12.000000,Max=12.000000),Z=(Min=12.000000,Max=12.000000)) + Texture=Texture'EpicParticles.Flares.BurnFlare1' + LifetimeRange=(Min=0.400000,Max=0.400000) + End Object + Emitters(1)=SpriteEmitter'SpriteEmitter23' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter24 + FadeOut=True + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + 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)) + ColorMultiplierRange=(X=(Min=0.700000,Max=0.700000),Y=(Min=0.600000,Max=0.600000)) + Opacity=0.590000 + FadeOutStartTime=0.060000 + MaxParticles=1 + Name="SpriteEmitter24" + SpinsPerSecondRange=(X=(Max=0.010000)) + StartSpinRange=(X=(Max=0.700000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=3.000000) + StartSizeRange=(X=(Min=16.000000,Max=16.000000),Y=(Min=16.000000,Max=16.000000),Z=(Min=16.000000,Max=16.000000)) + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar2' + LifetimeRange=(Min=0.400000,Max=0.400000) + End Object + Emitters(2)=SpriteEmitter'SpriteEmitter24' + */ + +defaultproperties +{ + Skins(0)=FinalBlend'UT2341Weapons_Tex.SuperShock.SuperShockFlashFinal' +} diff --git a/Sources/Classes/FX_SuperShockRifleImpact.uc b/Sources/Classes/FX_SuperShockRifleImpact.uc new file mode 100644 index 0000000..ab0968d --- /dev/null +++ b/Sources/Classes/FX_SuperShockRifleImpact.uc @@ -0,0 +1,281 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class FX_SuperShockRifleImpact extends Emitter; + +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter27 + UseCollision=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(X=-1500.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)) + ColorMultiplierRange=(Y=(Min=0.400000,Max=0.400000),Z=(Min=0.000000,Max=0.000000)) + FadeOutStartTime=0.800000 + SpinCCWorCW=(X=0.750000) + SpinsPerSecondRange=(X=(Min=0.500000,Max=1.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScale(0)=(RelativeTime=0.140000,RelativeSize=0.100000) + SizeScaleRepeats=1.000000 + StartSizeRange=(X=(Min=12.000000,Max=12.000000),Y=(Min=12.000000,Max=12.000000),Z=(Min=12.000000,Max=12.000000)) + InitialParticlesPerSecond=5000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=2.000000,Max=2.000000) + End Object + Emitters(0)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_SuperShockRifleImpact.SpriteEmitter27' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter28 + UseCollision=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(Z=-1500.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)) + ColorMultiplierRange=(Y=(Min=0.400000,Max=0.400000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.860000 + FadeOutStartTime=0.800000 + SpinCCWorCW=(X=0.750000) + SpinsPerSecondRange=(X=(Min=0.500000,Max=1.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScale(0)=(RelativeTime=0.140000,RelativeSize=0.100000) + SizeScaleRepeats=1.000000 + StartSizeRange=(X=(Min=18.000000,Max=18.000000),Y=(Min=18.000000,Max=18.000000),Z=(Min=18.000000,Max=18.000000)) + InitialParticlesPerSecond=5000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=2.000000,Max=2.000000) + StartVelocityRange=(X=(Min=-400.000000,Max=700.000000),Y=(Min=-400.000000,Max=400.000000),Z=(Min=-300.000000,Max=400.000000)) + End Object + Emitters(1)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_SuperShockRifleImpact.SpriteEmitter28' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter29 + UseDirectionAs=PTDU_Normal + ProjectionNormal=(X=1.000000,Z=0.000000) + FadeOut=True + RespawnDeadParticles=False + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(Y=(Min=0.400000,Max=0.400000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.490000 + FadeOutStartTime=0.600000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Max=0.200000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=30.000000,Max=30.000000),Y=(Min=30.000000,Max=30.000000),Z=(Min=30.000000,Max=30.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.AirBlast' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(2)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_SuperShockRifleImpact.SpriteEmitter29' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter31 + UseDirectionAs=PTDU_Normal + ProjectionNormal=(X=1.000000,Z=0.000000) + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(Y=(Min=0.400000,Max=0.400000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.880000 + FadeOutStartTime=0.600000 + FadeInEndTime=0.060000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Max=0.200000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=50.000000,Max=50.000000),Y=(Min=50.000000,Max=50.000000),Z=(Min=50.000000,Max=50.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.HardSpot' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(3)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_SuperShockRifleImpact.SpriteEmitter31' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter32 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(Y=(Min=0.400000,Max=0.400000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.790000 + FadeOutStartTime=0.600000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + StartLocationRange=(Z=(Min=10.000000,Max=10.000000)) + SpinsPerSecondRange=(X=(Min=0.500000,Max=0.900000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=20.000000,Max=20.000000),Y=(Min=20.000000,Max=20.000000),Z=(Min=20.000000,Max=20.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(4)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_SuperShockRifleImpact.SpriteEmitter32' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter33 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(Y=(Min=0.400000,Max=0.400000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.790000 + FadeOutStartTime=0.600000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + StartLocationRange=(Z=(Min=10.000000,Max=10.000000)) + SpinsPerSecondRange=(X=(Min=0.900000,Max=2.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=20.000000,Max=20.000000),Y=(Min=20.000000,Max=20.000000),Z=(Min=20.000000,Max=20.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(5)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_SuperShockRifleImpact.SpriteEmitter33' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter34 + UseDirectionAs=PTDU_Normal + ProjectionNormal=(X=1.000000,Z=0.000000) + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(Y=(Min=0.400000,Max=0.400000),Z=(Min=0.000000,Max=0.000000)) + Opacity=0.790000 + FadeOutStartTime=0.600000 + FadeInEndTime=0.060000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Max=0.200000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=74.000000,Max=74.000000),Y=(Min=74.000000,Max=74.000000),Z=(Min=74.000000,Max=74.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar2' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(6)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_SuperShockRifleImpact.SpriteEmitter34' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter35 + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(Y=(Min=0.600000,Max=0.600000),Z=(Min=0.200000,Max=0.200000)) + Opacity=0.490000 + FadeOutStartTime=0.600000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + StartLocationRange=(Z=(Min=20.000000,Max=20.000000)) + SpinsPerSecondRange=(X=(Min=0.100000,Max=0.100000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=20.000000,Max=20.000000),Y=(Min=20.000000,Max=20.000000),Z=(Min=20.000000,Max=20.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'EpicParticles.Flares.FlashFlare1' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(7)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_SuperShockRifleImpact.SpriteEmitter35' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter41 + UseDirectionAs=PTDU_Normal + ProjectionNormal=(X=1.000000,Z=0.000000) + FadeOut=True + RespawnDeadParticles=False + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(Y=(Min=0.600000,Max=0.600000),Z=(Min=0.200000,Max=0.200000)) + Opacity=0.370000 + FadeOutStartTime=0.600000 + CoordinateSystem=PTCS_Relative + MaxParticles=1 + SpinsPerSecondRange=(X=(Max=0.200000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=34.000000,Max=34.000000),Y=(Min=34.000000,Max=34.000000),Z=(Min=34.000000,Max=34.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.AirBlast' + LifetimeRange=(Min=1.000000,Max=1.000000) + End Object + Emitters(8)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_SuperShockRifleImpact.SpriteEmitter41' + + Begin Object Class=BeamEmitter Name=BeamEmitter6 + BeamDistanceRange=(Min=200.000000,Max=200.000000) + DetermineEndPointBy=PTEP_Distance + LowFrequencyNoiseRange=(X=(Max=10.000000),Y=(Max=10.000000),Z=(Max=10.000000)) + LowFrequencyPoints=2 + HighFrequencyNoiseRange=(X=(Min=-10.000000,Max=10.000000),Y=(Min=-10.000000,Max=10.000000),Z=(Min=-10.000000,Max=10.000000)) + HFScaleFactors(0)=(FrequencyScale=(X=0.400000,Y=0.400000,Z=0.400000),RelativeLength=0.280000) + UseHighFrequencyScale=True + BranchProbability=(Min=1.000000,Max=1.000000) + BranchSpawnAmountRange=(Min=5.000000,Max=5.000000) + LinkupLifetime=True + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + 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)) + ColorMultiplierRange=(Y=(Min=0.600000,Max=0.600000),Z=(Min=0.200000,Max=0.200000)) + Opacity=0.380000 + FadeOutStartTime=2.000000 + FadeInEndTime=2.000000 + CoordinateSystem=PTCS_Relative + StartLocationShape=PTLS_Sphere + SphereRadiusRange=(Max=25.000000) + SizeScale(0)=(RelativeTime=0.520000,RelativeSize=-1.000000) + SizeScaleRepeats=1.000000 + StartSizeRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000)) + InitialParticlesPerSecond=1000.000000 + Texture=Texture'AW-2004Particles.Energy.BeamBolt1a' + LifetimeRange=(Min=0.500000,Max=0.750000) + StartVelocityRange=(X=(Min=-20.000000,Max=20.000000),Y=(Min=-20.000000,Max=20.000000),Z=(Min=-20.000000,Max=20.000000)) + End Object + Emitters(9)=BeamEmitter'UT2341WeaponsReducedv1a.FX_SuperShockRifleImpact.BeamEmitter6' + + bNoDelete=False +} diff --git a/Sources/Classes/FX_SuperShockRifleMuzFlash3rd.uc b/Sources/Classes/FX_SuperShockRifleMuzFlash3rd.uc new file mode 100644 index 0000000..6aab43e --- /dev/null +++ b/Sources/Classes/FX_SuperShockRifleMuzFlash3rd.uc @@ -0,0 +1,42 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class FX_SuperShockRifleMuzFlash3rd extends ShockProjMuzFlash3rd; + +/* +defaultproperties +{ + mNumPerFlash=1 + mParticleType=PT_Mesh + mStartParticles=0 + mMaxParticles=6 + mLifeRange(0)=0.130000 + mLifeRange(1)=0.130000 + mRegenRange(0)=0.000000 + mRegenRange(1)=0.000000 + mSpawnVecB=(Z=0.000000) + mSpeedRange(0)=0.000000 + mSpeedRange(1)=0.000000 + mPosRelative=True + mAirResistance=0.000000 + mRandOrient=True + mSizeRange(0)=0.350000 + mSizeRange(1)=0.400000 + mGrowthRate=3.200000 + mColorRange(0)=(R=50) + mColorRange(1)=(R=50) + mAttenKa=0.000000 + mRandTextures=True + mMeshNodes(0)=StaticMesh'XEffects.MinigunFlashMesh' + Skins(0)=FinalBlend'XGameShaders.WeaponShaders.ShockMuzFlash3rdFinal' + Style=STY_Additive +} +*/ + +defaultproperties +{ + Skins(0)=FinalBlend'UT2341Weapons_Tex.SuperShock.SuperShockFlash3rdFinal' +} diff --git a/Sources/Classes/FX_UT2341WarpEffectBlue.uc b/Sources/Classes/FX_UT2341WarpEffectBlue.uc new file mode 100644 index 0000000..865b956 --- /dev/null +++ b/Sources/Classes/FX_UT2341WarpEffectBlue.uc @@ -0,0 +1,190 @@ +class FX_UT2341WarpEffectBlue extends Emitter; + +function PostBeginPlay() +{ + If ( Role == ROLE_Authority ) + Instigator = Pawn(Owner); + if ( Level.NetMode == NM_DedicatedServer ) + LifeSpan = 0.15; + Super.PostBeginPlay(); +} + +simulated function PostNetBeginPlay() +{ + local PlayerController PC; + local float Dist; + + if ( Instigator != None ) + { + SetLocation(Instigator.Location); + SetBase(Instigator); + if ( (Level.NetMode == NM_Standalone) || (Level.NetMode == NM_Client) ) + { + PC = Level.GetLocalPlayerController(); + if ( (PC != None) && (PC.ViewTarget != None) ) + { + Dist = VSize(PC.ViewTarget.Location - Location); + if ( Dist > PC.Region.Zone.DistanceFogEnd ) + LifeSpan = 0.01; + } + } + } + PlaySound(Sound'UT2341Weapons_Sounds.General.Resp2a',SLOT_None); + Super.PostNetBeginPlay(); +} + +defaultproperties +{ + Begin Object Class=MeshEmitter Name=MeshEmitter0 + StaticMesh=StaticMesh'XEffects.TeleRing' + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + Acceleration=(Z=12.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)) + ColorMultiplierRange=(X=(Min=0.080000,Max=0.080000),Y=(Min=0.190000,Max=0.190000)) + FadeOutStartTime=0.200000 + MaxParticles=3 + SpinCCWorCW=(Y=0.000000,Z=0.000000) + SpinsPerSecondRange=(X=(Min=1.000000,Max=2.000000),Z=(Min=0.010000,Max=0.020000)) + StartSpinRange=(X=(Min=-1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.370000,RelativeSize=1.100000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.200000) + StartSizeRange=(X=(Min=0.800000,Max=0.800000),Y=(Min=0.800000,Max=0.800000),Z=(Min=0.800000,Max=0.800000)) + InitialParticlesPerSecond=5000.000000 + LifetimeRange=(Min=1.250000,Max=1.250000) + StartVelocityRange=(Z=(Min=-10.000000,Max=-10.000000)) + End Object + Emitters(0)=MeshEmitter'UT2341WeaponsReducedv1a.FX_UT2341WarpEffectBlue.MeshEmitter0' + + Begin Object Class=MeshEmitter Name=MeshEmitter1 + StaticMesh=StaticMesh'XEffects.TeleRing' + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + Acceleration=(Z=12.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)) + ColorMultiplierRange=(X=(Min=0.080000,Max=0.080000),Y=(Min=0.290000,Max=0.290000)) + FadeOutStartTime=0.200000 + MaxParticles=3 + StartLocationRange=(Z=(Min=40.000000,Max=40.000000)) + SpinCCWorCW=(Y=0.000000,Z=0.000000) + SpinsPerSecondRange=(X=(Min=1.000000,Max=2.000000),Z=(Min=0.010000,Max=0.020000)) + StartSpinRange=(X=(Min=-1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.370000,RelativeSize=1.100000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.200000) + StartSizeRange=(X=(Min=0.750000,Max=0.750000),Y=(Min=0.750000,Max=0.750000),Z=(Min=0.750000,Max=0.750000)) + InitialParticlesPerSecond=5000.000000 + LifetimeRange=(Min=1.250000,Max=1.250000) + InitialDelayRange=(Max=0.100000) + StartVelocityRange=(Z=(Min=-10.000000,Max=-10.000000)) + End Object + Emitters(1)=MeshEmitter'UT2341WeaponsReducedv1a.FX_UT2341WarpEffectBlue.MeshEmitter1' + + Begin Object Class=MeshEmitter Name=MeshEmitter2 + StaticMesh=StaticMesh'XEffects.TeleRing' + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + Acceleration=(Z=12.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)) + ColorMultiplierRange=(X=(Min=0.180000,Max=0.180000),Y=(Min=0.300000,Max=0.300000)) + FadeOutStartTime=0.200000 + MaxParticles=3 + StartLocationRange=(Z=(Min=-40.000000,Max=-40.000000)) + SpinCCWorCW=(Y=0.000000,Z=0.000000) + SpinsPerSecondRange=(X=(Min=1.000000,Max=2.000000),Z=(Min=0.010000,Max=0.020000)) + StartSpinRange=(X=(Min=-1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.370000,RelativeSize=1.050000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.200000) + StartSizeRange=(X=(Min=0.750000,Max=0.750000),Y=(Min=0.750000,Max=0.750000),Z=(Min=0.750000,Max=0.750000)) + InitialParticlesPerSecond=5000.000000 + LifetimeRange=(Min=1.250000,Max=1.250000) + InitialDelayRange=(Max=0.100000) + StartVelocityRange=(Z=(Min=-10.000000,Max=-10.000000)) + End Object + Emitters(2)=MeshEmitter'UT2341WeaponsReducedv1a.FX_UT2341WarpEffectBlue.MeshEmitter2' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter2 + UseCollision=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(X=10.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.800000 + FadeOutFactor=(Z=0.000000) + FadeOutStartTime=1.360000 + MaxParticles=15 + StartLocationRange=(X=(Min=-20.100000,Max=20.100000),Y=(Min=-20.000000,Max=20.000000),Z=(Min=-60.000000,Max=60.000000)) + SpinCCWorCW=(X=0.750000) + SpinsPerSecondRange=(X=(Min=0.500000,Max=1.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=0.100000) + StartSizeRange=(X=(Min=16.000000,Max=16.000000),Y=(Min=16.000000,Max=16.000000),Z=(Min=16.000000,Max=16.000000)) + InitialParticlesPerSecond=5000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=1.300000,Max=1.300000) + StartVelocityRange=(X=(Min=-30.000000,Max=40.000000),Y=(Min=-60.000000,Max=60.000000),Z=(Min=-20.000000,Max=20.000000)) + End Object + Emitters(3)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_UT2341WarpEffectBlue.SpriteEmitter2' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter3 + UseCollision=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(X=10.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)) + ColorMultiplierRange=(X=(Min=0.400000,Max=0.400000),Y=(Min=0.600000,Max=0.600000)) + Opacity=0.800000 + FadeOutStartTime=0.400000 + MaxParticles=15 + StartLocationRange=(X=(Min=-20.000000,Max=20.000000),Y=(Min=-30.000000,Max=30.000000),Z=(Min=-60.000000,Max=60.000000)) + SpinCCWorCW=(X=0.750000) + SpinsPerSecondRange=(X=(Min=0.500000,Max=1.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=0.100000) + StartSizeRange=(X=(Min=21.000000,Max=21.000000),Y=(Min=21.000000,Max=21.000000),Z=(Min=21.000000,Max=21.000000)) + InitialParticlesPerSecond=5000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=1.600000,Max=1.600000) + InitialDelayRange=(Max=0.100000) + StartVelocityRange=(X=(Min=-30.000000,Max=40.000000),Y=(Min=-60.000000,Max=60.000000),Z=(Min=-20.000000,Max=20.000000)) + End Object + Emitters(4)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_UT2341WarpEffectBlue.SpriteEmitter3' + + AutoDestroy=True + bNoDelete=False + bNetTemporary=True + bReplicateInstigator=True + RemoteRole=ROLE_SimulatedProxy +} diff --git a/Sources/Classes/FX_UT2341WarpEffectRed.uc b/Sources/Classes/FX_UT2341WarpEffectRed.uc new file mode 100644 index 0000000..22f7332 --- /dev/null +++ b/Sources/Classes/FX_UT2341WarpEffectRed.uc @@ -0,0 +1,194 @@ +class FX_UT2341WarpEffectRed extends Emitter; + +function PostBeginPlay() +{ + If ( Role == ROLE_Authority ) + Instigator = Pawn(Owner); + if ( Level.NetMode == NM_DedicatedServer ) + LifeSpan = 0.15; + Super.PostBeginPlay(); +} + +simulated function PostNetBeginPlay() +{ + local PlayerController PC; + local float Dist; + + if ( Instigator != None ) + { + SetLocation(Instigator.Location); + SetBase(Instigator); + if ( (Level.NetMode == NM_Standalone) || (Level.NetMode == NM_Client) ) + { + PC = Level.GetLocalPlayerController(); + if ( (PC != None) && (PC.ViewTarget != None) ) + { + Dist = VSize(PC.ViewTarget.Location - Location); + if ( Dist > PC.Region.Zone.DistanceFogEnd ) + LifeSpan = 0.01; + } + } + } + PlaySound(Sound'UT2341Weapons_Sounds.General.Resp2a',SLOT_None); + Super.PostNetBeginPlay(); +} + +defaultproperties +{ + Begin Object Class=MeshEmitter Name=MeshEmitter0 + StaticMesh=StaticMesh'XEffects.TeleRing' + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + Acceleration=(Z=12.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)) + ColorMultiplierRange=(Y=(Min=0.190000,Max=0.190000),Z=(Min=0.080000,Max=0.080000)) + FadeOutStartTime=0.800000 + MaxParticles=3 + SpinCCWorCW=(Y=0.000000,Z=0.000000) + SpinsPerSecondRange=(X=(Min=1.000000,Max=2.000000),Z=(Min=0.010000,Max=0.020000)) + StartSpinRange=(X=(Min=-1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.370000,RelativeSize=1.100000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.200000) + StartSizeRange=(X=(Min=0.800000,Max=0.800000),Y=(Min=0.800000,Max=0.800000),Z=(Min=0.800000,Max=0.800000)) + InitialParticlesPerSecond=5000.000000 + LifetimeRange=(Min=1.250000,Max=1.250000) + StartVelocityRange=(Z=(Min=-10.000000,Max=-10.000000)) + End Object + Emitters(0)=MeshEmitter'UT2341WeaponsReducedv1a.FX_UT2341WarpEffectRed.MeshEmitter0' + + Begin Object Class=MeshEmitter Name=MeshEmitter1 + StaticMesh=StaticMesh'XEffects.TeleRing' + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + Acceleration=(Z=12.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)) + ColorMultiplierRange=(Y=(Min=0.190000,Max=0.190000),Z=(Min=0.080000,Max=0.080000)) + FadeOutStartTime=1.000000 + FadeInEndTime=0.120000 + MaxParticles=3 + StartLocationRange=(Z=(Min=40.000000,Max=40.000000)) + SpinCCWorCW=(Y=0.000000,Z=0.000000) + SpinsPerSecondRange=(X=(Min=1.000000,Max=2.000000),Z=(Min=0.010000,Max=0.020000)) + StartSpinRange=(X=(Min=-1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.370000,RelativeSize=1.100000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.200000) + StartSizeRange=(X=(Min=0.750000,Max=0.750000),Y=(Min=0.750000,Max=0.750000),Z=(Min=0.750000,Max=0.750000)) + InitialParticlesPerSecond=5000.000000 + LifetimeRange=(Min=1.250000,Max=1.250000) + InitialDelayRange=(Max=0.100000) + StartVelocityRange=(Z=(Min=-10.000000,Max=-10.000000)) + End Object + Emitters(1)=MeshEmitter'UT2341WeaponsReducedv1a.FX_UT2341WarpEffectRed.MeshEmitter1' + + Begin Object Class=MeshEmitter Name=MeshEmitter2 + StaticMesh=StaticMesh'XEffects.TeleRing' + RenderTwoSided=True + UseParticleColor=True + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + AutomaticInitialSpawning=False + Acceleration=(Z=12.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)) + ColorMultiplierRange=(Y=(Min=0.190000,Max=0.190000),Z=(Min=0.080000,Max=0.080000)) + FadeOutStartTime=1.000000 + FadeInEndTime=0.120000 + MaxParticles=3 + StartLocationRange=(Z=(Min=-40.000000,Max=-40.000000)) + SpinCCWorCW=(Y=0.000000,Z=0.000000) + SpinsPerSecondRange=(X=(Min=1.000000,Max=2.000000),Z=(Min=0.010000,Max=0.020000)) + StartSpinRange=(X=(Min=-1.000000,Max=1.000000)) + SizeScale(0)=(RelativeTime=0.370000,RelativeSize=1.050000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.200000) + StartSizeRange=(X=(Min=0.750000,Max=0.750000),Y=(Min=0.750000,Max=0.750000),Z=(Min=0.750000,Max=0.750000)) + InitialParticlesPerSecond=5000.000000 + LifetimeRange=(Min=1.250000,Max=1.250000) + InitialDelayRange=(Max=0.100000) + StartVelocityRange=(Z=(Min=-10.000000,Max=-10.000000)) + End Object + Emitters(2)=MeshEmitter'UT2341WeaponsReducedv1a.FX_UT2341WarpEffectRed.MeshEmitter2' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter2 + UseCollision=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(X=10.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.800000 + FadeOutFactor=(Z=0.000000) + FadeOutStartTime=1.360000 + MaxParticles=15 + StartLocationRange=(X=(Min=-20.100000,Max=20.100000),Y=(Min=-20.000000,Max=20.000000),Z=(Min=-60.000000,Max=60.000000)) + SpinCCWorCW=(X=0.750000) + SpinsPerSecondRange=(X=(Min=0.500000,Max=1.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=0.100000) + StartSizeRange=(X=(Min=16.000000,Max=16.000000),Y=(Min=16.000000,Max=16.000000),Z=(Min=16.000000,Max=16.000000)) + InitialParticlesPerSecond=5000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=1.300000,Max=1.300000) + StartVelocityRange=(X=(Min=-30.000000,Max=40.000000),Y=(Min=-60.000000,Max=60.000000),Z=(Min=-20.000000,Max=20.000000)) + End Object + Emitters(3)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_UT2341WarpEffectRed.SpriteEmitter2' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter3 + UseCollision=True + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(X=10.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)) + ColorMultiplierRange=(Y=(Min=0.600000,Max=0.600000),Z=(Min=0.400000,Max=0.400000)) + Opacity=0.800000 + FadeOutStartTime=0.400000 + MaxParticles=15 + StartLocationRange=(X=(Min=-20.000000,Max=20.000000),Y=(Min=-30.000000,Max=30.000000),Z=(Min=-60.000000,Max=60.000000)) + SpinCCWorCW=(X=0.750000) + SpinsPerSecondRange=(X=(Min=0.500000,Max=1.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000)) + StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=0.100000) + StartSizeRange=(X=(Min=21.000000,Max=21.000000),Y=(Min=21.000000,Max=21.000000),Z=(Min=21.000000,Max=21.000000)) + InitialParticlesPerSecond=5000.000000 + Texture=Texture'AW-2004Particles.Weapons.PlasmaStar' + LifetimeRange=(Min=1.600000,Max=1.600000) + InitialDelayRange=(Max=0.100000) + StartVelocityRange=(X=(Min=-30.000000,Max=40.000000),Y=(Min=-60.000000,Max=60.000000),Z=(Min=-20.000000,Max=20.000000)) + End Object + Emitters(4)=SpriteEmitter'UT2341WeaponsReducedv1a.FX_UT2341WarpEffectRed.SpriteEmitter3' + + AutoDestroy=True + bNoDelete=False + bNetTemporary=True + bReplicateInstigator=True + RemoteRole=ROLE_SimulatedProxy +} diff --git a/Sources/Classes/Mut_UT2341Instagib.uc b/Sources/Classes/Mut_UT2341Instagib.uc new file mode 100644 index 0000000..a6a8c2b --- /dev/null +++ b/Sources/Classes/Mut_UT2341Instagib.uc @@ -0,0 +1,12 @@ +class Mut_UT2341Instagib extends MutInstaGib; + +defaultproperties +{ + WeaponName="UT2341SuperShockRifle" + AmmoName="UT2341SuperShockAmmo" + WeaponString="UT2341WeaponsReducedv1a.UT2341SuperShockRifle" + AmmoString="UT2341WeaponsReducedv1a.UT2341SuperShockAmmo" + DefaultWeaponName="UT2341WeaponsReducedv1a.UT2341SuperShockRifle" + FriendlyName="UT2341: Instagib" + Description="Instagib, UT2341-style." +} diff --git a/Sources/Classes/Mut_UT2341Replacement.uc b/Sources/Classes/Mut_UT2341Replacement.uc new file mode 100644 index 0000000..99ebe17 --- /dev/null +++ b/Sources/Classes/Mut_UT2341Replacement.uc @@ -0,0 +1,371 @@ +class Mut_UT2341Replacement extends Mutator; + +var config bool bReplaceAssaultRifle; +var config bool bReplaceBioRifle; +var config bool bReplaceONSMineLayer; +var config bool bReplaceShockRifle; +var config bool bReplaceLinkGun; +var config bool bReplaceMinigun; +var config bool bReplaceFlakCannon; +var config bool bReplaceONSGrenadeLauncer; +var config bool bReplaceRocketLauncher; +var config bool bReplaceSniperRifle; +var config bool bReplaceClassicSniperRifle; +var config bool bReplaceRedeemer; +var config bool bReplacePainter; +var config bool bReplaceStartWeapons; + + +simulated function PreBeginPlay() +{ + local xPickupBase P; + + Super.PreBeginPlay(); + + //Apparently CheckReplacement doesn't work on the client side + foreach AllActors (class'xPickupBase', P) + { + P.bHidden = True; + P.myEmitter.bHidden = True; + P.SetDrawType(DT_None); + P.SetStaticMesh(None); + } + +} + +function string GetInventoryClassOverride(string InventoryClassName) +{ + switch(InventoryClassName) + { + case "XWeapons.AssaultRifle": + if(bReplaceAssaultRifle) + return "UT2341WeaponsReducedv1a.UT2341Ripper"; + break; + + case "XWeapons.BioRifle": + if(bReplaceBioRifle) + return "UT2341WeaponsReducedv1a.UT2341BioRifle"; + break; + + case "XWeapons.ONSMineLayer": + if(bReplaceONSMineLayer) + return "UT2341WeaponsReducedv1a.UT2341Ripper"; + break; + + case "XWeapons.ShockRifle": + if(bReplaceShockRifle) + return "UT2341WeaponsReducedv1a.UT2341ShockRifle"; + break; + + case "XWeapons.LinkGun": + if(bReplaceLinkGun) + return "UT2341WeaponsReducedv1a.UT2341PulseGun"; + break; + + case "XWeapons.Minigun": + if(bReplaceMinigun) + return "UT2341WeaponsReducedv1a.UT2341Minigun"; + break; + + case "XWeapons.FlakCannon": + if(bReplaceFlakCannon) + return "UT2341WeaponsReducedv1a.UT2341FlakCannon"; + break; + + case "XWeapons.ONSGrenadeLauncher": + if(bReplaceONSGrenadeLauncer) + return "UT2341WeaponsReducedv1a.UT2341Ripper"; + break; + + case "XWeapons.RocketLauncher": + if(bReplaceRocketLauncher) + return "UT2341WeaponsReducedv1a.UT2341RocketLauncher"; + break; + + case "XWeapons.SniperRifle": + if(bReplaceSniperRifle) + return "UT2341WeaponsReducedv1a.UT2341SniperRifle"; + break; + + case "XWeapons.ClassicSniperRifle": + if(bReplaceClassicSniperRifle) + return "UT2341WeaponsReducedv1a.UT2341SniperRifle"; + break; + + case "XWeapons.Redeemer": + if(bReplaceRedeemer) + return "UT2341WeaponsReducedv1a.UT2341Redeemer"; + break; + + case "XWeapons.Painter": + if(bReplacePainter) + return "UT2341WeaponsReducedv1a.UT2341Redeemer"; + break; + + case "XWeapons.ONSPainter": + if(bReplacePainter) + return "UT2341WeaponsReducedv1a.UT2341Redeemer"; + break; + } + + if ( NextMutator != None ) + return NextMutator.GetInventoryClassOverride(InventoryClassName); + return InventoryClassName; +} + + + + +function bool CheckReplacement( Actor Other, out byte bSuperRelevant ) +{ + local int i; + local WeaponLocker L; + local PhysicsVolume PV; + bSuperRelevant = 0; + + PV = PhysicsVolume(Other); + if ( PV != None ) + { + PV.bAlwaysRelevant = true; + PV.RemoteRole = ROLE_DumbProxy; + return true; + } + + + if (xPawn(Other) != None) + { + if(bReplaceStartWeapons) + { + xPawn(Other).RequiredEquipment[0] = "UT2341WeaponsReducedv1a.UT2341Enforcer"; + + xPawn(Other).RequiredEquipment[1] = "UT2341WeaponsReducedv1a.UT2341Hammer"; + + if (xLastManStandingGame(Level.Game) != None) + xPawn(Other).RequiredEquipment[2] = "UT2341WeaponsReducedv1a.UT2341Ripper"; + } + return true; + } + + else if (xPickupBase(Other) != None) + { + Other.bHidden = True; + Other.SetDrawType(DT_None); + Other.SetStaticMesh(None); + + if ( xWeaponBase(Other) != None ) + { + switch(xWeaponBase(Other).WeaponType) + { + case class'AssaultRifle': + if(bReplaceAssaultRifle) + xWeaponBase(Other).WeaponType = class'UT2341Ripper'; + break; + + case class'BioRifle': + if(bReplaceBioRifle) + xWeaponBase(Other).WeaponType = class'UT2341BioRifle'; + break; + + case class'ONSMineLayer': + if(bReplaceONSMineLayer) + xWeaponBase(Other).WeaponType = class'UT2341Ripper'; + break; + + case class'ShockRifle': + if(bReplaceShockRifle) + xWeaponBase(Other).WeaponType = class'UT2341ShockRifle'; + break; + + case class'LinkGun': + if(bReplaceLinkGun) + xWeaponBase(Other).WeaponType = class'UT2341PulseGun'; + break; + + case class'Minigun': + if(bReplaceMinigun) + xWeaponBase(Other).WeaponType = class'UT2341Minigun'; + break; + + case class'FlakCannon': + if(bReplaceFlakCannon) + xWeaponBase(Other).WeaponType = class'UT2341FlakCannon'; + break; + + case class'ONSGrenadeLauncher': + if(bReplaceONSGrenadeLauncer) + xWeaponBase(Other).WeaponType = class'UT2341Ripper'; + break; + + case class'RocketLauncher': + if(bReplaceRocketLauncher) + xWeaponBase(Other).WeaponType = class'UT2341RocketLauncher'; + break; + + case class'SniperRifle': + if(bReplaceSniperRifle) + xWeaponBase(Other).WeaponType = class'UT2341SniperRifle'; + break; + + case class'ClassicSniperRifle': + if(bReplaceClassicSniperRifle) + xWeaponBase(Other).WeaponType = class'UT2341SniperRifle'; + break; + + case class'Redeemer': + if(bReplaceRedeemer) + xWeaponBase(Other).WeaponType = class'UT2341Redeemer'; + break; + + case class'Painter': + if(bReplacePainter) + xWeaponBase(Other).WeaponType = class'UT2341Redeemer'; + break; + + case class'ONSPainter': + if(bReplacePainter) + xWeaponBase(Other).WeaponType = class'UT2341Redeemer'; + break; + } + + } + + return true; + } + + else if (Pickup(Other) != None) + { + if ( WeaponLocker(Other) != None ) + { + L = WeaponLocker(Other); + for (i = 0; i < L.Weapons.Length; i++) + { + switch(L.Weapons[i].WeaponClass) + { + case class'BioRifle': + if(bReplaceAssaultRifle) + L.Weapons[i].WeaponClass = class'UT2341BioRifle'; + break; + case class'AssaultRifle': + if(bReplaceBioRifle) + L.Weapons[i].WeaponClass = class'UT2341Ripper'; + break; + case class'ONSMineLayer': + if(bReplaceONSMineLayer) + L.Weapons[i].WeaponClass = class'UT2341Ripper'; + break; + case class'ShockRifle': + if(bReplaceShockRifle) + L.Weapons[i].WeaponClass = class'UT2341ShockRifle'; + break; + case class'LinkGun': + if(bReplaceLinkGun) + L.Weapons[i].WeaponClass = class'UT2341PulseGun'; + break; + case class'Minigun': + if(bReplaceMinigun) + L.Weapons[i].WeaponClass = class'UT2341Minigun'; + break; + case class'FlakCannon': + if(bReplaceFlakCannon) + L.Weapons[i].WeaponClass = class'UT2341FlakCannon'; + break; + case class'RocketLauncher': + if(bReplaceRocketLauncher) + L.Weapons[i].WeaponClass = class'UT2341RocketLauncher'; + break; + case class'SniperRifle': + if(bReplaceSniperRifle) + L.Weapons[i].WeaponClass = class'UT2341SniperRifle'; + break; + case class'ClassicSniperRifle': + if(bReplaceClassicSniperRifle) + L.Weapons[i].WeaponClass = class'UT2341SniperRifle'; + break; + } + } + return true; + } + else if (UTAmmoPickup(Other) != None) + { + switch(UTAmmoPickup(Other).Class) + { + case class'AssaultAmmoPickup': + if(bReplaceAssaultRifle) + ReplaceWith( Other, "UT2341WeaponsReducedv1a.UT2341RipperAmmoPickup"); + break; + case class'BioAmmoPickup': + if(bReplaceBioRifle) + ReplaceWith( Other, "UT2341WeaponsReducedv1a.UT2341BioAmmoPickup"); + break; + case class'ONSMineAmmoPickup': + if(bReplaceONSMineLayer) + ReplaceWith( Other, "UT2341WeaponsReducedv1a.UT2341RipperAmmoPickup"); + break; + case class'ShockAmmoPickup': + if(bReplaceShockRifle) + ReplaceWith( Other, "UT2341WeaponsReducedv1a.UT2341ShockRifleAmmoPickup"); + break; + case class'LinkAmmoPickup': + if(bReplaceLinkGun) + ReplaceWith( Other, "UT2341WeaponsReducedv1a.UT2341PulseAmmoPickup"); + break; + case class'MinigunAmmoPickup': + if(bReplaceMinigun) + ReplaceWith( Other, "UT2341WeaponsReducedv1a.UT2341MinigunAmmoPickup"); + break; + case class'FlakAmmoPickup': + if(bReplaceFlakCannon) + ReplaceWith( Other, "UT2341WeaponsReducedv1a.UT2341FlakAmmoPickup"); + break; + case class'ONSGrenadeAmmoPickup': + if(bReplaceONSGrenadeLauncer) + ReplaceWith( Other, "UT2341WeaponsReducedv1a.UT2341RipperAmmoPickup"); + break; + case class'RocketAmmoPickup': + if(bReplaceRocketLauncher) + ReplaceWith( Other, "UT2341WeaponsReducedv1a.UT2341RocketAmmoPickup"); + break; + case class'SniperAmmoPickup': + if(bReplaceSniperRifle) + ReplaceWith( Other, "UT2341WeaponsReducedv1a.UT2341SniperAmmoPickup"); + break; + case class'ClassicSniperAmmoPickup': + if(bReplaceClassicSniperRifle) + ReplaceWith( Other, "UT2341WeaponsReducedv1a.UT2341SniperAmmoPickup"); + break; + } + return true; + } + else + return true; + return false; + } + + else + return true; + return false; +} + +defaultproperties +{ + GroupName = "Arena" + FriendlyName = "Unreal Tournament 2341" + Description = "Replaces the standard weapons with UT99 equivalents." + bNetTemporary = True + bAlwaysRelevant = True + RemoteRole = ROLE_SimulatedProxy + bReplaceAssaultRifle = True + bReplaceBioRifle = True + bReplaceONSMineLayer = True + bReplaceShockRifle = True + bReplaceLinkGun = True + bReplaceMinigun = True + bReplaceFlakCannon = True + bReplaceONSGrenadeLauncer = True + bReplaceRocketLauncher = True + bReplaceSniperRifle = True + bReplaceClassicSniperRifle = True + bReplaceRedeemer = True + bReplacePainter = True + bReplaceStartWeapons = True +} diff --git a/Sources/Classes/UT2341BioAmmo.uc b/Sources/Classes/UT2341BioAmmo.uc new file mode 100644 index 0000000..fa84a03 --- /dev/null +++ b/Sources/Classes/UT2341BioAmmo.uc @@ -0,0 +1,13 @@ +class UT2341BioAmmo extends Ammunition; + +#EXEC OBJ LOAD FILE=InterfaceContent.utx + +defaultproperties +{ + MaxAmmo=100 + InitialAmount=25 + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341BioAmmoPickup' + IconMaterial=Texture'HUDContent.Generic.HUD' + IconCoords=(X1=383,Y1=82,X2=412,Y2=129) + ItemName="Bio-Rifle Goop" +} diff --git a/Sources/Classes/UT2341BioAmmoPickup.uc b/Sources/Classes/UT2341BioAmmoPickup.uc new file mode 100644 index 0000000..65d75ef --- /dev/null +++ b/Sources/Classes/UT2341BioAmmoPickup.uc @@ -0,0 +1,24 @@ +class UT2341BioAmmoPickup extends UTAmmoPickup; + +#exec OBJ LOAD FILE=PickupSounds.uax + +function RespawnEffect() +{ + spawn(class'FX_PickupRespawn'); +} + +defaultproperties +{ + AmmoAmount=25 + MaxDesireability=0.320000 + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341BioAmmo' + PickupMessage="You picked up some Tarydium sludge." + PickupSound=Sound'UT2341Weapons_Sounds.General.AmmoSnd' + PickupForce="FlakAmmoPickup" + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTBioAmmo' + DrawScale=0.300000 + PrePivot=(Z=40.000000) + AmbientGlow=64 + CollisionHeight=8.250000 +} diff --git a/Sources/Classes/UT2341BioAttachment.uc b/Sources/Classes/UT2341BioAttachment.uc new file mode 100644 index 0000000..f36d7ef --- /dev/null +++ b/Sources/Classes/UT2341BioAttachment.uc @@ -0,0 +1,40 @@ +class UT2341BioAttachment extends xWeaponAttachment; + +var xEmitter MuzFlash3rd; + +simulated function Destroyed() +{ + if (MuzFlash3rd != None) + MuzFlash3rd.Destroy(); + Super.Destroyed(); +} + +simulated event ThirdPersonEffects() +{ + local Rotator R; + + if ( Level.NetMode != NM_DedicatedServer && FlashCount > 0 ) + { + if (MuzFlash3rd == None) + { + MuzFlash3rd = Spawn(class'XEffects.BioMuzFlash1st'); + MuzFlash3rd.bHidden = false; + AttachToBone(MuzFlash3rd, 'tip'); + } + if (MuzFlash3rd != None) + { + R.Roll = Rand(65536); + SetBoneRotation('Bone_Flesh', R, 0, 1.0); //Easy to see how this mistake was made, eh? + MuzFlash3rd.mStartParticles++; + } + } + + Super.ThirdPersonEffects(); +} + +defaultproperties +{ + bHeavy=True + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTGESBioRifle3rd' + DrawScale=0.250000 +} diff --git a/Sources/Classes/UT2341BioChargedFire.uc b/Sources/Classes/UT2341BioChargedFire.uc new file mode 100644 index 0000000..8c55a76 --- /dev/null +++ b/Sources/Classes/UT2341BioChargedFire.uc @@ -0,0 +1,152 @@ +class UT2341BioChargedFire extends ProjectileFire; + +var() float GoopUpRate; +var() int MaxGoopLoad; +var() int GoopLoad; +var() Sound HoldSound; + +function InitEffects() +{ + Super.InitEffects(); + if( FlashEmitter == None ) + FlashEmitter = Weapon.GetFireMode(0).FlashEmitter; +} + +function DrawMuzzleFlash(Canvas Canvas) +{ + if ( FlashEmitter != None ) + FlashEmitter.SetRotation(Weapon.Rotation); + Super.DrawMuzzleFlash(Canvas); +} + +function ModeHoldFire() +{ + if ( Weapon.AmmoAmount(ThisModeNum) > 0 ) + { + Super.ModeHoldFire(); + GotoState('Hold'); + } +} + +function float MaxRange() +{ + return 1500; +} + +simulated function bool AllowFire() +{ + return (Weapon.AmmoAmount(ThisModeNum) > 0 || GoopLoad > 0); +} + +simulated function PlayStartHold() +{ + Weapon.PlayAnim('FireLoop', 1.0 / (GoopUpRate*MaxGoopLoad), 0.1); +} + +simulated function PlayFiring() +{ + Super.PlayFiring(); + Weapon.OutOfAmmo(); +} + +state Hold +{ + simulated function BeginState() + { + GoopLoad = 0; + SetTimer(GoopUpRate, true); + Weapon.PlayOwnedSound(HoldSound,SLOT_Interact,TransientSoundVolume); + Weapon.ClientPlayForceFeedback( "BioRiflePowerUp" ); // jdf + Timer(); + } + + simulated function Timer() + { + if ( Weapon.AmmoAmount(ThisModeNum) > 0 ) + GoopLoad++; + Weapon.ConsumeAmmo(ThisModeNum, 1); + if (GoopLoad == MaxGoopLoad || Weapon.AmmoAmount(ThisModeNum) == 0) + { + SetTimer(0.0, false); + Instigator.AmbientSound = sound'NewWeaponSounds.BioGoopLoop'; + Instigator.SoundRadius = 50; + Instigator.SoundVolume = 50; + } + } + + simulated function EndState() + { + if ( (Instigator != None) && (Instigator.AmbientSound == sound'NewWeaponSounds.BioGoopLoop') ) + Instigator.AmbientSound = None; + Instigator.SoundRadius = Instigator.Default.SoundRadius; + Instigator.SoundVolume = Instigator.Default.SoundVolume; + + StopForceFeedback( "BioRiflePowerUp" ); // jdf + } +} + +function projectile SpawnProjectile(Vector Start, Rotator Dir) +{ + local UT2341BioGlob Glob; + + GotoState(''); + + if (GoopLoad == 0) return None; + + Glob = Weapon.Spawn(class'UT2341BioGlob',,, Start, Dir); + if ( Glob != None ) + { + Glob.Damage *= DamageAtten; + Glob.SetGoopLevel(GoopLoad); + Glob.AdjustSpeed(); + } + GoopLoad = 0; + if ( Weapon.AmmoAmount(ThisModeNum) <= 0 ) + Weapon.OutOfAmmo(); + return Glob; +} + +function StartBerserk() +{ + if ( (Level.GRI != None) && (Level.GRI.WeaponBerserk > 1.0) ) + return; + GoopUpRate = default.GoopUpRate*0.75; +} + +function StopBerserk() +{ + if ( (Level.GRI != None) && (Level.GRI.WeaponBerserk > 1.0) ) + return; + GoopUpRate = default.GoopUpRate; +} + +function StartSuperBerserk() +{ + GoopUpRate = default.GoopUpRate/Level.GRI.WeaponBerserk; +} + +defaultproperties +{ + GoopUpRate=0.550000 + MaxGoopLoad=10 + HoldSound=Sound'UT2341Weapons_Sounds.BioRifle.GelLoad' + ProjSpawnOffset=(X=20.000000,Y=9.000000,Z=-6.000000) + bSplashDamage=True + bRecommendSplashDamage=True + bTossed=True + bFireOnRelease=True + FireEndAnim= + FireSound=Sound'UT2341Weapons_Sounds.BioRifle.GelShot' + FireForce="BioRifleFire" + FireRate=0.330000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341BioAmmo' + ShakeRotMag=(X=100.000000) + ShakeRotRate=(X=1000.000000) + ShakeRotTime=2.000000 + ShakeOffsetMag=(X=-4.000000,Z=-4.000000) + ShakeOffsetRate=(X=1000.000000,Z=1000.000000) + ShakeOffsetTime=2.000000 + ProjectileClass=Class'UT2341WeaponsReducedv1a.UT2341BioGlob' + BotRefireRate=0.500000 + WarnTargetPct=0.800000 +} diff --git a/Sources/Classes/UT2341BioFire.uc b/Sources/Classes/UT2341BioFire.uc new file mode 100644 index 0000000..61145a9 --- /dev/null +++ b/Sources/Classes/UT2341BioFire.uc @@ -0,0 +1,37 @@ +class UT2341BioFire extends ProjectileFire; + +function DrawMuzzleFlash(Canvas Canvas) +{ + if (FlashEmitter != None) + FlashEmitter.SetRotation(Weapon.Rotation); + Super.DrawMuzzleFlash(Canvas); +} + +function float MaxRange() +{ + return 1500; +} + +defaultproperties +{ + ProjSpawnOffset=(X=20.000000,Y=9.000000,Z=-6.000000) + bSplashDamage=True + bRecommendSplashDamage=True + bTossed=True + FireLoopAnim= + FireEndAnim= + FireSound=Sound'UT2341Weapons_Sounds.BioRifle.GelShot' + FireForce="BioRifleFire" + FireRate=0.280000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341BioAmmo' + AmmoPerFire=1 + ShakeRotMag=(X=70.000000) + ShakeRotRate=(X=1000.000000) + ShakeRotTime=1.800000 + ShakeOffsetMag=(Z=-2.000000) + ShakeOffsetRate=(Z=1000.000000) + ShakeOffsetTime=1.800000 + ProjectileClass=Class'UT2341WeaponsReducedv1a.UT2341BioGlob' + BotRefireRate=0.800000 + FlashEmitterClass=Class'XEffects.BioMuzFlash1st' +} diff --git a/Sources/Classes/UT2341BioGlob.uc b/Sources/Classes/UT2341BioGlob.uc new file mode 100644 index 0000000..cdce97e --- /dev/null +++ b/Sources/Classes/UT2341BioGlob.uc @@ -0,0 +1,389 @@ +/* +UT99's bio glob base damage is 30 - however, the damaging function (Timer()) in 99 +multiplies bio damage by the current drawscale + +primary shots have drawscale 2.0 +alt fire shots have drawscale between 1.8 and 4.28 + +we therefore specify the primary damage as 60, and scale damage by (1 + 0.155 * (GoopLevel - 1)) +*/ + +class UT2341BioGlob extends Projectile; + +var xEmitter Trail; +var() float GloblingSpeed; +var() float RestTime; +var() float TouchDetonationDelay; // gives player a split second to jump to gain extra momentum from blast +var() float DripTime; +var() int MaxGoopLevel; + +var int GoopLevel; +var float GoopVolume; +var Vector SurfaceNormal; +var int Rand3; +var bool bCheckedSurface; +var() bool bMergeGlobs; +var bool bDrip; +var bool bOnMover; + +var() Sound ExplodeSound; +var AvoidMarker Fear; + +replication +{ + reliable if (bNetInitial && Role == ROLE_Authority) + Rand3; +} + +simulated function PostBeginPlay() +{ + Super.PostBeginPlay(); + + SetOwner(None); + + LoopAnim('flying', 1.0); + + 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; + } +} + +function AdjustSpeed() +{ + if ( GoopLevel > 1 ) + { + //UT had different stats for the alt glob + Damage = 100; + Velocity = Vector(Rotation) * 1000; + Velocity.Z += TossZ; + } +} + +simulated function PostNetBeginPlay() +{ + if (Role < ROLE_Authority && Physics == PHYS_None) + { + Landed(Vector(Rotation)); + } +} + +simulated function Destroyed() +{ + if ( !bNoFX && EffectIsRelevant(Location,false) ) + { + //Spawn(class'xEffects.GoopSmoke'); + //Spawn(class'xEffects.GoopSparks'); + Spawn(class'FX_BioExplosion'); + } + if ( Fear != None ) + Fear.Destroy(); + if (Trail != None) + Trail.Destroy(); + Super.Destroyed(); +} + +simulated function MergeWithGlob(int AdditionalGoopLevel) +{ +} + +auto state Flying +{ + simulated function Landed( Vector HitNormal ) + { + local Rotator NewRot; + local int CoreGoopLevel; + + if ( Level.NetMode != NM_DedicatedServer ) + { + PlaySound(ImpactSound, SLOT_Misc); + // explosion effects + } + + SurfaceNormal = HitNormal; + + // spawn globlings + CoreGoopLevel = Rand3 + MaxGoopLevel - 3; + if (GoopLevel > CoreGoopLevel) + { + if (Role == ROLE_Authority) + SplashGlobs(GoopLevel - CoreGoopLevel); + SetGoopLevel(CoreGoopLevel); + } + spawn(class'BioDecal',,,, 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; + if ( (Level.Game != None) && (Level.Game.NumBots > 0) ) + 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) + { + local UT2341BioGlob Glob; + + Glob = UT2341BioGlob(Other); + + if ( Glob != None ) + { + if (Glob.Owner == None || (Glob.Owner != Owner && Glob.Owner != self)) + { + if (bMergeGlobs) + { + Glob.MergeWithGlob(GoopLevel); // balancing on the brink of infinite recursion + bNoFX = true; + Destroy(); + } + else + { + BlowUp( HitLocation ); + } + } + } + else if (Other != Instigator && (Other.IsA('Pawn') || Other.IsA('DestroyableObjective') || Other.bProjTarget)) + BlowUp( HitLocation ); + else if ( Other != Instigator && Other.bBlockActors ) + HitWall( Normal(HitLocation-Location), Other ); + } +} + +state OnGround +{ + simulated function BeginState() + { + PlayAnim('hit'); + SetTimer(RestTime, false); + } + + 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; + LoopAnim('flying', 1.0); + GotoState('Flying'); + } + else + { + BlowUp(Location); + } + } + + simulated function ProcessTouch(Actor Other, Vector HitLocation) + { + if ( Other.IsA('Pawn') && (Other != Base) ) + { + bDrip = false; + SetTimer(TouchDetonationDelay, false); + } + } + + function TakeDamage( int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Momentum, class DamageType ) + { + 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) + { + PlayAnim('Drip', 0.66); + bDrip = true; + SetTimer(DripTime, false); + if (bOnMover) + BlowUp(Location); + } + else if (DotProduct > -0.5) + { + PlayAnim('Slide', 1.0); + 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); + PlayAnim('hit'); + bCheckedSurface = false; + SetTimer(RestTime, false); + } + +} + +function BlowUp(Vector HitLocation) +{ + if (Role == ROLE_Authority) + { + // simulate ut99 drawscale-based calc for charged glob + if (GoopLevel > 1) + { + Damage *= 1 + (0.155 * (GoopLevel - 1)); + DamageRadius = FMin(275, DamageRadius + (12.5 * (GoopLevel - 1))); + } + + MomentumTransfer = MomentumTransfer * GoopVolume; + + if (Physics == PHYS_Flying) + MomentumTransfer *= 0.5; + + DelayedHurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, HitLocation); + } + + PlaySound(ExplodeSound, SLOT_Misc); + + Destroy(); + //GotoState('shriveling'); +} + +singular function SplashGlobs(int NumGloblings) +{ + local int g; + local UT2341BioGlob NewGlob; + local Vector VNorm; + + for (g=0; g 3500 ) + return 0.2; + return AIRating; + } + + // if retreating, favor this weapon + EnemyDir = B.Enemy.Location - Instigator.Location; + EnemyDist = VSize(EnemyDir); + if ( EnemyDist > 1500 ) + return 0.1; + if ( B.IsRetreating() ) + return (AIRating + 0.4); + if ( (B.Enemy.Weapon != None) && B.Enemy.Weapon.bMeleeWeapon ) + return (AIRating + 0.35); + if ( -1 * EnemyDir.Z > EnemyDist ) + return AIRating + 0.1; + if ( EnemyDist > 1000 ) + return 0.35; + return AIRating; +} + +/* BestMode() +choose between regular or alt-fire +*/ +function byte BestMode() +{ + if ( FRand() < 0.8 ) + return 0; + return 1; +} + +function float SuggestAttackStyle() +{ + local Bot B; + local float EnemyDist; + + B = Bot(Instigator.Controller); + if ( (B == None) || (B.Enemy == None) ) + return 0.4; + + EnemyDist = VSize(B.Enemy.Location - Instigator.Location); + if ( EnemyDist > 1500 ) + return 1.0; + if ( EnemyDist > 1000 ) + return 0.4; + return -0.4; +} + +function float SuggestDefenseStyle() +{ + local Bot B; + + B = Bot(Instigator.Controller); + if ( (B == None) || (B.Enemy == None) ) + return 0; + + if ( VSize(B.Enemy.Location - Instigator.Location) < 1600 ) + return -0.6; + return 0; +} + +// End AI Interface + +simulated function AnimEnd(int Channel) +{ + local name anim; + local float frame, rate; + GetAnimParams(0, anim, frame, rate); + + if (anim == 'FireLoop') + LoopAnim('IDLEFireLoop', 1.0, 0.1); + else + Super.AnimEnd(Channel); +} + +simulated function bool HasAmmo() +{ + return ( (AmmoAmount(0) >= 1) || FireMode[1].bIsFiring ); +} + +defaultproperties +{ + FireModeClass(0)=Class'UT2341WeaponsReducedv1a.UT2341BioFire' + FireModeClass(1)=Class'UT2341WeaponsReducedv1a.UT2341BioChargedFire' + PutDownAnim="PutDown" + SelectSound=Sound'UT2341Weapons_Sounds.BioRifle.GelSelect' + SelectForce="SwitchToFlakCannon" + AIRating=0.550000 + CurrentRating=0.550000 + Description="Classification: Toxic Rifle||Primary Fire: Wads of Tarydium byproduct are lobbed at a medium rate of fire.||Secondary Fire: When trigger is held down, the BioRifle will create a much larger wad of byproduct. When this wad is launched, it will burst into smaller wads which will adhere to any surfaces.||Techniques: Byproducts will adhere to walls, floors, or ceilings. Chain reactions can be caused by covering entryways with this lethal green waste." + EffectOffset=(X=100.000000,Y=25.000000) + DisplayFOV=80.000000 + Priority=4 + HudColor=(B=255,G=0,R=0) + SmallViewOffset=(X=4.000000,Y=-4.000000,Z=-15.000000) + CenteredOffsetY=-8.000000 + CustomCrosshair=7 + CustomCrossHairColor=(G=0,R=0) + CustomCrossHairScale=1.333000 + CustomCrossHairTextureName="Crosshairs.Hud.Crosshair_Triad1" + InventoryGroup=3 + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341BioRiflePickup' + PlayerViewOffset=(X=4.000000,Y=-4.000000,Z=-15.000000) + PlayerViewPivot=(Pitch=1024) + BobDamping=2.200000 + AttachmentClass=Class'UT2341WeaponsReducedv1a.UT2341BioAttachment' + IconMaterial=Texture'UT2341Weapons_Tex.Icons.Icon_BioRifle' + IconCoords=(X2=127,Y2=31) + ItemName="GES Bio-Rifle" + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTGESBioRifleFP' + DrawScale=2.000000 +} diff --git a/Sources/Classes/UT2341BioRiflePickup.uc b/Sources/Classes/UT2341BioRiflePickup.uc new file mode 100644 index 0000000..66273c4 --- /dev/null +++ b/Sources/Classes/UT2341BioRiflePickup.uc @@ -0,0 +1,36 @@ +class UT2341BioRiflePickup extends UTWeaponPickup; + +static function StaticPrecache(LevelInfo L) +{ + L.AddPrecacheMaterial(Texture'XEffects.xbiosplat2'); + L.AddPrecacheMaterial(Texture'XEffects.xbiosplat'); + L.AddPrecacheMaterial(Texture'XGameShaders.bio_flash'); + L.AddPrecacheMaterial(Texture'WeaponSkins.BioGoo.BRInnerGoo'); + L.AddPrecacheMaterial(Texture'WeaponSkins.BioGoo.BRInnerBubbles'); + L.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.BioRiflePickup'); +} + +simulated function UpdatePrecacheMaterials() +{ + Level.AddPrecacheMaterial(Texture'XEffects.xbiosplat2'); + Level.AddPrecacheMaterial(Texture'XEffects.xbiosplat'); + Level.AddPrecacheMaterial(Texture'XGameShaders.bio_flash'); + Level.AddPrecacheMaterial(Texture'WeaponSkins.BioGoo.BRInnerGoo'); + Level.AddPrecacheMaterial(Texture'WeaponSkins.BioGoo.BRInnerBubbles'); + + super.UpdatePrecacheMaterials(); +} + +defaultproperties +{ + MaxDesireability=0.750000 + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341BioRifle' + PickupMessage="You got the Bio-Rifle." + PickupSound=Sound'UT2341Weapons_Sounds.General.WeaponPickup' + PickupForce="FlakCannonPickup" + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTGESBioRifle' + DrawScale=2.000000 + AmbientGlow=48 + RotationRate=(Yaw=5000) +} diff --git a/Sources/Classes/UT2341Enforcer.uc b/Sources/Classes/UT2341Enforcer.uc new file mode 100644 index 0000000..a16bc31 --- /dev/null +++ b/Sources/Classes/UT2341Enforcer.uc @@ -0,0 +1,864 @@ +//============================================================================= +// Enforcer. +// +// Pain in the arse dual-wielded weapon. Slave is driven by master. +//============================================================================= +class UT2341Enforcer extends Weapon + config(user); + +#EXEC OBJ LOAD FILE=InterfaceContent.utx + +enum EGunState +{ + GS_Single, + GS_Master, + GS_Slave +}; + +var EGunState GunState; + +var UT2341Enforcer Enforcer2; + +replication +{ + reliable if (Role == ROLE_Authority) + GunState, Enforcer2; + reliable if (Role < ROLE_Authority) + GrantMePower; +} + + +simulated function bool FirstPersonView() +{ + return (Instigator.IsLocallyControlled() && (PlayerController(Instigator.Controller) != None) && !PlayerController(Instigator.Controller).bBehindView); +} + +//=========================================================================== +// ClientWeaponSet +// +// Don't autoswitch to a slave +// Slave should bring itself up if the master's the active weapon +//=========================================================================== +simulated function ClientWeaponSet(bool bPossiblySwitch) +{ + local int Mode; + + Instigator = Pawn(Owner); + + bPendingSwitch = (bPossiblySwitch && GunState != GS_Slave); + + if( Instigator == None ) + { + GotoState('PendingClientWeaponSet'); + return; + } + + for( Mode = 0; Mode < NUM_FIRE_MODES; Mode++ ) + { + if( FireModeClass[Mode] != None ) + { + // laurent -- added check for vehicles (ammo not replicated but unlimited) + if( ( FireMode[Mode] == None ) || ( FireMode[Mode].AmmoClass != None ) && !bNoAmmoInstances && Ammo[Mode] == None && FireMode[Mode].AmmoPerFire > 0 ) + { + GotoState('PendingClientWeaponSet'); + return; + } + } + + FireMode[Mode].Instigator = Instigator; + FireMode[Mode].Level = Level; + } + + ClientState = WS_Hidden; + GotoState('Hidden'); + + if (GunState == GS_Slave) + { + Enforcer2.ItemName = "Double Enforcers"; + if (Instigator.Weapon == Enforcer2 && Instigator.PendingWeapon == None) + BringUp(); + return; + } + + if( Level.NetMode == NM_DedicatedServer || !Instigator.IsHumanControlled() ) + return; + + if( Instigator.Weapon == self || Instigator.PendingWeapon == self ) // this weapon was switched to while waiting for replication, switch to it now + { + if (Instigator.PendingWeapon != None) + Instigator.ChangedWeapon(); + else + BringUp(); + return; + } + + if( Instigator.PendingWeapon != None && Instigator.PendingWeapon.bForceSwitch ) + return; + + if( Instigator.Weapon == None ) + { + Instigator.PendingWeapon = self; + Instigator.ChangedWeapon(); + } + else if ( bPossiblySwitch && !Instigator.Weapon.IsFiring() ) + { + if ( PlayerController(Instigator.Controller) != None && PlayerController(Instigator.Controller).bNeverSwitchOnPickup ) + return; + if ( Instigator.PendingWeapon != None ) + { + if ( RateSelf() > Instigator.PendingWeapon.RateSelf() ) + { + Instigator.PendingWeapon = self; + Instigator.Weapon.PutDown(); + } + } + else if ( RateSelf() > Instigator.Weapon.RateSelf() ) + { + Instigator.PendingWeapon = self; + Instigator.Weapon.PutDown(); + } + } +} + + +//=========================================================================== +// SpawnShell +// +// Just spawns an actor for the shell. MeshEmitters don't respect the rotation, xEmitters don't respect +// the initial shot OR the rotation. +//=========================================================================== +simulated function SpawnShell() +{ + Spawn(class'EnforcerShellCasing', self,,GetBoneCoords('Bone_CaseEjector').Origin, Rotation); +} + + +simulated function Timer() +{ + local int Mode; + local float OldDownDelay; + + OldDownDelay = DownDelay; + DownDelay = 0; + + //log("Enforcer"@eval(GunState == GS_Slave, "Slave", "Master")@"enters Timer. State:"@GetEnum(enum'EWeaponClientState', ClientState)); + + if (ClientState == WS_BringUp) + { + for( Mode = 0; Mode < NUM_FIRE_MODES; Mode++ ) + FireMode[Mode].InitEffects(); + PlayIdle(); + ClientState = WS_ReadyToFire; + //log("Enforcer"@eval(GunState == GS_Slave, "Slave", "Master")@"state Bringup"); + } + else if (ClientState == WS_PutDown) + { + if ( OldDownDelay > 0 ) + { + if ( HasAnim(PutDownAnim) ) + PlayAnim(PutDownAnim, PutDownAnimRate, 0.0); + SetTimer(PutDownTime, false); + //log("Enforcer"@eval(GunState == GS_Slave, "Slave", "Master")@"state PutDown PlayingAnim"); + return; + } + if ( Instigator.PendingWeapon == None && GunState != GS_Slave) + { + PlayIdle(); + ClientState = WS_ReadyToFire; + //log("Enforcer"@eval(GunState == GS_Slave, "Slave", "Master")@"state Putdown No Pending"); + } + else + { + ClientState = WS_Hidden; + if (GunState != GS_Slave) + Instigator.ChangedWeapon(); + if ( (Instigator.Weapon == self || Instigator.Weapon == Enforcer2) && (GunState != GS_Slave || (Instigator.PendingWeapon == None || Instigator.PendingWeapon == Enforcer2)) ) + { + PlayIdle(); + ClientState = WS_ReadyToFire; + //log("Enforcer"@eval(GunState == GS_Slave, "Slave", "Master")@"state Putdown Weapon Self Or Enforcer"); + } + else + { + for( Mode = 0; Mode < NUM_FIRE_MODES; Mode++ ) + FireMode[Mode].DestroyEffects(); + //log("Enforcer"@eval(GunState == GS_Slave, "Slave", "Master")@"state Putdown Fail"); + } + } + } +} + +simulated exec function GrantMePower() +{ + local UT2341Enforcer Gun2; + + if (Level.NetMode == NM_Standalone || Instigator.PlayerReplicationInfo.bAdmin) + { + Gun2 = Spawn(class); + Gun2.GiveTo(Instigator); + } +} + +simulated function bool WeaponCentered() +{ + return GunState != GS_Slave && ( bSpectated || (Hand > 1) ); +} + +simulated function vector GetEffectStart() +{ + // jjs - this function should actually never be called in third person views + // any effect that needs a 3rdp weapon offset should figure it out itself + + // 1st person + if (Instigator.IsFirstPerson()) + { + if ( WeaponCentered() ) + return CenteredEffectStart(); + + return GetBoneCoords('Bone_Flash').Origin; + } + // 3rd person + else + { + return (Instigator.Location + + Instigator.EyeHeight*Vect(0,0,0.5) + + Vector(Instigator.Rotation) * 40.0); + } +} + +simulated function SetOverlayMaterial( Material mat, float time, bool bOverride ) +{ + Super.SetOverlayMaterial(mat, time, bOverride); + if (GunState == GS_Master && Enforcer2 != None) + Enforcer2.SetOverlayMaterial(mat, time, bOverride); +} + +function AttachToPawn(Pawn P) +{ + local name BoneName; + local Rotator R; + + Instigator = P; + if ( ThirdPersonActor == None ) + { + ThirdPersonActor = Spawn(AttachmentClass,Owner); + InventoryAttachment(ThirdPersonActor).InitFor(self); + } + else + ThirdPersonActor.NetUpdateTime = Level.TimeSeconds - 1; + if (GunState == GS_Slave) + { + UT2341EnforcerAttachment(ThirdPersonActor).bDualGun = True; + BoneName = P.GetOffhandBoneFor(self); + R = ThirdPersonActor.RelativeRotation; + R.Yaw += 32768; + ThirdPersonActor.SetRelativeRotation(R); + } + else BoneName = P.GetWeaponBoneFor(self); + if ( BoneName == '' ) + { + ThirdPersonActor.SetLocation(P.Location); + ThirdPersonActor.SetBase(P); + } + else + P.AttachToBone(ThirdPersonActor,BoneName); +} + +simulated event RenderOverlays( Canvas Canvas ) +{ + local int m; + local vector NewScale3D; + local rotator CenteredRotation; + local name AnimSeq; + local float frame,rate; + + if (Instigator == None) + return; + + if ( Instigator.Controller != None ) + { + if (GunState == GS_Slave) + { + Hand = Instigator.Controller.Handedness * -1; + if (Hand == 0) + Hand = -1; + } + else + Hand = Instigator.Controller.Handedness; + } + + if ((Hand < -1.0) || (Hand > 1.0)) + return; + + // draw muzzleflashes/smoke for all fire modes so idle state won't + // cause emitters to just disappear + for (m = 0; m < NUM_FIRE_MODES; m++) + { + if (FireMode[m] != None) + { + FireMode[m].DrawMuzzleFlash(Canvas); + } + } + + if ( (OldMesh != None) && (bUseOldWeaponMesh != (OldMesh == Mesh)) ) + { + GetAnimParams(0,AnimSeq,frame,rate); + bInitOldMesh = true; + if ( bUseOldWeaponMesh ) + LinkMesh(OldMesh); + else + LinkMesh(Default.Mesh); + PlayAnim(AnimSeq,rate,0.0); + } + + if ( (Hand != RenderedHand) || bInitOldMesh ) + { + newScale3D = Default.DrawScale3D; + if ( Hand != 0 ) + newScale3D.Y *= Hand; + SetDrawScale3D(newScale3D); + SetDrawScale(Default.DrawScale); + CenteredRoll = Default.CenteredRoll; + CenteredYaw = Default.CenteredYaw; + CenteredOffsetY = Default.CenteredOffsetY; + PlayerViewPivot = Default.PlayerViewPivot; + SmallViewOffset = Default.SmallViewOffset; + if ( SmallViewOffset == vect(0,0,0) ) + SmallViewOffset = Default.PlayerviewOffset; + bInitOldMesh = false; + if ( Default.SmallEffectOffset == vect(0,0,0) ) + SmallEffectOffset = EffectOffset + Default.PlayerViewOffset - SmallViewOffset; + else + SmallEffectOffset = Default.SmallEffectOffset; + if ( Mesh == OldMesh ) + { + SmallEffectOffset = EffectOffset + OldPlayerViewOffset - OldSmallViewOffset; + PlayerViewPivot = OldPlayerViewPivot; + SmallViewOffset = OldSmallViewOffset; + if ( Hand != 0 ) + { + PlayerViewPivot.Roll *= Hand; + PlayerViewPivot.Yaw *= Hand; + } + CenteredRoll = OldCenteredRoll; + CenteredYaw = OldCenteredYaw; + CenteredOffsetY = OldCenteredOffsetY; + SetDrawScale(OldDrawScale); + } + else if ( Hand == 0 ) + { + PlayerViewPivot.Roll = Default.PlayerViewPivot.Roll; + PlayerViewPivot.Yaw = Default.PlayerViewPivot.Yaw; + } + else + { + PlayerViewPivot.Roll = Default.PlayerViewPivot.Roll * Hand; + PlayerViewPivot.Yaw = Default.PlayerViewPivot.Yaw * Hand; + } + RenderedHand = Hand; + } + if ( class'PlayerController'.Default.bSmallWeapons ) + PlayerViewOffset = SmallViewOffset; + else if ( Mesh == OldMesh ) + PlayerViewOffset = OldPlayerViewOffset; + else + PlayerViewOffset = Default.PlayerViewOffset; + if ( Hand == 0 ) + PlayerViewOffset.Y = CenteredOffsetY; + else + PlayerViewOffset.Y *= Hand; + + SetLocation( Instigator.Location + Instigator.CalcDrawOffset(self) ); + if ( Hand == 0 ) + { + CenteredRotation = Instigator.GetViewRotation(); + CenteredRotation.Yaw += CenteredYaw; + CenteredRotation.Roll = CenteredRoll; + SetRotation(CenteredRotation); + } + else + SetRotation( Instigator.GetViewRotation() ); + + PreDrawFPWeapon(); // Laurent -- Hook to override things before render (like rotation if using a staticmesh) + + bDrawingFirstPerson = true; + Canvas.DrawActor(self, false, false, DisplayFOV); + bDrawingFirstPerson = false; + if ( Hand == 0 ) + PlayerViewOffset.Y = 0; + + if (GunState == GS_Master && Enforcer2 != None && Enforcer2.ClientState != WS_Hidden) + Enforcer2.RenderOverlays(Canvas); +} + +simulated function BringUp(optional Weapon PrevWeapon) +{ + local int Mode; + + if ( ClientState == WS_Hidden) + { + PlayOwnedSound(SelectSound, SLOT_Interact,,,,, false); + ClientPlayForceFeedback(SelectForce); // jdf + + if ( Instigator.IsLocallyControlled() ) + { + if ( (Mesh!=None) && HasAnim(SelectAnim) ) + PlayAnim(SelectAnim, SelectAnimRate, 0.0); + } + + ClientState = WS_BringUp; + SetTimer(BringUpTime, false); + } + for (Mode = 0; Mode < NUM_FIRE_MODES; Mode++) + { + FireMode[Mode].bIsFiring = false; + FireMode[Mode].HoldTime = 0.0; + FireMode[Mode].bServerDelayStartFire = false; + FireMode[Mode].bServerDelayStopFire = false; + FireMode[Mode].bInstantStop = false; + } + if ( (PrevWeapon != None) && PrevWeapon.HasAmmo() && !PrevWeapon.bNoVoluntarySwitch ) + OldWeapon = PrevWeapon; + else + OldWeapon = None; + + if (GunState == GS_Master && Enforcer2 != None) + Enforcer2.BringUp(); + if (GunState == GS_Slave) + AttachToPawn(Instigator); +} + +//=========================================================================== +// Slave should never be accessible to the player. +//=========================================================================== +simulated function Weapon WeaponChange( byte F, bool bSilent ) +{ + local Weapon newWeapon; + + if ( InventoryGroup == F ) + { + if ( !HasAmmo() || GunState == GS_Slave) + { + if ( Inventory == None ) + newWeapon = None; + else + newWeapon = Inventory.WeaponChange(F,bSilent); + + if ( !bSilent && (newWeapon == None) && Instigator.IsHumanControlled() ) + Instigator.ClientMessage( ItemName$MessageNoAmmo ); + + return newWeapon; + } + else + return self; + } + else if ( Inventory == None ) + return None; + else + return Inventory.WeaponChange(F,bSilent); +} + +simulated function Weapon PrevWeapon(Weapon CurrentChoice, Weapon CurrentWeapon) +{ + if (GunState == GS_Slave) + { + if ( Inventory == None ) + return CurrentChoice; + else + return Inventory.PrevWeapon(CurrentChoice,CurrentWeapon); + } + + return Super.PrevWeapon(CurrentChoice, CurrentWeapon); +} + +simulated function Weapon NextWeapon(Weapon CurrentChoice, Weapon CurrentWeapon) +{ + if (GunState == GS_Slave) + { + if ( Inventory == None ) + return CurrentChoice; + else + return Inventory.NextWeapon(CurrentChoice,CurrentWeapon); + } + + return Super.NextWeapon(CurrentChoice, CurrentWeapon); +} + +//=========================================================================== +// DropFrom +// +// Throw the slave as well. +//=========================================================================== +function DropFrom(vector StartLocation) +{ + local int m; + local Pickup Pickup; + + if (!bCanThrow || !HasAmmo()) + return; + + if (GunState == GS_Master && Enforcer2 != None) + Enforcer2.DropFrom(StartLocation + vect(1,1,1)); + + ClientWeaponThrown(); + + for (m = 0; m < NUM_FIRE_MODES; m++) + { + if (FireMode[m].bIsFiring) + StopFire(m); + } + + if ( Instigator != None ) + { + DetachFromPawn(Instigator); + } + + Pickup = Spawn(PickupClass,,, StartLocation); + if ( Pickup != None ) + { + Pickup.InitDroppedPickupFor(self); + Pickup.Velocity = Velocity; + if (Instigator.Health > 0) + WeaponPickup(Pickup).bThrown = true; + } + + Destroy(); +} + +simulated function bool PutDown() +{ + if (Super.PutDown()) + { + if (GunState == GS_Slave || Enforcer2 == None || Enforcer2.PutDown()) + { + //log("Enforcer"@eval(GunState == GS_Slave, "Slave", "Master")@"PutDown"); + return true; + } + } + return false; +} + +simulated function DetachFromPawn(Pawn P) +{ + if (Enforcer2 != None && GunState != GS_Slave) + Enforcer2.DetachFromPawn(P); + Super.DetachFromPawn(P); +} + +simulated event WeaponTick(float dt) +{ + local int Mode; + + if (GunState == GS_Master && Enforcer2 != None) + Enforcer2.WeaponTick(dt); + + if (GunState == GS_Slave) + { + for (Mode=0; Mode < NUM_FIRE_MODES; Mode++) + { + if (FireMode[Mode].bIsFiring) + { + if (FireMode[Mode].NextFireTime <= Level.TimeSeconds) + FireMode[Mode].ModeDoFire(); + if (Instigator.IsLocallyControlled() && Instigator.Controller != None && ((Instigator.Controller.bFire == 0 && Mode == 0) || (Instigator.Controller.bAltFire == 0 && Mode == 1))) + ClientStopFire(Mode); + } + if (FireMode[Mode].NextTimerPop != 0 && FireMode[Mode].NextTimerPop <= Level.TimeSeconds) + { + FireMode[Mode].Timer(); + if (FireMode[Mode].bTimerLoop) + FireMode[Mode].NextTimerPop = Level.TimeSeconds + FireMode[Mode].TimerInterval; + else FireMode[Mode].NextTimerPop = 0.0f; + } + } + } +} + +//// client & server //// +simulated function bool StartFire(int Mode) +{ + local int alt; + + if (!ReadyToFire(Mode)) + return false; + + if (Mode == 0) + alt = 1; + else + alt = 0; + + FireMode[Mode].bIsFiring = true; + + //Stagger firing for slave as old Enforcers did. + if (GunState == GS_Slave) + FireMode[Mode].NextFireTime = Level.TimeSeconds + FireMode[Mode].PreFireTime + FireMode[Mode].FireRate/2; + else + FireMode[Mode].NextFireTime = Level.TimeSeconds + FireMode[Mode].PreFireTime; + + if (FireMode[alt].bModeExclusive) + { + // prevents rapidly alternating fire modes + FireMode[Mode].NextFireTime = FMax(FireMode[Mode].NextFireTime, FireMode[alt].NextFireTime); + } + + if (Instigator.IsLocallyControlled()) + { + if (FireMode[Mode].PreFireTime > 0.0 || FireMode[Mode].bFireOnRelease) + { + FireMode[Mode].PlayPreFire(); + } + FireMode[Mode].FireCount = 0; + } + + if (GunState == GS_Master && Enforcer2 != None) + Enforcer2.StartFire(Mode); + + return true; +} + +simulated event StopFire(int Mode) +{ + Super.StopFire(Mode); + if (GunState == GS_Master && Enforcer2 != None) + Enforcer2.StopFire(Mode); +} + +//hack to stop all firing and release any charging firemodes RIGHT THIS INSTANT +//used when getting into vehicles +simulated function ImmediateStopFire() +{ + Super.ImmediateStopFire(); + + if (GunState == GS_Master && Enforcer2 != None) + Enforcer2.ImmediateStopFire(); +} + +function GiveTo(Pawn Other, optional Pickup Pickup) +{ + local int m; + local weapon w; + local bool bPossiblySwitch, bJustSpawned; + + Instigator = Other; + W = Weapon(Instigator.FindInventoryType(class)); + if ( W == None || W.Class != Class || UT2341Enforcer(W).Enforcer2 == None) // added class check because somebody made FindInventoryType() return subclasses for some reason + { + bJustSpawned = true; + Super(Inventory).GiveTo(Other); + bPossiblySwitch = true; + if (W != None && UT2341Enforcer(W).Enforcer2 == None) + { + UT2341Enforcer(W).Enforcer2 = self; + Enforcer2 = UT2341Enforcer(W); + W.ItemName = "Double Enforcers"; + GunState = GS_Slave; + bPossiblySwitch=False; //Never allow a slave to trigger an autoswitch + UT2341Enforcer(W).GunState = GS_Master; + } + W = self; + } + + else if ( !W.HasAmmo() ) + bPossiblySwitch = true; + if ( Pickup == None && GunState != GS_Slave) + bPossiblySwitch = true; + + for (m = 0; m < NUM_FIRE_MODES; m++) + { + if ( FireMode[m] != None ) + { + FireMode[m].Instigator = Instigator; + W.GiveAmmo(m,WeaponPickup(Pickup),(bJustSpawned && GunState != GS_Slave)); + } + } + + if ( Instigator.Weapon != W) + W.ClientWeaponSet(bPossiblySwitch); + + if ( !bJustSpawned ) + { + for (m = 0; m < NUM_FIRE_MODES; m++) + Ammo[m] = None; + Destroy(); + } + + if (W == self && GunState == GS_Slave && Instigator.Weapon == Enforcer2 && Instigator.PendingWeapon == None) + BringUp(); +} + +//=========================================================================== +// GiveAmmo +// +// Enforcers should start with 30, not the amount defined in the base ammo, which is for the Mini +//=========================================================================== +function GiveAmmo(int m, WeaponPickup WP, bool bJustSpawned) +{ + local bool bJustSpawnedAmmo; + local int addAmount, InitialAmount; + + 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.AmmoAmount[0] > 0) || (WP.AmmoAmount[1] > 0)) ) + { + InitialAmount = WP.AmmoAmount[m]; + } + + InitialAmount *= 0.3; + + 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) ); + + if ( (WP != None) && ((WP.AmmoAmount[0] > 0) || (WP.AmmoAmount[1] > 0)) ) + { + addAmount = WP.AmmoAmount[m]; + } + else if ( bJustSpawnedAmmo ) + { + addAmount = Ammo[m].InitialAmount * 0.3; + } + + Ammo[m].AddAmmo(addAmount); + Ammo[m].GotoState(''); + } + } +} +function bool HandlePickupQuery( pickup Item ) +{ + local int i; + + if ( bNoAmmoInstances ) + { + // handle ammo pickups + for ( i=0; i<2; i++ ) + { + if ( (item.inventorytype == AmmoClass[i]) && (AmmoClass[i] != None) ) + { + if ( AmmoCharge[i] >= MaxAmmo(i) ) + return true; + item.AnnouncePickup(Pawn(Owner)); + AddAmmo(Ammo(item).AmmoAmount, i); + item.SetRespawn(); + return true; + } + } + } + + if (class == Item.InventoryType) + { + if(WeaponPickup(Item) != None && !WeaponPickup(Item).AllowRepeatPickup()) + return true; + //if (Enforcer2 == None) + return false; + //return true; + } + + if ( Inventory == None ) + return false; + + return Inventory.HandlePickupQuery(Item); +} + +simulated function DisplayDebug(Canvas Canvas, out float YL, out float YPos) +{ + super.DisplayDebug(Canvas, YL, YPos); + + if (GunState == GS_Master) + Enforcer2.DisplayDebug(Canvas, YL, YPos); +} + +function byte BestMode() +{ + local Bot B; + + B = Bot(Instigator.Controller); + if ( (B != None) && (B.Enemy != None) ) + { + if ( VSize(B.Location - B.Enemy.Location) < 1024 ) + return 1; + } + return 0; +} + +function float GetAIRating() +{ + local Bot B; + + if ( Enforcer2 == None ) + return AIRating; + + B = Bot(Instigator.Controller); + if ( B == None ) + return AIRating; + + if ( B.Enemy == None ) + return AIRating; + + return (AIRating + 0.0003 * FClamp(1500 - VSize(B.Enemy.Location - Instigator.Location),0,1000)); +} + +defaultproperties +{ + FireModeClass(0)=Class'UT2341WeaponsReducedv1a.UT2341EnforcerFire' + FireModeClass(1)=Class'UT2341WeaponsReducedv1a.UT2341EnforcerAltFire' + PutDownAnim="PutDown" + SelectSound=Sound'UT2341Weapons_Sounds.Enforcer.Cocking' + SelectForce="SwitchToMiniGun" + AIRating=0.400000 + CurrentRating=0.400000 + bNoAmmoInstances=False + Description="Classification: Light PistolnnPrimary Fire: Accurate but slow firing instant hit.nnSecondary Fire: Sideways, or 'Gangsta' firing mode, shoots faster and less accurately than the primary fire.nnTechniques: Collect two for twice the damage." + EffectOffset=(X=100.000000,Y=30.000000,Z=-16.000000) + Priority=9 + HudColor=(B=255) + SmallViewOffset=(X=-2.000000,Z=-13.000000) + CenteredOffsetY=-6.000000 + CenteredRoll=0 + CenteredYaw=-500 + CustomCrosshair=12 + CustomCrossHairTextureName="Crosshairs.Hud.Crosshair_Circle1" + InventoryGroup=2 + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341EnforcerPickup' + PlayerViewOffset=(X=-2.000000,Z=-13.000000) + BobDamping=2.250000 + AttachmentClass=Class'UT2341WeaponsReducedv1a.UT2341EnforcerAttachment' + IconMaterial=Texture'UT2341Weapons_Tex.Icons.Icon_Enforcer' + IconCoords=(X2=128,Y2=32) + ItemName="Enforcer" + LightType=LT_Pulse + LightEffect=LE_NonIncidence + LightHue=30 + LightSaturation=150 + LightBrightness=255.000000 + LightRadius=5.000000 + LightPeriod=3 + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTEnforcer_FP' + DrawScale=2.000000 + SoundRadius=400.000000 +} diff --git a/Sources/Classes/UT2341EnforcerAltFire.uc b/Sources/Classes/UT2341EnforcerAltFire.uc new file mode 100644 index 0000000..694889c --- /dev/null +++ b/Sources/Classes/UT2341EnforcerAltFire.uc @@ -0,0 +1,169 @@ +/************************************************************* +* +* +* +*************************************************************/ +class UT2341EnforcerAltFire extends InstantFire; + +var() class NewFlashClass; +var Emitter NewFlashEmitter; + +function InitEffects() +{ + // don't even spawn on server + if ( (Level.NetMode == NM_DedicatedServer) || (AIController(Instigator.Controller) != None) ) + return; + if ( (NewFlashClass != None) && ((NewFlashEmitter == None) || NewFlashEmitter.bDeleteMe) ) + { + NewFlashEmitter = Weapon.Spawn(NewFlashClass); + Weapon.AttachToBone(NewFlashEmitter, 'tip'); + } + if ( (SmokeEmitterClass != None) && ((SmokeEmitter == None) || SmokeEmitter.bDeleteMe) ) + { + SmokeEmitter = Weapon.Spawn(SmokeEmitterClass); + } +} + +function DrawMuzzleFlash(Canvas Canvas) +{ + // Draw smoke first + if (SmokeEmitter != None && SmokeEmitter.Base != Weapon) + { + SmokeEmitter.SetLocation( Weapon.GetEffectStart() ); + Canvas.DrawActor( SmokeEmitter, false, false, Weapon.DisplayFOV ); + } + + if (NewFlashEmitter != None && NewFlashEmitter.Base != Weapon) + { + NewFlashEmitter.SetLocation( Weapon.GetEffectStart() ); + Canvas.DrawActor( NewFlashEmitter, false, false, Weapon.DisplayFOV ); + } +} + +function FlashMuzzleFlash() +{ + local rotator r; + + r.Roll = Rand(65535); + Weapon.SetBoneRotation('Bone_Flash', r, 0, 1.f); + if (NewFlashEmitter != None) + NewFlashEmitter.Trigger(Weapon, Instigator); +} + +simulated function DestroyEffects() +{ + if (NewFlashEmitter != None) + NewFlashEmitter.Destroy(); + + if (SmokeEmitter != None) + SmokeEmitter.Destroy(); +} + +function DoFireEffect() +{ + local Vector StartTrace; + local Rotator R, Aim; + local Vector X,Y,Z; + + Instigator.MakeNoise(1.0); + + StartTrace = Instigator.Location + Instigator.EyePosition(); + + Aim = AdjustAim(StartTrace, AimError); + Weapon.GetViewAxes(X, Y, Z); + + Spread = FMin(default.Spread + (0.05 * FireCount), 0.3); + if (UT2341Enforcer(Weapon).GunState != GS_Single) + Spread = FClamp(3 * Spread, 0.075, 0.3); + + R = rotator(Vector(Aim) + (Spread * (FRand() -0.5) * Y) + (Spread * (FRand() -0.5) * Z)); + DoTrace(StartTrace, R); +} + +function PlayFireEnd() +{ + //no pls +} + +function DoTrace(Vector Start, Rotator Dir) +{ + local Vector X,Y,Z, End, HitLocation, HitNormal; + local Actor Other; + local SniperWallHitEffect S; + + Weapon.GetViewAxes(X, Y, Z); + + X = Vector(Dir); + End = Start + TraceRange * X; + + Other = Weapon.Trace(HitLocation, HitNormal, End, Start, true); + + if ( Other != None && (Other != Instigator) ) + { + if ( !Other.bWorldGeometry && Other.bCanBeDamaged ) + Other.TakeDamage(DamageMax, Instigator, HitLocation, Momentum*X, DamageType); + else + HitLocation = HitLocation + 2.0 * HitNormal; + } + else + { + HitLocation = End; + HitNormal = Normal(Start - End); + } + + if ( (HitNormal != Vect(0,0,0)) && (HitScanBlockingVolume(Other) == None) ) + { + S = Weapon.Spawn(class'SniperWallHitEffect',,, HitLocation, rotator(-1 * HitNormal)); + if ( S != None ) + S.FireStart = Start; + } +} + +function PlayFiring() +{ + Super.PlayFiring(); + + if (Weapon.Role == ROLE_Authority) + { + Spread = FMin(default.Spread + (0.05 * FireCount), 0.3); + + if (UT2341Enforcer(Weapon).GunState != GS_Single) + Spread = FClamp(3 * Spread, 0.075, 0.3); + } + UT2341Enforcer(Weapon).SpawnShell(); +} + +function ServerPlayFiring() +{ + FireCount++; +} + +function StopFiring() +{ + Spread = default.Spread; + FireCount = 0; +} + +defaultproperties +{ + NewFlashClass=Class'UT2341WeaponsReducedv1a.FX_EnforcerMuzFlash' + DamageType=Class'UT2341WeaponsReducedv1a.DamType_Enforcer' + DamageMin=25 + DamageMax=25 + PreFireTime=0.200000 + PreFireAnim="PreAlt" + FireAnim="FireAlt" + FireEndAnim="AltEnd" + PreFireAnimRate=2.000000 + FireAnimRate=2.000000 + FireEndAnimRate=2.000000 + FireSound=Sound'UT2341Weapons_Sounds.Enforcer.Shot' + FireRate=0.290000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341MinigunAmmo' + AmmoPerFire=1 + BotRefireRate=0.400000 + WarnTargetPct=0.500000 + aimerror=850.000000 + Spread=0.040000 + SpreadStyle=SS_Random +} diff --git a/Sources/Classes/UT2341EnforcerAttachment.uc b/Sources/Classes/UT2341EnforcerAttachment.uc new file mode 100644 index 0000000..62c31aa --- /dev/null +++ b/Sources/Classes/UT2341EnforcerAttachment.uc @@ -0,0 +1,112 @@ +class UT2341EnforcerAttachment extends xWeaponAttachment; + +var Emitter mMuzFlash3rd; + +var bool bDualGun; +var UT2341EnforcerAttachment Enforcer2Attachment; +var float AimAlpha; + +replication +{ + reliable if ( Role == ROLE_Authority ) + bDualGun, Enforcer2Attachment; +} + +simulated function Hide(bool NewbHidden) +{ + bHidden = NewbHidden; + if ( Enforcer2Attachment != None ) + Enforcer2Attachment.bHidden = bHidden; +} + +simulated function Tick(float deltatime) +{ + local rotator newRot; + + if ( !bDualGun || (Level.NetMode == NM_DedicatedServer) ) + { + Disable('Tick'); + return; + } + + AimAlpha = AimAlpha * ( 1 - 2*DeltaTime); + + // point in firing direction + if ( Instigator != None ) + { + newRot = Instigator.Rotation; + if ( AimAlpha < 0.5 ) + newRot.Yaw += 4500 * (1 - 2*AimAlpha); + Instigator.SetBoneDirection('lfarm', newRot,, 1.0, 1); + + newRot.Roll += 32768; + Instigator.SetBoneDirection(AttachmentBone, newRot,, 1.0, 1); + } +} + + +simulated function Destroyed() +{ + if ( bDualGun ) + { + if ( Instigator != None ) + { + Instigator.SetBoneDirection(AttachmentBone, Rotation,, 0, 0); + Instigator.SetBoneDirection('lfarm', Rotation,, 0, 0); + } + } + if (mMuzFlash3rd != None) + mMuzFlash3rd.Destroy(); + Super.Destroyed(); +} + +simulated function SetOverlayMaterial( Material mat, float time, bool bOverride ) +{ + Super.SetOverlayMaterial(mat, time, bOverride); + if ( !bDualGun && (Enforcer2Attachment != None) ) + Enforcer2Attachment.SetOverlayMaterial(mat, time, bOverride); +} + +simulated event ThirdPersonEffects() +{ + if ( (FlashCount != 0) && (Level.NetMode != NM_DedicatedServer) ) + { + if (FiringMode == 0) + WeaponLight(); + + if ( Level.TimeSeconds - Instigator.LastRenderTime < 0.2 ) + { + if (mMuzFlash3rd == None) + { + mMuzFlash3rd = Spawn(class'FX_EnforcerMuzFlash'); + AttachToBone(mMuzFlash3rd, 'tip'); + } + if (mMuzFlash3rd != None) + mMuzFlash3rd.Trigger(Self, None); + } + } + + Super.ThirdPersonEffects(); +} + +simulated function Vector GetTipLocation() +{ + local Coords C; + + C = GetBoneCoords('tip'); + return C.Origin; +} + +defaultproperties +{ + LightType=LT_Steady + LightEffect=LE_NonIncidence + LightHue=30 + LightSaturation=224 + LightBrightness=255.000000 + LightRadius=5.000000 + LightPeriod=3 + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTEnforcer3rd' + RelativeLocation=(X=3.000000,Z=3.000000) + DrawScale=0.120000 +} diff --git a/Sources/Classes/UT2341EnforcerFire.uc b/Sources/Classes/UT2341EnforcerFire.uc new file mode 100644 index 0000000..88678cc --- /dev/null +++ b/Sources/Classes/UT2341EnforcerFire.uc @@ -0,0 +1,143 @@ +/************************************************************* +* +* +* +*************************************************************/ +class UT2341EnforcerFire extends InstantFire; + +var() class NewFlashClass; +var Emitter NewFlashEmitter; + +function InitEffects() +{ + // don't even spawn on server + if ( (Level.NetMode == NM_DedicatedServer) || (AIController(Instigator.Controller) != None) ) + return; + if ( (NewFlashClass != None) && ((NewFlashEmitter == None) || NewFlashEmitter.bDeleteMe) ) + { + NewFlashEmitter = Weapon.Spawn(NewFlashClass); + Weapon.AttachToBone(NewFlashEmitter, 'tip'); + } + if ( (SmokeEmitterClass != None) && ((SmokeEmitter == None) || SmokeEmitter.bDeleteMe) ) + { + SmokeEmitter = Weapon.Spawn(SmokeEmitterClass); + } +} + +function DrawMuzzleFlash(Canvas Canvas) +{ + // Draw smoke first + if (SmokeEmitter != None && SmokeEmitter.Base != Weapon) + { + SmokeEmitter.SetLocation( Weapon.GetEffectStart() ); + Canvas.DrawActor( SmokeEmitter, false, false, Weapon.DisplayFOV ); + } + + if (NewFlashEmitter != None && NewFlashEmitter.Base != Weapon) + { + NewFlashEmitter.SetLocation( Weapon.GetEffectStart() ); + Canvas.DrawActor( NewFlashEmitter, false, false, Weapon.DisplayFOV ); + } +} + +function FlashMuzzleFlash() +{ + local rotator r; + + r.Roll = Rand(65535); + Weapon.SetBoneRotation('Bone_Flash', r, 0, 1.f); + if (NewFlashEmitter != None) + NewFlashEmitter.Trigger(Weapon, Instigator); +} + +function DoFireEffect() +{ + local Vector StartTrace; + local Rotator R, Aim; + local Vector X,Y,Z; + + Instigator.MakeNoise(1.0); + + StartTrace = Instigator.Location + Instigator.EyePosition(); + + Aim = AdjustAim(StartTrace, AimError); + Weapon.GetViewAxes(X, Y, Z); + //R = rotator(vector(Aim) + VRand()*FRand()*Spread); + //UT99 Enforcer spread implementation - Spread == UT99's Accuracy value/10 + if (UT2341Enforcer(Weapon).GunState != GS_Single) + Spread = 0.075; + R = rotator(Vector(Aim) + (Spread * (FRand() -0.5) * Y) + (Spread * (FRand() -0.5) * Z)); + DoTrace(StartTrace, R); +} + +simulated function DestroyEffects() +{ + if (NewFlashEmitter != None) + NewFlashEmitter.Destroy(); + + if (SmokeEmitter != None) + SmokeEmitter.Destroy(); +} + +function DoTrace(Vector Start, Rotator Dir) +{ + local Vector X,Y,Z, End, HitLocation, HitNormal; + local Actor Other; + local SniperWallHitEffect S; + + Weapon.GetViewAxes(X, Y, Z); + + X = Vector(Dir); + End = Start + TraceRange * X; + Other = Weapon.Trace(HitLocation, HitNormal, End, Start, true); + + if ( Other != None && (Other != Instigator) ) + { + if ( !Other.bWorldGeometry && Other.bCanBeDamaged ) + Other.TakeDamage(DamageMax, Instigator, HitLocation, Momentum*X, DamageType); + else + HitLocation = HitLocation + 2.0 * HitNormal; + } + else + { + HitLocation = End; + HitNormal = Normal(Start - End); + } + + if ( (HitNormal != Vect(0,0,0)) && (HitScanBlockingVolume(Other) == None) ) + { + S = Weapon.Spawn(class'SniperWallHitEffect',,, HitLocation, rotator(-1 * HitNormal)); + if ( S != None ) + S.FireStart = Start; + } +} + + +function PlayFiring() +{ + Super.PlayFiring(); + + UT2341Enforcer(Weapon).SpawnShell(); +} + +function StopFiring() +{ + Spread = default.Spread; +} + +defaultproperties +{ + NewFlashClass=Class'UT2341WeaponsReducedv1a.FX_EnforcerMuzFlash' + DamageType=Class'UT2341WeaponsReducedv1a.DamType_Enforcer' + DamageMin=25 + DamageMax=25 + FireSound=Sound'UT2341Weapons_Sounds.Enforcer.Shot' + FireRate=0.400000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341MinigunAmmo' + AmmoPerFire=1 + BotRefireRate=0.400000 + WarnTargetPct=0.500000 + aimerror=850.000000 + Spread=0.020000 + SpreadStyle=SS_Random +} diff --git a/Sources/Classes/UT2341EnforcerPickup.uc b/Sources/Classes/UT2341EnforcerPickup.uc new file mode 100644 index 0000000..56e0566 --- /dev/null +++ b/Sources/Classes/UT2341EnforcerPickup.uc @@ -0,0 +1,35 @@ +//============================================================================= +// Minigun. +//============================================================================= +class UT2341EnforcerPickup extends UTWeaponPickup; + +static function StaticPrecache(LevelInfo L) +{ + L.AddPrecacheMaterial(Texture'XEffects.ShellCasingTex'); + L.AddPrecacheMaterial(Texture'AW-2004Explosions.Part_explode2s'); + L.AddPrecacheMaterial(Texture'AW-2004Particles.TracerShot'); + L.AddPrecacheStaticMesh(StaticMesh'UT2341Weapons_SM.UTMinigun'); +} + +simulated function UpdatePrecacheMaterials() +{ + Level.AddPrecacheMaterial(Texture'XEffects.ShellCasingTex'); + Level.AddPrecacheMaterial(Texture'AW-2004Explosions.Part_explode2s'); + Level.AddPrecacheMaterial(Texture'AW-2004Particles.TracerShot'); + + super.UpdatePrecacheMaterials(); +} + +defaultproperties +{ + MaxDesireability=0.730000 + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341Enforcer' + PickupMessage="You got an Enforcer." + PickupSound=Sound'UT2341Weapons_Sounds.General.WeaponPickup' + PickupForce="MinigunPickup" + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTEnforcer' + DrawScale=0.220000 + AmbientGlow=64 + RotationRate=(Yaw=5000) +} diff --git a/Sources/Classes/UT2341FlakAltFire.uc b/Sources/Classes/UT2341FlakAltFire.uc new file mode 100644 index 0000000..46b62b6 --- /dev/null +++ b/Sources/Classes/UT2341FlakAltFire.uc @@ -0,0 +1,31 @@ +class UT2341FlakAltFire extends ProjectileFire; + +function InitEffects() +{ + Super.InitEffects(); + if ( FlashEmitter == None ) + FlashEmitter = Weapon.GetFireMode(0).FlashEmitter; +} + +defaultproperties +{ + ProjSpawnOffset=(X=25.000000,Y=9.000000,Z=-12.000000) + bSplashDamage=True + bRecommendSplashDamage=True + bTossed=True + FireAnim="FireAltLoad" + FireEndAnim= + FireAnimRate=0.900000 + FireSound=Sound'UT2341Weapons_Sounds.flak.Explode1' + FireForce="FlakCannonAltFire" + FireRate=1.000000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341FlakAmmo' + AmmoPerFire=1 + ShakeRotTime=2.000000 + ShakeOffsetMag=(X=-20.000000) + ShakeOffsetRate=(X=-1000.000000) + ShakeOffsetTime=2.000000 + ProjectileClass=Class'UT2341WeaponsReducedv1a.UT2341FlakShell' + BotRefireRate=0.500000 + WarnTargetPct=0.900000 +} diff --git a/Sources/Classes/UT2341FlakAmmo.uc b/Sources/Classes/UT2341FlakAmmo.uc new file mode 100644 index 0000000..ca63e57 --- /dev/null +++ b/Sources/Classes/UT2341FlakAmmo.uc @@ -0,0 +1,12 @@ +class UT2341FlakAmmo extends Ammunition; + +#EXEC OBJ LOAD FILE=InterfaceContent.utx + +defaultproperties +{ + MaxAmmo=50 + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341FlakAmmoPickup' + IconMaterial=Texture'HUDContent.Generic.HUD' + IconCoords=(X1=394,Y1=40,X2=457,Y2=81) + ItemName="Flak Shells" +} diff --git a/Sources/Classes/UT2341FlakAmmoPickup.uc b/Sources/Classes/UT2341FlakAmmoPickup.uc new file mode 100644 index 0000000..e0f05ae --- /dev/null +++ b/Sources/Classes/UT2341FlakAmmoPickup.uc @@ -0,0 +1,22 @@ +class UT2341FlakAmmoPickup extends UTAmmoPickup; + +function RespawnEffect() +{ + spawn(class'FX_PickupRespawn'); +} + +defaultproperties +{ + AmmoAmount=10 + MaxDesireability=0.320000 + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341FlakAmmo' + PickupMessage="You picked up 10 Flak Shells." + PickupSound=Sound'UT2341Weapons_Sounds.General.AmmoSnd' + PickupForce="FlakAmmoPickup" + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTFlakAmmo' + DrawScale=0.250000 + PrePivot=(Z=40.000000) + AmbientGlow=48 + CollisionHeight=8.250000 +} diff --git a/Sources/Classes/UT2341FlakAttachment.uc b/Sources/Classes/UT2341FlakAttachment.uc new file mode 100644 index 0000000..8ee4d3b --- /dev/null +++ b/Sources/Classes/UT2341FlakAttachment.uc @@ -0,0 +1,64 @@ +class UT2341FlakAttachment extends xWeaponAttachment; + +var class mMuzFlashClass; +var xEmitter mMuzFlash3rd; + +simulated function PostNetBeginPlay() +{ + Super.PostNetBeginPlay(); + PlayAnim('Select', 1.35); +} + +simulated function Destroyed() +{ + if (mMuzFlash3rd != None) + mMuzFlash3rd.Destroy(); + Super.Destroyed(); +} + +simulated event ThirdPersonEffects() +{ + local rotator r; + + if ( Level.NetMode != NM_DedicatedServer && FlashCount > 0 ) + { + WeaponLight(); + if (mMuzFlash3rd == None) + { + mMuzFlash3rd = Spawn(mMuzFlashClass); + AttachToBone(mMuzFlash3rd, 'tip'); + } + if (mMuzFlash3rd != None) + { + r.Roll = Rand(65536); + SetBoneRotation('Bone_Flash', r, 0, 1.f); + mMuzFlash3rd.mStartParticles++; + } + } + + if (FiringMode == 0) + PlayAnim('FireLoad',1.35); + else PlayAnim('FireAltLoad',1.25); + + Super.ThirdPersonEffects(); +} + +simulated function Notify_AttachmentLoad() +{ + if (Level.NetMode != NM_DedicatedServer && !Instigator.IsLocallyControlled()) + PlaySound(Sound'UT2341Weapons_Sounds.Flak.load1', SLOT_None,0.65,,,,false); +} + +defaultproperties +{ + mMuzFlashClass=Class'XEffects.FlakMuzFlash3rd' + bHeavy=True + LightType=LT_Steady + LightEffect=LE_NonIncidence + LightHue=30 + LightSaturation=150 + LightBrightness=255.000000 + LightRadius=4.000000 + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTFlakCannon3rd' + DrawScale=0.100000 +} diff --git a/Sources/Classes/UT2341FlakCannon.uc b/Sources/Classes/UT2341FlakCannon.uc new file mode 100644 index 0000000..51d74ad --- /dev/null +++ b/Sources/Classes/UT2341FlakCannon.uc @@ -0,0 +1,142 @@ +//============================================================================= +// Flak Cannon +//============================================================================= +class UT2341FlakCannon extends Weapon + config(user); + +#EXEC OBJ LOAD FILE=InterfaceContent.utx + +simulated function Notify_Hydraulic() +{ + if (Instigator.IsLocallyControlled()) + PlaySound(Sound'UT2341Weapons_Sounds.Flak.load1', SLOT_None,0.65,,,,false); +} + +simulated function Notify_HydraulicSelect() +{ + PlayOwnedSound(Sound'UT2341Weapons_Sounds.Flak.Hidraul2', SLOT_None,0.8,,,,false); +} + +// AI Interface +function float GetAIRating() +{ + local Bot B; + local float EnemyDist; + local vector EnemyDir; + + B = Bot(Instigator.Controller); + if ( B == None ) + return AIRating; + + if ( (B.Target != None) && (Pawn(B.Target) == None) && (VSize(B.Target.Location - Instigator.Location) < 1250) ) + return 0.9; + + if ( B.Enemy == None ) + { + if ( (B.Target != None) && VSize(B.Target.Location - B.Pawn.Location) > 3500 ) + return 0.2; + return AIRating; + } + + EnemyDir = B.Enemy.Location - Instigator.Location; + EnemyDist = VSize(EnemyDir); + if ( EnemyDist > 750 ) + { + if ( EnemyDist > 2000 ) + { + if ( EnemyDist > 3500 ) + return 0.2; + return (AIRating - 0.3); + } + if ( EnemyDir.Z < -0.5 * EnemyDist ) + return (AIRating - 0.3); + } + else if ( (B.Enemy.Weapon != None) && B.Enemy.Weapon.bMeleeWeapon ) + return (AIRating + 0.35); + else if ( EnemyDist < 400 ) + return (AIRating + 0.2); + return FMax(AIRating + 0.2 - (EnemyDist - 400) * 0.0008, 0.2); +} + +/* BestMode() +choose between regular or alt-fire +*/ +function byte BestMode() +{ + local vector EnemyDir; + local float EnemyDist; + local bot B; + + B = Bot(Instigator.Controller); + if ( (B == None) || (B.Enemy == None) ) + return 0; + + EnemyDir = B.Enemy.Location - Instigator.Location; + EnemyDist = VSize(EnemyDir); + if ( EnemyDist > 750 ) + { + if ( EnemyDir.Z < -0.5 * EnemyDist ) + return 1; + return 0; + } + else if ( (B.Enemy.Weapon != None) && B.Enemy.Weapon.bMeleeWeapon ) + return 0; + else if ( (EnemyDist < 400) || (EnemyDir.Z > 30) ) + return 0; + else if ( FRand() < 0.65 ) + return 1; + return 0; +} + +function float SuggestAttackStyle() +{ + if ( (AIController(Instigator.Controller) != None) + && (AIController(Instigator.Controller).Skill < 3) ) + return 0.4; + return 0.8; +} + +function float SuggestDefenseStyle() +{ + return -0.4; +} +// End AI Interface + +defaultproperties +{ + FireModeClass(0)=Class'UT2341WeaponsReducedv1a.UT2341FlakFire' + FireModeClass(1)=Class'UT2341WeaponsReducedv1a.UT2341FlakAltFire' + PutDownAnim="PutDown" + BringUpTime=1.000000 + SelectSound=Sound'UT2341Weapons_Sounds.flak.pdown' + SelectForce="SwitchToFlakCannon" + AIRating=0.750000 + CurrentRating=0.750000 + Description="Classification: Heavy Shrapnel||Primary Fire: White hot chunks of scrap metal are sprayed forth, shotgun style.||Secondary Fire: A grenade full of shrapnel is lobbed at the enemy.||Techniques: The Flak Cannon is far more useful in close range combat situations." + EffectOffset=(X=200.000000,Y=32.000000,Z=-25.000000) + DisplayFOV=80.000000 + Priority=13 + HudColor=(G=128) + SmallViewOffset=(X=5.000000,Z=-7.000000) + CenteredOffsetY=-4.000000 + CenteredRoll=3000 + CenteredYaw=-500 + CustomCrosshair=9 + CustomCrossHairColor=(B=0,G=128) + CustomCrossHairTextureName="Crosshairs.Hud.Crosshair_Triad3" + InventoryGroup=8 + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341FlakCannonPickup' + PlayerViewOffset=(X=5.000000,Z=-7.000000) + BobDamping=1.400000 + AttachmentClass=Class'UT2341WeaponsReducedv1a.UT2341FlakAttachment' + IconMaterial=Texture'UT2341Weapons_Tex.Icons.Icon_FlakCannon' + IconCoords=(X2=128,Y2=32) + ItemName="Flak Cannon" + LightType=LT_Steady + LightEffect=LE_NonIncidence + LightHue=30 + LightSaturation=150 + LightBrightness=255.000000 + LightRadius=4.000000 + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTFlakCannonFP' +} diff --git a/Sources/Classes/UT2341FlakCannonPickup.uc b/Sources/Classes/UT2341FlakCannonPickup.uc new file mode 100644 index 0000000..4a387a7 --- /dev/null +++ b/Sources/Classes/UT2341FlakCannonPickup.uc @@ -0,0 +1,61 @@ +//============================================================================= +// FlakCannonPickup. +//============================================================================= +class UT2341FlakCannonPickup extends UTWeaponPickup; + +#exec OBJ LOAD FILE=WeaponStaticMesh.usx + +static function StaticPrecache(LevelInfo L) +{ + L.AddPrecacheMaterial(Texture'XEffects.FlakTrailTex'); + if ( L.DetailMode != DM_Low ) + L.AddPrecacheMaterial(Texture'XEffects.fexpt'); + L.AddPrecacheMaterial(Texture'XEffects.ExplosionFlashTex'); + L.AddPrecacheMaterial(Texture'XEffects.GoldGlow'); + L.AddPrecacheMaterial(Texture'WeaponSkins.FlakTex0'); + L.AddPrecacheMaterial(Texture'WeaponSkins.FlakTex1'); + L.AddPrecacheMaterial(Texture'WeaponSkins.FlakChunkTex'); + L.AddPrecacheMaterial(Texture'XWeapons.NewFlakSkin'); + L.AddPrecacheMaterial(Texture'XGameShaders.flak_flash'); + L.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.flakchunk'); + L.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.flakshell'); + L.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.FlakCannonPickup'); +} + +simulated function UpdatePrecacheMaterials() +{ + Level.AddPrecacheMaterial(Texture'XEffects.FlakTrailTex'); + if ( Level.DetailMode != DM_Low ) + Level.AddPrecacheMaterial(Texture'XEffects.fexpt'); + Level.AddPrecacheMaterial(Texture'XEffects.ExplosionFlashTex'); + Level.AddPrecacheMaterial(Texture'XEffects.GoldGlow'); + Level.AddPrecacheMaterial(Texture'WeaponSkins.FlakTex0'); + Level.AddPrecacheMaterial(Texture'WeaponSkins.FlakTex1'); + Level.AddPrecacheMaterial(Texture'WeaponSkins.FlakChunkTex'); + Level.AddPrecacheMaterial(Texture'XWeapons.NewFlakSkin'); + Level.AddPrecacheMaterial(Texture'XGameShaders.flak_flash'); + + super.UpdatePrecacheMaterials(); +} + +simulated function UpdatePrecacheStaticMeshes() +{ + Level.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.flakchunk'); + Level.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.flakshell'); + Super.UpdatePrecacheStaticMeshes(); +} + + +defaultproperties +{ + MaxDesireability=0.750000 + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341FlakCannon' + PickupMessage="You got the Flak Cannon." + PickupSound=Sound'UT2341Weapons_Sounds.General.WeaponPickup' + PickupForce="FlakCannonPickup" + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTFlakCannon' + DrawScale=1.500000 + AmbientGlow=48 + RotationRate=(Yaw=5000) +} diff --git a/Sources/Classes/UT2341FlakChunk.uc b/Sources/Classes/UT2341FlakChunk.uc new file mode 100644 index 0000000..56fd9e6 --- /dev/null +++ b/Sources/Classes/UT2341FlakChunk.uc @@ -0,0 +1,208 @@ +//============================================================================= +// FlakChunk. +//============================================================================= +class UT2341FlakChunk extends Projectile; + +var Emitter Glow; +var byte Bounces; +var float DamageAtten; +var sound ImpactSounds[3]; + +var ConstantColor myConstantColor; +var Combiner myCombiner; + +replication +{ + reliable if (bNetInitial && Role == ROLE_Authority) + Bounces; +} + +simulated function Destroyed() +{ + if (Glow!=None) + Glow.Destroy(); + + if (Level.NetMode != NM_DedicatedServer) + { + myCombiner.Material1 = None; + myCombiner.Material2 = None; + myCombiner.Mask = None; + Level.ObjectPool.FreeObject(myCombiner); + + Level.ObjectPool.FreeObject(myConstantColor); + } + + Super.Destroyed(); +} + +simulated function PostBeginPlay() +{ + local float r; + + if ( Level.NetMode != NM_DedicatedServer ) + { + if ( !PhysicsVolume.bWaterVolume ) + { + Glow = Spawn(class'FX_FlakChunkGlow',self); + Glow.SetBase(self); + } + } + + if (Role == ROLE_Authority) + { + Velocity = Vector(Rotation) * (Speed + (FRand() * 200 - 100)); + if (PhysicsVolume.bWaterVolume) + Velocity *= 0.65; + } + + r = FRand(); + if (r > 0.75) + Bounces = 2; + else if (r > 0.25) + Bounces = 1; + else + Bounces = 0; + + SetRotation(RotRand()); + + Super.PostBeginPlay(); +} + +//=========================================================================== +// PostNetBeginPlay +// +// Apparently, SetOverlayMaterial doesn't work for this class. +// Hence, this irritating and convoluted method! +//=========================================================================== +simulated function PostNetBeginPlay() +{ + if (Level.NetMode != NM_DedicatedServer) + { + myConstantColor = ConstantColor(Level.ObjectPool.AllocateObject(class'ConstantColor')); + myConstantColor.Color.R = 255; + myConstantColor.Color.G = 255; + myConstantColor.Color.B = 255; + myConstantColor.Color.A = 0; + myCombiner = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); + + myCombiner.CombineOperation = CO_AlphaBlend_With_Mask; + myCombiner.AlphaOperation = AO_Use_Mask; + myCombiner.Material2 = Texture'WeaponSkins.Skins.FlakChunkTex'; + myCombiner.Material1 = Texture'UT2341Weapons_Tex.Flak.FlakChunkHot'; + myCombiner.Mask = myConstantColor; + + Skins[0] = myCombiner; + } +} + +simulated function ProcessTouch (Actor Other, vector HitLocation) +{ + if ( (FlakChunk(Other) == None) && ((Physics == PHYS_Falling) || (Other != Instigator)) ) + { + speed = VSize(Velocity); + if ( speed > 200 ) + { + if (FRand() > 0.5) + PlaySound(Sound'UT2341Weapons_Sounds.Flak.ChunkHit'); + if ( Role == ROLE_Authority ) + { + if ( Instigator == None || Instigator.Controller == None ) + Other.SetDelayedDamageInstigatorController( InstigatorController ); + + Other.TakeDamage( Damage, Instigator, HitLocation, + (MomentumTransfer * Velocity/speed), MyDamageType ); + } + } + Destroy(); + } +} + +simulated function Landed( Vector HitNormal ) +{ + SetPhysics(PHYS_None); + LifeSpan = 1.0; +} + +simulated function HitWall( vector HitNormal, actor Wall ) +{ + if ( !Wall.bStatic && !Wall.bWorldGeometry + && ((Mover(Wall) == None) || Mover(Wall).bDamageTriggered) ) + { + if ( Level.NetMode != NM_Client ) + { + if ( Instigator == None || Instigator.Controller == None ) + Wall.SetDelayedDamageInstigatorController( InstigatorController ); + Wall.TakeDamage( Damage, instigator, Location, MomentumTransfer * Normal(Velocity), MyDamageType); + } + Destroy(); + return; + } + + SetPhysics(PHYS_Falling); + if (Bounces > 0) + { + if ( !Level.bDropDetail && (FRand() < 0.4) ) + Playsound(ImpactSounds[Rand(3)]); + + Velocity = 0.65 * (Velocity - 2.0*HitNormal*(Velocity dot HitNormal)); + Bounces = Bounces - 1; + return; + } + bBounce = false; +} + +simulated function PhysicsVolumeChange( PhysicsVolume Volume ) +{ + if (Volume.bWaterVolume) + { + if ( Glow != None ) + Glow.Destroy(); + Velocity *= 0.65; + } +} + +simulated function Tick(float DeltaTime) +{ + Super.Tick(DeltaTime); + + if (Level.NetMode == NM_DedicatedServer) + return; + + if (myConstantColor != None) + { + if ( (DeltaTime * 255 + myConstantColor.Color.A) > 255) + { + MyConstantColor.Color.A = 255; + Disable('Tick'); + } + else myConstantColor.Color.A += DeltaTime * 2 * 255; + + AmbientGlow = 255 - myConstantColor.Color.A; + } +} + +/* +n.b +flak chunk speed values match ut99 exactly, with no compensatory mechanism, +because flak was too strong +*/ + +defaultproperties +{ + Bounces=1 + ImpactSounds(0)=Sound'UT2341Weapons_Sounds.flak.Hit1' + ImpactSounds(1)=Sound'UT2341Weapons_Sounds.flak.Hit3' + ImpactSounds(2)=Sound'UT2341Weapons_Sounds.flak.Hit5' + Speed=2750.000000 + MaxSpeed=2970.000000 + Damage=24.000000 + MomentumTransfer=10000.000000 + MyDamageType=Class'UT2341WeaponsReducedv1a.DamType_Flak' + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'WeaponStaticMesh.FlakChunk' + CullDistance=3000.000000 + LifeSpan=2.000000 + DrawScale=21.000000 + AmbientGlow=64 + bBounce=True +} diff --git a/Sources/Classes/UT2341FlakFire.uc b/Sources/Classes/UT2341FlakFire.uc new file mode 100644 index 0000000..b295481 --- /dev/null +++ b/Sources/Classes/UT2341FlakFire.uc @@ -0,0 +1,31 @@ +class UT2341FlakFire extends ProjectileFire; + +function InitEffects() +{ + Super.InitEffects(); + if ( FlashEmitter != None ) + Weapon.AttachToBone(FlashEmitter, 'tip'); +} + +defaultproperties +{ + ProjPerFire=8 + ProjSpawnOffset=(X=15.000000,Y=5.000000,Z=-6.000000) + FireAnim="FireLoad" + FireEndAnim= + FireAnimRate=1.250000 + FireSound=Sound'UT2341Weapons_Sounds.flak.shot1' + FireForce="FlakCannonFire" + FireRate=0.785000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341FlakAmmo' + AmmoPerFire=1 + ShakeRotTime=2.000000 + ShakeOffsetMag=(X=-20.000000) + ShakeOffsetRate=(X=-1000.000000) + ShakeOffsetTime=2.000000 + ProjectileClass=Class'UT2341WeaponsReducedv1a.UT2341FlakChunk' + BotRefireRate=0.700000 + FlashEmitterClass=Class'XEffects.FlakMuzFlash1st' + Spread=2000.000000 + SpreadStyle=SS_Random +} diff --git a/Sources/Classes/UT2341FlakShell.uc b/Sources/Classes/UT2341FlakShell.uc new file mode 100644 index 0000000..60434ed --- /dev/null +++ b/Sources/Classes/UT2341FlakShell.uc @@ -0,0 +1,127 @@ +//============================================================================= +// flakshell +//============================================================================= +class UT2341FlakShell extends Projectile; + +#exec OBJ LOAD File=UT2341Weapons_Sounds.uax + +var xEmitter Trail; +var vector initialDir; +var actor Glow; + +simulated function PostBeginPlay() +{ + local Rotator R; + local PlayerController PC; + + if ( !PhysicsVolume.bWaterVolume && (Level.NetMode != NM_DedicatedServer) ) + { + PC = Level.GetLocalPlayerController(); + if ( (PC.ViewTarget != None) && VSize(PC.ViewTarget.Location - Location) < 6000 ) + Trail = Spawn(class'FlakShellTrail',self); + Glow = Spawn(class'FlakGlow', self); + } + + Super.PostBeginPlay(); + Velocity = Vector(Rotation) * Speed; + R = Rotation; + R.Roll = 32768; + SetRotation(R); + Velocity.z += TossZ; + initialDir = Velocity; +} + +simulated function destroyed() +{ + if ( Trail != None ) + Trail.mRegen=False; + if ( glow != None ) + Glow.Destroy(); + Super.Destroyed(); +} + + +simulated function ProcessTouch(Actor Other, Vector HitLocation) +{ + if ( Other != Instigator ) + { + SpawnEffects(HitLocation, -1 * Normal(Velocity) ); + Explode(HitLocation,Normal(HitLocation-Other.Location)); + } +} + +simulated function SpawnEffects( vector HitLocation, vector HitNormal ) +{ + local PlayerController PC; + + PlaySound (Sound'UT2341Weapons_Sounds.General.Expl04',,3*TransientSoundVolume); + if ( EffectIsRelevant(Location,false) ) + { + PC = Level.GetLocalPlayerController(); + if ( (PC.ViewTarget != None) && VSize(PC.ViewTarget.Location - Location) < 3000 ) + spawn(class'FlakExplosion',,,HitLocation + HitNormal*16 ); + spawn(class'FlashExplosion',,,HitLocation + HitNormal*16 ); + spawn(class'RocketSmokeRing',,,HitLocation + HitNormal*16, rotator(HitNormal) ); + if ( (ExplosionDecal != None) && (Level.NetMode != NM_DedicatedServer) ) + Spawn(ExplosionDecal,self,,HitLocation, rotator(-HitNormal)); + } +} + +simulated function Landed( vector HitNormal ) +{ + SpawnEffects( Location, HitNormal ); + Explode(Location,HitNormal); +} + +simulated function HitWall (vector HitNormal, actor Wall) +{ + Landed(HitNormal); +} + +simulated function Explode(vector HitLocation, vector HitNormal) +{ + local vector start; + local rotator rot; + local int i; + local UT2341FlakChunk NewChunk; + + start = Location + 10 * HitNormal; + if ( Role == ROLE_Authority ) + { + HurtRadius(damage, 220, MyDamageType, MomentumTransfer, HitLocation); + for (i=0; i<4; i++) + { + rot = Rotation; + rot.yaw += FRand()*32000-16000; + rot.pitch += FRand()*32000-16000; + rot.roll += FRand()*32000-16000; + NewChunk = Spawn( class 'UT2341FlakChunk',, '', Start, rot); + } + } + Destroy(); +} + +defaultproperties +{ + Speed=1380.000000 + TossZ=225.000000 + Damage=105.000000 + MomentumTransfer=75000.000000 + MyDamageType=Class'UT2341WeaponsReducedv1a.DamType_FlakShell' + ExplosionDecal=Class'XEffects.ShockAltDecal' + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'WeaponStaticMesh.FlakShell' + CullDistance=4000.000000 + Physics=PHYS_Falling + AmbientSound=Sound'WeaponSounds.BaseProjectileSounds.BFlakCannonProjectile' + LifeSpan=6.000000 + DrawScale=8.000000 + Skins(0)=Texture'XWeapons.Skins.NewFlakSkin' + AmbientGlow=100 + SoundVolume=255 + SoundRadius=100.000000 + bProjTarget=True + ForceType=FT_Constant + ForceRadius=60.000000 + ForceScale=5.000000 +} diff --git a/Sources/Classes/UT2341Hammer.uc b/Sources/Classes/UT2341Hammer.uc new file mode 100644 index 0000000..f4588b6 --- /dev/null +++ b/Sources/Classes/UT2341Hammer.uc @@ -0,0 +1,167 @@ +//============================================================================= +// Shield Gun +//============================================================================= +class UT2341Hammer extends Weapon + config(user) + HideDropDown; + +replication +{ + reliable if (Role == ROLE_Authority) + ClientForceRelease; +} + +simulated function ClientForceRelease(byte Mode) +{ + if (Role < ROLE_Authority) + StopFire(Mode); +} + +// AI Interface +function GiveTo(Pawn Other, optional Pickup Pickup) +{ + Super.GiveTo(Other, Pickup); + + if ( Bot(Other.Controller) != None ) + Bot(Other.Controller).bHasImpactHammer = true; +} + +function bool CanAttack(Actor Other) +{ + return true; +} + +simulated function Timer() +{ + local Bot B; + + if (ClientState == WS_BringUp) + { + // check if owner is bot waiting to do impact jump + B = Bot(Instigator.Controller); + if ( (B != None) && B.bPreparingMove && (B.ImpactTarget != None) ) + { + B.ImpactJump(); + B = None; + } + } + Super.Timer(); + if ( (B != None) && (B.Enemy != None) ) + BotFire(false); +} + +function FireHack(byte Mode) +{ + if ( Mode == 0 ) + { + FireMode[0].PlayFiring(); + FireMode[0].FlashMuzzleFlash(); + FireMode[0].StartMuzzleSmoke(); + IncrementFlashCount(0); + } +} + +/* BestMode() +choose between regular or alt-fire +*/ +function byte BestMode() +{ + return 0; +} + +// super desireable for bot waiting to impact jump +function float GetAIRating() +{ + local Bot B; + local float EnemyDist; + + B = Bot(Instigator.Controller); + if ( B == None ) + return AIRating; + + if ( B.bPreparingMove && (B.ImpactTarget != None) ) + return 9; + + if ( B.Enemy == None ) + return AIRating; + + EnemyDist = VSize(B.Enemy.Location - Instigator.Location); + if ( B.Stopped() && (EnemyDist > 100) ) + return 0.1; + + if ( (EnemyDist < 750) && (B.Skill <= 2) && !B.Enemy.IsA('Bot') && (UT2341Hammer(B.Enemy.Weapon) != None) ) + return FClamp(300/(EnemyDist + 1), 0.6, 0.75); + + if ( EnemyDist > 400 ) + return 0.1; + if ( (Instigator.Weapon != self) && (EnemyDist < 120) ) + return 0.25; + + return ( FMin(0.6, 90/(EnemyDist + 1)) ); +} + +// End AI interface + +simulated function AnimEnd(int channel) +{ + if (FireMode[0].bIsFiring) + { + LoopAnim('FireLoop', 2); + Instigator.AmbientSound = UT2341HammerFire(FireMode[0]).ChargingSound; + Instigator.SoundVolume = UT2341HammerFire(FireMode[0]).ChargingSoundVolume; + } + else + Super.AnimEnd(channel); +} + +function float SuggestAttackStyle() +{ + return 0.8; +} + +function float SuggestDefenseStyle() +{ + return -0.8; +} + +simulated function float ChargeBar() +{ + return FMin(1,FireMode[0].HoldTime/UT2341HammerFire(FireMode[0]).FullyChargedTime); +} + +defaultproperties +{ + FireModeClass(0)=Class'UT2341WeaponsReducedv1a.UT2341HammerFire' + FireModeClass(1)=Class'UT2341WeaponsReducedv1a.UT2341HammerAltFire' + PutDownAnim="PutDown" + BringUpTime=0.500000 + SelectSound=Sound'UT2341Weapons_Sounds.Hammer.ImpactPickup' + SelectForce="ShieldGun_change" + AIRating=0.350000 + CurrentRating=0.350000 + bMeleeWeapon=True + bShowChargingBar=True + bCanThrow=False + Description="Classification: Melee Piston||Primary Fire: When trigger is held down, touch opponents with this piston to inflict massive damage.||Secondary Fire: Damages opponents at close range and has the ability to deflect projectiles.||Techniques: Shoot at the ground while jumping to jump extra high." + EffectOffset=(X=15.000000,Y=5.500000,Z=2.000000) + DisplayFOV=80.000000 + Priority=2 + HudColor=(G=150) + SmallViewOffset=(Z=-13.000000) + CenteredOffsetY=-9.000000 + CenteredRoll=1000 + CustomCrosshair=6 + CustomCrossHairColor=(B=121,G=188) + CustomCrossHairTextureName="Crosshairs.Hud.Crosshair_Pointer" + PickupClass=Class'XWeapons.ShieldGunPickup' + PlayerViewOffset=(Z=-13.000000) + PlayerViewPivot=(Pitch=1024) + BobDamping=2.200000 + AttachmentClass=Class'UT2341WeaponsReducedv1a.UT2341HammerAttachment' + IconMaterial=Texture'UT2341Weapons_Tex.Icons.Icon_ImpactHammer' + IconCoords=(X2=127,Y2=31) + ItemName="Impact Hammer" + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTImpactHammerFP' + DrawScale=1.500000 + TransientSoundVolume=1.000000 +} diff --git a/Sources/Classes/UT2341HammerAltFire.uc b/Sources/Classes/UT2341HammerAltFire.uc new file mode 100644 index 0000000..25f22b0 --- /dev/null +++ b/Sources/Classes/UT2341HammerAltFire.uc @@ -0,0 +1,85 @@ +class UT2341HammerAltFire extends WeaponFire; + +var class DamageType; // weapon fire damage type (no projectile, so we put this here) +var float HammerLongRange; // from pawn centre +var float Force; // force to other players +var float Damage; +var float SelfDamageScale; // %damage to self (when shielding a wall) + +simulated function InitEffects() +{ +} + +function Rotator AdjustAim(Vector Start, float InAimError) +{ + local rotator Aim, EnemyAim; + + if ( AIController(Instigator.Controller) != None ) + { + Aim = Instigator.Rotation; + if ( Instigator.Controller.Enemy != None ) + { + EnemyAim = rotator(Instigator.Controller.Enemy.Location - Start); + Aim.Pitch = EnemyAim.Pitch; + } + return Aim; + } + else + return super.AdjustAim(Start,InAimError); +} + +function DoFireEffect() +{ + local Vector HitLocation, HitNormal, StartTrace, EndTrace, X,Y,Z; + local Rotator Aim; + local Actor Other; + + Instigator.MakeNoise(1.0); + Weapon.GetViewAxes(X,Y,Z); + + StartTrace = Instigator.Location + Instigator.EyePosition(); + Aim = AdjustAim(StartTrace, AimError); + EndTrace = StartTrace + HammerLongRange * Vector(Aim); + Other = Weapon.Trace(HitLocation, HitNormal, EndTrace, StartTrace, true); + + if ( Other != None && Other != Instigator ) + { + if ( Pawn(Other) != None || (Decoration(Other) != None && Decoration(Other).bDamageable) || TranslocatorBeacon(Other) != None) + { + if (Pawn(Other) == None || Pawn(Other).Controller == None || !Pawn(Other).Controller.SameTeamAs(Instigator.Controller)) + Other.TakeDamage(Damage , Instigator, HitLocation, Force*(X+vect(0,0,0.5)), DamageType); + } + else + { + if ( xPawn(Instigator).bBerserk ) + Force *= 2.0; + Instigator.TakeDamage(SelfDamageScale*Damage, Instigator, HitLocation, -Force*X, DamageType); + if ( DestroyableObjective(Other) != None ) + Other.TakeDamage(Damage, Instigator, HitLocation, Force*(X+vect(0,0,0.5)), DamageType); + } + } +} + +defaultproperties +{ + DamageType=Class'UT2341WeaponsReducedv1a.DamType_Hammer' + HammerLongRange=200.000000 + Force=35000.000000 + Damage=30.000000 + SelfDamageScale=1.200000 + TransientSoundVolume=1.000000 + FireLoopAnim= + FireEndAnim= + TweenTime=0.000000 + FireSound=Sound'UT2341Weapons_Sounds.Hammer.ImpactAltFire' + FireForce="ShieldGunFire" + FireRate=0.810000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341HammerAmmo' + ShakeRotTime=2.000000 + ShakeOffsetMag=(X=-20.000000) + ShakeOffsetRate=(X=-1000.000000) + ShakeOffsetTime=2.000000 + BotRefireRate=1.000000 + WarnTargetPct=0.100000 + FlashEmitterClass=Class'XEffects.ForceRingA' +} diff --git a/Sources/Classes/UT2341HammerAmmo.uc b/Sources/Classes/UT2341HammerAmmo.uc new file mode 100644 index 0000000..75638e0 --- /dev/null +++ b/Sources/Classes/UT2341HammerAmmo.uc @@ -0,0 +1,8 @@ +class UT2341HammerAmmo extends Ammunition; + +defaultproperties +{ + MaxAmmo=1 + InitialAmount=1 + ItemName="HammerCharge" +} diff --git a/Sources/Classes/UT2341HammerAttachment.uc b/Sources/Classes/UT2341HammerAttachment.uc new file mode 100644 index 0000000..bfb1885 --- /dev/null +++ b/Sources/Classes/UT2341HammerAttachment.uc @@ -0,0 +1,8 @@ +class UT2341HammerAttachment extends xWeaponAttachment; + +defaultproperties +{ + bHeavy=True + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTImpactHammer3rd' + DrawScale=0.200000 +} diff --git a/Sources/Classes/UT2341HammerFire.uc b/Sources/Classes/UT2341HammerFire.uc new file mode 100644 index 0000000..762919d --- /dev/null +++ b/Sources/Classes/UT2341HammerFire.uc @@ -0,0 +1,240 @@ +class UT2341HammerFire extends WeaponFire; + +var class DamageType; // weapon fire damage type (no projectile, so we put this here) +var float AutoCheckRange, HammerLongRange; // from pawn centre +var float Force; // force to other players +var float Damage; +var float SelfDamageScale; // %damage to self (when shielding a wall) +var float MinSelfDamage; +var Sound ChargingSound; // charging sound +var float AutoFireTestFreq; +var float FullyChargedTime; // held for this long will do max damage +var bool bAutoRelease; +var bool bStartedChargingForce; +var byte ChargingSoundVolume; +var Pawn AutoHitPawn; +var float AutoHitTime; + +var bool bCheckingHit; + +var sound PreFireSound; + +// jdf --- +var String ChargingForce; +// --- jdf + +simulated function InitEffects() +{ + bStartedChargingForce = false; // jdf +} + +function Rotator AdjustAim(Vector Start, float InAimError) +{ + local rotator Aim, EnemyAim; + + if ( AIController(Instigator.Controller) != None ) + { + Aim = Instigator.Rotation; + if ( Instigator.Controller.Enemy != None ) + { + EnemyAim = rotator(Instigator.Controller.Enemy.Location - Start); + Aim.Pitch = EnemyAim.Pitch; + } + return Aim; + } + else + return super.AdjustAim(Start,InAimError); +} + +function DoFireEffect() +{ + local Vector HitLocation, HitNormal, StartTrace, EndTrace, X,Y,Z; + local Rotator Aim; + local Actor Other; + local float Scale; + + Instigator.MakeNoise(1.0); + Weapon.GetViewAxes(X,Y,Z); + bAutoRelease = false; + + if ( (AutoHitPawn != None) && (Level.TimeSeconds - AutoHitTime < 0.15) ) + { + Other = AutoHitPawn; + HitLocation = Other.Location; + AutoHitPawn = None; + } + else + { + StartTrace = Instigator.Location + Instigator.EyePosition(); + Aim = AdjustAim(StartTrace, AimError); + EndTrace = StartTrace + HammerLongRange * Vector(Aim); + Other = Weapon.Trace(HitLocation, HitNormal, EndTrace, StartTrace, true); + } + + Scale = FMin(HoldTime, FullyChargedTime); + + Instigator.AmbientSound = None; + Instigator.SoundVolume = Instigator.Default.SoundVolume; + + if ( Other != None && Other != Instigator ) + { + if ( Pawn(Other) != None || (Decoration(Other) != None && Decoration(Other).bDamageable) || TranslocatorBeacon(Other) != None) + { + if (Pawn(Other) == None || Pawn(Other).Controller == None || !Pawn(Other).Controller.SameTeamAs(Instigator.Controller)) + Other.TakeDamage(Damage * Scale, Instigator, HitLocation, Scale*Force*(X+vect(0,0,0.5)), DamageType); + } + else + { + Scale = FMax(Scale, 1); + if ( xPawn(Instigator).bBerserk ) + Force *= 2.0; + Instigator.TakeDamage(SelfDamageScale*Damage, Instigator, HitLocation, -Scale*Force*X, DamageType); + if ( DestroyableObjective(Other) != None ) + Other.TakeDamage(Damage*Scale, Instigator, HitLocation, Scale*Force*(X+vect(0,0,0.5)), DamageType); + } + } + + UT2341Hammer(Weapon).ClientForceRelease(ThisModeNum); + + bCheckingHit=False; + SetTimer(0, false); +} + +function ModeHoldFire() +{ + bCheckingHit = False; + SetTimer(1.33, false); + Weapon.PlayAnim(PreFireAnim); + Weapon.PlayOwnedSound(PreFireSound, SLOT_Interact, 1); +} + +function bool IsFiring() +{ + return ( bIsFiring || bAutoRelease ); +} + +function Timer() +{ + local Actor Other; + local Vector HitLocation, HitNormal, StartTrace, EndTrace; + local Rotator Aim; + local float ChargeScale; + + if (HoldTime > 0.0 && !bNowWaiting) + { + StartTrace = Instigator.Location; + Aim = AdjustAim(StartTrace, AimError); + EndTrace = StartTrace + AutoCheckRange * Vector(Aim); + + Other = Weapon.Trace(HitLocation, HitNormal, EndTrace, StartTrace, true); + if ( (Pawn(Other) != None) && (Other != Instigator) ) + { + bAutoRelease = true; + bIsFiring = false; + Instigator.AmbientSound = None; + Instigator.SoundVolume = Instigator.Default.SoundVolume; + AutoHitPawn = Pawn(Other); + AutoHitTime = Level.TimeSeconds; + } + else + { + ChargeScale = FMin(HoldTime, FullyChargedTime); + + if (!bStartedChargingForce) + { + bStartedChargingForce = true; + ClientPlayForceFeedback( ChargingForce ); + } + } + } + else + { + if ( Instigator.AmbientSound == ChargingSound ) + { + Instigator.AmbientSound = None; + Instigator.SoundVolume = Instigator.Default.SoundVolume; + } + + SetTimer(0, false); + } + + if (!bCheckingHit) + { + bCheckingHit=True; + SetTimer(AutoFireTestFreq, true); + } +} + +simulated function vector GetFireStart(vector X, vector Y, vector Z) +{ + return Instigator.Location; +} + +function StartBerserk() +{ + if ( (Level.GRI != None) && (Level.GRI.WeaponBerserk > 1.0) ) + return; + MaxHoldTime = default.MaxHoldTime * 0.75; + FullyChargedTime = default.FullyChargedTime * 0.75; +} + +function StopBerserk() +{ + if ( (Level.GRI != None) && (Level.GRI.WeaponBerserk > 1.0) ) + return; + MaxHoldTime = default.MaxHoldTime; + FullyChargedTime = default.FullyChargedTime; +} + +function StartSuperBerserk() +{ + MaxHoldTime = default.MaxHoldTime/Level.GRI.WeaponBerserk; + FullyChargedTime = default.FullyChargedTime/Level.GRI.WeaponBerserk; + Damage = Default.Damage * Level.GRI.WeaponBerserk; +} + +// jdf --- +function PlayFiring() +{ + bStartedChargingForce = false; + StopForceFeedback(ChargingForce); + Super.PlayFiring(); +} +// --- jdf + +function PlayPreFire(); + +defaultproperties +{ + DamageType=Class'UT2341WeaponsReducedv1a.DamType_Hammer' + AutoCheckRange=82.000000 + HammerLongRange=120.000000 + Force=79000.000000 + Damage=90.000000 + SelfDamageScale=0.600000 + ChargingSound=Sound'UT2341Weapons_Sounds.Hammer.ImpactLoop' + AutoFireTestFreq=0.150000 + FullyChargedTime=1.500000 + ChargingSoundVolume=200 + PreFireSound=Sound'UT2341Weapons_Sounds.Hammer.ImpactFireStart' + ChargingForce="shieldgun_charge" + bFireOnRelease=True + bWaitForRelease=True + TransientSoundVolume=1.000000 + PreFireAnim="FireLoad" + FireLoopAnim= + FireEndAnim= + PreFireAnimRate=2.000000 + TweenTime=0.000000 + FireSound=Sound'UT2341Weapons_Sounds.Hammer.ImpactFireRelease' + FireForce="ShieldGunFire" + FireRate=0.600000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341HammerAmmo' + ShakeRotTime=2.000000 + ShakeOffsetMag=(X=-20.000000) + ShakeOffsetRate=(X=-1000.000000) + ShakeOffsetTime=2.000000 + BotRefireRate=1.000000 + WarnTargetPct=0.100000 + FlashEmitterClass=Class'XEffects.ForceRingA' +} diff --git a/Sources/Classes/UT2341Minigun.uc b/Sources/Classes/UT2341Minigun.uc new file mode 100644 index 0000000..b94938c --- /dev/null +++ b/Sources/Classes/UT2341Minigun.uc @@ -0,0 +1,141 @@ +//============================================================================= +// Minigun +//============================================================================= +class UT2341Minigun extends Minigun + config(user); + +#EXEC OBJ LOAD FILE=InterfaceContent.utx + +simulated function PostBeginPlay() +{ + Super.PostBeginPlay(); + + if ( Level.NetMode == NM_DedicatedServer ) + return; + + ShellCaseEmitter = spawn(class'ShellSpewer'); + if ( ShellCaseEmitter != None ) + { + ShellCaseEmitter.Trigger(Self, Instigator); //turn off + AttachToBone(ShellCaseEmitter, 'Bone_CaseEjector'); + } +} + +simulated function bool ConsumeAmmo(int Mode, float load, optional bool bAmountNeededIsMax) +{ + local int AmountNeeded; + + if ( bNoAmmoInstances ) + { + if ( AmmoClass[0] == AmmoClass[mode] ) + mode = 0; + AmountNeeded = int(load); + if (bAmountNeededIsMax && AmmoCharge[mode] < AmountNeeded) + AmountNeeded = AmmoCharge[mode]; + + if (AmmoCharge[mode] < AmountNeeded) + { + CheckOutOfAmmo(); + return false; // Can't do it + } + + AmmoCharge[mode] -= AmountNeeded; + NetUpdateTime = Level.TimeSeconds - 1; + + if (Level.NetMode == NM_StandAlone || Level.NetMode == NM_ListenServer) + CheckOutOfAmmo(); + + return true; + } + if (Ammo[Mode] != None) + return Ammo[Mode].UseAmmo(int(load), bAmountNeededIsMax); + + return true; +} + +simulated function OutOfAmmo() +{ + log("OUTOFAMMO"); + if ( (Instigator == None) || !Instigator.IsLocallyControlled() || HasAmmo() ) + return; + + Instigator.AmbientSound = None; + Instigator.SoundVolume = Instigator.default.SoundVolume; + DoAutoSwitch(); +} + +function byte BestMode() +{ + local float EnemyDist; + local bot B; + + B = Bot(Instigator.Controller); + if ( (B == None) || (B.Enemy == None) ) + return 0; + + if ( FireMode[0].bIsFiring ) + return 0; + else if ( FireMode[1].bIsFiring ) + return 1; + EnemyDist = VSize(B.Enemy.Location - Instigator.Location); + if ( EnemyDist < 2000 ) + return 1; + return 0; +} +// end AI Interface + +simulated function SpawnShells(float amountPerSec) +{ + if(ShellCaseEmitter == None || !FirstPersonView()) + return; + if ( Bot(Instigator.Controller) != None ) + { + ShellCaseEmitter.Destroy(); + return; + } + + ShellCaseEmitter.mRegenRange[0] = amountPerSec; + ShellCaseEmitter.mRegenRange[1] = amountPerSec; + ShellCaseEmitter.Trigger(self, Instigator); +} + +// Client-side only: update the first person barrel rotation +simulated function UpdateRoll(float dt, float speed, int mode) +{ + local rotator r; + + if (Level.NetMode == NM_DedicatedServer) + return; + + if (mode == CurrentMode) // to limit to one mode + { + // log(self$" updateroll (mode="$mode$") speed="$speed); + + RollSpeed = speed; + CurrentRoll += dt*RollSpeed; + CurrentRoll = CurrentRoll % 65536.f; + r.Roll = int(CurrentRoll); + SetBoneRotation('Bone_Barrels', r, 0, Blend); + } +} + +defaultproperties +{ + FireModeClass(0)=Class'UT2341WeaponsReducedv1a.UT2341MinigunFire' + FireModeClass(1)=Class'UT2341WeaponsReducedv1a.UT2341MinigunAltFire' + SelectSound=Sound'UT2341Weapons_Sounds.Minigun.MiniSelect' + bNoAmmoInstances=False + Description="Classification: Gatling Gun||Primary Fire: Bullets are sprayed forth at a medium to fast rate of fire and good accuracy.||Secondary Fire: Minigun fires twice as fast and is half as accurate.||Techniques: Secondary fire is much more useful at close range, but can eat up tons of ammunition." + EffectOffset=(Y=22.000000,Z=-10.000000) + DisplayFOV=80.000000 + SmallViewOffset=(X=0.000000,Y=2.000000,Z=-5.000000) + InventoryGroup=7 + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341MinigunPickup' + PlayerViewOffset=(X=0.000000,Y=2.000000,Z=-5.000000) + AttachmentClass=Class'UT2341WeaponsReducedv1a.UT2341MinigunAttachment' + IconMaterial=Texture'UT2341Weapons_Tex.Icons.Icon_Minigun' + IconCoords=(X1=0,Y1=0,X2=128,Y2=32) + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTminigun_FP' + DrawScale=1.000000 + HighDetailOverlay=None +} diff --git a/Sources/Classes/UT2341MinigunAltFire.uc b/Sources/Classes/UT2341MinigunAltFire.uc new file mode 100644 index 0000000..138bad5 --- /dev/null +++ b/Sources/Classes/UT2341MinigunAltFire.uc @@ -0,0 +1,14 @@ +class UT2341MinigunAltFire extends UT2341MinigunFire; + +defaultproperties +{ + WindDownModifier=1.000000 + BarrelRotationsPerSec=2.500000 + FiringSound=Sound'UT2341Weapons_Sounds.Minigun.M2AltFire' + MinigunSoundVolume=240 + WindUpTime=0.500000 + FiringForce="minialtfireb" + PreFireTime=0.100000 + FireLoopAnimRate=3.000000 + Spread=0.120000 +} diff --git a/Sources/Classes/UT2341MinigunAmmo.uc b/Sources/Classes/UT2341MinigunAmmo.uc new file mode 100644 index 0000000..7f68f99 --- /dev/null +++ b/Sources/Classes/UT2341MinigunAmmo.uc @@ -0,0 +1,20 @@ +class UT2341MinigunAmmo extends Ammunition; + +#EXEC OBJ LOAD FILE=InterfaceContent.utx + +simulated function PostNetReceive() +{ + if (AmmoAmount == 0) + Pawn(Owner).Weapon.OutOfAmmo(); +} + +defaultproperties +{ + MaxAmmo=199 + InitialAmount=100 + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341MinigunAmmoPickup' + IconMaterial=Texture'HUDContent.Generic.HUD' + IconCoords=(X1=338,Y1=40,X2=393,Y2=79) + ItemName="Bullets" + bNetNotify=True +} diff --git a/Sources/Classes/UT2341MinigunAmmoPickup.uc b/Sources/Classes/UT2341MinigunAmmoPickup.uc new file mode 100644 index 0000000..1c0e60c --- /dev/null +++ b/Sources/Classes/UT2341MinigunAmmoPickup.uc @@ -0,0 +1,21 @@ +class UT2341MinigunAmmoPickup extends UTAmmoPickup; + +function RespawnEffect() +{ + spawn(class'FX_PickupRespawn'); +} + +defaultproperties +{ + AmmoAmount=50 + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341MinigunAmmo' + PickupMessage="You picked up 50 bullets." + PickupSound=Sound'UT2341Weapons_Sounds.General.AmmoSnd' + PickupForce="MinigunAmmoPickup" + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTminigunammo' + DrawScale=0.300000 + PrePivot=(Z=44.000000) + AmbientGlow=64 + CollisionHeight=12.750000 +} diff --git a/Sources/Classes/UT2341MinigunAttachment.uc b/Sources/Classes/UT2341MinigunAttachment.uc new file mode 100644 index 0000000..611d044 --- /dev/null +++ b/Sources/Classes/UT2341MinigunAttachment.uc @@ -0,0 +1,133 @@ +class UT2341MinigunAttachment extends MinigunAttachment; + +var Emitter MuzFlashNew; +var class NewFlashClass; + +function Destroyed() +{ + if (mTracer != None) + mTracer.Destroy(); + + if (MuzFlashNew != None) + MuzFlashNew.Destroy(); + + if (mShellCaseEmitter != None) + mShellCaseEmitter.Destroy(); + + Super(xWeaponAttachment).Destroyed(); +} + +simulated function UpdateRoll(float dt) +{ + local rotator r; + + UpdateRollTime(false); + + if (mRollInc <= 0.f) + return; + + mCurrentRoll += dt*mRollInc; + mCurrentRoll = mCurrentRoll % 65536.f; + r.Roll = int(mCurrentRoll); + + SetBoneRotation('Bone_Barrels', r, 0, 1.f); +} + +simulated function vector GetTracerStart() +{ + local Pawn p; + + p = Pawn(Owner); + + if ( (p != None) && p.IsFirstPerson() && p.Weapon != None ) + { + // 1st person + return p.Weapon.GetEffectStart(); + } + + // 3rd person + if ( MuzFlashNew != None ) + return MuzFlashNew.Location; + else + return Location; +} + +simulated event ThirdPersonEffects() +{ + local PlayerController PC; + + if ( (Level.NetMode == NM_DedicatedServer) || (Instigator == None) ) + return; + + if ( FlashCount > 0 ) + { + PC = Level.GetLocalPlayerController(); + if ( OldSpawnHitCount != SpawnHitCount ) + { + OldSpawnHitCount = SpawnHitCount; + GetHitInfo(); + PC = Level.GetLocalPlayerController(); + if ( (Instigator.Controller == PC) || (VSize(PC.ViewTarget.Location - mHitLocation) < 2000) ) + { + Spawn(class'HitEffect'.static.GetHitEffect(mHitActor, mHitLocation, mHitNormal),,, mHitLocation, Rotator(mHitNormal)); + CheckForSplash(); + } + } + if ( (Level.TimeSeconds - LastRenderTime > 0.2) && (Instigator.Controller != PC) ) + return; + + WeaponLight(); + + if (FiringMode == 0) + { + mTracerInterval = mTracerIntervalPrimary; + mRollInc = 65536.f*2.f; + } + else + { + mTracerInterval = mTracerIntervalSecondary; + mRollInc = 65536.f *4.f; + } + + if ( Level.bDropDetail || Level.DetailMode == DM_Low ) + mTracerInterval *= 2.0; + + UpdateRollTime(true); + + UpdateTracer(); + + if (MuzFlashNew == None) + { + MuzFlashNew = Spawn(NewFlashClass); + AttachToBone(MuzFlashNew, 'tip'); + } + if (MuzFlashNew != None) + { + MuzFlashNew.Trigger(self, None); + } + + if ( (mShellCaseEmitter == None) && (Level.DetailMode != DM_Low) && !Level.bDropDetail ) + { + mShellCaseEmitter = Spawn(mShellCaseEmitterClass); + if ( mShellCaseEmitter != None ) + AttachToBone(mShellCaseEmitter, 'Bone_CaseEjector'); + } + if (mShellCaseEmitter != None) + mShellCaseEmitter.mStartParticles++; + } + else + { + GotoState(''); + } + + Super(xWeaponAttachment).ThirdPersonEffects(); +} + +defaultproperties +{ + NewFlashClass=Class'UT2341WeaponsReducedv1a.FX_EnforcerMuzFlash' + mTracerIntervalPrimary=0.130000 + mTracerIntervalSecondary=0.080000 + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTminigun3rd' + DrawScale=0.900000 +} diff --git a/Sources/Classes/UT2341MinigunFire.uc b/Sources/Classes/UT2341MinigunFire.uc new file mode 100644 index 0000000..2e63a1f --- /dev/null +++ b/Sources/Classes/UT2341MinigunFire.uc @@ -0,0 +1,195 @@ +class UT2341MinigunFire extends MinigunFire; + +var float WindDownModifier; +var() class NewFlashClass; +var Emitter NewFlashEmitter; + +var Sound WindUpSound; + +function InitEffects() +{ + // don't even spawn on server + if ( (Level.NetMode == NM_DedicatedServer) || (AIController(Instigator.Controller) != None) ) + return; + if ( (NewFlashClass != None) && ((NewFlashEmitter == None) || NewFlashEmitter.bDeleteMe) ) + { + NewFlashEmitter = Weapon.Spawn(NewFlashClass); + Weapon.AttachToBone(NewFlashEmitter, 'Flash'); + } + if ( (SmokeEmitterClass != None) && ((SmokeEmitter == None) || SmokeEmitter.bDeleteMe) ) + { + SmokeEmitter = Weapon.Spawn(SmokeEmitterClass); + } +} + +function DrawMuzzleFlash(Canvas Canvas) +{ + // Draw smoke first + if (SmokeEmitter != None && SmokeEmitter.Base != Weapon) + { + SmokeEmitter.SetLocation( Weapon.GetEffectStart() ); + Canvas.DrawActor( SmokeEmitter, false, false, Weapon.DisplayFOV ); + } + + if (NewFlashEmitter != None && NewFlashEmitter.Base != Weapon) + { + NewFlashEmitter.SetLocation( Weapon.GetEffectStart() ); + Canvas.DrawActor( NewFlashEmitter, false, false, Weapon.DisplayFOV ); + } +} + +function FlashMuzzleFlash() +{ + local rotator r; + + r.Roll = Rand(65535); + Weapon.SetBoneRotation('Bone_Flash', r, 0, 1.f); + if (NewFlashEmitter != None) + NewFlashEmitter.Trigger(Weapon, Instigator); +} + +simulated function DestroyEffects() +{ + if (NewFlashEmitter != None) + NewFlashEmitter.Destroy(); + + if (SmokeEmitter != None) + SmokeEmitter.Destroy(); +} + +auto state Idle +{ + function bool IsIdle() + { + return true; + } + + function BeginState() + { + PlayAmbientSound(None); + StopRolling(); + } + + function EndState() + { + PlayAmbientSound(WindUpSound); + } + + function StartFiring() + { + RollSpeed = 0; + FireTime = (RollSpeed/MaxRollSpeed) * WindUpTime; + GotoState('WindUp'); + } +} + +state WindUp +{ + function BeginState() + { + ClientPlayForceFeedback(WindingForce); // jdf + } + + function EndState() + { + if (ThisModeNum == 0) + { + if ( (Weapon == None) || !Weapon.GetFireMode(1).bIsFiring ) + StopForceFeedback(WindingForce); + } + else + { + if ( (Weapon == None) || !Weapon.GetFireMode(0).bIsFiring ) + StopForceFeedback(WindingForce); + } + } + + function ModeTick(float dt) + { + FireTime += dt; + RollSpeed = (FireTime/WindUpTime) * MaxRollSpeed; + + if ( !bIsFiring ) + { + GotoState('WindDown'); + return; + } + + if (RollSpeed >= MaxRollSpeed) + { + RollSpeed = MaxRollSpeed; + FireTime = WindUpTime; + Gun.UpdateRoll(dt, RollSpeed, ThisModeNum); + GotoState('FireLoop'); + return; + } + + Gun.UpdateRoll(dt, RollSpeed, ThisModeNum); + } + + function StopFiring() + { + GotoState('WindDown'); + } +} + +state WindDown +{ + function BeginState() + { + ClientPlayForceFeedback(WindingForce); // jdf + } + + function EndState() + { + if (ThisModeNum == 0) + { + if ( (Weapon == None) || !Weapon.GetFireMode(1).bIsFiring ) + StopForceFeedback(WindingForce); + } + else + { + if ( (Weapon == None) || !Weapon.GetFireMode(0).bIsFiring ) + StopForceFeedback(WindingForce); + } + } + + function ModeTick(float dt) + { + FireTime -= dt / WindDownModifier; + RollSpeed = (FireTime/WindUpTime) * MaxRollSpeed; + + if (RollSpeed <= 0.f) + { + RollSpeed = 0.f; + FireTime = 0.f; + Gun.UpdateRoll(dt, RollSpeed, ThisModeNum); + GotoState('Idle'); + return; + } + + Gun.UpdateRoll(dt, RollSpeed, ThisModeNum); + } + + function StartFiring() + { + GotoState('WindUp'); + } +} + +defaultproperties +{ + WindDownModifier=12.000000 + NewFlashClass=Class'UT2341WeaponsReducedv1a.FX_EnforcerMuzFlash' + WindUpSound=Sound'UT2341Weapons_Sounds.Minigun.M2WindUp' + BarrelRotationsPerSec=1.250000 + WindingSound=Sound'UT2341Weapons_Sounds.Minigun.M2WindDown' + FiringSound=Sound'UT2341Weapons_Sounds.Minigun.M2RegFire' + WindUpTime=0.050000 + DamageType=Class'UT2341WeaponsReducedv1a.DamType_MinigunBullet' + DamageMin=15 + DamageMax=21 + PreFireTime=0.100000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341MinigunAmmo' + Spread=0.050000 +} diff --git a/Sources/Classes/UT2341MinigunPickup.uc b/Sources/Classes/UT2341MinigunPickup.uc new file mode 100644 index 0000000..a8dae7f --- /dev/null +++ b/Sources/Classes/UT2341MinigunPickup.uc @@ -0,0 +1,36 @@ +//============================================================================= +// Minigun. +//============================================================================= +class UT2341MinigunPickup extends UTWeaponPickup; + +static function StaticPrecache(LevelInfo L) +{ + L.AddPrecacheMaterial(Texture'XEffects.ShellCasingTex'); + L.AddPrecacheMaterial(Texture'AW-2004Explosions.Part_explode2s'); + L.AddPrecacheMaterial(Texture'AW-2004Particles.TracerShot'); + L.AddPrecacheStaticMesh(StaticMesh'UT2341Weapons_SM.UTMinigun'); +} + +simulated function UpdatePrecacheMaterials() +{ + Level.AddPrecacheMaterial(Texture'XEffects.ShellCasingTex'); + Level.AddPrecacheMaterial(Texture'AW-2004Explosions.Part_explode2s'); + Level.AddPrecacheMaterial(Texture'AW-2004Particles.TracerShot'); + + super.UpdatePrecacheMaterials(); +} + +defaultproperties +{ + MaxDesireability=0.730000 + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341Minigun' + PickupMessage="You got the Minigun." + PickupSound=Sound'UT2341Weapons_Sounds.General.WeaponPickup' + PickupForce="MinigunPickup" + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTminigun' + DrawScale=0.150000 + PrePivot=(Z=40.000000) + AmbientGlow=64 + RotationRate=(Yaw=5000) +} diff --git a/Sources/Classes/UT2341PulseAltFire.uc b/Sources/Classes/UT2341PulseAltFire.uc new file mode 100644 index 0000000..848a11f --- /dev/null +++ b/Sources/Classes/UT2341PulseAltFire.uc @@ -0,0 +1,366 @@ +class UT2341PulseAltFire extends WeaponFire; + +var UT2341PulseBeamEffect Beam; +var class BeamEffectClass; + +var() class DamageType; +var() int Damage; +var() float MomentumTransfer; + +var() float TraceRange; + +var float UpTime; + +var bool bDoHit; +var() bool bFeedbackDeath; +var bool bInitAimError; +var bool bLinkFeedbackPlaying; +var bool bStartFire; +var byte LinkVolume; +var byte SentLinkVolume; + +var rotator DesiredAimError, CurrentAimError; + +var Sound BeamSound; + +var() class PulseFlashClass; +var Emitter PulseFlashEmitter; + +simulated function InitEffects() +{ + // don't even spawn on server + if ( (Level.NetMode == NM_DedicatedServer) || (AIController(Instigator.Controller) != None) ) + return; + if ( (PulseFlashClass != None) && ((PulseFlashEmitter == None) || PulseFlashEmitter.bDeleteMe) ) + { + PulseFlashEmitter = Weapon.Spawn(PulseFlashClass); + Weapon.AttachToBone(PulseFlashEmitter, 'tip'); + } + if ( (SmokeEmitterClass != None) && ((SmokeEmitter == None) || SmokeEmitter.bDeleteMe) ) + { + SmokeEmitter = Weapon.Spawn(SmokeEmitterClass); + } +} + +function DrawMuzzleFlash(Canvas Canvas) +{ + // Draw smoke first + if (SmokeEmitter != None && SmokeEmitter.Base != Weapon) + { + SmokeEmitter.SetLocation( Weapon.GetEffectStart() ); + Canvas.DrawActor( SmokeEmitter, false, false, Weapon.DisplayFOV ); + } + + if (PulseFlashEmitter != None && PulseFlashEmitter.Base != Weapon) + { + PulseFlashEmitter.SetLocation( Weapon.GetEffectStart() ); + Canvas.DrawActor( PulseFlashEmitter, false, false, Weapon.DisplayFOV ); + } +} + +function FlashMuzzleFlash() +{ + if (PulseFlashEmitter != None) + PulseFlashEmitter.Trigger(Weapon, Instigator); +} + +simulated function DestroyEffects() +{ + if (PulseFlashEmitter != None) + PulseFlashEmitter.Destroy(); + + if (SmokeEmitter != None) + SmokeEmitter.Destroy(); + + if ( Level.NetMode != NM_Client ) + { + if ( Beam != None ) + Beam.Destroy(); + } +} + +simulated function bool myHasAmmo( ) +{ + return (Weapon.AmmoAmount(ThisModeNum) >= AmmoPerFire); +} + +simulated function Rotator GetPlayerAim( vector StartTrace, float InAimError ) +{ + return AdjustAim(StartTrace, InAimError); +} + +simulated function ModeTick(float dt) +{ + local Vector StartTrace, EndTrace, X, Y, Z; + local Vector HitLocation, HitNormal, EndEffect; + local Actor Other; + local Rotator Aim; + local float Step; + local DestroyableObjective HealObjective; + local int AdjustedDamage; + local UT2341PulseBeamEffect LB; + + if ( !bIsFiring ) + { + bInitAimError = true; + return; + } + + if ( myHasAmmo() && ((UpTime > 0.0) || (Instigator.Role < ROLE_Authority)) ) + { + UpTime -= dt; + + // the to-hit trace always starts right in front of the eye + Weapon.GetViewAxes(X, Y, Z); + StartTrace = GetFireStart( X, Y, Z); + + if ( Instigator.Role < ROLE_Authority ) + { + if ( Beam == None ) + ForEach Weapon.DynamicActors(class'UT2341PulseBeamEffect', LB ) + if ( !LB.bDeleteMe && (LB.Instigator != None) && (LB.Instigator == Instigator) ) + { + Beam = LB; + break; + } + } + + if ( Instigator.Role == ROLE_Authority ) + { + if ( bDoHit ) + Weapon.ConsumeAmmo(ThisModeNum, AmmoPerFire); + } + + if ( Bot(Instigator.Controller) != None ) + { + if ( bInitAimError ) + { + CurrentAimError = AdjustAim(StartTrace, AimError); + bInitAimError = false; + } + else + { + BoundError(); + CurrentAimError.Yaw = CurrentAimError.Yaw + Instigator.Rotation.Yaw; + } + + // smooth aim error changes + Step = 7500.0 * dt; + if ( DesiredAimError.Yaw ClockWiseFrom CurrentAimError.Yaw ) + { + CurrentAimError.Yaw += Step; + if ( !(DesiredAimError.Yaw ClockWiseFrom CurrentAimError.Yaw) ) + { + CurrentAimError.Yaw = DesiredAimError.Yaw; + DesiredAimError = AdjustAim(StartTrace, AimError); + } + } + else + { + CurrentAimError.Yaw -= Step; + if ( DesiredAimError.Yaw ClockWiseFrom CurrentAimError.Yaw ) + { + CurrentAimError.Yaw = DesiredAimError.Yaw; + DesiredAimError = AdjustAim(StartTrace, AimError); + } + } + CurrentAimError.Yaw = CurrentAimError.Yaw - Instigator.Rotation.Yaw; + if ( BoundError() ) + DesiredAimError = AdjustAim(StartTrace, AimError); + CurrentAimError.Yaw = CurrentAimError.Yaw + Instigator.Rotation.Yaw; + + if ( Instigator.Controller.Target == None ) + Aim = Rotator(Instigator.Controller.FocalPoint - StartTrace); + else + Aim = Rotator(Instigator.Controller.Target.Location - StartTrace); + + Aim.Yaw = CurrentAimError.Yaw; + + // save difference + CurrentAimError.Yaw = CurrentAimError.Yaw - Instigator.Rotation.Yaw; + } + else + Aim = GetPlayerAim(StartTrace, AimError); + + X = Vector(Aim); + EndTrace = StartTrace + TraceRange * X; + + Other = Weapon.Trace(HitLocation, HitNormal, EndTrace, StartTrace, true); + if ( Other != None && Other != Instigator ) + EndEffect = HitLocation - X * 15; + else + EndEffect = EndTrace- X * 15; + + if ( Beam != None ) + Beam.EndEffect = EndEffect; + + if (Instigator.Role < ROLE_Authority) + return; + + if ( Other != None && Other != Instigator ) + { + // beam is updated every frame, but damage is only done based on the firing rate + if ( bDoHit ) + { + Instigator.MakeNoise(1.0); + + AdjustedDamage = Damage * 1.5; + + if ( !Other.bWorldGeometry ) + { + HealObjective = DestroyableObjective(Other); + if ( HealObjective == None ) + HealObjective = DestroyableObjective(Other.Owner); + if ( HealObjective != None) + { + if ( HealObjective.TeamLink(Instigator.GetTeamNum()) ) + { + if (!HealObjective.HealDamage(AdjustedDamage, Instigator.Controller, DamageType)) + UT2341PulseGun(Weapon).ConsumeAmmo(ThisModeNum, -AmmoPerFire); + } + } + else if (Vehicle(Other) != None) + { + if(!Vehicle(Other).HealDamage(AdjustedDamage, Instigator.Controller, DamageType)) + UT2341PulseGun(Weapon).ConsumeAmmo(ThisModeNum, -AmmoPerFire); + } + else Other.TakeDamage(Damage, Instigator, HitLocation, MomentumTransfer*X, DamageType); + } + } + } + + // beam effect is created and destroyed when firing starts and stops + if ( (Beam == None) && bIsFiring ) + { + Beam = Weapon.Spawn( BeamEffectClass, Instigator ); + // vary link volume to make sure it gets replicated (in case owning player changed it client side) + if ( SentLinkVolume == Default.LinkVolume ) + SentLinkVolume = Default.LinkVolume + 1; + else + SentLinkVolume = Default.LinkVolume; + } + + if ( Beam != None ) + { + Instigator.AmbientSound = BeamSound; + Instigator.SoundVolume = SentLinkVolume; + Beam.bHitSomething = (Other != None); + Beam.EndEffect = EndEffect; + } + } + else + StopFiring(); + + bStartFire = false; + bDoHit = false; +} + +function bool BoundError() +{ + CurrentAimError.Yaw = CurrentAimError.Yaw & 65535; + if ( CurrentAimError.Yaw > 2048 ) + { + if ( CurrentAimError.Yaw < 32768 ) + { + CurrentAimError.Yaw = 2048; + return true; + } + else if ( CurrentAimError.Yaw < 63487 ) + { + CurrentAimError.Yaw = 63487; + return true; + } + } + return false; +} + +event ModeDoFire() +{ + Load = 0; //don't use ammo here - it will be consumed in ModeTick() where it's sync'ed with damage dealing + Super.ModeDoFire(); +} + +function DoFireEffect() +{ + bDoHit = true; + UpTime = FireRate+0.1; +} + +function StopFiring() +{ + if (Instigator.AmbientSound == BeamSound) + { + Instigator.AmbientSound = None; + Instigator.SoundVolume = Instigator.Default.SoundVolume; + } + if (Beam != None) + { + Beam.Destroy(); + Beam = None; + } + bStartFire = true; + bFeedbackDeath = false; +} + +simulated function vector GetFireStart(vector X, vector Y, vector Z) +{ + return Instigator.Location + Instigator.EyePosition() + X*Instigator.CollisionRadius; +} + +function StartBerserk() +{ + if ( (Level.GRI != None) && (Level.GRI.WeaponBerserk > 1.0) ) + return; + + Damage = default.Damage * 1.33; +} + +function StopBerserk() +{ + if ( (Level.GRI != None) && (Level.GRI.WeaponBerserk > 1.0) ) + return; + + Damage = default.Damage; +} + +function PlayFiring() +{ + if ( Weapon.Mesh != None ) + { + if (FireCount == 0) + Weapon.PlayAnim(FireAnim, FireAnimRate, TweenTime); + } + Weapon.PlayOwnedSound(FireSound,SLOT_Interact,TransientSoundVolume,,TransientSoundRadius,Default.FireAnimRate/FireAnimRate,false); + ClientPlayForceFeedback(FireForce); // jdf + + FireCount++; +} + +defaultproperties +{ + BeamEffectClass=Class'UT2341WeaponsReducedv1a.UT2341PulseBeamEffect' + DamageType=Class'UT2341WeaponsReducedv1a.DamType_Pulse' + Damage=10 + MomentumTransfer=2000.000000 + TraceRange=1100.000000 + bInitAimError=True + LinkVolume=240 + BeamSound=Sound'UT2341Weapons_Sounds.PulseGun.PulseBolt' + PulseFlashClass=Class'UT2341WeaponsReducedv1a.FX_PulseMuzFlash' + bPawnRapidFireAnim=True + FireAnim="FireAltStart" + FireLoopAnim="FireAltLoop" + FireEndAnim="FireAltEnd" + NoAmmoSound=ProceduralSound'WeaponSounds.PReload5.P1Reload5' + FireRate=0.100000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341PulseAmmo' + AmmoPerFire=1 + ShakeRotMag=(Z=60.000000) + ShakeRotRate=(Z=4000.000000) + ShakeRotTime=6.000000 + ShakeOffsetMag=(Y=1.000000,Z=1.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=3.000000 + BotRefireRate=0.990000 + WarnTargetPct=0.200000 +} diff --git a/Sources/Classes/UT2341PulseAmmo.uc b/Sources/Classes/UT2341PulseAmmo.uc new file mode 100644 index 0000000..f738391 --- /dev/null +++ b/Sources/Classes/UT2341PulseAmmo.uc @@ -0,0 +1,13 @@ +class UT2341PulseAmmo extends Ammunition; + +#EXEC OBJ LOAD FILE=InterfaceContent.utx + +defaultproperties +{ + MaxAmmo=400 + InitialAmount=120 + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341PulseAmmoPickup' + IconMaterial=Texture'HUDContent.Generic.HUD' + IconCoords=(X1=413,Y1=82,X2=457,Y2=125) + ItemName="Pulse Ammo" +} diff --git a/Sources/Classes/UT2341PulseAmmoPickup.uc b/Sources/Classes/UT2341PulseAmmoPickup.uc new file mode 100644 index 0000000..80f928a --- /dev/null +++ b/Sources/Classes/UT2341PulseAmmoPickup.uc @@ -0,0 +1,30 @@ +class UT2341PulseAmmoPickup extends UTAmmoPickup; + +function RespawnEffect() +{ + spawn(class'FX_PickupRespawn'); +} + +function PostBeginPlay() +{ + Super.PostBeginPlay(); + + if ( Level.Game.bAllowVehicles ) + MaxDesireability *= 1.9; +} + +defaultproperties +{ + AmmoAmount=50 + MaxDesireability=0.240000 + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341PulseAmmo' + PickupMessage="You picked up pulse charges." + PickupSound=Sound'UT2341Weapons_Sounds.General.AmmoSnd' + PickupForce="LinkAmmoPickup" + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTPulseCell' + DrawScale=0.350000 + PrePivot=(Z=30.000000) + AmbientGlow=64 + CollisionHeight=10.500000 +} diff --git a/Sources/Classes/UT2341PulseAttachment.uc b/Sources/Classes/UT2341PulseAttachment.uc new file mode 100644 index 0000000..f4927ac --- /dev/null +++ b/Sources/Classes/UT2341PulseAttachment.uc @@ -0,0 +1,45 @@ +class UT2341PulseAttachment extends xWeaponAttachment; + +var FX_PulseMuzFlash MuzFlash; + +simulated function Destroyed() +{ + if ( MuzFlash != None ) + MuzFlash.Destroy(); + + super.Destroyed(); +} + +simulated event ThirdPersonEffects() +{ + local Rotator R; + + if ( Level.NetMode != NM_DedicatedServer && FlashCount > 0 ) + { + if (FiringMode == 0) + { + if (MuzFlash == None) + { + MuzFlash = Spawn(class'FX_PulseMuzFlash'); + AttachToBone(MuzFlash, 'tip'); + } + if (MuzFlash != None) + { + MuzFlash.Trigger(self, None); + R.Roll = Rand(65536); + SetBoneRotation('Bone_flashA', R, 0, 1.0); + } + } + } + + super.ThirdPersonEffects(); +} + +defaultproperties +{ + bRapidFire=True + bAltRapidFire=True + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTPulseGun3rd' + RelativeLocation=(X=3.000000,Z=6.000000) + DrawScale=0.250000 +} diff --git a/Sources/Classes/UT2341PulseBeamEffect.uc b/Sources/Classes/UT2341PulseBeamEffect.uc new file mode 100644 index 0000000..14f372c --- /dev/null +++ b/Sources/Classes/UT2341PulseBeamEffect.uc @@ -0,0 +1,175 @@ +class UT2341PulseBeamEffect extends xEmitter; + +#exec OBJ LOAD FILE=XEffectMat.utx + +var Vector StartEffect, EndEffect; +var bool bHitSomething; +var Vector EffectOffset; +var Vector PrevLoc; +var Rotator PrevRot; +var float scorchtime; + +var FX_PulseBeamEnd BeamEndEffect; +var FX_PulseBeamFlash3rd MuzFlash; + +replication +{ + unreliable if (Role == ROLE_Authority) + bHitSomething; + + unreliable if ( (Role == ROLE_Authority) && (!bNetOwner || bDemoRecording || bRepClientDemo) ) + StartEffect, EndEffect; +} + + +simulated function Destroyed() +{ + if ( MuzFlash != None ) + MuzFlash.Kill(); + + if (BeamEndEffect != None) + BeamEndEffect.Destroy(); + + Super.Destroyed(); +} + +simulated function SetBeamLocation() +{ + local xWeaponAttachment Attachment; + + if ( Level.NetMode == NM_DedicatedServer ) + { + StartEffect = Instigator.Location + Instigator.EyeHeight*Vect(0,0,1); + SetLocation( StartEffect ); + return; + } + + if ( Instigator == None ) + { + SetLocation( StartEffect ); + } + else + { + if ( Instigator.IsFirstPerson() ) + { + if ( (Instigator.Weapon == None) || Instigator.Weapon.WeaponCentered() || (Instigator.Weapon.Instigator == None) ) + SetLocation( Instigator.Location ); + else + SetLocation(Instigator.Weapon.GetEffectStart() - (20 * vector(Instigator.Controller.Rotation))); + } + else + { + Attachment = xPawn(Instigator).WeaponAttachment; + if ( Attachment != None && (Level.TimeSeconds - Attachment.LastRenderTime) < 1 ) + SetLocation( Attachment.GetTipLocation() ); + else + SetLocation( Instigator.Location + Normal(EndEffect - Instigator.Location) * 25.0 ); + } + if ( Role == ROLE_Authority ) // what clients will use if their instigator is not relevant yet + StartEffect = Location; + } +} + +simulated function Vector SetBeamRotation() +{ + if ( (Instigator != None) && PlayerController(Instigator.Controller) != None ) + SetRotation( Instigator.Controller.GetViewRotation() ); + else + SetRotation( Rotator(EndEffect - Location) ); + + return Normal(EndEffect - Location); +} + +simulated function bool CheckMaxEffectDistance(PlayerController P, vector SpawnLocation) +{ + return !P.BeyondViewDistance(SpawnLocation,1000); +} + + +simulated function Tick(float dt) +{ + local Vector BeamDir, HitLocation, HitNormal; + local actor HitActor; + + if ( Role == ROLE_Authority && (Instigator == None || Instigator.Controller == None) ) + { + Destroy(); + return; + } + + // set beam start location + SetBeamLocation(); + BeamDir = SetBeamRotation(); + + if ( Level.NetMode != NM_DedicatedServer ) + { + if ( (Instigator != None) && !Instigator.IsFirstPerson() ) + { + if ( MuzFlash == None || MuzFlash.bDeleteMe ) + MuzFlash = Spawn(class'FX_PulseBeamFlash3rd', self); + } + else if ( MuzFlash != None ) + MuzFlash.Destroy(); + + if ( BeamEndEffect == None && EffectIsRelevant(EndEffect, false) ) + BeamEndEffect = Spawn(class'FX_PulseBeamEnd', self); + } + + if ( Level.bDropDetail || Level.DetailMode == DM_Low ) + { + bDynamicLight = false; + LightType = LT_None; + } + else if ( bDynamicLight ) + LightType = LT_Steady; + + mSpawnVecA = EndEffect; + + mWaveAmplitude = 0.0; + + PrevLoc = Location; + PrevRot = Rotation; + + if ( MuzFlash != None ) + MuzFlash.SetLocation( StartEffect ); + + if ( BeamEndEffect != None ) + BeamEndEffect.SetLocation( EndEffect ); + + if ( bHitSomething && (Level.NetMode != NM_DedicatedServer) && (Level.TimeSeconds - ScorchTime > 0.07) ) + { + ScorchTime = Level.TimeSeconds; + HitActor = Trace(HitLocation, HitNormal, EndEffect + 100*BeamDir, EndEffect - 100*BeamDir, true); + if ( (HitActor != None) && HitActor.bWorldGeometry ) + spawn(class'LinkScorch',,,HitLocation,rotator(-HitNormal)); + } +} + +defaultproperties +{ + EffectOffset=(X=22.000000,Y=11.000000,Z=1.400000) + mParticleType=PT_Beam + mMaxParticles=3 + mRegenDist=65.000000 + mSpinRange(0)=45000.000000 + mColorRange(0)=(B=240,G=240,R=240) + mColorRange(1)=(B=240,G=240,R=240) + mAttenuate=False + mAttenKa=0.000000 + mWaveFrequency=0.060000 + mWaveAmplitude=8.000000 + mWaveShift=100000.000000 + mBendStrength=3.000000 + mWaveLockEnd=True + LightType=LT_Steady + LightHue=100 + LightSaturation=100 + LightBrightness=255.000000 + LightRadius=4.000000 + bDynamicLight=True + bNetTemporary=False + bReplicateInstigator=True + RemoteRole=ROLE_SimulatedProxy + Skins(0)=FinalBlend'UT2341Weapons_Tex.PulseGun.PulseBeamBlend' + Style=STY_Additive +} diff --git a/Sources/Classes/UT2341PulseFire.uc b/Sources/Classes/UT2341PulseFire.uc new file mode 100644 index 0000000..c3fabdf --- /dev/null +++ b/Sources/Classes/UT2341PulseFire.uc @@ -0,0 +1,125 @@ +class UT2341PulseFire extends ProjectileFire; + +var sound WindDownSound; + +var() class NewFlashClass; +var Emitter NewFlashEmitter; + +simulated function InitEffects() +{ + // don't even spawn on server + if ( (Level.NetMode == NM_DedicatedServer) || (AIController(Instigator.Controller) != None) ) + return; + if ( (NewFlashClass != None) && ((NewFlashEmitter == None) || NewFlashEmitter.bDeleteMe) ) + { + NewFlashEmitter = Weapon.Spawn(NewFlashClass); + Weapon.AttachToBone(NewFlashEmitter, 'tip'); + } + if ( (SmokeEmitterClass != None) && ((SmokeEmitter == None) || SmokeEmitter.bDeleteMe) ) + { + SmokeEmitter = Weapon.Spawn(SmokeEmitterClass); + } +} + +function DrawMuzzleFlash(Canvas Canvas) +{ + // Draw smoke first + if (SmokeEmitter != None && SmokeEmitter.Base != Weapon) + { + SmokeEmitter.SetLocation( Weapon.GetEffectStart() ); + Canvas.DrawActor( SmokeEmitter, false, false, Weapon.DisplayFOV ); + } + + if (NewFlashEmitter != None && NewFlashEmitter.Base != Weapon) + { + NewFlashEmitter.SetLocation( Weapon.GetEffectStart() ); + Canvas.DrawActor( NewFlashEmitter, false, false, Weapon.DisplayFOV ); + } +} + +function FlashMuzzleFlash() +{ + if (NewFlashEmitter != None) + NewFlashEmitter.Trigger(Weapon, Instigator); +} + +simulated function DestroyEffects() +{ + if (NewFlashEmitter != None) + NewFlashEmitter.Destroy(); + + if (SmokeEmitter != None) + SmokeEmitter.Destroy(); +} + +function PlayFiring() +{ + if ( Weapon.Mesh != None ) + { + if ( FireCount > 0 ) + { + if ( Weapon.HasAnim(FireLoopAnim) ) + { + Weapon.PlayAnim(FireLoopAnim, FireLoopAnimRate, 0.0); + } + else + { + Weapon.PlayAnim(FireAnim, FireAnimRate, TweenTime); + } + } + else + { + Weapon.PlayAnim(FireAnim, FireAnimRate, TweenTime); + UT2341PulseGun(Weapon).BarrelState = 1; + } + } + + Instigator.AmbientSound = FireSound; + Instigator.SoundVolume = 254; + // Weapon.PlayOwnedSound(FireSound,SLOT_Interact,TransientSoundVolume,,TransientSoundRadius,Default.FireAnimRate/FireAnimRate,false); + ClientPlayForceFeedback(FireForce); // jdf + + FireCount++; +} + +function ServerPlayFiring() +{ + Instigator.AmbientSound = FireSound; + Instigator.SoundVolume = 254; +} + +simulated function bool AllowFire() +{ + return ( Weapon.AmmoAmount(ThisModeNum) >= 1 ); +} + +function StopFiring() +{ + Weapon.PlaySound(WindDownSound,SLOT_Interact,TransientSoundVolume,,TransientSoundRadius,,false); + Instigator.AmbientSound=None; + Instigator.SoundVolume = Instigator.Default.SoundVolume; + UT2341PulseGun(Weapon).BarrelState = 2; +} + +defaultproperties +{ + WindDownSound=Sound'UT2341Weapons_Sounds.PulseGun.PulseDown' + NewFlashClass=Class'UT2341WeaponsReducedv1a.FX_PulseMuzFlash' + ProjSpawnOffset=(X=25.000000,Y=8.000000,Z=-3.000000) + FireAnimRate=1.500000 + FireLoopAnimRate=1.500000 + FireSound=Sound'UT2341Weapons_Sounds.PulseGun.PulseFire' + FireForce="TranslocatorFire" + FireRate=0.180000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341PulseAmmo' + AmmoPerFire=2 + ShakeRotMag=(X=40.000000) + ShakeRotRate=(X=2000.000000) + ShakeRotTime=2.000000 + ShakeOffsetMag=(Y=1.000000) + ShakeOffsetRate=(Y=-2000.000000) + ShakeOffsetTime=4.000000 + ProjectileClass=Class'UT2341WeaponsReducedv1a.UT2341PulseProjectile' + BotRefireRate=0.990000 + WarnTargetPct=0.100000 +} diff --git a/Sources/Classes/UT2341PulseGun.uc b/Sources/Classes/UT2341PulseGun.uc new file mode 100644 index 0000000..2dbcb8d --- /dev/null +++ b/Sources/Classes/UT2341PulseGun.uc @@ -0,0 +1,206 @@ +class UT2341PulseGun extends Weapon + config(user); + +#EXEC OBJ LOAD FILE=UT2341Weapons_Tex.utx + +var byte BarrelState; //0 - still - 1 - spin - 2 - winddown +var Rotator BarrelRot; +var float RotationsPerSecond, RemainingWind; + +simulated function bool HasAmmo() +{ + return ( AmmoClass[0] != None && FireMode[0] != None && AmmoCharge[0] >= 1 ); +} + +function bool ConsumeAmmo(int Mode, float load, optional bool bAmountNeededIsMax) +{ + if ( mode == 0 ) + bAmountNeededIsMax = true; + + return Super.ConsumeAmmo(Mode, load, bAmountNeededIsMax); +} + +//=========================================================================== +// GetEffectStart +// +// Use tip location +//=========================================================================== +simulated function vector GetEffectStart() +{ + if (FireMode[1].bIsFiring) + return GetBoneCoords('tip2').Origin; + return GetBoneCoords('tip').Origin; +} + +function float GetAIRating() +{ + local Bot B; + local DestroyableObjective O; + local Vehicle V; + + B = Bot(Instigator.Controller); + if ( B == None ) + return AIRating; + + V = B.Squad.GetLinkVehicle(B); + if ( (V != None) + && (VSize(Instigator.Location - V.Location) < 1.5 * UT2341PulseAltFire(FireMode[1]).TraceRange) + && (V.Health < V.HealthMax) && (V.LinkHealMult > 0) ) + return 1.2; + + if ( Vehicle(B.RouteGoal) != None && B.Enemy == None && VSize(Instigator.Location - B.RouteGoal.Location) < 1.5 * UT2341PulseAltFire(FireMode[1]).TraceRange + && Vehicle(B.RouteGoal).TeamLink(B.GetTeamNum()) ) + return 1.2; + + O = DestroyableObjective(B.Squad.SquadObjective); + if ( O != None && B.Enemy == None && O.TeamLink(B.GetTeamNum()) && O.Health < O.DamageCapacity + && VSize(Instigator.Location - O.Location) < 1.1 * UT2341PulseAltFire(FireMode[1]).TraceRange && B.LineOfSightTo(O) ) + return 1.2; + + return AIRating * FMin(Pawn(Owner).DamageScaling, 1.5); +} + +//=========================================================================== +// AnimEnd +// +// Handles loop firing animation +//=========================================================================== +simulated function AnimEnd(int channel) +{ + local name anim; + local float frame, rate; + + GetAnimParams(0, anim, frame, rate); + + if (ClientState == WS_ReadyToFire) + { + if (anim == FireMode[1].FireAnim) + { + if (FireMode[1].bIsFiring) + LoopAnim(FireMode[1].FireLoopAnim, FireMode[1].FireLoopAnimRate, 0.0); + else if (HasAnim(FireMode[1].FireEndAnim)) + PlayAnim(FireMode[1].FireEndAnim, FireMode[1].FireEndAnimRate, 0.0); + } + else if ((FireMode[0] == None || !FireMode[0].bIsFiring) && (FireMode[1] == None || !FireMode[1].bIsFiring)) + { + PlayIdle(); + } + } +} + +//=========================================================================== +// WeaponTick +// +// Rotate barrels +//=========================================================================== +simulated function WeaponTick (float dt) +{ + if (BarrelState == 1) + { + BarrelRot.Roll += dt * RotationsPerSecond * 65535; + SetBoneRotation('Bone_Barrels', BarrelRot); + } + + else if (BarrelState == 2) + { + RemainingWind -= dt; + if (RemainingWind < 0) + { + RemainingWind = default.RemainingWind; + BarrelState = 0; + } + else + { BarrelRot.Roll += dt * (RemainingWind / default.RemainingWind) * RotationsPerSecond * 65535; + SetBoneRotation('Bone_Barrels', BarrelRot); + } + } + +} +/* BestMode() +choose between regular or alt-fire +*/ +function byte BestMode() +{ + local float EnemyDist; + local bot B; + local Vehicle V; + + B = Bot(Instigator.Controller); + if ( B == None ) + return 0; + + if ( ( (DestroyableObjective(B.Squad.SquadObjective) != None && B.Squad.SquadObjective.TeamLink(B.GetTeamNum())) + || (B.Squad.SquadObjective == None && DestroyableObjective(B.Target) != None && B.Target.TeamLink(B.GetTeamNum())) ) + && VSize(B.Squad.SquadObjective.Location - B.Pawn.Location) < FireMode[1].MaxRange() && (B.Enemy == None || !B.EnemyVisible()) ) + return 1; + V = B.Squad.GetLinkVehicle(B); + if ( V == None ) + V = Vehicle(B.MoveTarget); + if ( V == B.Target ) + return 1; + if ( (V != None) && (VSize(Instigator.Location - V.Location) < UT2341PulseAltFire(FireMode[1]).TraceRange) + && (V.Health < V.HealthMax) && (V.LinkHealMult > 0) && B.LineOfSightTo(V) ) + return 1; + if ( B.Enemy == None ) + return 0; + EnemyDist = VSize(B.Enemy.Location - Instigator.Location); + if ( EnemyDist > UT2341PulseAltFire(FireMode[1]).TraceRange || EnemyDist < 400) + return 0; + return 1; +} + +function float SuggestAttackStyle() +{ + return 0.8; +} + +function float SuggestDefenseStyle() +{ + return -0.4; +} + +function bool CanHeal(Actor Other) +{ + if (DestroyableObjective(Other) != None && DestroyableObjective(Other).LinkHealMult > 0) + return true; + if (Vehicle(Other) != None && Vehicle(Other).LinkHealMult > 0) + return true; + + return false; +} + +defaultproperties +{ + RotationsPerSecond=0.800000 + RemainingWind=0.800000 + FireModeClass(0)=Class'UT2341WeaponsReducedv1a.UT2341PulseFire' + FireModeClass(1)=Class'UT2341WeaponsReducedv1a.UT2341PulseAltFire' + PutDownAnim="PutDown" + IdleAnimRate=0.030000 + SelectSound=Sound'UT2341Weapons_Sounds.PulseGun.PulsePickup' + SelectForce="SwitchToLinkGun" + AIRating=0.680000 + CurrentRating=0.680000 + Description="Classification: Plasma Rifle||Primary Fire: Medium sized, fast moving plasma balls are fired at a fast rate of fire.||Secondary Fire: A bolt of green lightning is expelled for 100 meters, which will shock all opponents.||Techniques: Firing and keeping the secondary fire's lightning on an opponent will melt them in seconds." + EffectOffset=(X=100.000000,Y=25.000000,Z=-3.000000) + DisplayFOV=80.000000 + Priority=7 + HudColor=(B=128,R=128) + SmallViewOffset=(Y=-1.000000,Z=-12.000000) + CenteredOffsetY=-5.000000 + CenteredRoll=3000 + CenteredYaw=-1000 + CustomCrosshair=10 + CustomCrossHairColor=(B=128,R=128) + CustomCrossHairTextureName="Crosshairs.Hud.Crosshair_Bracket1" + InventoryGroup=5 + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341PulseGunPickup' + PlayerViewOffset=(Y=-1.000000,Z=-12.000000) + BobDamping=1.575000 + AttachmentClass=Class'UT2341WeaponsReducedv1a.UT2341PulseAttachment' + IconMaterial=Texture'UT2341Weapons_Tex.Icons.Icon_PulseGun' + IconCoords=(X2=128,Y2=32) + ItemName="Pulse Gun" + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTPulseGunFP' + DrawScale=2.000000 +} diff --git a/Sources/Classes/UT2341PulseGunPickup.uc b/Sources/Classes/UT2341PulseGunPickup.uc new file mode 100644 index 0000000..9f64f26 --- /dev/null +++ b/Sources/Classes/UT2341PulseGunPickup.uc @@ -0,0 +1,35 @@ +//============================================================================= +// LinkGunPickup. +//============================================================================= +class UT2341PulseGunPickup extends UTWeaponPickup; + +#exec OBJ LOAD FILE=NewWeaponPickups.usx + +static function StaticPrecache(LevelInfo L) +{ +} + +simulated function UpdatePrecacheMaterials() +{ + super.UpdatePrecacheMaterials(); +} + +simulated function UpdatePrecacheStaticMeshes() +{ + Super.UpdatePrecacheStaticMeshes(); +} + +defaultproperties +{ + MaxDesireability=0.700000 + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341PulseGun' + PickupMessage="You got the Pulse Gun." + PickupSound=Sound'UT2341Weapons_Sounds.General.WeaponPickup' + PickupForce="LinkGunPickup" + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTPulseGun' + DrawScale=0.220000 + PrePivot=(Z=47.000000) + AmbientGlow=64 + RotationRate=(Yaw=5000) +} diff --git a/Sources/Classes/UT2341PulseProjectile.uc b/Sources/Classes/UT2341PulseProjectile.uc new file mode 100644 index 0000000..1b3bea0 --- /dev/null +++ b/Sources/Classes/UT2341PulseProjectile.uc @@ -0,0 +1,127 @@ +//============================================================================= +// LinkProjectile. +//============================================================================= +class UT2341PulseProjectile extends Projectile; + +#exec OBJ LOAD FILE=XEffectMat.utx + +var Emitter Trail; + +simulated function Destroyed() +{ + if (Trail != None) + { + Trail.Destroy(); + } + Super.Destroyed(); +} + +simulated function PostBeginPlay() +{ + local Rotator R; + + Super.PostBeginPlay(); + + Velocity = Vector(Rotation); + Velocity *= Speed; + + R = Rotation; + R.Roll = Rand(65536); + SetRotation(R); +} + +simulated function PostNetBeginPlay() +{ + local PlayerController PC; + + Acceleration = Normal(Velocity) * 3000.0; + + if (Level.NetMode != NM_DedicatedServer) + { + Trail = Spawn(class'FX_PulseProjectileNew',self); + Trail.SetBase(self); + } + + if ( Level.NetMode == NM_DedicatedServer ) + return; + if ( Level.bDropDetail || (Level.DetailMode == DM_Low) ) + { + bDynamicLight = false; + LightType = LT_None; + } + else + { + PC = Level.GetLocalPlayerController(); + if ( (PC == None) || (Instigator == None) || (PC != Instigator.Controller) ) + { + bDynamicLight = false; + LightType = LT_None; + } + } +} + +simulated function Explode(vector HitLocation, vector HitNormal) +{ + if ( EffectIsRelevant(Location,false) ) + { + Spawn(class'FX_PulseImpact',,, HitLocation, rotator(HitNormal)); + } + PlaySound(Sound'UT2341Weapons_Sounds.PulseGun.PulseExp'); + Destroy(); +} + +simulated function ProcessTouch (Actor Other, vector HitLocation) +{ + if (Other == Instigator) return; + if (Other == Owner) return; + + if ( !Other.IsA('Projectile') || Other.bProjTarget ) + { + if ( Role == ROLE_Authority ) + { + if ( Instigator == None || Instigator.Controller == None ) + Other.SetDelayedDamageInstigatorController( InstigatorController ); + Other.TakeDamage(Damage,Instigator,HitLocation,MomentumTransfer * Normal(Velocity),MyDamageType); + } + Explode(HitLocation, vect(0,0,1)); + } +} + +/* +pulse pri has been improved with acceleration which did not exist in UT99 +*/ + +defaultproperties +{ + Speed=1900.000000 + MaxSpeed=2500.000000 + Damage=30.000000 + DamageRadius=0.000000 + MomentumTransfer=13500.000000 + MyDamageType=Class'UT2341WeaponsReducedv1a.DamType_Pulse' + ExplosionDecal=Class'XEffects.LinkBoltScorch' + ExploWallOut=10.000000 + MaxEffectDistance=7000.000000 + LightType=LT_Steady + LightEffect=LE_QuadraticNonIncidence + LightHue=83 + LightBrightness=255.000000 + LightRadius=4.000000 + DrawType=DT_None + CullDistance=3500.000000 + bDynamicLight=True + AmbientSound=Sound'UT2341Weapons_Sounds.PulseGun.PulseFly' + LifeSpan=3.000000 + PrePivot=(X=10.000000) + Style=STY_Additive + FluidSurfaceShootStrengthMod=6.000000 + SoundVolume=218 + SoundRadius=10.000000 + bFixedRotationDir=True + RotationRate=(Roll=80000) + ForceType=FT_Constant + ForceRadius=30.000000 + ForceScale=5.000000 + CollisionRadius=2.000000 + CollisionHeight=2.000000 +} diff --git a/Sources/Classes/UT2341Redeemer.uc b/Sources/Classes/UT2341Redeemer.uc new file mode 100644 index 0000000..5bcf0bc --- /dev/null +++ b/Sources/Classes/UT2341Redeemer.uc @@ -0,0 +1,90 @@ +class UT2341Redeemer extends Weapon + config(user); + +simulated event ClientStopFire(int Mode) +{ + if (Role < ROLE_Authority) + { + StopFire(Mode); + } + if ( Mode == 0 ) + ServerStopFire(Mode); +} + +simulated event WeaponTick(float dt) +{ + if ( (Instigator.Controller == None) || HasAmmo() ) + return; + Instigator.Controller.SwitchToBestWeapon(); +} + + +// AI Interface +function float SuggestAttackStyle() +{ + return -1.0; +} + +function float SuggestDefenseStyle() +{ + return -1.0; +} + +/* BestMode() +choose between regular or alt-fire +*/ +function byte BestMode() +{ + return 0; +} + +function float GetAIRating() +{ + local Bot B; + + B = Bot(Instigator.Controller); + if ( B == None ) + return 0.4; + + if ( B.IsShootingObjective() ) + return 1.0; + + if ( (B.Enemy == None) || B.Enemy.bCanFly || VSize(B.Enemy.Location - Instigator.Location) < 2400 ) + return 0.4; + + return AIRating; +} + +defaultproperties +{ + FireModeClass(0)=Class'UT2341WeaponsReducedv1a.UT2341RedeemerFire' + FireModeClass(1)=Class'UT2341WeaponsReducedv1a.UT2341RedeemerGuidedFire' + PutDownAnim="PutDown" + SelectAnimRate=0.667000 + PutDownAnimRate=1.000000 + PutDownTime=0.450000 + BringUpTime=0.675000 + SelectSound=Sound'UT2341Weapons_Sounds.Redeemer.WarheadPickup' + SelectForce="SwitchToFlakCannon" + AIRating=1.500000 + CurrentRating=1.500000 + Description="Classification: Thermonuclear Device||Primary Fire: Launches a huge yet slow moving missile that, upon striking a solid surface, will explode and send out a gigantic shock wave, instantly pulverizing anyone or anything within its colossal radius, including yourself.||Secondary Fire: Take control of the missile and fly it anywhere. You can press the primary fire button to explode the missile early.||Techniques: Remember that while this rocket is being piloted you are a sitting duck. If an opponent manages to hit your incoming Redeemer missile while it's in the air, the missile will explode harmlessly." + DisplayFOV=80.000000 + Priority=16 + SmallViewOffset=(Y=1.000000,Z=-12.000000) + CustomCrosshair=13 + CustomCrossHairColor=(B=128) + CustomCrossHairScale=2.000000 + CustomCrossHairTextureName="Crosshairs.Hud.Crosshair_Circle2" + InventoryGroup=0 + GroupOffset=1 + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341RedeemerPickup' + PlayerViewOffset=(Y=1.000000,Z=-12.000000) + BobDamping=1.400000 + AttachmentClass=Class'UT2341WeaponsReducedv1a.UT2341RedeemerAttachment' + IconMaterial=Texture'UT2341Weapons_Tex.Icons.Icon_Redeemer' + IconCoords=(X2=127,Y2=32) + ItemName="Redeemer" + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTRedeemerFP' + DrawScale=2.000000 +} diff --git a/Sources/Classes/UT2341RedeemerAmmo.uc b/Sources/Classes/UT2341RedeemerAmmo.uc new file mode 100644 index 0000000..e68dcbd --- /dev/null +++ b/Sources/Classes/UT2341RedeemerAmmo.uc @@ -0,0 +1,8 @@ +class UT2341RedeemerAmmo extends Ammunition; + +defaultproperties +{ + MaxAmmo=2 + InitialAmount=1 + ItemName="UT Redeemer Ammo" +} diff --git a/Sources/Classes/UT2341RedeemerAttachment.uc b/Sources/Classes/UT2341RedeemerAttachment.uc new file mode 100644 index 0000000..3729445 --- /dev/null +++ b/Sources/Classes/UT2341RedeemerAttachment.uc @@ -0,0 +1,9 @@ +class UT2341RedeemerAttachment extends xWeaponAttachment; + +defaultproperties +{ + bHeavy=True + CullDistance=5000.000000 + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTRedeemer3rd' + DrawScale=0.150000 +} diff --git a/Sources/Classes/UT2341RedeemerFire.uc b/Sources/Classes/UT2341RedeemerFire.uc new file mode 100644 index 0000000..7275b61 --- /dev/null +++ b/Sources/Classes/UT2341RedeemerFire.uc @@ -0,0 +1,40 @@ +class UT2341RedeemerFire extends ProjectileFire; + +function Projectile SpawnProjectile(Vector Start, Rotator Dir) +{ + local Projectile p; + + p = Super.SpawnProjectile(Start,Dir); + if ( p == None ) + p = Super.SpawnProjectile(Instigator.Location,Dir); + if ( p == None ) + { + Weapon.Spawn(class'SmallRedeemerExplosion'); + Weapon.HurtRadius(500, 400, class'DamTypeRedeemer', 100000, Instigator.Location); + } + return p; +} + +function float MaxRange() +{ + return 20000; +} + +defaultproperties +{ + ProjSpawnOffset=(X=100.000000,Z=0.000000) + bSplashDamage=True + bRecommendSplashDamage=True + TransientSoundVolume=1.000000 + FireSound=Sound'UT2341Weapons_Sounds.Redeemer.WarheadShot' + FireForce="redeemer_shoot" + FireRate=1.000000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341RedeemerAmmo' + AmmoPerFire=1 + ShakeRotTime=2.000000 + ShakeOffsetMag=(X=-20.000000) + ShakeOffsetRate=(X=-1000.000000) + ShakeOffsetTime=2.000000 + ProjectileClass=Class'UT2341WeaponsReducedv1a.UT2341RedeemerProjectile' + BotRefireRate=0.500000 +} diff --git a/Sources/Classes/UT2341RedeemerGuidedFire.uc b/Sources/Classes/UT2341RedeemerGuidedFire.uc new file mode 100644 index 0000000..2316313 --- /dev/null +++ b/Sources/Classes/UT2341RedeemerGuidedFire.uc @@ -0,0 +1,43 @@ +class UT2341RedeemerGuidedFire extends UT2341RedeemerFire; + +function Projectile SpawnProjectile(Vector Start, Rotator Dir) +{ + local RedeemerWarhead Warhead; + local PlayerController Possessor; + + Warhead = Weapon.Spawn(class'UT2341RedeemerWarhead', Instigator,, Start, Dir); + if (Warhead == None) + Warhead = Weapon.Spawn(class'UT2341RedeemerWarhead', Instigator,, Instigator.Location, Dir); + if (Warhead != None) + { + Warhead.OldPawn = Instigator; + Warhead.PlaySound(FireSound); + Possessor = PlayerController(Instigator.Controller); + Possessor.bAltFire = 0; + if ( Possessor != None ) + { + if ( Instigator.InCurrentCombo() ) + Possessor.Adrenaline = 0; + Possessor.UnPossess(); + Instigator.SetOwner(Possessor); + Instigator.PlayerReplicationInfo = Possessor.PlayerReplicationInfo; + Possessor.Possess(Warhead); + } + Warhead.Velocity = Warhead.AirSpeed * Vector(Warhead.Rotation); + Warhead.Acceleration = Warhead.Velocity; + WarHead.MyTeam = Possessor.PlayerReplicationInfo.Team; + } + else + { + Weapon.Spawn(class'SmallRedeemerExplosion'); + Weapon.HurtRadius(500, 400, class'DamTypeRedeemer', 100000, Instigator.Location); + } + + bIsFiring = false; + StopFiring(); + return None; +} + +defaultproperties +{ +} diff --git a/Sources/Classes/UT2341RedeemerPickup.uc b/Sources/Classes/UT2341RedeemerPickup.uc new file mode 100644 index 0000000..5482689 --- /dev/null +++ b/Sources/Classes/UT2341RedeemerPickup.uc @@ -0,0 +1,88 @@ +class UT2341RedeemerPickup extends UTWeaponPickup; + +#exec OBJ LOAD FILE=EpicParticles.utx +#exec OBJ LOAD FILE=2K4HUD.utx + +var material PrecacheHUDTextures[4]; + +function PrebeginPlay() +{ + Super.PreBeginPlay(); + if ( Level.Game.IsA('xMutantGame') ) + Destroy(); +} + +function SetWeaponStay() +{ + bWeaponStay = false; +} + +function float GetRespawnTime() +{ + return ReSpawnTime; +} + +static function StaticPrecache(LevelInfo L) +{ + local int i; + + for ( i=0; i<4; i++ ) + L.AddPrecacheMaterial(Default.PrecacheHUDTextures[i]); + L.AddPrecacheMaterial(Material'EpicParticles.Smokepuff2'); + L.AddPrecacheMaterial(Material'EpicParticles.IonBurn'); + L.AddPrecacheMaterial(Material'EpicParticles.IonWave'); + L.AddPrecacheMaterial(Material'EpicParticles.BurnFlare1'); + L.AddPrecacheMaterial(Material'EpicParticles.WhiteStreak01aw'); + L.AddPrecacheMaterial(Material'EpicParticles.Smokepuff'); + L.AddPrecacheMaterial(Material'EpicParticles.SoftFlare'); + L.AddPrecacheMaterial(Material'WeaponSkins.RDMR_Missile'); + L.AddPrecacheMaterial(Material'AW-2004Explosions.Part_explode2'); + L.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.RedeemerPickup'); + L.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.RedeemerMissile'); +} + +simulated function UpdatePrecacheMaterials() +{ + local int i; + + for ( i=0; i<4; i++ ) + Level.AddPrecacheMaterial(Default.PrecacheHUDTextures[i]); + Level.AddPrecacheMaterial(Material'EpicParticles.Smokepuff2'); + Level.AddPrecacheMaterial(Material'EpicParticles.IonBurn'); + Level.AddPrecacheMaterial(Material'EpicParticles.IonWave'); + Level.AddPrecacheMaterial(Material'EpicParticles.BurnFlare1'); + Level.AddPrecacheMaterial(Material'EpicParticles.WhiteStreak01aw'); + Level.AddPrecacheMaterial(Material'EpicParticles.Smokepuff'); + Level.AddPrecacheMaterial(Material'EpicParticles.SoftFlare'); + Level.AddPrecacheMaterial(Material'WeaponSkins.RDMR_Missile'); + Level.AddPrecacheMaterial(Material'AW-2004Explosions.Part_explode2'); + + super.UpdatePrecacheMaterials(); +} + +simulated function UpdatePrecacheStaticMeshes() +{ + Level.AddPrecacheStaticMesh(StaticMesh'UT2341Weapons_SM.UTRedeemerMissile'); + Level.AddPrecacheStaticMesh(StaticMesh'UT2341Weapons_SM.UTRedeemer'); + + Super.UpdatePrecacheStaticMeshes(); +} + +defaultproperties +{ + PrecacheHUDTextures(0)=Texture'2K4Hud.ZoomFX.RedeemerInnerScope' + PrecacheHUDTextures(1)=Texture'2K4Hud.ZoomFX.RedeemerOuterEdge' + PrecacheHUDTextures(2)=Texture'2K4Hud.ZoomFX.RedeemerOuterScope' + PrecacheHUDTextures(3)=Texture'2K4Hud.ZoomFX.RDM_Altitude' + bWeaponStay=False + MaxDesireability=1.000000 + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341Redeemer' + RespawnTime=120.000000 + PickupMessage="You got the Redeemer." + PickupSound=Sound'UT2341Weapons_Sounds.General.WeaponPickup' + PickupForce="FlakCannonPickup" + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTRedeemer' + DrawScale=0.200000 + RotationRate=(Yaw=5000) +} diff --git a/Sources/Classes/UT2341RedeemerProjectile.uc b/Sources/Classes/UT2341RedeemerProjectile.uc new file mode 100644 index 0000000..eb6766d --- /dev/null +++ b/Sources/Classes/UT2341RedeemerProjectile.uc @@ -0,0 +1,241 @@ +//============================================================================= +// rocket. +//============================================================================= +class UT2341RedeemerProjectile extends Projectile; + +var NewRedeemerTrail SmokeTrail; + +// camera shakes // +var() vector ShakeRotMag; // how far to rot view +var() vector ShakeRotRate; // how fast to rot view +var() float ShakeRotTime; // how much time to rot the instigator's view +var() vector ShakeOffsetMag; // max view offset vertically +var() vector ShakeOffsetRate; // how fast to offset view vertically +var() float ShakeOffsetTime; // how much time to offset view + +var class ExplosionEffectClass; + +var byte Team; + +simulated function Destroyed() +{ + if ( SmokeTrail != None ) + SmokeTrail.Destroy(); + Super.Destroyed(); +} + +function BeginPlay() +{ + Super.BeginPlay(); + + if (Instigator != None) + Team = Instigator.GetTeamNum(); + SetTimer(0.5, true); +} + +simulated function PostBeginPlay() +{ + local vector Dir; + + if ( bDeleteMe || IsInState('Dying') ) + return; + + Dir = vector(Rotation); + Velocity = speed * Dir; + + if ( Level.NetMode != NM_DedicatedServer) + { + SmokeTrail = Spawn(class'NewRedeemerTrail',self,,Location - 13 * Dir, Rotation); + SmokeTrail.SetBase(self); + } + + Super.PostBeginPlay(); +} + +event bool EncroachingOn( actor Other ) +{ + if ( Other.bWorldGeometry ) + return true; + + return false; +} + +simulated function ProcessTouch (Actor Other, Vector HitLocation) +{ + if ( Other != instigator ) + Explode(HitLocation,Vect(0,0,1)); +} + +simulated function Explode(vector HitLocation, vector HitNormal) +{ + BlowUp(HitLocation); +} + +simulated function PhysicsVolumeChange( PhysicsVolume Volume ) +{ +} + +simulated function Landed( vector HitNormal ) +{ + BlowUp(Location); +} + +simulated function HitWall(vector HitNormal, actor Wall) +{ + BlowUp(Location); +} + +function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, + Vector momentum, class damageType) +{ + if ( (Damage > 0) && ((InstigatedBy == None) || (InstigatedBy.Controller == None) || (Instigator == None) || (Instigator.Controller == None) || !InstigatedBy.Controller.SameTeamAs(Instigator.Controller)) ) + { + if ( (InstigatedBy == None) || DamageType.Default.bVehicleHit || (DamageType == class'Crushed') ) + BlowUp(Location); + else + { + Spawn(class'SmallRedeemerExplosion'); + SetCollision(false,false,false); + HurtRadius(Damage, DamageRadius*0.125, MyDamageType, MomentumTransfer, Location); + Destroy(); + } + } +} + +simulated event FellOutOfWorld(eKillZType KillType) +{ + BlowUp(Location); +} + +function BlowUp(vector HitLocation) +{ + local Emitter E; + + E = Spawn(ExplosionEffectClass,,, HitLocation - 100 * Normal(Velocity), Rot(0,16384,0)); + if ( Level.NetMode == NM_DedicatedServer ) + { + E.LifeSpan = 0.7; + } + MakeNoise(1.0); + SetPhysics(PHYS_None); + bHidden = true; + GotoState('Dying'); +} + +function Timer() +{ + local Controller C; + + //Enemies who don't have anything else to shoot at will try to shoot redeemer down + for (C = Level.ControllerList; C != None; C = C.NextController) + if ( AIController(C) != None && C.Pawn != None && C.GetTeamNum() != Team && AIController(C).Skill >= 2.0 + && !C.Pawn.IsFiring() && (C.Enemy == None || !C.LineOfSightTo(C.Enemy)) && C.Pawn.CanAttack(self) ) + { + C.Focus = self; + C.FireWeaponAt(self); + } +} + +state Dying +{ + function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, + Vector momentum, class damageType) {} + function Timer() {} + + function BeginState() + { + bHidden = true; + SetPhysics(PHYS_None); + SetCollision(false,false,false); + //Spawn(class'IonCore',,, Location, Rotation); + ShakeView(); + InitialState = 'Dying'; + if ( SmokeTrail != None ) + SmokeTrail.Destroy(); + SetTimer(0, false); + } + + function ShakeView() + { + local Controller C; + local PlayerController PC; + local float Dist, Scale; + + for ( C=Level.ControllerList; C!=None; C=C.NextController ) + { + PC = PlayerController(C); + if ( PC != None && PC.ViewTarget != None ) + { + Dist = VSize(Location - PC.ViewTarget.Location); + if ( Dist < DamageRadius * 2.0) + { + if (Dist < DamageRadius) + Scale = 1.0; + else + Scale = (DamageRadius*2.0 - Dist) / (DamageRadius); + C.ShakeView(ShakeRotMag*Scale, ShakeRotRate, ShakeRotTime, ShakeOffsetMag*Scale, ShakeOffsetRate, ShakeOffsetTime); + } + } + } + } + +Begin: + PlaySound(sound'UT2341Weapons_Sounds.Redeemer.WarExplo'); + HurtRadius(Damage, DamageRadius*0.125, MyDamageType, MomentumTransfer, Location); + Sleep(0.5); + HurtRadius(Damage, DamageRadius*0.300, MyDamageType, MomentumTransfer, Location); + Sleep(0.2); + HurtRadius(Damage, DamageRadius*0.475, MyDamageType, MomentumTransfer, Location); + Sleep(0.2); + HurtRadius(Damage, DamageRadius*0.650, MyDamageType, MomentumTransfer, Location); + Sleep(0.2); + HurtRadius(Damage, DamageRadius*0.825, MyDamageType, MomentumTransfer, Location); + Sleep(0.2); + HurtRadius(Damage, DamageRadius*1.000, MyDamageType, MomentumTransfer, Location); + Destroy(); +} + +defaultproperties +{ + ShakeRotMag=(Z=250.000000) + ShakeRotRate=(Z=2500.000000) + ShakeRotTime=6.000000 + ShakeOffsetMag=(Z=10.000000) + ShakeOffsetRate=(Z=200.000000) + ShakeOffsetTime=10.000000 + ExplosionEffectClass=Class'UT2341WeaponsReducedv1a.FX_RedeemerExplosion' + Team=255 + Speed=670.000000 + MaxSpeed=1000.000000 + Damage=350.000000 + DamageRadius=2000.000000 + MomentumTransfer=200000.000000 + MyDamageType=Class'XWeapons.DamTypeRedeemer' + LightType=LT_Steady + LightEffect=LE_QuadraticNonIncidence + LightHue=28 + LightBrightness=255.000000 + LightRadius=6.000000 + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTRedeemerMissile' + bDynamicLight=True + bNetTemporary=False + AmbientSound=Sound'UT2341Weapons_Sounds.Redeemer.WarFly' + LifeSpan=20.000000 + DrawScale=0.300000 + AmbientGlow=96 + bUnlit=False + SoundVolume=255 + SoundRadius=100.000000 + TransientSoundVolume=1.000000 + TransientSoundRadius=5000.000000 + CollisionRadius=24.000000 + CollisionHeight=12.000000 + bProjTarget=True + bFixedRotationDir=True + RotationRate=(Roll=50000) + DesiredRotation=(Roll=30000) + ForceType=FT_DragAlong + ForceRadius=100.000000 + ForceScale=5.000000 +} diff --git a/Sources/Classes/UT2341RedeemerWarhead.uc b/Sources/Classes/UT2341RedeemerWarhead.uc new file mode 100644 index 0000000..4f28e41 --- /dev/null +++ b/Sources/Classes/UT2341RedeemerWarhead.uc @@ -0,0 +1,122 @@ +class UT2341RedeemerWarhead extends RedeemerWarhead; + +#EXEC OBJ LOAD FILE=2K4Hud.utx + + +simulated function PostBeginPlay() +{ + local vector Dir; + + Dir = Vector(Rotation); + Velocity = AirSpeed * Dir; + Acceleration = Velocity; + + if ( Level.NetMode != NM_DedicatedServer) + { + SmokeTrail = Spawn(class'RedeemerTrail',self,,Location - 13 * Dir); + SmokeTrail.SetBase(self); + } +} + +simulated function PostNetBeginPlay() +{ + Super(Pawn).PostNetBeginPlay(); + + if ( PlayerController(Controller) != None ) + { + Controller.SetRotation(Rotation); + PlayerController(Controller).SetViewTarget(self); + Controller.GotoState(LandMovementState); + PlayOwnedSound(Sound'UT2341Weapons_Sounds.Redeemer.WarheadShot',SLOT_Interact,1.0); + } +} +function BlowUp(vector HitLocation) +{ + local Emitter E; + + if ( Role == ROLE_Authority ) + { + bHidden = true; + E = Spawn(class'FX_RedeemerExplosion',,, HitLocation - 100 * Normal(Velocity), Rot(0,16384,0)); + if ( Level.NetMode == NM_DedicatedServer ) + { + E.LifeSpan = 0.7; + } + GotoState('Dying'); + } +} + +state Dying +{ +ignores Trigger, Bump, HitWall, HeadVolumeChange, PhysicsVolumeChange, Falling, BreathTimer; + + function Fire( optional float F ) {} + function BlowUp(vector HitLocation) {} + function ServerBlowUp() {} + function Timer() {} + function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, + Vector momentum, class damageType) {} + + function BeginState() + { + bHidden = true; + bStaticScreen = true; + SetPhysics(PHYS_None); + SetCollision(false,false,false); + //Spawn(class'IonCore',,, Location, Rotation); + if ( SmokeTrail != None ) + SmokeTrail.Destroy(); + ShakeView(); + } + + function ShakeView() + { + local Controller C; + local PlayerController PC; + local float Dist, Scale; + + for ( C=Level.ControllerList; C!=None; C=C.NextController ) + { + PC = PlayerController(C); + if ( PC != None && PC.ViewTarget != None ) + { + Dist = VSize(Location - PC.ViewTarget.Location); + if ( Dist < DamageRadius * 2.0) + { + if (Dist < DamageRadius) + Scale = 1.0; + else + Scale = (DamageRadius*2.0 - Dist) / (DamageRadius); + C.ShakeView(ShakeRotMag*Scale, ShakeRotRate, ShakeRotTime, ShakeOffsetMag*Scale, ShakeOffsetRate, ShakeOffsetTime); + } + } + } + } + +Begin: + Instigator = self; + PlaySound(sound'UT2341Weapons_Sounds.Redeemer.WarExplo'); + HurtRadius(Damage, DamageRadius*0.125, MyDamageType, MomentumTransfer, Location); + Sleep(0.5); + HurtRadius(Damage, DamageRadius*0.300, MyDamageType, MomentumTransfer, Location); + Sleep(0.2); + HurtRadius(Damage, DamageRadius*0.475, MyDamageType, MomentumTransfer, Location); + Sleep(0.2); + RelinquishController(); + HurtRadius(Damage, DamageRadius*0.650, MyDamageType, MomentumTransfer, Location); + Sleep(0.2); + HurtRadius(Damage, DamageRadius*0.825, MyDamageType, MomentumTransfer, Location); + Sleep(0.2); + HurtRadius(Damage, DamageRadius*1.000, MyDamageType, MomentumTransfer, Location); + Destroy(); +} + +defaultproperties +{ + Damage=350.000000 + AirSpeed=670.000000 + AccelRate=1500.000000 + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTRedeemerMissile' + AmbientSound=Sound'UT2341Weapons_Sounds.Redeemer.WarFly' + DrawScale=0.300000 +} diff --git a/Sources/Classes/UT2341Ripper.uc b/Sources/Classes/UT2341Ripper.uc new file mode 100644 index 0000000..a6d567d --- /dev/null +++ b/Sources/Classes/UT2341Ripper.uc @@ -0,0 +1,78 @@ +class UT2341Ripper extends Weapon + config(user); + +#EXEC OBJ LOAD FILE=InterfaceContent.utx + +// AI Interface +function float GetAIRating() +{ + local Bot B; + + B = Bot(Owner); + + if ( B != None && B.Enemy != None ) + { + if ( B.Location.Z > B.Enemy.Location.Z + 140 ) + { + return (AIRating + 0.25); + } + else if ( B.Enemy.Location.Z > B.Location.Z + 160 ) + return (AIRating - 0.07); + } + return (AIRating + FRand() * 0.05); +} + +/* BestMode() +choose between regular or alt-fire +*/ +function byte BestMode() +{ + local Bot B; + + B = Bot(Owner); + if ( B != None && ((B.Enemy == None ) || (B.Enemy.Location.Z < B.Location.Z - 60) || (FRand() < 0.5)) ) + return 1; + return 0; +} + +function float SuggestAttackStyle() +{ + return -0.2; +} + +function float SuggestDefenseStyle() +{ + return -0.2; +} + +defaultproperties +{ + FireModeClass(0)=Class'UT2341WeaponsReducedv1a.UT2341RipperFire' + FireModeClass(1)=Class'UT2341WeaponsReducedv1a.UT2341RipperAltFire' + PutDownAnim="PutDown" + SelectSound=Sound'UT2341Weapons_Sounds.Ripper.Beam' + SelectForce="SwitchToFlakCannon" + AIRating=0.550000 + CurrentRating=0.550000 + Description="Classification: Ballistic Blade Launcher||Primary Fire: Razor sharp titanium disks are launched at a medium rate of speed. Shots will ricochet off of any surfaces.||Secondary Fire: Explosive disks are launched at a slow rate of fire.||Techniques: Aim for the necks of your opponents." + EffectOffset=(X=100.000000,Y=32.000000,Z=-20.000000) + DisplayFOV=80.000000 + Priority=4 + HudColor=(B=255,G=64,R=64) + SmallViewOffset=(Y=-1.000000,Z=-12.000000) + CenteredOffsetY=-8.000000 + CustomCrosshair=7 + CustomCrossHairColor=(G=0,R=0) + CustomCrossHairScale=1.333000 + CustomCrossHairTextureName="Crosshairs.Hud.Crosshair_Triad1" + InventoryGroup=6 + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341RipperPickup' + PlayerViewOffset=(Y=-1.000000,Z=-12.000000) + BobDamping=2.200000 + AttachmentClass=Class'UT2341WeaponsReducedv1a.UT2341RipperAttachment' + IconMaterial=Texture'UT2341Weapons_Tex.Icons.Icon_Ripper' + IconCoords=(X2=128,Y2=32) + ItemName="Ripper" + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTRipperFP' + DrawScale=2.000000 +} diff --git a/Sources/Classes/UT2341RipperAltFire.uc b/Sources/Classes/UT2341RipperAltFire.uc new file mode 100644 index 0000000..d38af11 --- /dev/null +++ b/Sources/Classes/UT2341RipperAltFire.uc @@ -0,0 +1,24 @@ +class UT2341RipperAltFire extends ProjectileFire; + +function DrawMuzzleFlash(Canvas Canvas) +{ +} + +function float MaxRange() +{ + return 5000; +} + +defaultproperties +{ + ProjSpawnOffset=(X=20.000000,Y=9.000000,Z=-6.000000) + FireAnim="FireAlt" + FireEndAnim= + FireSound=Sound'UT2341Weapons_Sounds.Ripper.RazorAlt' + FireForce="BioRifleFire" + FireRate=0.720000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341RipperAmmo' + AmmoPerFire=1 + ProjectileClass=Class'UT2341WeaponsReducedv1a.UT2341RipperAltProjectile' + BotRefireRate=0.830000 +} diff --git a/Sources/Classes/UT2341RipperAltProjectile.uc b/Sources/Classes/UT2341RipperAltProjectile.uc new file mode 100644 index 0000000..8c7e674 --- /dev/null +++ b/Sources/Classes/UT2341RipperAltProjectile.uc @@ -0,0 +1,97 @@ +class UT2341RipperAltProjectile extends Projectile; + +#exec OBJ LOAD File=UT2341Weapons_Sounds.uax + +var Emitter Trail; +var bool bCanHitOwner; + +simulated function PostBeginPlay() +{ + Velocity = Vector(Rotation) * (Speed); + + SetRotation(Rotator(Velocity)); + + Super.PostBeginPlay(); + + if ( Level.NetMode != NM_DedicatedServer ) + { + Trail = Spawn(class'FX_RipperProjTrail',self,, Location,Rotation); + Trail.SetBase(self); + } + + SetTimer(0.2, false); + + PlayAnim('Explosive', 1, 0, 0); + FreezeAnimAt(0.0); +} + +simulated function Timer() +{ + bCanHitOwner=True; +} + +simulated function ProcessTouch (Actor Other, vector HitLocation) +{ + if (Other == None || (!bCanHitOwner && (Other == Instigator || Other == Owner))) + return; + + if ( (Other != instigator) && (!Other.IsA('Projectile') || Other.bProjTarget) ) + Explode(HitLocation, vector(rotation)*-1 ); +} + +function BlowUp(vector HitLocation) +{ + HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, HitLocation ); + MakeNoise(1.0); +} + +simulated function Explode(vector HitLocation, vector HitNormal) +{ + local PlayerController PC; + + PlaySound(Sound'UT2341Weapons_Sounds.General.Expl03',,2.5*TransientSoundVolume); + if ( EffectIsRelevant(Location,false) ) + { + Spawn(class'FX_RipperExplosion',,,HitLocation + HitNormal*20,rotator(HitNormal)); + PC = Level.GetLocalPlayerController(); + if ( (PC.ViewTarget != None) && VSize(PC.ViewTarget.Location - Location) < 5000 ) + Spawn(class'ExplosionCrap',,, HitLocation + HitNormal*20, rotator(HitNormal)); +// if ( (ExplosionDecal != None) && (Level.NetMode != NM_DedicatedServer) ) +// Spawn(ExplosionDecal,self,,Location, rotator(-HitNormal)); + } + + BlowUp(HitLocation); + Destroy(); +} + +simulated function Destroyed() +{ + if (Trail !=None) + Trail.Destroy(); + Super.Destroyed(); +} + +defaultproperties +{ + Speed=1540.000000 + MaxSpeed=1300.000000 + Damage=51.000000 + DamageRadius=210.000000 + MomentumTransfer=87000.000000 + MyDamageType=Class'UT2341WeaponsReducedv1a.DamType_RipperBlade' + LightType=LT_Steady + LightEffect=LE_NonIncidence + LightHue=23 + LightBrightness=255.000000 + LightRadius=3.000000 + bDynamicLight=True + AmbientSound=Sound'UT2341Weapons_Sounds.Ripper.RazorHum' + LifeSpan=6.000000 + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTRipperDisk' + DrawScale=5.000000 + AmbientGlow=128 + Style=STY_Alpha + SoundVolume=255 + SoundPitch=200 + SoundRadius=12.000000 +} diff --git a/Sources/Classes/UT2341RipperAmmo.uc b/Sources/Classes/UT2341RipperAmmo.uc new file mode 100644 index 0000000..d1288f1 --- /dev/null +++ b/Sources/Classes/UT2341RipperAmmo.uc @@ -0,0 +1,13 @@ +class UT2341RipperAmmo extends Ammunition; + +#EXEC OBJ LOAD FILE=InterfaceContent.utx + +defaultproperties +{ + MaxAmmo=75 + InitialAmount=15 + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341RipperAmmoPickup' + IconMaterial=Texture'HUDContent.Generic.HUD' + IconCoords=(X1=338,Y1=40,X2=393,Y2=79) + ItemName="Razorblades" +} diff --git a/Sources/Classes/UT2341RipperAmmoPickup.uc b/Sources/Classes/UT2341RipperAmmoPickup.uc new file mode 100644 index 0000000..d9ea977 --- /dev/null +++ b/Sources/Classes/UT2341RipperAmmoPickup.uc @@ -0,0 +1,20 @@ +class UT2341RipperAmmoPickup extends UTAmmoPickup; + +function RespawnEffect() +{ + spawn(class'FX_PickupRespawn'); +} + +defaultproperties +{ + AmmoAmount=25 + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341RipperAmmo' + PickupMessage="You picked up razor blades." + PickupSound=Sound'UT2341Weapons_Sounds.General.AmmoSnd' + PickupForce="MinigunAmmoPickup" + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTRipperAmmo' + PrePivot=(Z=13.000000) + AmbientGlow=64 + CollisionHeight=12.750000 +} diff --git a/Sources/Classes/UT2341RipperAttachment.uc b/Sources/Classes/UT2341RipperAttachment.uc new file mode 100644 index 0000000..d826342 --- /dev/null +++ b/Sources/Classes/UT2341RipperAttachment.uc @@ -0,0 +1,8 @@ +class UT2341RipperAttachment extends xWeaponAttachment; + +defaultproperties +{ + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTRipper3rd' + RelativeLocation=(X=5.000000,Z=6.000000) + DrawScale=0.300000 +} diff --git a/Sources/Classes/UT2341RipperFire.uc b/Sources/Classes/UT2341RipperFire.uc new file mode 100644 index 0000000..b2b89c0 --- /dev/null +++ b/Sources/Classes/UT2341RipperFire.uc @@ -0,0 +1,24 @@ +class UT2341RipperFire extends ProjectileFire; + +function DrawMuzzleFlash(Canvas Canvas) +{ +} + +function float MaxRange() +{ + return 5000; +} + +defaultproperties +{ + ProjSpawnOffset=(X=20.000000,Y=9.000000,Z=-6.000000) + FireEndAnim= + FireAnimRate=1.200000 + FireSound=Sound'UT2341Weapons_Sounds.Ripper.StartBlade' + FireForce="BioRifleFire" + FireRate=0.385000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341RipperAmmo' + AmmoPerFire=1 + ProjectileClass=Class'UT2341WeaponsReducedv1a.UT2341RipperProjectile' + BotRefireRate=0.800000 +} diff --git a/Sources/Classes/UT2341RipperPickup.uc b/Sources/Classes/UT2341RipperPickup.uc new file mode 100644 index 0000000..9235034 --- /dev/null +++ b/Sources/Classes/UT2341RipperPickup.uc @@ -0,0 +1,36 @@ +//============================================================================= +// Minigun. +//============================================================================= +class UT2341RipperPickup extends UTWeaponPickup; + +static function StaticPrecache(LevelInfo L) +{ + L.AddPrecacheMaterial(Texture'XEffects.ShellCasingTex'); + L.AddPrecacheMaterial(Texture'AW-2004Explosions.Part_explode2s'); + L.AddPrecacheMaterial(Texture'AW-2004Particles.TracerShot'); + L.AddPrecacheStaticMesh(StaticMesh'UT2341Weapons_SM.UTRipper'); +} + +simulated function UpdatePrecacheMaterials() +{ + Level.AddPrecacheMaterial(Texture'XEffects.ShellCasingTex'); + Level.AddPrecacheMaterial(Texture'AW-2004Explosions.Part_explode2s'); + Level.AddPrecacheMaterial(Texture'AW-2004Particles.TracerShot'); + + super.UpdatePrecacheMaterials(); +} + +defaultproperties +{ + MaxDesireability=0.730000 + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341Ripper' + PickupMessage="You got the Ripper." + PickupSound=Sound'UT2341Weapons_Sounds.General.WeaponPickup' + PickupForce="MinigunPickup" + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTRipper' + DrawScale=0.240000 + PrePivot=(Z=50.000000) + AmbientGlow=64 + RotationRate=(Yaw=5000) +} diff --git a/Sources/Classes/UT2341RipperProjectile.uc b/Sources/Classes/UT2341RipperProjectile.uc new file mode 100644 index 0000000..31fa24b --- /dev/null +++ b/Sources/Classes/UT2341RipperProjectile.uc @@ -0,0 +1,137 @@ +class UT2341RipperProjectile extends Projectile; + +var Emitter Trail; +var bool bCanHitOwner; +var byte Bounces; +var sound WallImpactSound, PlayerImpactSound; + +simulated function PostBeginPlay() +{ + Velocity = Vector(Rotation) * (Speed); + + SetRotation(Rotator(Velocity)); + + Super.PostBeginPlay(); + + if ( Level.NetMode != NM_DedicatedServer ) + { + Trail = Spawn(class'FX_RipperProjTrail',self,, Location); + Trail.SetBase(self); + } + + SetTimer(0.2, false); + + LoopAnim('Cutting', 1, 0.1, 0); +} + +simulated function Timer() +{ + bCanHitOwner=True; +} + +simulated function ProcessTouch (Actor Other, vector HitLocation) +{ + if (Other == None || (!bCanHitOwner && (Other == Instigator || Other == Owner))) + return; + + if (xPawn(Other) != None) + PlaySound(PlayerImpactSound); + + if ( Role == ROLE_Authority ) + { + if ( Instigator == None || Instigator.Controller == None ) + Other.SetDelayedDamageInstigatorController( InstigatorController ); + + if (xPawn(Other) != None && CheckHeadshot(xPawn(Other), HitLocation)) + Other.TakeDamage( Damage * 3.5, Instigator, HitLocation, MomentumTransfer * vector(Rotation), class'DamType_RipperBladeHead' ); + else Other.TakeDamage( Damage, Instigator, HitLocation, MomentumTransfer * vector(Rotation), MyDamageType ); + } + Destroy(); +} + +function bool CheckHeadshot(xPawn Victim, vector HitLocation) +{ + local String Bone; + local float BoneDist; + local Vector ClosestLocation, BoneTestLocation, temp; + + //Find a point on the victim's Z axis at the same height as the HitLocation. + ClosestLocation = Victim.Location; + ClosestLocation.Z += (HitLocation - Victim.Location).Z; + + //Extend the hit along the projectile's Velocity to a point where it is closest to the victim's Z axis. + temp = Normal(Velocity); + temp *= VSize(ClosestLocation - HitLocation); + BoneTestLocation = temp; + BoneTestLocation *= normal(ClosestLocation - HitLocation) dot normal(temp); + BoneTestLocation += HitLocation; + + Bone = string(Victim.GetClosestBone(BoneTestLocation, Normal(Velocity), BoneDist, 'head', 10)); + if (InStr(Bone, "head") > -1) + return true; + return false; +} + +simulated function HitWall( vector HitNormal, actor Wall ) +{ + if ( !Wall.bStatic && !Wall.bWorldGeometry + && ((Mover(Wall) == None) || Mover(Wall).bDamageTriggered) ) + { + if ( Level.NetMode != NM_Client ) + { + if ( Instigator == None || Instigator.Controller == None ) + Wall.SetDelayedDamageInstigatorController( InstigatorController ); + Wall.TakeDamage( Damage, instigator, Location, MomentumTransfer * Normal(Velocity), MyDamageType); + } + Destroy(); + return; + } + + if (Bounces > 0) + { + if ( !Level.bDropDetail && (FRand() < 0.4) ) + Playsound(WallImpactSound); + + Velocity = 1 * (Velocity - 2.0*HitNormal*(Velocity dot HitNormal)); + SetRotation(Rotator(Velocity)); + Bounces = Bounces - 1; + return; + } + Destroy(); +} + +simulated function Destroyed() +{ + if (Trail !=None) + Trail.Destroy(); + Super.Destroyed(); +} + +/* +the Ripper primary has been heavily improved due to its weakness in the older game. +speed values from 99 are 1300/1200, here it is 2000/1800 +*/ + +defaultproperties +{ + Bounces=5 + WallImpactSound=Sound'UT2341Weapons_Sounds.Ripper.BladeHit' + PlayerImpactSound=Sound'UT2341Weapons_Sounds.Ripper.BladeThunk' + Speed=2000.000000 + MaxSpeed=1800.000000 + Damage=45.000000 + MomentumTransfer=15000.000000 + MyDamageType=Class'UT2341WeaponsReducedv1a.DamType_RipperBlade' + AmbientSound=Sound'UT2341Weapons_Sounds.Ripper.RazorHum' + LifeSpan=6.000000 + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTRipperDisk' + DrawScale=5.000000 + AmbientGlow=254 + Style=STY_Alpha + SoundVolume=255 + SoundPitch=200 + SoundRadius=16.000000 + CollisionRadius=2.000000 + CollisionHeight=1.000000 + bBounce=True +} diff --git a/Sources/Classes/UT2341RocketAmmo.uc b/Sources/Classes/UT2341RocketAmmo.uc new file mode 100644 index 0000000..5b6e5cc --- /dev/null +++ b/Sources/Classes/UT2341RocketAmmo.uc @@ -0,0 +1,13 @@ +class UT2341RocketAmmo extends Ammunition; + +#EXEC OBJ LOAD FILE=InterfaceContent.utx + +defaultproperties +{ + MaxAmmo=48 + InitialAmount=6 + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341RocketAmmoPickup' + IconMaterial=Texture'HUDContent.Generic.HUD' + IconCoords=(X1=458,Y1=34,X2=511,Y2=78) + ItemName="Rockets" +} diff --git a/Sources/Classes/UT2341RocketAmmoPickup.uc b/Sources/Classes/UT2341RocketAmmoPickup.uc new file mode 100644 index 0000000..3e1b6e2 --- /dev/null +++ b/Sources/Classes/UT2341RocketAmmoPickup.uc @@ -0,0 +1,22 @@ +class UT2341RocketAmmoPickup extends UTAmmoPickup; + +function RespawnEffect() +{ + spawn(class'FX_PickupRespawn'); +} + +defaultproperties +{ + AmmoAmount=12 + MaxDesireability=0.300000 + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341RocketAmmo' + PickupMessage="You picked up a rocket can." + PickupSound=Sound'UT2341Weapons_Sounds.General.AmmoSnd' + PickupForce="RocketAmmoPickup" + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTRocketPack' + DrawScale=0.100000 + PrePivot=(Z=140.000000) + AmbientGlow=64 + CollisionHeight=13.500000 +} diff --git a/Sources/Classes/UT2341RocketAttachment.uc b/Sources/Classes/UT2341RocketAttachment.uc new file mode 100644 index 0000000..7a2c8f0 --- /dev/null +++ b/Sources/Classes/UT2341RocketAttachment.uc @@ -0,0 +1,42 @@ +class UT2341RocketAttachment extends xWeaponAttachment; + +var class MuzFlashClass; +var xEmitter MuzFlash; + +simulated function Destroyed() +{ + if (MuzFlash != None) + MuzFlash.Destroy(); + + Super.Destroyed(); +} + +simulated event ThirdPersonEffects() +{ + local rotator r; + + if ( Level.NetMode != NM_DedicatedServer && FlashCount > 0 ) + { + if (MuzFlash == None) + { + MuzFlash = Spawn(MuzFlashClass); + if ( MuzFlash != None ) + AttachToBone(MuzFlash, 'tip'); + } + if (MuzFlash != None) + { + MuzFlash.mStartParticles++; + r.Roll = Rand(65536); + SetBoneRotation('Bone_Flash', r, 0, 1.f); + } + } + + Super.ThirdPersonEffects(); +} + +defaultproperties +{ + MuzFlashClass=Class'XEffects.RocketMuzFlash3rd' + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTRocketLauncher3rd' + DrawScale=0.120000 +} diff --git a/Sources/Classes/UT2341RocketFire.uc b/Sources/Classes/UT2341RocketFire.uc new file mode 100644 index 0000000..d53d6dd --- /dev/null +++ b/Sources/Classes/UT2341RocketFire.uc @@ -0,0 +1,192 @@ +//=========================================================================== +// UT2341 Rocket Fire. +// +// Standard RL fire code, cleaned up a bit and with support for any given max number of rockets. +//=========================================================================== +class UT2341RocketFire extends ProjectileFire; + +var() float TightSpread, LooseSpread; +var int MaxLoad; +var byte StartRocket; + +simulated function bool AllowFire() +{ + return Super.AllowFire(); +} + +simulated function PreBeginPlay() +{ + MaxHoldTime = FireRate * (MaxLoad - 1) + 0.5; +} + +event ModeHoldFire() +{ + StartRocket = UT2341RocketLauncher(Weapon).NextBarrel - 1; + if (StartRocket > 5) + StartRocket = 5; + if (Instigator.IsLocallyControlled()) + PlayStartHold(); + else + ServerPlayLoading(); +} + +simulated function ServerPlayLoading() +{ + UT2341RocketLauncher(Weapon).PlayOwnedSound(Sound'UT2341Weapons_Sounds.RocketLauncher.Loading', SLOT_None,,,,,false); +} + +function PlayFireEnd() +{ +} + +function PlayStartHold() +{ + //Loading, empty + UT2341RocketLauncher(Weapon).PlayLoad(true); +} + +function PlayFiring() +{ + if (Load > 4.0) + FireAnim = 'Fire3'; + else if (Load > 1.0) + FireAnim = 'Fire2'; + else + FireAnim = 'Fire'; + Super.PlayFiring(); + //If on the max load, load new rocket - because the weapon won't be in the process of loading + UT2341RocketLauncher(Weapon).PlayLoad((Load == MaxLoad)); + UT2341RocketLauncher(Weapon).EmptyBarrels(StartRocket, Load); + Weapon.OutOfAmmo(); +} + +event ModeDoFire() +{ + if ( UT2341RocketLauncher(Weapon).bTightSpread || ((Bot(Instigator.Controller) != None) && (FRand() < 0.65)) ) + { + Spread = TightSpread; + SpreadStyle = SS_Ring; + } + else + { + SpreadStyle = SS_Line; + Spread = LooseSpread; + } + UT2341RocketLauncher(Weapon).bTightSpread = false; + Super.ModeDoFire(); + NextFireTime = FMax(NextFireTime, Level.TimeSeconds + FireRate); +} + +function DoFireEffect() +{ + local Vector StartProj, StartTrace, X,Y,Z; + local Rotator Aim; + local Vector HitLocation, HitNormal,FireLocation; + local Actor Other; + local int p,SpawnCount; + + if ( (SpreadStyle == SS_Line) || (Load < 2) ) + { + Super.DoFireEffect(); + return; + } + + Instigator.MakeNoise(1.0); + Weapon.GetViewAxes(X,Y,Z); + + StartTrace = Instigator.Location + Instigator.EyePosition(); + StartProj = StartTrace + X*ProjSpawnOffset.X + Z*ProjSpawnOffset.Z; + if ( !Weapon.WeaponCentered() ) + StartProj = StartProj + Weapon.Hand * Y*ProjSpawnOffset.Y; + + // 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); + + SpawnCount = Max(1, int(Load)); + + for ( p=0; p 0.0 && Load >= Weapon.AmmoAmount(ThisModeNum) && !bNowWaiting) + { + bIsFiring = false; + //NextFireTime=Level.TimeSeconds + FireRate; + } + + Super.ModeTick(dt); + + if (Load > 0 && Load < MaxLoad) + { + //Rewrite this for multi-load. + if (HoldTime >= FireRate * Load) + { + if (Load < (MaxLoad-1)) + { + if (Instigator.IsLocallyControlled()) + UT2341RocketLauncher(Weapon).PlayLoad(true); + else + ServerPlayLoading(); + } + Load = Load + 1.0; + } + } +} + +function InitEffects() +{ + Super.InitEffects(); + if ( FlashEmitter != None ) + Weapon.AttachToBone(FlashEmitter, 'tip'); +} + +function Projectile SpawnProjectile(Vector Start, Rotator Dir) +{ + local Projectile p; + + p = UT2341RocketLauncher(Weapon).SpawnProjectile(Start, Dir); + if ( P != None ) + p.Damage *= DamageAtten; + return p; +} + +defaultproperties +{ + TightSpread=300.000000 + LooseSpread=1000.000000 + MaxLoad=6 + ProjSpawnOffset=(X=25.000000,Y=6.000000,Z=-6.000000) + bSplashDamage=True + bSplashJump=True + bRecommendSplashDamage=True + bFireOnRelease=True + MaxHoldTime=2.300000 + FireAnim="AltFire" + TweenTime=0.000000 + FireSound=Sound'UT2341Weapons_Sounds.RocketLauncher.Ignite' + FireForce="RocketLauncherFire" + FireRate=0.950000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341RocketAmmo' + AmmoPerFire=1 + ShakeRotTime=2.000000 + ShakeOffsetMag=(X=-20.000000) + ShakeOffsetRate=(X=-1000.000000) + ShakeOffsetTime=2.000000 + ProjectileClass=Class'UT2341WeaponsReducedv1a.UT2341RocketProj' + BotRefireRate=0.600000 + WarnTargetPct=0.900000 + SpreadStyle=SS_Line +} diff --git a/Sources/Classes/UT2341RocketGrenade.uc b/Sources/Classes/UT2341RocketGrenade.uc new file mode 100644 index 0000000..d4a941b --- /dev/null +++ b/Sources/Classes/UT2341RocketGrenade.uc @@ -0,0 +1,174 @@ +//============================================================================= +// Grenade. +//============================================================================= +class UT2341RocketGrenade extends Projectile; + +var float ExplodeTimer; +var bool bCanHitOwner, bHitWater; +var xEmitter Trail; +var() float DampenFactor, DampenFactorParallel; +var class HitEffectClass; +var float LastSparkTime; +var bool bTimerSet; + +replication +{ + reliable if (Role==ROLE_Authority) + ExplodeTimer; +} + +simulated function Destroyed() +{ + if ( Trail != None ) + Trail.mRegen = false; // stop the emitter from regenerating + Super.Destroyed(); +} + +simulated function PostBeginPlay() +{ + local PlayerController PC; + local Vector X, Y, Z; + + Super.PostBeginPlay(); + + if ( Level.NetMode != NM_DedicatedServer) + { + PC = Level.GetLocalPlayerController(); + if ( (PC.ViewTarget != None) && VSize(PC.ViewTarget.Location - Location) < 5500 ) + Trail = Spawn(class'GrenadeSmokeTrail', self,, Location, Rotation); + RandSpin(25000); + } + + if ( Role == ROLE_Authority ) + { + GetAxes(Instigator.GetViewRotation(),X,Y,Z); + Velocity = X * (Instigator.Velocity Dot X)*0.4 + Vector(Rotation) * (Speed + FRand() * 115); + Velocity.Z += 240; + MaxSpeed = 1150; + bCanHitOwner = false; + if (Instigator.HeadVolume.bWaterVolume) + { + bHitWater = true; + Velocity = 0.6*Velocity; + } + } + + PlayAnim('Grenade'); +} + +simulated function PostNetBeginPlay() +{ + SetTimer(2.5+FRand()*0.5,false); +} + +simulated function Timer() +{ + Explode(Location, vect(0,0,1)); +} + +simulated function Landed( vector HitNormal ) +{ + HitWall( HitNormal, None ); +} + +simulated function ProcessTouch( actor Other, vector HitLocation ) +{ + if ( !Other.bWorldGeometry && (Other != Instigator || bCanHitOwner) ) + { + Explode(HitLocation, Normal(HitLocation-Other.Location)); + } +} + +simulated function HitWall( vector HitNormal, actor Wall ) +{ + local Vector VNorm; + local PlayerController PC; + + if ( (Pawn(Wall) != None) || (GameObjective(Wall) != None) ) + { + Explode(Location, HitNormal); + return; + } + + // 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 ( Trail != None ) + Trail.mRegen = false; // stop the emitter from regenerating + } + else + { + if ( (Level.NetMode != NM_DedicatedServer) && (Speed > 250) ) + 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; + } + } +} + +simulated function BlowUp(vector HitLocation) +{ + DelayedHurtRadius(Damage,DamageRadius, MyDamageType, MomentumTransfer, HitLocation ); + if ( Role == ROLE_Authority ) + MakeNoise(1.0); +} + +simulated function Explode(vector HitLocation, vector HitNormal) +{ + BlowUp(HitLocation); + PlaySound(sound'UT2341Weapons_Sounds.General.Explo1',,2.5*TransientSoundVolume); + if ( EffectIsRelevant(Location,false) ) + { + Spawn(class'FX_RocketExplosion',,, HitLocation + (HitNormal * 8), rotator(vect(0,0,1))); + Spawn(ExplosionDecal,self,,HitLocation, rotator(-HitNormal)); + } + Destroy(); +} + +defaultproperties +{ + DampenFactor=0.500000 + DampenFactorParallel=0.800000 + HitEffectClass=Class'XEffects.WallSparks' + Speed=690.000000 + MaxSpeed=1150.000000 + TossZ=0.000000 + Damage=120.000000 + MomentumTransfer=57000.000000 + MyDamageType=Class'UT2341WeaponsReducedv1a.DamType_Rocket' + ImpactSound=Sound'UT2341Weapons_Sounds.RocketLauncher.GrenadeFloor' + ExplosionDecal=Class'XEffects.RocketMark' + Physics=PHYS_Falling + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTRocket' + AmbientGlow=64 + FluidSurfaceShootStrengthMod=3.000000 + bBounce=True + bFixedRotationDir=True + DesiredRotation=(Pitch=12000,Yaw=5666,Roll=2334) +} diff --git a/Sources/Classes/UT2341RocketGrenadeFire.uc b/Sources/Classes/UT2341RocketGrenadeFire.uc new file mode 100644 index 0000000..9e9dce7 --- /dev/null +++ b/Sources/Classes/UT2341RocketGrenadeFire.uc @@ -0,0 +1,169 @@ +//=========================================================================== +// UT2341 Rocket Fire. +// +// Standard RL fire code, cleaned up a bit and with support for any given max number of rockets. +//=========================================================================== +class UT2341RocketGrenadeFire extends ProjectileFire; + +var int MaxLoad; +var byte StartRocket; + +simulated function bool AllowFire() +{ + return Super.AllowFire(); +} + +simulated function PreBeginPlay() +{ + MaxHoldTime = FireRate * (MaxLoad - 1) + 0.5; +} + +event ModeHoldFire() +{ + StartRocket = UT2341RocketLauncher(Weapon).NextBarrel - 1; + if (StartRocket > 5) + StartRocket = 5; + if (Instigator.IsLocallyControlled()) + PlayStartHold(); + else + ServerPlayLoading(); +} + +simulated function ServerPlayLoading() +{ + UT2341RocketLauncher(Weapon).PlayOwnedSound(Sound'UT2341Weapons_Sounds.RocketLauncher.Loading', SLOT_None,,,,,false); +} + +function PlayFireEnd() +{ +} + +function PlayStartHold() +{ + //Loading, empty + UT2341RocketLauncher(Weapon).PlayLoad(true); +} + +function PlayFiring() +{ + if (Load > 4.0) + FireAnim = 'Fire3'; + else if (Load > 1.0) + FireAnim = 'Fire2'; + else + FireAnim = 'Fire'; + Super.PlayFiring(); + //If on the max load, load new rocket - because the weapon won't be in the process of loading + UT2341RocketLauncher(Weapon).PlayLoad((Load == MaxLoad)); + UT2341RocketLauncher(Weapon).EmptyBarrels(StartRocket, Load); + Weapon.OutOfAmmo(); +} + +event ModeDoFire() +{ + UT2341RocketLauncher(Weapon).bTightSpread = false; + Super.ModeDoFire(); + NextFireTime = FMax(NextFireTime, Level.TimeSeconds + FireRate); +} + +function DoFireEffect() +{ + local Vector StartProj, StartTrace, X,Y,Z; + local Rotator Aim; + local Vector HitLocation, HitNormal,FireLocation; + local Actor Other; + local int p, SpawnCount; + + if ( (SpreadStyle == SS_Line) || (Load < 2) ) + { + Super.DoFireEffect(); + return; + } + + Instigator.MakeNoise(1.0); + Weapon.GetViewAxes(X,Y,Z); + + StartTrace = Instigator.Location + Instigator.EyePosition(); + StartProj = StartTrace + X*ProjSpawnOffset.X + Z*ProjSpawnOffset.Z; + if ( !Weapon.WeaponCentered() ) + StartProj = StartProj + Weapon.Hand * Y*ProjSpawnOffset.Y; + + // 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); + + SpawnCount = Max(1, int(Load)); + + for ( p=0; p 0.0 && Load >= Weapon.AmmoAmount(ThisModeNum) && !bNowWaiting) + { + bIsFiring = false; + } + + Super.ModeTick(dt); + + if (Load > 0 && Load < MaxLoad) + { + //Rewrite this for multi-load. + if (HoldTime >= FireRate * Load) + { + if (Load < (MaxLoad-1)) + { + if (Instigator.IsLocallyControlled()) + UT2341RocketLauncher(Weapon).PlayLoad(true); + else + ServerPlayLoading(); + } + Load = Load + 1.0; + } + } +} + +function InitEffects() +{ + Super.InitEffects(); + if ( FlashEmitter != None ) + Weapon.AttachToBone(FlashEmitter, 'tip'); +} + +defaultproperties +{ + MaxLoad=6 + ProjSpawnOffset=(X=25.000000,Y=6.000000,Z=-6.000000) + bSplashDamage=True + bSplashJump=True + bRecommendSplashDamage=True + bFireOnRelease=True + MaxHoldTime=2.300000 + FireAnim="AltFire" + TweenTime=0.000000 + FireSound=Sound'UT2341Weapons_Sounds.RocketLauncher.EightAltFire' + FireForce="RocketLauncherFire" + FireRate=0.950000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341RocketAmmo' + AmmoPerFire=1 + ShakeRotTime=2.000000 + ShakeOffsetMag=(X=-20.000000) + ShakeOffsetRate=(X=-1000.000000) + ShakeOffsetTime=2.000000 + ProjectileClass=Class'UT2341WeaponsReducedv1a.UT2341RocketGrenade' + BotRefireRate=0.600000 + WarnTargetPct=0.900000 + Spread=500.000000 + SpreadStyle=SS_Random +} diff --git a/Sources/Classes/UT2341RocketLauncher.uc b/Sources/Classes/UT2341RocketLauncher.uc new file mode 100644 index 0000000..3fb0475 --- /dev/null +++ b/Sources/Classes/UT2341RocketLauncher.uc @@ -0,0 +1,544 @@ +//============================================================================= +// RocketLaucher +//============================================================================= +class UT2341RocketLauncher extends Weapon + config(user); + +#EXEC OBJ LOAD FILE=InterfaceContent.utx + +const NUM_BARRELS = 3; +const BARREL_ROTATION_RATE = 2.95; + +var float BarrelRotation; +var float FinalRotation; +var bool bRotateBarrel; +var byte NextBarrel; +var float BarrelRotationRate, BarrelTransitionTime, LoadAnimRate; + +struct SBarrelInfo +{ + var Name BoneName; + var float DesiredBarrelRotation; +}; + +var array BarrelInfo; + +var Pawn SeekTarget; +var float LockTime, UnLockTime, SeekCheckTime; +var bool bLockedOn, bBreakLock; +var bool bTightSpread; +var() float SeekCheckFreq, SeekRange; +var() float LockRequiredTime, UnLockRequiredTime; +var() float LockAim; +var() Color CrosshairColor; +var() float CrosshairX, CrosshairY; + +replication +{ + reliable if (Role == ROLE_Authority && bNetOwner) + bLockedOn; + + reliable if (Role < ROLE_Authority) + ServerSetTightSpread, ServerClearTightSpread; +} + +function Tick(float dt) +{ + local Pawn Other; + local Vector StartTrace; + local Rotator Aim; + local float BestDist, BestAim; + + if (Instigator == None || Instigator.Weapon != self) + return; + + if ( Role < ROLE_Authority ) + return; + + if ( !Instigator.IsHumanControlled() ) + return; + + if (Level.TimeSeconds > SeekCheckTime) + { + if (bBreakLock) + { + bBreakLock = false; + bLockedOn = false; + SeekTarget = None; + } + + StartTrace = Instigator.Location + Instigator.EyePosition(); + Aim = Instigator.GetViewRotation(); + + BestAim = LockAim; + Other = Instigator.Controller.PickTarget(BestAim, BestDist, Vector(Aim), StartTrace, SeekRange); + + if ( CanLockOnTo(Other) ) + { + if (Other == SeekTarget) + { + LockTime += SeekCheckFreq; + if (!bLockedOn && LockTime >= LockRequiredTime) + { + bLockedOn = true; + PlayerController(Instigator.Controller).ClientPlaySound(Sound'UT2341Weapons_Sounds.RocketLauncher.SeekLock'); + } + } + else + { + SeekTarget = Other; + LockTime = 0.0; + } + UnLockTime = 0.0; + } + else + { + if (SeekTarget != None) + { + UnLockTime += SeekCheckFreq; + if (UnLockTime >= UnLockRequiredTime) + { + SeekTarget = None; + if (bLockedOn) + { + bLockedOn = false; + PlayerController(Instigator.Controller).ClientPlaySound(Sound'UT2341Weapons_Sounds.RocketLauncher.SeekLost'); + } + } + } + else + bLockedOn = false; + } + + SeekCheckTime = Level.TimeSeconds + SeekCheckFreq; + } +} + +function bool CanLockOnTo(Actor Other) +{ + local Pawn P; + + P = Pawn(Other); + + if (P == None || P == Instigator || !P.bProjTarget) + return false; + + if (!Level.Game.bTeamGame) + return true; + + if ( (Instigator.Controller != None) && Instigator.Controller.SameTeamAs(P.Controller) ) + return false; + + return ( (P.PlayerReplicationInfo == None) || (P.PlayerReplicationInfo.Team != Instigator.PlayerReplicationInfo.Team) ); +} + +simulated event RenderOverlays( Canvas Canvas ) +{ + if (bLockedOn) + { + Canvas.DrawColor = CrosshairColor; + Canvas.DrawColor.A = 255; + Canvas.Style = ERenderStyle.STY_Alpha; + + Canvas.SetPos(Canvas.SizeX*0.5-CrosshairX, Canvas.SizeY*0.5-CrosshairY); + Canvas.DrawTile(Texture'SniperArrows', CrosshairX*2.0, CrosshairY*2.0, 0.0, 0.0, Texture'SniperArrows'.USize, Texture'SniperArrows'.VSize); + } + + Super.RenderOverlays(Canvas); +} + +function Projectile SpawnProjectile(Vector Start, Rotator Dir) +{ + local UT2341RocketProj Rocket; + local UT2341SeekingRocketProj SeekingRocket; + local bot B; + + bBreakLock = true; + + // decide if bot should be locked on + B = Bot(Instigator.Controller); + if ( (B != None) && (B.Skill > 2 + 5 * FRand()) && (FRand() < 0.6) && (B.Target != None) + && (B.Target == B.Enemy) && (VSize(B.Enemy.Location - B.Pawn.Location) > 2000 + 2000 * FRand()) + && (Level.TimeSeconds - B.LastSeenTime < 0.4) && (Level.TimeSeconds - B.AcquireTime > 1.5) ) + { + bLockedOn = true; + SeekTarget = B.Enemy; + } + + if (bLockedOn && SeekTarget != None) + { + SeekingRocket = Spawn(class'UT2341SeekingRocketProj',,, Start, Dir); + SeekingRocket.Seeking = SeekTarget; + if ( B != None ) + { + //log("LOCKED"); + bLockedOn = false; + SeekTarget = None; + } + return SeekingRocket; + } + else + { + Rocket = Spawn(class'UT2341RocketProj',,, Start, Dir); + return Rocket; + } +} + +//=========================================================================== +// PlayIdle +// +// If in bringup state, doesn't tween (to prevent a swapping issue with the rockets) +//=========================================================================== +simulated function PlayIdle() +{ + if (ClientState == WS_BringUp) + LoopAnim(IdleAnim, IdleAnimRate, 0); + else LoopAnim(IdleAnim, IdleAnimRate, 0.25); +} + +//=========================================================================== +// PlayLoad +// +// If no rocket loaded, plunge (to load one) +//=========================================================================== +simulated function PlayLoad(bool bDoLoad) +{ + if (bDoLoad) + GotoState('AnimateLoad', 'Begin'); +} + +simulated function EmptyBarrels(byte pos, byte Shift) +{ + local int i; + + for (i=0; i < Shift; i++) + { + SetBoneScale(pos, 0, BarrelInfo[pos].BoneName); + pos++; + if (pos > 5) + pos = 0; + } +} + +simulated function AnimEnd(int Channel) +{ + if ( (Channel == 0) && (ClientState == WS_ReadyToFire) ) + { + PlayIdle(); + if ( (Role < ROLE_Authority) && !HasAmmo() ) + DoAutoSwitch(); //FIXME HACK + } + + if (Channel == 1) + { + SetBoneScale(NextBarrel, 1, BarrelInfo[NextBarrel].BoneName); + if (NextBarrel == 5) + NextBarrel = 0; + else NextBarrel++; + + //We need to move the Loader rocket back into position + FreezeAnimAt(0.0, 1); + } +} + +simulated function RotateBarrel() +{ + FinalRotation = BarrelInfo[NextBarrel].DesiredBarrelRotation; + if (FinalRotation > BarrelRotation) + BarrelRotation += 65535.0; + if (FinalRotation != BarrelRotation) + { + BarrelRotationRate = (BarrelRotation - FinalRotation) / BarrelTransitionTime; + bRotateBarrel = true; + } +} + +simulated function UpdateBarrel(float dt) +{ + local Rotator R; + + BarrelRotation -= dt * BarrelRotationRate; + if (BarrelRotation < FinalRotation) + { + BarrelRotation = FinalRotation; + bRotateBarrel = false; + } + + R.Roll = BarrelRotation; + SetBoneRotation('Bone_Barrels', R, 0, 1); +} + +simulated function Plunge() +{ + PlayAnim('load1', LoadAnimRate, 0.0, 1); +} + +simulated event ClientStartFire(int Mode) +{ + local int OtherMode; + + if ( Mode == 0 ) + OtherMode = 1; + + if ( UT2341RocketFire(FireMode[Mode]) != None ) + { + SetTightSpread(false); + + if ( FireMode[OtherMode].bIsFiring || FireMode[OtherMode].Load > 1 || (FireMode[OtherMode].NextFireTime > Level.TimeSeconds) ) + return; + } + else + { + if ( FireMode[OtherMode].bIsFiring || FireMode[OtherMode].Load > 1 || (FireMode[OtherMode].NextFireTime > Level.TimeSeconds) ) + { + if ( FireMode[OtherMode].Load > 0 ) + SetTightSpread(true); + return; + } + } + Super.ClientStartFire(Mode); +} + +simulated function bool StartFire(int Mode) +{ + local int OtherMode; + + if ( Mode == 0 ) + OtherMode = 1; + if ( FireMode[OtherMode].bIsFiring || (FireMode[OtherMode].NextFireTime > Level.TimeSeconds) ) + return false; + + return Super.StartFire(Mode); +} + +//=========================================================================== +// StopFire +// +// Dual hold fire modes do not seem to play nice without this. +// Seems to be a timing issue - the bug occurs if you hold 0, hold 1, release 0 then release 1. +// 0 and 1 will both fire on command - 1 should be delayed. +//=========================================================================== +simulated function StopFire(int Mode) +{ + FireMode[Mode^1].NextFireTime = Level.TimeSeconds + FireMode[Mode].FireRate; + Super.StopFire(Mode); +} + +simulated function SetTightSpread(bool bNew, optional bool bForce) +{ + if ( (bTightSpread != bNew) || bForce ) + { + bTightSpread = bNew; + if ( bTightSpread ) + ServerSetTightSpread(); + else + ServerClearTightSpread(); + } +} + +function ServerClearTightSpread() +{ + bTightSpread = false; +} + +function ServerSetTightSpread() +{ + bTightSpread = true; +} + + + +simulated function BringUp(optional Weapon PrevWeapon) +{ + local int i, CurrentBarrel; + + SetTightSpread(false,true); + if (Instigator.IsLocallyControlled()) + AnimBlendParams( 1, 1.0, 0.0, 0.0, 'RocketPack' ); + + if (NextBarrel == 0) + CurrentBarrel = 5; + else CurrentBarrel = NextBarrel-1; + SetBoneScale(CurrentBarrel, 1, BarrelInfo[CurrentBarrel].BoneName); + + i = NextBarrel; + + while (i != CurrentBarrel) + { + SetBoneScale(i, 0, BarrelInfo[i].BoneName); + if (i == 5) + i = 0; + else i++; + } + + Super.BringUp(PrevWeapon); +} + +exec function SetBarrelRotation(float desiredroll) +{ + local Rotator R; + + R.Roll = desiredroll; + SetBoneRotation('Bone_Barrels', R, 0, 1); +} + +simulated state AnimateLoad +{ + simulated function Tick(float dt) + { + if (bRotateBarrel) + UpdateBarrel(dt); + } + +Begin: + Sleep(0.15); + RotateBarrel(); + Sleep(0.07); + PlayOwnedSound(Sound'UT2341Weapons_Sounds.RocketLauncher.BarrelMove', SLOT_None,0.1,,,,false); + ClientPlayForceFeedback( "RocketLauncherLoad" ); // jdf + Sleep(0.28); + Plunge(); + PlayOwnedSound(Sound'UT2341Weapons_Sounds.RocketLauncher.Loading', SLOT_None,,,,,false); + ClientPlayForceFeedback( "RocketLauncherPlunger" ); // jdf + Sleep(0.29); + GotoState(''); +} + +// AI Interface +function float SuggestAttackStyle() +{ + local float EnemyDist; + + // recommend backing off if target is too close + EnemyDist = VSize(Instigator.Controller.Enemy.Location - Owner.Location); + if ( EnemyDist < 750 ) + { + if ( EnemyDist < 500 ) + return -1.5; + else + return -0.7; + } + else if ( EnemyDist > 1600 ) + return 0.5; + else + return -0.1; +} + +// tell bot how valuable this weapon would be to use, based on the bot's combat situation +// also suggest whether to use regular or alternate fire mode +function float GetAIRating() +{ + local Bot B; + local float EnemyDist, Rating, ZDiff; + local vector EnemyDir; + + B = Bot(Instigator.Controller); + if ( (B == None) || (B.Enemy == None) ) + return AIRating; + + // if standing on a lift, make sure not about to go around a corner and lose sight of target + // (don't want to blow up a rocket in bot's face) + if ( (Instigator.Base != None) && (Instigator.Base.Velocity != vect(0,0,0)) + && !B.CheckFutureSight(0.1) ) + return 0.1; + + EnemyDir = B.Enemy.Location - Instigator.Location; + EnemyDist = VSize(EnemyDir); + Rating = AIRating; + + // don't pick rocket launcher if enemy is too close + if ( EnemyDist < 360 ) + { + if ( Instigator.Weapon == self ) + { + // don't switch away from rocket launcher unless really bad tactical situation + if ( (EnemyDist > 250) || ((Instigator.Health < 50) && (Instigator.Health < B.Enemy.Health - 30)) ) + return Rating; + } + return 0.05 + EnemyDist * 0.001; + } + + // rockets are good if higher than target, bad if lower than target + ZDiff = Instigator.Location.Z - B.Enemy.Location.Z; + if ( ZDiff > 120 ) + Rating += 0.25; + else if ( ZDiff < -160 ) + Rating -= 0.35; + else if ( ZDiff < -80 ) + Rating -= 0.05; + if ( (B.Enemy.Weapon != None) && B.Enemy.Weapon.bMeleeWeapon && (EnemyDist < 2500) ) + Rating += 0.25; + + return Rating; +} + +/* BestMode() +choose between regular or alt-fire +*/ +function byte BestMode() +{ + local bot B; + + B = Bot(Instigator.Controller); + if ( (B == None) || (B.Enemy == None) ) + return 0; + + if ( (FRand() < 0.3) && !B.IsStrafing() && (Instigator.Physics != PHYS_Falling) ) + return 1; + return 0; +} +// end AI Interface + +defaultproperties +{ + NextBarrel=1 + BarrelTransitionTime=0.350000 + LoadAnimRate=1.500000 + BarrelInfo(0)=(BoneName="1") + BarrelInfo(1)=(BoneName="2",DesiredBarrelRotation=57343.000000) + BarrelInfo(2)=(BoneName="3",DesiredBarrelRotation=49151.000000) + BarrelInfo(3)=(BoneName="4",DesiredBarrelRotation=32768.000000) + BarrelInfo(4)=(BoneName="5",DesiredBarrelRotation=24576.000000) + BarrelInfo(5)=(BoneName="6",DesiredBarrelRotation=16384.000000) + SeekCheckFreq=0.500000 + SeekRange=8000.000000 + LockRequiredTime=1.250000 + UnLockRequiredTime=0.500000 + LockAim=0.996000 + CrossHairColor=(R=250,A=255) + CrosshairX=16.000000 + CrosshairY=16.000000 + FireModeClass(0)=Class'UT2341WeaponsReducedv1a.UT2341RocketFire' + FireModeClass(1)=Class'UT2341WeaponsReducedv1a.UT2341RocketGrenadeFire' + PutDownAnim="PutDown" + IdleAnimRate=0.500000 + SelectAnimRate=2.000000 + BringUpTime=0.450000 + SelectSound=Sound'UT2341Weapons_Sounds.RocketLauncher.Selecting' + SelectForce="SwitchToRocketLauncher" + AIRating=0.780000 + CurrentRating=0.780000 + Description="Classification: Heavy Ballistic||Primary Fire: Slow moving but deadly rockets are fired at opponents. Trigger can be held down to load up to six rockets at a time, which can be fired at once.||Secondary Fire: Grenades are lobbed from the barrel. Secondary trigger can be held as well to load up to six grenades.||Techniques: Keeping this weapon pointed at an opponent will cause it to lock on, and while the gun is locked the next rocket fired will be a homing rocket. Because the Rocket Launcher can load up multiple rockets, it fires when you release the fire button." + EffectOffset=(X=50.000000,Y=1.000000,Z=10.000000) + DisplayFOV=80.000000 + Priority=14 + HudColor=(G=0) + SmallViewOffset=(Z=-10.000000) + CenteredOffsetY=-5.000000 + CenteredYaw=-500 + CustomCrosshair=8 + CustomCrossHairColor=(B=0,G=0) + CustomCrossHairTextureName="Crosshairs.Hud.Crosshair_Triad2" + InventoryGroup=9 + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341RocketLauncherPickup' + PlayerViewOffset=(Z=-10.000000) + PlayerViewPivot=(Yaw=500,Roll=1000) + BobDamping=1.500000 + AttachmentClass=Class'UT2341WeaponsReducedv1a.UT2341RocketAttachment' + IconMaterial=Texture'UT2341Weapons_Tex.Icons.Icon_RocketLauncher' + IconCoords=(X2=128,Y2=32) + ItemName="Rocket Launcher" + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTRocketLauncherFP' + DrawScale=2.000000 + HighDetailOverlay=Combiner'UT2004Weapons.WeaponSpecMap2' +} diff --git a/Sources/Classes/UT2341RocketLauncherPickup.uc b/Sources/Classes/UT2341RocketLauncherPickup.uc new file mode 100644 index 0000000..ccd29ba --- /dev/null +++ b/Sources/Classes/UT2341RocketLauncherPickup.uc @@ -0,0 +1,49 @@ +//============================================================================= +// RocketLauncherPickup. +//============================================================================= +class UT2341RocketLauncherPickup extends UTWeaponPickup; + +static function StaticPrecache(LevelInfo L) +{ + L.AddPrecacheMaterial(Material'WeaponSkins.RocketShellTex'); + L.AddPrecacheMaterial(Material'XEffects.RocketFlare'); + L.AddPrecacheMaterial(Material'XEffects.SmokeAlphab_t'); + L.AddPrecacheMaterial(Material'EmitterTextures.rockchunks02'); + L.AddPrecacheMaterial(Material'EmitterTextures.fire3'); + L.AddPrecacheMaterial(Material'EmitterTextures.LargeFlames'); + L.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.rocketproj'); + L.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.RocketLauncherPickup'); +} + +simulated function UpdatePrecacheMaterials() +{ + Level.AddPrecacheMaterial(Material'EmitterTextures.fire3'); + Level.AddPrecacheMaterial(Material'EmitterTextures.LargeFlames'); + Level.AddPrecacheMaterial(Material'WeaponSkins.RocketShellTex'); + Level.AddPrecacheMaterial(Material'XEffects.RocketFlare'); + Level.AddPrecacheMaterial(Material'XEffects.SmokeAlphab_t'); + Level.AddPrecacheMaterial(Material'EmitterTextures.rockchunks02'); + + super.UpdatePrecacheMaterials(); +} + +simulated function UpdatePrecacheStaticMeshes() +{ + Level.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.rocketproj'); + Super.UpdatePrecacheStaticMeshes(); +} + +defaultproperties +{ + MaxDesireability=0.780000 + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341RocketLauncher' + PickupMessage="You got the Rocket Launcher." + PickupSound=Sound'UT2341Weapons_Sounds.General.WeaponPickup' + PickupForce="RocketLauncherPickup" + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTRocketLauncher' + DrawScale=0.080000 + PrePivot=(Z=60.000000) + AmbientGlow=48 + RotationRate=(Yaw=5000) +} diff --git a/Sources/Classes/UT2341RocketProj.uc b/Sources/Classes/UT2341RocketProj.uc new file mode 100644 index 0000000..6ee83ea --- /dev/null +++ b/Sources/Classes/UT2341RocketProj.uc @@ -0,0 +1,132 @@ +//============================================================================= +// rocket. +//============================================================================= +class UT2341RocketProj extends Projectile; + +var bool bRing,bHitWater,bWaterStart; +var int NumExtraRockets; +var Emitter SmokeTrail; +var Effects Corona; + +var vector Dir; + +simulated function Destroyed() +{ + if ( SmokeTrail != None ) + SmokeTrail.Kill(); + if ( Corona != None ) + Corona.Destroy(); + Super.Destroyed(); +} + +simulated function PostBeginPlay() +{ + if ( Level.NetMode != NM_DedicatedServer) + { + SmokeTrail = Spawn(class'FX_RocketTrail',self,,,Rotation); + SmokeTrail.SetBase(self); + } + + Dir = vector(Rotation); + Velocity = speed * Dir; + if (PhysicsVolume.bWaterVolume) + { + bHitWater = True; + Velocity=0.6*Velocity; + } + Super.PostBeginPlay(); +} + +simulated function PostNetBeginPlay() +{ + local PlayerController PC; + + Super.PostNetBeginPlay(); + + if ( Level.NetMode == NM_DedicatedServer ) + return; + if ( Level.bDropDetail || (Level.DetailMode == DM_Low) ) + { + bDynamicLight = false; + LightType = LT_None; + } + else + { + PC = Level.GetLocalPlayerController(); + if ( (Instigator != None) && (PC == Instigator.Controller) ) + return; + if ( (PC == None) || (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 3000) ) + { + bDynamicLight = false; + LightType = LT_None; + } + } +} + +simulated function Landed( vector HitNormal ) +{ + Explode(Location,HitNormal); +} + +simulated function ProcessTouch (Actor Other, Vector HitLocation) +{ + if ( (Other != instigator) && (!Other.IsA('Projectile') || Other.bProjTarget) ) + Explode(HitLocation, vector(rotation)*-1 ); +} + +function BlowUp(vector HitLocation) +{ + HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, HitLocation ); + MakeNoise(1.0); +} + +simulated function Explode(vector HitLocation, vector HitNormal) +{ + local PlayerController PC; + + PlaySound(sound'UT2341Weapons_Sounds.General.Explo1',,2.5*TransientSoundVolume); + if ( EffectIsRelevant(Location,false) ) + { + Spawn(class'FX_RocketExplosion',,,HitLocation + HitNormal*10,rotator(HitNormal)); + PC = Level.GetLocalPlayerController(); + if ( (PC.ViewTarget != None) && VSize(PC.ViewTarget.Location - Location) < 5000 ) + Spawn(class'ExplosionCrap',,, HitLocation + HitNormal*20, rotator(HitNormal)); +// if ( (ExplosionDecal != None) && (Level.NetMode != NM_DedicatedServer) ) +// Spawn(ExplosionDecal,self,,Location, rotator(-HitNormal)); + } + + BlowUp(HitLocation); + Destroy(); +} + +defaultproperties +{ + Speed=1035.000000 + MaxSpeed=1840.000000 + Damage=112.000000 + DamageRadius=256.000000 + MomentumTransfer=92000.000000 + MyDamageType=Class'UT2341WeaponsReducedv1a.DamType_Rocket' + ExplosionDecal=Class'XEffects.RocketMark' + LightType=LT_Steady + LightEffect=LE_QuadraticNonIncidence + LightHue=28 + LightBrightness=255.000000 + LightRadius=6.000000 + CullDistance=7500.000000 + bDynamicLight=True + AmbientSound=Sound'UT2341Weapons_Sounds.RocketLauncher.RocketFly1' + LifeSpan=6.000000 + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTRocket' + AmbientGlow=96 + FluidSurfaceShootStrengthMod=10.000000 + SoundVolume=255 + SoundPitch=100 + SoundRadius=16.000000 + bFixedRotationDir=True + RotationRate=(Roll=50000) + DesiredRotation=(Roll=30000) + ForceType=FT_Constant + ForceRadius=100.000000 + ForceScale=5.000000 +} diff --git a/Sources/Classes/UT2341SeekingRocketProj.uc b/Sources/Classes/UT2341SeekingRocketProj.uc new file mode 100644 index 0000000..d25f7a1 --- /dev/null +++ b/Sources/Classes/UT2341SeekingRocketProj.uc @@ -0,0 +1,53 @@ +class UT2341SeekingRocketProj extends UT2341RocketProj; + +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); + + // track vehicles better + if ( Seeking.Physics == PHYS_Karma ) + ForceDir = Normal(ForceDir * 0.8 * VelMag + Velocity); + else + ForceDir = Normal(ForceDir * 0.5 * 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 +{ + LifeSpan=10.000000 +} diff --git a/Sources/Classes/UT2341ShockRifle.uc b/Sources/Classes/UT2341ShockRifle.uc new file mode 100644 index 0000000..d6bf116 --- /dev/null +++ b/Sources/Classes/UT2341ShockRifle.uc @@ -0,0 +1,226 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341ShockRifle extends Weapon; + +#exec OBJ LOAD FILE=UT2341Weapons_Tex.utx +#exec OBJ LOAD FILE=UT2341Weapons_Anims.ukx +#exec OBJ LOAD FILE=UT2341Weapons_SM.usx + +var ShockProjectile ComboTarget; // used by AI +var bool bRegisterTarget; +var bool bWaitForCombo; +var vector ComboStart; +var color EffectColor; + +simulated function vector GetEffectStart() +{ + local Coords C; + + if ( Instigator.IsFirstPerson() ) + { + if ( WeaponCentered() ) + return CenteredEffectStart(); + C = GetBoneCoords('tip'); + return C.Origin - 15 * C.XAxis; + } + return Super.GetEffectStart(); +} + +simulated function bool WeaponCentered() +{ + return ( bSpectated || (Hand > 1) ); +} + +// AI Interface +function float GetAIRating() +{ + local Bot B; + + B = Bot(Instigator.Controller); + if ( B == None ) + return AIRating; + + if ( B.Enemy == None ) + { + if ( (B.Target != None) && VSize(B.Target.Location - B.Pawn.Location) > 8000 ) + return 0.9; + return AIRating; + } + + if ( bWaitForCombo ) + return 1.5; + if ( !B.ProficientWithWeapon() ) + return AIRating; + if ( B.Stopped() ) + { + if ( !B.EnemyVisible() && (VSize(B.Enemy.Location - Instigator.Location) < 5000) ) + return (AIRating + 0.5); + return (AIRating + 0.3); + } + else if ( VSize(B.Enemy.Location - Instigator.Location) > 1600 ) + return (AIRating + 0.1); + else if ( B.Enemy.Location.Z > B.Location.Z + 200 ) + return (AIRating + 0.15); + + return AIRating; +} + +function SetComboTarget(ShockProjectile S) +{ + if ( !bRegisterTarget || (bot(Instigator.Controller) == None) || (Instigator.Controller.Enemy == None) ) + return; + + bRegisterTarget = false; + ComboStart = Instigator.Location; + ComboTarget = S; + ComboTarget.Monitor(Bot(Instigator.Controller).Enemy); +} + +function float RangedAttackTime() +{ + local bot B; + + B = Bot(Instigator.Controller); + if ( (B == None) || (B.Enemy == None) ) + return 0; + + if ( B.CanComboMoving() ) + return 0; + + return FMin(2,0.3 + VSize(B.Enemy.Location - Instigator.Location)/class'ShockProjectile'.default.Speed); +} + +function float SuggestAttackStyle() +{ + return -0.4; +} + +simulated function bool StartFire(int mode) +{ + if ( bWaitForCombo && (Bot(Instigator.Controller) != None) ) + { + if ( (ComboTarget == None) || ComboTarget.bDeleteMe ) + bWaitForCombo = false; + else + return false; + } + return Super.StartFire(mode); +} + +function DoCombo() +{ + if ( bWaitForCombo ) + { + bWaitForCombo = false; + if ( (Instigator != None) && (Instigator.Weapon == self) ) + StartFire(0); + } +} + +/* BestMode() +choose between regular or alt-fire +*/ +function byte BestMode() +{ + local float EnemyDist, MaxDist; + local bot B; + + bWaitForCombo = false; + B = Bot(Instigator.Controller); + if ( (B == None) || (B.Enemy == None) ) + return 0; + + if (B.IsShootingObjective()) + return 0; + + if ( !B.EnemyVisible() ) + { + if ( (ComboTarget != None) && !ComboTarget.bDeleteMe && B.CanCombo() ) + { + bWaitForCombo = true; + return 0; + } + ComboTarget = None; + if ( B.CanCombo() && B.ProficientWithWeapon() ) + { + bRegisterTarget = true; + return 1; + } + return 0; + } + + EnemyDist = VSize(B.Enemy.Location - Instigator.Location); + if ( B.Skill > 5 ) + MaxDist = 4 * class'ShockProjectile'.default.Speed; + else + MaxDist = 3 * class'ShockProjectile'.default.Speed; + + if ( (EnemyDist > MaxDist) || (EnemyDist < 150) ) + { + ComboTarget = None; + return 0; + } + + if ( (ComboTarget != None) && !ComboTarget.bDeleteMe && B.CanCombo() ) + { + bWaitForCombo = true; + return 0; + } + + ComboTarget = None; + + if ( (EnemyDist > 2500) && (FRand() < 0.5) ) + return 0; + + if ( B.CanCombo() && B.ProficientWithWeapon() ) + { + bRegisterTarget = true; + return 1; + } + if ( FRand() < 0.7 ) + return 0; + return 1; +} +// end AI Interface + +defaultproperties +{ + EffectColor=(B=255,G=125,R=128,A=96) + FireModeClass(0)=Class'UT2341WeaponsReducedv1a.UT2341ShockRifleBeamFire' + FireModeClass(1)=Class'UT2341WeaponsReducedv1a.UT2341ShockRifleProjectileFire' + PutDownAnim="PutDown" + SelectSound=Sound'UT2341Weapons_Sounds.ShockRifle.TazerSelect' + SelectForce="SwitchToShockRifle" + Description="Classification: Energy Rifle||Primary Fire: Instant hit laser beam.||Secondary Fire: Large, slow moving plasma balls.||Techniques: Hitting the secondary fire plasma balls with the regular fire's laser beam will cause an immensely powerful explosion." + EffectOffset=(X=65.000000,Y=14.000000,Z=-10.000000) + DisplayFOV=80.000000 + HudColor=(B=255,G=0,R=128) + SmallViewOffset=(X=5.000000,Y=1.000000,Z=-4.000000) + CenteredOffsetY=1.000000 + CenteredRoll=1000 + CenteredYaw=-1000 + CustomCrosshair=5 + CustomCrossHairColor=(G=0) + CustomCrossHairScale=0.698105 + InventoryGroup=4 + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341ShockRiflePickup' + PlayerViewOffset=(X=-2.000000,Z=-10.000000) + BobDamping=1.800000 + AttachmentClass=Class'UT2341WeaponsReducedv1a.UT2341ShockRifleAttachment' + IconMaterial=Texture'UT2341Weapons_Tex.Icons.Icon_ShockRifle' + IconCoords=(X2=128,Y2=32) + ItemName="ASMD Shock Rifle" + LightType=LT_Steady + LightEffect=LE_NonIncidence + LightHue=165 + LightSaturation=70 + LightBrightness=255.000000 + LightRadius=4.000000 + LightPeriod=3 + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTASMD_FP' + DrawScale=1.500000 +} diff --git a/Sources/Classes/UT2341ShockRifleAmmo.uc b/Sources/Classes/UT2341ShockRifleAmmo.uc new file mode 100644 index 0000000..cb40db3 --- /dev/null +++ b/Sources/Classes/UT2341ShockRifleAmmo.uc @@ -0,0 +1,12 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341ShockRifleAmmo extends ShockAmmo; + +defaultproperties +{ + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341ShockRifleAmmoPickup' +} diff --git a/Sources/Classes/UT2341ShockRifleAmmoPickup.uc b/Sources/Classes/UT2341ShockRifleAmmoPickup.uc new file mode 100644 index 0000000..329d822 --- /dev/null +++ b/Sources/Classes/UT2341ShockRifleAmmoPickup.uc @@ -0,0 +1,22 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341ShockRifleAmmoPickup extends ShockAmmoPickup; + +function RespawnEffect() +{ + spawn(class'FX_PickupRespawn'); +} + +defaultproperties +{ + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341ShockRifleAmmo' + PickupSound=Sound'UT2341Weapons_Sounds.General.AmmoSnd' + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTASMDCore' + DrawScale3D=(X=0.400000,Y=0.400000,Z=0.250000) + PrePivot=(Z=125.000000) + AmbientGlow=64 +} diff --git a/Sources/Classes/UT2341ShockRifleAttachment.uc b/Sources/Classes/UT2341ShockRifleAttachment.uc new file mode 100644 index 0000000..0053ab4 --- /dev/null +++ b/Sources/Classes/UT2341ShockRifleAttachment.uc @@ -0,0 +1,63 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341ShockRifleAttachment extends ShockAttachment; + +//var class MuzFlashClass; +//var xEmitter MuzFlash; + +simulated function PostNetBeginPlay() +{ + Super(xWeaponAttachment).PostNetBeginPlay(); + /* + if ( (Instigator != None) && (Instigator.PlayerReplicationInfo != None)&& (Instigator.PlayerReplicationInfo.Team != None) ) + { + if ( Instigator.PlayerReplicationInfo.Team.TeamIndex == 0 ) + Skins[1] = Material'UT2004Weapons.RedShockFinal'; + else if ( Instigator.PlayerReplicationInfo.Team.TeamIndex == 1 ) + Skins[1] = Material'UT2004Weapons.BlueShockFinal'; + } + */ +} + + +simulated event ThirdPersonEffects() +{ + local rotator r; + + if ( Level.NetMode != NM_DedicatedServer && FlashCount > 0 ) + { + if ( FiringMode == 0 ) + WeaponLight(); + else + { + if (MuzFlash == None) + { + MuzFlash = Spawn(MuzFlashClass); + AttachToBone(MuzFlash, 'tip'); + } + if (MuzFlash != None) + { + MuzFlash.mStartParticles++; + r.Roll = Rand(65536); + SetBoneRotation('Flash_Bone', r, 0, 1.f); + } + } + } + + Super(xWeaponAttachment).ThirdPersonEffects(); +} + +defaultproperties +{ + MuzFlashClass=Class'UT2341WeaponsReducedv1a.FX_ShockRifleMuzFlash3rd' + LightHue=165 + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTASMD3rd' + RelativeLocation=(X=0.000000,Y=0.000000,Z=10.000000) + RelativeRotation=(Pitch=0) + DrawScale=0.125000 + Skins(0)=Texture'UT2341Weapons_Tex.ASMD-Weapon.ShockRifleTex0' +} diff --git a/Sources/Classes/UT2341ShockRifleBeamFire.uc b/Sources/Classes/UT2341ShockRifleBeamFire.uc new file mode 100644 index 0000000..cf44a5c --- /dev/null +++ b/Sources/Classes/UT2341ShockRifleBeamFire.uc @@ -0,0 +1,79 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341ShockRifleBeamFire extends ShockBeamFire; + +var class BeamImpactEffectClass; + +//var() class BeamEffectClass; + +//#exec OBJ LOAD FILE=..\Sounds\WeaponSounds.uax + +// Leaving this in here because ShockProjFire.ProjSpawnOffset is probably wrong +/* +function DoFireEffect() +{ + local Vector StartTrace,X,Y,Z; + local Rotator R, Aim; + + Instigator.MakeNoise(1.0); + + StartTrace = Instigator.Location + Instigator.EyePosition(); + if ( PlayerController(Instigator.Controller) != None ) + { + // for combos + Weapon.GetViewAxes(X,Y,Z); + StartTrace = StartTrace + X*class'ShockProjFire'.Default.ProjSpawnOffset.X; + if ( !Weapon.WeaponCentered() ) + StartTrace = StartTrace + Weapon.Hand * Y*class'ShockProjFire'.Default.ProjSpawnOffset.Y + Z*class'ShockProjFire'.Default.ProjSpawnOffset.Z; + } + + Aim = AdjustAim(StartTrace, AimError); + R = rotator(vector(Aim) + VRand()*FRand()*Spread); + DoTrace(StartTrace, R); +} +*/ + +/* +function InitEffects() +{ + if ( Level.DetailMode == DM_Low ) + FlashEmitterClass = None; + Super.InitEffects(); + if ( FlashEmitter != None ) + Weapon.AttachToBone(FlashEmitter, 'tip'); +} +*/ + +/* +function SpawnBeamEffect(Vector Start, Rotator Dir, Vector HitLocation, Vector HitNormal, int ReflectNum) +{ + local xEmitter Beam; + + if (Weapon != None) + { + Beam = Weapon.Spawn(BeamEffectClass,,, Start, Dir); + if (ReflectNum != 0) + { + Beam.Instigator = None; // prevents client side repositioning of beam start + } + FX_ShockRifleBeamEffect(Beam).AimAt(HitLocation, HitNormal); + } +} +*/ + +defaultproperties +{ + BeamImpactEffectClass=Class'UT2341WeaponsReducedv1a.FX_ShockRifleImpact' + BeamEffectClass=Class'UT2341WeaponsReducedv1a.FX_ShockRifleBeamEffect' + DamageType=Class'UT2341WeaponsReducedv1a.DamType_ShockRifleBeam' + DamageMin=60 + DamageMax=60 + FireSound=Sound'UT2341Weapons_Sounds.ShockRifle.TazerFire' + FireRate=0.850000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341ShockRifleAmmo' + FlashEmitterClass=Class'UT2341WeaponsReducedv1a.FX_ShockRifleBeamMuzFlash' +} diff --git a/Sources/Classes/UT2341ShockRifleCombo.uc b/Sources/Classes/UT2341ShockRifleCombo.uc new file mode 100644 index 0000000..db900a7 --- /dev/null +++ b/Sources/Classes/UT2341ShockRifleCombo.uc @@ -0,0 +1,59 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341ShockRifleCombo extends Actor; + +//#exec OBJ LOAD FILE=XEffectMat.utx + +var ShockComboFlare Flare; +var Rotator NetRot; +replication +{ + //Rotation isn't replicated under these conditions + reliable if (Role == ROLE_Authority) + NetRot; +} +simulated function PreBeginPlay() +{ + Super.PreBeginPlay(); + + if (Role == ROLE_Authority) + NetRot = Rotation; +} + +simulated event PostNetBeginPlay() +{ + Super.PostNetBeginPlay(); + + if (Level.NetMode != NM_DedicatedServer) + Spawn(class'FX_ShockRifleComboVortex',self,,,NetRot); +} + +auto simulated state Combo +{ +Begin: + Sleep(0.9); + LightType = LT_None; +} + +defaultproperties +{ + LightType=LT_Steady + LightEffect=LE_QuadraticNonIncidence + LightHue=165 + LightSaturation=100 + LightBrightness=255.000000 + LightRadius=10.000000 + DrawType=DT_None + bDynamicLight=True + bNetTemporary=True + RemoteRole=ROLE_SimulatedProxy + LifeSpan=2.000000 + bCollideActors=True + ForceType=FT_Constant + ForceRadius=300.000000 + ForceScale=-500.000000 +} diff --git a/Sources/Classes/UT2341ShockRiflePickup.uc b/Sources/Classes/UT2341ShockRiflePickup.uc new file mode 100644 index 0000000..4ed4e27 --- /dev/null +++ b/Sources/Classes/UT2341ShockRiflePickup.uc @@ -0,0 +1,78 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341ShockRiflePickup extends ShockRiflePickup; + +static function StaticPrecache(LevelInfo L) +{ + /* + L.AddPrecacheMaterial(Material'XEffects.ShockHeatDecal'); + L.AddPrecacheMaterial(Material'XEffectMat.shock_flash'); + L.AddPrecacheMaterial(Material'XEffectMat.shock_flare_a'); + L.AddPrecacheMaterial(Material'XEffectMat.shock_core'); + L.AddPrecacheMaterial(Material'XEffectMat.purple_line'); + L.AddPrecacheMaterial(Material'XEffectMat.shock_sparkle'); + L.AddPrecacheMaterial(Material'XEffectMat.shock_core_low'); + L.AddPrecacheMaterial(Material'XEffectMat.shock_Energy_green_faded'); + L.AddPrecacheMaterial(Material'XEffectMat.Shock_Elec_a'); + L.AddPrecacheMaterial(Material'XEffectMat.shock_gradient_b'); + L.AddPrecacheMaterial(Material'XEffectMat.Shock_ring_a'); + L.AddPrecacheMaterial(Material'XEffectMat.ShockComboFlash'); + L.AddPrecacheMaterial(Material'XGameShaders.shock_muzflash_1st'); + L.AddPrecacheMaterial(Material'XGameShaders.WeaponShaders.shock_muzflash_3rd'); + L.AddPrecacheMaterial(Material'XWeapons_rc.ShockBeamTex'); + L.AddPrecacheMaterial(Material'XEffects.SaDScorcht'); + L.AddPrecacheMaterial(Material'DeployableTex.C_T_Electricity_SG'); + L.AddPrecacheMaterial(Material'UT2004Weapons.ShockRipple'); + */ + L.AddPrecacheStaticMesh(StaticMesh'Editor.TexPropSphere'); + L.AddPrecacheStaticMesh(StaticMesh'UT2341Weapons_SM.UTASMD'); +} + +simulated function UpdatePrecacheMaterials() +{ + /* + Level.AddPrecacheMaterial(Material'XEffects.ShockHeatDecal'); + Level.AddPrecacheMaterial(Material'XEffectMat.shock_flash'); + Level.AddPrecacheMaterial(Material'XEffectMat.shock_flare_a'); + Level.AddPrecacheMaterial(Material'XEffectMat.shock_core'); + Level.AddPrecacheMaterial(Material'XEffectMat.purple_line'); + Level.AddPrecacheMaterial(Material'XEffectMat.shock_sparkle'); + Level.AddPrecacheMaterial(Material'XEffectMat.shock_core_low'); + Level.AddPrecacheMaterial(Material'XEffectMat.shock_Energy_green_faded'); + Level.AddPrecacheMaterial(Material'XEffectMat.Shock_Elec_a'); + Level.AddPrecacheMaterial(Material'XEffectMat.shock_gradient_b'); + Level.AddPrecacheMaterial(Material'XEffectMat.Shock_ring_a'); + Level.AddPrecacheMaterial(Material'XEffectMat.ShockComboFlash'); + Level.AddPrecacheMaterial(Material'XGameShaders.shock_muzflash_1st'); + Level.AddPrecacheMaterial(Material'XGameShaders.WeaponShaders.shock_muzflash_3rd'); + Level.AddPrecacheMaterial(Material'XWeapons_rc.ShockBeamTex'); + Level.AddPrecacheMaterial(Material'DeployableTex.C_T_Electricity_SG'); + Level.AddPrecacheMaterial(Material'XEffects.SaDScorcht'); + Level.AddPrecacheMaterial(Material'UT2004Weapons.ShockRipple'); + */ + + Super(Weapon).UpdatePrecacheMaterials(); +} + +simulated function UpdatePrecacheStaticMeshes() +{ + //Level.AddPrecacheStaticMesh(StaticMesh'Editor.TexPropSphere'); + Super.UpdatePrecacheStaticMeshes(); +} + +defaultproperties +{ + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341ShockRifle' + PickupMessage="You got the ASMD Shock Rifle." + PickupSound=Sound'UT2341Weapons_Sounds.General.WeaponPickup' + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTASMD' + DrawScale=0.090000 + PrePivot=(Z=74.000000) + Skins(0)=Texture'UT2341Weapons_Tex.ASMD-Weapon.ShockRifleTex0' + AmbientGlow=64 + RotationRate=(Yaw=5000) +} diff --git a/Sources/Classes/UT2341ShockRifleProjectile.uc b/Sources/Classes/UT2341ShockRifleProjectile.uc new file mode 100644 index 0000000..30d1fd3 --- /dev/null +++ b/Sources/Classes/UT2341ShockRifleProjectile.uc @@ -0,0 +1,125 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341ShockRifleProjectile extends ShockProjectile; + +var FX_ShockRifleProjectile ASMDBallEffect; +var class ComboInstigatingDamageType; + +simulated function PostBeginPlay() +{ + Super(Projectile).PostBeginPlay(); + + if ( Level.NetMode != NM_DedicatedServer ) + { + ASMDBallEffect = Spawn(class'FX_ShockRifleProjectile', self); + ASMDBallEffect.SetBase(self); + } + + Velocity = Speed * Vector(Rotation); // starts off slower so combo can be done closer + + SetTimer(0.4, false); + tempStartLoc = Location; +} + +function Timer() +{ + SetCollisionSize(20, 20); +} + +simulated function Destroyed() +{ + if (ASMDBallEffect != None) + { + ASMDBallEffect.Destroy(); + } + + Super(Projectile).Destroyed(); +} + +simulated function DestroyTrails() +{ + if (ASMDBallEffect != None) + { + ASMDBallEffect.Destroy(); + } +} + +// @! override explosion +simulated function Explode(vector HitLocation,vector HitNormal) +{ + if ( Role == ROLE_Authority ) + { + HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, HitLocation ); + } + + PlaySound(ImpactSound, SLOT_Misc); + if ( EffectIsRelevant(Location,false) ) + Spawn(class'FX_ShockRifleImpact',,, Location, Rotator(HitNormal)); + SetCollisionSize(0.0, 0.0); + Destroy(); +} + +// @! override Combo +function SuperExplosion() +{ + local actor HitActor; + local vector HitLocation, HitNormal; + + HurtRadius(ComboDamage, ComboRadius, ComboDamageType, ComboMomentumTransfer, Location ); + + Spawn(class'UT2341ShockRifleCombo',self,,,Rotator(Location - Instigator.Location)); + if ( (Level.NetMode != NM_DedicatedServer) && EffectIsRelevant(Location,false) ) + { + HitActor = Trace(HitLocation, HitNormal,Location - Vect(0,0,120), Location,false); + if ( HitActor != None ) + Spawn(class'ComboDecal',self,,HitLocation, rotator(vect(0,0,-1))); + } + PlaySound(ComboSound, SLOT_None,1.0,,800); + DestroyTrails(); + Destroy(); +} + +event TakeDamage( int Damage, Pawn EventInstigator, vector HitLocation, vector Momentum, class DamageType) +{ + if (DamageType == ComboInstigatingDamageType) + { + Instigator = EventInstigator; + SuperExplosion(); + if( EventInstigator.Weapon != None ) + { + EventInstigator.Weapon.ConsumeAmmo(0, ComboAmmoCost, true); + Instigator = EventInstigator; + } + } +} + +defaultproperties +{ + ComboInstigatingDamageType=Class'UT2341WeaponsReducedv1a.DamType_ShockRifleBeam' + ComboDamage=250.000000 + ComboRadius=275.000000 + ComboMomentumTransfer=140000 + ComboAmmoCost=2 + ComboDamageType=Class'UT2341WeaponsReducedv1a.DamType_ShockRifleProjectileCombo' + Speed=1125.000000 + MaxSpeed=1125.000000 + Damage=82.000000 + DamageRadius=70.000000 + MyDamageType=Class'UT2341WeaponsReducedv1a.DamType_ShockRifleProjectile' + LightType=LT_Steady + LightEffect=LE_NonIncidence + LightBrightness=255 + LightHue=165 + LightSaturation=72 + LightRadius=6 + LifeSpan=10 + Texture=None + Skins(0)=None + ForceRadius=20.000000 + CollisionRadius=13.000000 + CollisionHeight=13.000000 +} diff --git a/Sources/Classes/UT2341ShockRifleProjectileFire.uc b/Sources/Classes/UT2341ShockRifleProjectileFire.uc new file mode 100644 index 0000000..d5d5ca6 --- /dev/null +++ b/Sources/Classes/UT2341ShockRifleProjectileFire.uc @@ -0,0 +1,17 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341ShockRifleProjectileFire extends ShockProjFire; + +defaultproperties +{ + FireAnimRate=1.000000 + FireSound=Sound'UT2341Weapons_Sounds.ShockRifle.TazerAltFire' + FireRate=0.700000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341ShockRifleAmmo' + ProjectileClass=Class'UT2341WeaponsReducedv1a.UT2341ShockRifleProjectile' + FlashEmitterClass=Class'UT2341WeaponsReducedv1a.FX_ShockRifleProjectileMuzFlash' +} diff --git a/Sources/Classes/UT2341SniperAmmo.uc b/Sources/Classes/UT2341SniperAmmo.uc new file mode 100644 index 0000000..4cb228a --- /dev/null +++ b/Sources/Classes/UT2341SniperAmmo.uc @@ -0,0 +1,14 @@ +class UT2341SniperAmmo extends Ammunition; + +#EXEC OBJ LOAD FILE=InterfaceContent.utx + +defaultproperties +{ + MaxAmmo=50 + InitialAmount=8 + bTryHeadShot=True + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341SniperAmmoPickup' + IconMaterial=Texture'HUDContent.Generic.HUD' + IconCoords=(X1=451,Y1=445,X2=510,Y2=500) + ItemName="Sniper Rounds" +} diff --git a/Sources/Classes/UT2341SniperAmmoPickup.uc b/Sources/Classes/UT2341SniperAmmoPickup.uc new file mode 100644 index 0000000..5c65db6 --- /dev/null +++ b/Sources/Classes/UT2341SniperAmmoPickup.uc @@ -0,0 +1,16 @@ +class UT2341SniperAmmoPickup extends UTAmmoPickup; + +defaultproperties +{ + AmmoAmount=10 + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341SniperAmmo' + PickupMessage="You picked up a box of sniper rounds." + PickupSound=Sound'UT2341Weapons_Sounds.General.AmmoSnd' + PickupForce="SniperAmmoPickup" + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTSniperAmmo' + DrawScale=0.200000 + PrePivot=(Z=96.000000) + AmbientGlow=64 + CollisionHeight=19.000000 +} diff --git a/Sources/Classes/UT2341SniperRifle.uc b/Sources/Classes/UT2341SniperRifle.uc new file mode 100644 index 0000000..8f1b7ae --- /dev/null +++ b/Sources/Classes/UT2341SniperRifle.uc @@ -0,0 +1,176 @@ +//======================================================================== +// EONSSniperRifle +// EONS Sniper Rifle by Wail of Suicide +// The EONS Sniper Rifle is intended to perform as the UT2004 Lightning Gun(Sniper Rifle) but utilizing the appearance of the Classic Sniper Rifle. Additionally, the smoke associated with the Classic Sniper Rifle has been removed and an improved projectile-impact emitter has been implemented to help in both aiming and determining the location of snipers. Firing sounds for the EONS Sniper Rifle are taken from Unreal Tournament Game of the Year Edition. +// +// Credit goes to Mr. Evil for the approach taken from his Helios weapon (Weapons of Evil pack) for Headshot detection on Monsters +// Feel free to use this content in any maps you create, but please provide credit in the readme. +// Contact: wailofsuicide@gmail.com - Comments and suggestions welcome. +//======================================================================== + +// O Damage Overlay on Hit +// O Look into Monster headshot detection + +class UT2341SniperRifle extends ClassicSniperRifle + config(user); + +#EXEC OBJ LOAD FILE=WeaponSounds.uax +//#exec AUDIO IMPORT FILE="Sounds\SniperFire.wav" NAME="SniperFire" GROUP="Sniper" +//#exec TEXTURE IMPORT FILE="Textures\gold_beam.dds" NAME="gold_beam" GROUP="Sniper" +//#exec TEXTURE IMPORT FILE="Textures\EONSSniper1.dds" NAME="EONSSniper1" GROUP="Sniper" +//#exec TEXTURE IMPORT FILE="Textures\EONSSniper2.dds" NAME="EONSSniper2" GROUP="Sniper" + +simulated function bool WeaponCentered() +{ + if (Zoomed) + return true; + return Super.WeaponCentered(); +} + +simulated function Vector GetEffectStart() +{ + return GetBoneCoords('tip').Origin; +} + +simulated event RenderOverlays( Canvas Canvas ) +{ + local float CX,CY,Scale; + local float ChargeBar; + local float barOrgX, barOrgY; + local float barSizeX, barSizeY; + + if ( PlayerController(Instigator.Controller) == None ) + { + Super.RenderOverlays(Canvas); + Zoomed = false; + return; + } + + if ( LastFOV > PlayerController(Instigator.Controller).DesiredFOV ) + { + PlaySound(Sound'AssaultSounds.TargetCycle01', SLOT_Misc,,,,0.2,false); + } + else if ( LastFOV < PlayerController(Instigator.Controller).DesiredFOV ) + { + PlaySound(Sound'WeaponSounds.FlakCannonReload', SLOT_Misc,,,,1.2,false); //Sound'WeaponSounds.FlakCannon.FlakCannonReload' //Sound'WeaponSounds.LightningGun.LightningZoomOut + } + LastFOV = PlayerController(Instigator.Controller).DesiredFOV; + + if ( PlayerController(Instigator.Controller).DesiredFOV == PlayerController(Instigator.Controller).DefaultFOV ) + { + Super.RenderOverlays(Canvas); + Zoomed = false; + } + else + { + if ( FireMode[0].NextFireTime <= Level.TimeSeconds ) + { + ChargeBar = 1.0; + } + else + { + ChargeBar = 1.0 - ((FireMode[0].NextFireTime-Level.TimeSeconds) / FireMode[0].FireRate); + } + + CX = Canvas.ClipX/2; + CY = Canvas.ClipY/2; + Scale = Canvas.ClipX/1024; + + Canvas.Style = ERenderStyle.STY_Alpha; + Canvas.SetDrawColor(0,0,0); + + // Draw the crosshair + Canvas.SetPos(CX-169*Scale,CY-155*Scale); + Canvas.DrawTile(texture'NewSniperRifle.COGAssaultZoomedCrosshair',169*Scale,310*Scale, 164,35, 169,310); + Canvas.SetPos(CX,CY-155*Scale); + Canvas.DrawTile(texture'NewSniperRifle.COGAssaultZoomedCrosshair',169*Scale,310*Scale, 332,345, -169,-310); + + // Draw Cornerbars + Canvas.SetPos(160*Scale,160*Scale); + Canvas.DrawTile(texture'NewSniperRifle.COGAssaultZoomedCrosshair', 111*Scale, 111*Scale , 0 , 0, 111, 111); + + Canvas.SetPos(Canvas.ClipX-271*Scale,160*Scale); + Canvas.DrawTile(texture'NewSniperRifle.COGAssaultZoomedCrosshair', 111*Scale, 111*Scale , 111 , 0, -111, 111); + + Canvas.SetPos(160*Scale,Canvas.ClipY-271*Scale); + Canvas.DrawTile(texture'NewSniperRifle.COGAssaultZoomedCrosshair', 111*Scale, 111*Scale, 0 , 111, 111, -111); + + Canvas.SetPos(Canvas.ClipX-271*Scale,Canvas.ClipY-271*Scale); + Canvas.DrawTile(texture'NewSniperRifle.COGAssaultZoomedCrosshair', 111*Scale, 111*Scale , 111 , 111, -111, -111); + + // Draw the 4 corners + Canvas.SetPos(0,0); + Canvas.DrawTile(texture'NewSniperRifle.COGAssaultZoomedCrosshair',160*Scale,160*Scale, 0, 274, 159, -158); + + Canvas.SetPos(Canvas.ClipX-160*Scale,0); + Canvas.DrawTile(texture'NewSniperRifle.COGAssaultZoomedCrosshair',160*Scale,160*Scale, 159,274, -159, -158); + + Canvas.SetPos(0,Canvas.ClipY-160*Scale); + Canvas.DrawTile(texture'NewSniperRifle.COGAssaultZoomedCrosshair',160*Scale,160*Scale, 0,116, 159, 158); + + Canvas.SetPos(Canvas.ClipX-160*Scale,Canvas.ClipY-160*Scale); + Canvas.DrawTile(texture'NewSniperRifle.COGAssaultZoomedCrosshair',160*Scale,160*Scale, 159, 116, -159, 158); + + // Draw the Horz Borders + Canvas.SetPos(160*Scale,0); + Canvas.DrawTile(texture'NewSniperRifle.COGAssaultZoomedCrosshair', Canvas.ClipX-320*Scale, 160*Scale, 284, 512, 32, -160); + + Canvas.SetPos(160*Scale,Canvas.ClipY-160*Scale); + Canvas.DrawTile(texture'NewSniperRifle.COGAssaultZoomedCrosshair', Canvas.ClipX-320*Scale, 160*Scale, 284, 352, 32, 160); + + // Draw the Vert Borders + Canvas.SetPos(0,160*Scale); + Canvas.DrawTile(texture'NewSniperRifle.COGAssaultZoomedCrosshair', 160*Scale, Canvas.ClipY-320*Scale, 0,308, 160,32); + + Canvas.SetPos(Canvas.ClipX-160*Scale,160*Scale); + Canvas.DrawTile(texture'NewSniperRifle.COGAssaultZoomedCrosshair', 160*Scale, Canvas.ClipY-320*Scale, 160,308, -160,32); + + // Draw the Charging meter + Canvas.DrawColor = ChargeColor; + Canvas.DrawColor.A = 255; + + if (ChargeBar <1) + Canvas.DrawColor.R = 255*ChargeBar; + else + { + Canvas.DrawColor.R = 0; + Canvas.DrawColor.B = 0; + } + + if (ChargeBar == 1) + Canvas.DrawColor.G = 255; + else + Canvas.DrawColor.G = 0; + + Canvas.Style = ERenderStyle.STY_Alpha; + Canvas.SetPos( barOrgX, barOrgY ); + Canvas.DrawTile(Texture'Engine.WhiteTexture',barSizeX,barSizeY*chargeBar, 0.0, 0.0,Texture'Engine.WhiteTexture'.USize,Texture'Engine.WhiteTexture'.VSize*chargeBar); + zoomed = true; + } +} + +defaultproperties +{ + FireModeClass(0)=Class'UT2341WeaponsReducedv1a.UT2341SniperRifleFire' + FireModeClass(1)=Class'UT2341WeaponsReducedv1a.UT2341SniperZoomFire' + SelectAnim="Select" + SelectAnimRate=1.200000 + PutDownAnimRate=1.200000 + SelectSound=Sound'UT2341Weapons_Sounds.Sniper.RiflePickup' + Description="Classification: Long Range Ballistic||Regular Fire: Fires a high powered bullet. Can kill instantly when applied to the cranium of opposing forces. ||Secondary Fire: Zooms the rifle in, up to eight times normal vision. Allows for extreme precision from hundreds of yards away.||Techniques: Great for long distance headshots!" + EffectOffset=(Y=31.000000,Z=-5.000000) + DisplayFOV=80.000000 + Priority=60 + SmallViewOffset=(X=30.000000,Z=-15.600000) + InventoryGroup=0 + GroupOffset=0 + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341SniperRiflePickup' + PlayerViewOffset=(X=0.000000,Y=-3.000000,Z=-22.000000) + PlayerViewPivot=(Pitch=256,Yaw=-256) + AttachmentClass=Class'UT2341WeaponsReducedv1a.UT2341SniperRifleAttachment' + IconMaterial=Texture'UT2341Weapons_Tex.Icons.Icon_SniperRifle' + IconCoords=(X1=0,Y1=0,X2=128,Y2=32) + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTSniper_FP' + DrawScale=3.000000 + HighDetailOverlay=None +} diff --git a/Sources/Classes/UT2341SniperRifleAttachment.uc b/Sources/Classes/UT2341SniperRifleAttachment.uc new file mode 100644 index 0000000..2cdaf3b --- /dev/null +++ b/Sources/Classes/UT2341SniperRifleAttachment.uc @@ -0,0 +1,61 @@ +//======================================================================== +// EONSSniperRifleAttachment +// EONS Sniper Rifle by Wail of Suicide +// Modifications to this class remove the smoke effect of the Classic Sniper Rifle. +//======================================================================== + +class UT2341SniperRifleAttachment extends xWeaponAttachment; + +var Emitter mMuzFlash3rd; + +simulated function Destroyed() +{ + if (mMuzFlash3rd != None) + mMuzFlash3rd.Destroy(); + Super.Destroyed(); +} + +simulated event ThirdPersonEffects() +{ + if ( (FlashCount != 0) && (Level.NetMode != NM_DedicatedServer) ) + { + if (FiringMode == 0) + WeaponLight(); + + if ( Level.TimeSeconds - Instigator.LastRenderTime < 0.2 ) + { + if (mMuzFlash3rd == None) + { + mMuzFlash3rd = Spawn(class'FX_SniperRifleMuzFlash'); + AttachToBone(mMuzFlash3rd, 'tip'); + } + if (mMuzFlash3rd != None) + mMuzFlash3rd.Trigger(self, None); + } + } + + Super.ThirdPersonEffects(); +} + + +simulated function Vector GetTipLocation() +{ + local Coords C; + + C = GetBoneCoords('tip'); + return C.Origin; + +} + +defaultproperties +{ + LightType=LT_Steady + LightEffect=LE_NonIncidence + LightHue=30 + LightSaturation=224 + LightBrightness=255.000000 + LightRadius=5.000000 + LightPeriod=3 + Mesh=SkeletalMesh'UT2341Weapons_Anims.UTSniperRifle3rd' + DrawScale=0.110000 +} diff --git a/Sources/Classes/UT2341SniperRifleFire.uc b/Sources/Classes/UT2341SniperRifleFire.uc new file mode 100644 index 0000000..4612149 --- /dev/null +++ b/Sources/Classes/UT2341SniperRifleFire.uc @@ -0,0 +1,243 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341SniperRifleFire extends ClassicSniperFire; + +var class TeamBeamClasses[2]; +var class TeamTracerClasses[2]; +var float LimbShotDamageMult; +var vector FireStartOffset; +var() class NewFlashClass; +var Emitter NewFlashEmitter; + +function InitEffects() +{ + // don't even spawn on server + if ( (Level.NetMode == NM_DedicatedServer) || (AIController(Instigator.Controller) != None) ) + return; + if ( (NewFlashClass != None) && ((NewFlashEmitter == None) || NewFlashEmitter.bDeleteMe) ) + { + NewFlashEmitter = Weapon.Spawn(NewFlashClass); + Weapon.AttachToBone(NewFlashEmitter, 'tip'); + } + if ( (SmokeEmitterClass != None) && ((SmokeEmitter == None) || SmokeEmitter.bDeleteMe) ) + { + SmokeEmitter = Weapon.Spawn(SmokeEmitterClass); + } +} + +function DrawMuzzleFlash(Canvas Canvas) +{ + // Draw smoke first + if (SmokeEmitter != None && SmokeEmitter.Base != Weapon) + { + SmokeEmitter.SetLocation( Weapon.GetEffectStart() ); + Canvas.DrawActor( SmokeEmitter, false, false, Weapon.DisplayFOV ); + } + + if (NewFlashEmitter != None && NewFlashEmitter.Base != Weapon) + { + NewFlashEmitter.SetLocation( Weapon.GetEffectStart() ); + Canvas.DrawActor( NewFlashEmitter, false, false, Weapon.DisplayFOV ); + } +} + +function FlashMuzzleFlash() +{ + local rotator r; + + r.Roll = Rand(65535); + Weapon.SetBoneRotation('Bone_Flash', r, 0, 1.f); + if (NewFlashEmitter != None) + NewFlashEmitter.Trigger(Weapon, Instigator); +} + +function DoFireEffect() +{ + local Vector StartTrace; + local Rotator R, Aim; + + Instigator.MakeNoise(1.0); + + StartTrace = Instigator.Location + Instigator.EyePosition(); + + Aim = AdjustAim(StartTrace, AimError); + R = rotator(vector(Aim) + VRand()*FRand()*Spread); + DoTrace(StartTrace, R); +} + +simulated function DestroyEffects() +{ + if (NewFlashEmitter != None) + NewFlashEmitter.Destroy(); + + if (SmokeEmitter != None) + SmokeEmitter.Destroy(); +} + +function DoTrace(Vector Start, Rotator Dir) +{ + local Vector X,Y,Z, End, HitLocation, HitNormal; + local Actor Other; + local SniperWallHitEffect S; + local Pawn HeadShotPawn; + + //For Monsters + local float dist; + local name HitBone; + local vector BoneTestLocation, ClosestLocation; + local float HitHorizontal, HitVertical; + + + Weapon.GetViewAxes(X, Y, Z); + + X = Vector(Dir); + End = Start + TraceRange * X; + Other = Weapon.Trace(HitLocation, HitNormal, End, Start, true); + + //Spawn team colored tracers + if ( (Instigator.PlayerReplicationInfo.Team != None) && (Instigator.PlayerReplicationInfo.Team.TeamIndex == 1) ) + Weapon.Spawn(TeamTracerClasses[1],Instigator.Controller,,Start,Dir); + else + Weapon.Spawn(TeamTracerClasses[0],Instigator.Controller,,Start,Dir); + + if ( Other != None && (Other != Instigator) ) + { + if ( !Other.bWorldGeometry ) + { + if(Pawn(Other) != None) + { + //Find a point on the victim's Z axis at the same height as the HitLocation. + ClosestLocation = Other.Location; + ClosestLocation.Z += (HitLocation - Other.Location).Z; + + //Extend the shot along its direction to a point where it is closest to the victim's Z axis. + BoneTestLocation = X; + BoneTestLocation *= VSize(ClosestLocation - HitLocation); + BoneTestLocation *= Normal(ClosestLocation - HitLocation) dot Normal(HitLocation - Start); + BoneTestLocation += HitLocation; + + //Find the closest bone. + HitBone = Other.GetClosestBone(BoneTestLocation, X, dist, 'head', 8.000); + + if (HitBone != 'head') + HitBone = Other.GetClosestBone(BoneTestLocation, X, dist, 'spine', 20.000); + + + if (Vehicle(Other) != None) + HeadShotPawn = Vehicle(Other).CheckForHeadShot(HitLocation, X, 1.0); + + if (HeadShotPawn != None) + HeadShotPawn.TakeDamage(DamageMax * HeadShotDamageMult, Instigator, HitLocation, Momentum*X, DamageTypeHeadShot); + else if ( (Pawn(Other) != None) && Pawn(Other).IsHeadShot(HitLocation, X, 1.0)) + Other.TakeDamage(DamageMax * HeadShotDamageMult, Instigator, HitLocation, Momentum*X, DamageTypeHeadShot); + else if ( (Pawn(Other) != None) && ClassIsChildOf(Other.Class, class'skaarjpack.Monster') ) + { + HitVertical = BoneTestLocation.Z - Other.Location.Z; + BoneTestLocation.Z = Other.Location.Z; + HitHorizontal = VSize(BoneTestLocation - Other.Location); + + if (HitHorizontal < Other.CollisionRadius * 0.6) + { + if ( ClassIsChildOf(Other.Class, class'skaarjpack.GasBag') || ClassIsChildOf(Other.Class, class'skaarjpack.Manta') || ClassIsChildOf(Other.class, class'skaarjpack.RazorFly') || ClassIsChildOf(Other.class, class'skaarjpack.SkaarjPupae') ) + { + Other.TakeDamage(DamageMax*HeadShotDamageMult, Instigator, HitLocation, Momentum * X, DamageTypeHeadShot); + + if ( (Pawn(Other).Health <= 0) && (Pawn(Other).Health + DamageMax*HeadShotDamageMult > 0) ) + Instigator.ReceiveLocalizedMessage(class'SpecialKillMessage', 0, Instigator.PlayerReplicationInfo, None, None); + } + else if (HitVertical > Other.CollisionHeight * 0.8 ) + { + Other.TakeDamage(DamageMax*HeadShotDamageMult, Instigator, HitLocation, Momentum * X, DamageTypeHeadShot); + + if ( (Pawn(Other).Health <= 0) && (Pawn(Other).Health + DamageMax*HeadShotDamageMult > 0) ) + Instigator.ReceiveLocalizedMessage(class'SpecialKillMessage', 0, Instigator.PlayerReplicationInfo, None, None); + } + else if (HitVertical > Other.CollisionHeight * -0.4) + Other.TakeDamage(DamageMax, Instigator, HitLocation, Momentum * X, DamageType); + } + else + Other.TakeDamage(DamageMax*LimbShotDamageMult, Instigator, HitLocation, Momentum * X, DamageType); + } + else + Other.TakeDamage(DamageMax, Instigator, HitLocation, Momentum*X, DamageType); + } + else + Other.TakeDamage(DamageMax, Instigator, HitLocation, Momentum * X, DamageType); + } + else + HitLocation = HitLocation + 2.0 * HitNormal; + } + else + { + HitLocation = End; + HitNormal = Normal(Start - End); + } + + if ( (HitNormal != Vect(0,0,0)) && (HitScanBlockingVolume(Other) == None) ) + { + S = Weapon.Spawn(class'FX_SniperWallHitEffect',,, HitLocation, rotator(-1 * HitNormal)); + if ( S != None ) + S.FireStart = Start; + } + + SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, 0); +} + +function SpawnBeamEffect(Vector Start, Rotator Dir, Vector HitLocation, Vector HitNormal, int ReflectNum) +{ + local FX_SniperRifleBeamEffect Beam; + local vector SpawnVec; + + if (Weapon != None) + { + if (ClassicSniperRifle(Weapon).Zoomed) + SpawnVec = Instigator.Location + Instigator.EyePosition() - vect(0,0,10); + else SpawnVec = Weapon.GetBoneCoords('Bone_Flash').Origin; + //Spawn team colored beams + if ( (Instigator.PlayerReplicationInfo.Team != None) && (Instigator.PlayerReplicationInfo.Team.TeamIndex == 1) ) + Beam = Weapon.Spawn(TeamBeamClasses[1],,, SpawnVec, Dir); + else + Beam = Weapon.Spawn(TeamBeamClasses[0],,, SpawnVec, Dir); + + // prevents client side repositioning of beam start + Beam.AimAt(HitLocation, HitNormal, 1); + } +} + +function PlayFiring() +{ + Weapon.PlayAnim(FireAnims[Rand(3)], FireAnimRate, TweenTime); + Weapon.PlayOwnedSound(FireSound,SLOT_Interact,TransientSoundVolume,,,Default.FireAnimRate/FireAnimRate,false); + ClientPlayForceFeedback(FireForce); + FireCount++; +} + +/* +note that this weapon has been nerfed because of how horrendously overpowered +it was in 99 + +limb shot damage is only used vs monster +*/ +defaultproperties +{ + TeamBeamClasses(0)=Class'UT2341WeaponsReducedv1a.FX_SniperRifleBeamEffect' + TeamBeamClasses(1)=Class'UT2341WeaponsReducedv1a.FX_SniperRifleBeamEffectBlue' + TeamTracerClasses(0)=Class'UT2341WeaponsReducedv1a.UT2341SniperRifleTracerProjectile' + TeamTracerClasses(1)=Class'UT2341WeaponsReducedv1a.UT2341SniperRifleTracerProjectileBlue' + LimbShotDamageMult=0.750000 + FireStartOffset=(X=6.000000,Y=8.000000) + NewFlashClass=Class'UT2341WeaponsReducedv1a.FX_SniperRifleMuzFlash' + HeadShotDamageMult=2.250000 + DamageTypeHeadShot=Class'UT2341WeaponsReducedv1a.DamType_SniperHeadShot' + DamageType=Class'UT2341WeaponsReducedv1a.DamType_SniperShot' + DamageMin=67 + DamageMax=67 + FireEndAnim= + FireSound=Sound'UT2341Weapons_Sounds.Sniper.SniperFire' + FireRate=0.660000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341SniperAmmo' +} diff --git a/Sources/Classes/UT2341SniperRiflePickup.uc b/Sources/Classes/UT2341SniperRiflePickup.uc new file mode 100644 index 0000000..fa855da --- /dev/null +++ b/Sources/Classes/UT2341SniperRiflePickup.uc @@ -0,0 +1,61 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341SniperRiflePickup extends ClassicSniperRiflePickup; + +//=========================================================================== +// Because it's slot 0, game will try to delay the spawning of this pickup. +// We reject this. +//=========================================================================== +State Sleeping +{ + ignores Touch; + + function bool ReadyToPickup(float MaxWait) + { + return ( bPredictRespawns && (LatentFloat < MaxWait) ); + } + + function StartSleeping() {} + + function BeginState() + { + local int i; + + NetUpdateTime = Level.TimeSeconds - 1; + bHidden = true; + for ( i=0; i<4; i++ ) + TeamOwner[i] = None; + } + + function EndState() + { + NetUpdateTime = Level.TimeSeconds - 1; + bHidden = false; + } + +DelayedSpawn: + Goto('Respawn'); +Begin: + Sleep( GetReSpawnTime() - RespawnEffectTime ); +Respawn: + RespawnEffect(); + Sleep(RespawnEffectTime); + if (PickUpBase != None) + PickUpBase.TurnOn(); + GotoState('Pickup'); +} + +defaultproperties +{ + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341SniperRifle' + PickupSound=Sound'UT2341Weapons_Sounds.General.WeaponPickup' + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTSniper' + DrawScale=0.070000 + PrePivot=(Z=175.000000) + AmbientGlow=64 + RotationRate=(Yaw=5000) +} diff --git a/Sources/Classes/UT2341SniperRifleTracerProjectile.uc b/Sources/Classes/UT2341SniperRifleTracerProjectile.uc new file mode 100644 index 0000000..c45b873 --- /dev/null +++ b/Sources/Classes/UT2341SniperRifleTracerProjectile.uc @@ -0,0 +1,61 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341SniperRifleTracerProjectile extends TracerProjectile; + +var class MyTrailerClass; + +simulated function PostNetBeginPlay() +{ + local PlayerController PC; + local vector Dir,LinePos,LineDir, OldLocation; + + if ( (Level.NetMode == NM_Client) && (Level.GetLocalPlayerController() == Owner) ) + { + Destroy(); + return; + } + + if ( Level.NetMode != NM_DedicatedServer ) + { + if ( !PhysicsVolume.bWaterVolume ) + { + Trail = Spawn(MyTrailerClass,self); + Trail.Lifespan = Lifespan; + } + } + Velocity = Vector(Rotation) * (Speed); + Super.PostNetBeginPlay(); + + // see if local player controller near bullet, but missed + PC = Level.GetLocalPlayerController(); + if ( (PC != None) && (PC.Pawn != None) ) + { + Dir = Normal(Velocity); + LinePos = (Location + (Dir dot (PC.Pawn.Location - Location)) * Dir); + LineDir = PC.Pawn.Location - LinePos; + + if ( VSize(LineDir) < 150 ) + { + OldLocation = Location; + SetLocation(LinePos); + + if ( FRand() < 0.5 ) + PlaySound(sound'Impact3Snd',,,,80); + else + PlaySound(sound'Impact7Snd',,,,80); + SetLocation(OldLocation); + } + } +} + +defaultproperties +{ + MyTrailerClass=Class'UT2341WeaponsReducedv1a.FX_SniperTracerTrail' + Speed=40000.000000 + MaxSpeed=40000.000000 + bOwnerNoSee=False +} diff --git a/Sources/Classes/UT2341SniperRifleTracerProjectileBlue.uc b/Sources/Classes/UT2341SniperRifleTracerProjectileBlue.uc new file mode 100644 index 0000000..e40a44b --- /dev/null +++ b/Sources/Classes/UT2341SniperRifleTracerProjectileBlue.uc @@ -0,0 +1,12 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341SniperRifleTracerProjectileBlue extends UT2341SniperRifleTracerProjectile; + +defaultproperties +{ + MyTrailerClass=Class'UT2341WeaponsReducedv1a.FX_SniperTracerTrailBlue' +} diff --git a/Sources/Classes/UT2341SniperZoomFire.uc b/Sources/Classes/UT2341SniperZoomFire.uc new file mode 100644 index 0000000..4fb84ae --- /dev/null +++ b/Sources/Classes/UT2341SniperZoomFire.uc @@ -0,0 +1,21 @@ +class UT2341SniperZoomFire extends WeaponFire; + +function PlayFiring() +{ + Weapon.PlayOwnedSound(FireSound,SLOT_Interact,TransientSoundVolume,,TransientSoundRadius,Default.FireAnimRate/FireAnimRate,false); + ClientPlayForceFeedback(FireForce); // jdf + + FireCount++; +} + +defaultproperties +{ + bWaitForRelease=True + bModeExclusive=False + FireAnim= + FireLoopAnim= + FireEndAnim= + FireRate=0.100000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341SniperAmmo' + BotRefireRate=0.300000 +} diff --git a/Sources/Classes/UT2341SuperShockRifle.uc b/Sources/Classes/UT2341SuperShockRifle.uc new file mode 100644 index 0000000..087e9ff --- /dev/null +++ b/Sources/Classes/UT2341SuperShockRifle.uc @@ -0,0 +1,21 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341SuperShockRifle extends UT2341ShockRifle; + +defaultproperties +{ + EffectColor=(B=0,G=100,R=255) + FireModeClass(0)=Class'UT2341WeaponsReducedv1a.UT2341SuperShockRifleBeamFire' + FireModeClass(1)=Class'UT2341WeaponsReducedv1a.UT2341SuperShockRifleBeamFire' + HudColor=(B=0,G=100,R=255) + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341SuperShockRiflePickup' + AttachmentClass=Class'UT2341WeaponsReducedv1a.UT2341SuperShockRifleAttachment' + IconMaterial=Texture'UT2341Weapons_Tex.Icons.Icon_SuperShockRifle' + ItemName="Super Shock Rifle" + LightHue=30 + Skins(0)=Shader'UT2341Weapons_Tex.ASMD-Weapon.InstagibShader' +} diff --git a/Sources/Classes/UT2341SuperShockRifleAmmo.uc b/Sources/Classes/UT2341SuperShockRifleAmmo.uc new file mode 100644 index 0000000..5cc2d44 --- /dev/null +++ b/Sources/Classes/UT2341SuperShockRifleAmmo.uc @@ -0,0 +1,15 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341SuperShockRifleAmmo extends ShockAmmo; + +defaultproperties +{ + MaxAmmo=1 + InitialAmount=1 + PickupClass=Class'UT2341WeaponsReducedv1a.UT2341ShockRifleAmmoPickup' + ItemName="Super Shock Core" +} diff --git a/Sources/Classes/UT2341SuperShockRifleAttachment.uc b/Sources/Classes/UT2341SuperShockRifleAttachment.uc new file mode 100644 index 0000000..3805567 --- /dev/null +++ b/Sources/Classes/UT2341SuperShockRifleAttachment.uc @@ -0,0 +1,14 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341SuperShockRifleAttachment extends UT2341ShockRifleAttachment; + +defaultproperties +{ + MuzFlashClass=Class'UT2341WeaponsReducedv1a.FX_SuperShockRifleMuzFlash3rd' + LightHue=30 + Skins(0)=Shader'UT2341Weapons_Tex.ASMD-Weapon.InstagibShader' +} diff --git a/Sources/Classes/UT2341SuperShockRifleBeamFire.uc b/Sources/Classes/UT2341SuperShockRifleBeamFire.uc new file mode 100644 index 0000000..25b4a5d --- /dev/null +++ b/Sources/Classes/UT2341SuperShockRifleBeamFire.uc @@ -0,0 +1,25 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341SuperShockRifleBeamFire extends ShockBeamFire; + +var class BeamImpactEffectClass; + +defaultproperties +{ + BeamImpactEffectClass=Class'UT2341WeaponsReducedv1a.FX_SuperShockRifleImpact' + BeamEffectClass=Class'UT2341WeaponsReducedv1a.FX_SuperShockRifleBeamEffect' + DamageType=Class'UT2341WeaponsReducedv1a.DamType_SuperShockRifleBeam' + DamageMin=1000 + DamageMax=1000 + TraceRange=50000.000000 + Momentum=150000.000000 + FireSound=Sound'UT2341Weapons_Sounds.ShockRifle.TazerFire' + FireRate=0.850000 + AmmoClass=Class'UT2341WeaponsReducedv1a.UT2341SuperShockRifleAmmo' + AmmoPerFire=0 + FlashEmitterClass=Class'UT2341WeaponsReducedv1a.FX_SuperShockRifleBeamMuzFlash' +} diff --git a/Sources/Classes/UT2341SuperShockRiflePickup.uc b/Sources/Classes/UT2341SuperShockRiflePickup.uc new file mode 100644 index 0000000..af3ffa2 --- /dev/null +++ b/Sources/Classes/UT2341SuperShockRiflePickup.uc @@ -0,0 +1,78 @@ +/************************************************************* +* +* +* +*************************************************************/ + +class UT2341SuperShockRiflePickup extends ShockRiflePickup; + +static function StaticPrecache(LevelInfo L) +{ + /* + L.AddPrecacheMaterial(Material'XEffects.ShockHeatDecal'); + L.AddPrecacheMaterial(Material'XEffectMat.shock_flash'); + L.AddPrecacheMaterial(Material'XEffectMat.shock_flare_a'); + L.AddPrecacheMaterial(Material'XEffectMat.shock_core'); + L.AddPrecacheMaterial(Material'XEffectMat.purple_line'); + L.AddPrecacheMaterial(Material'XEffectMat.shock_sparkle'); + L.AddPrecacheMaterial(Material'XEffectMat.shock_core_low'); + L.AddPrecacheMaterial(Material'XEffectMat.shock_Energy_green_faded'); + L.AddPrecacheMaterial(Material'XEffectMat.Shock_Elec_a'); + L.AddPrecacheMaterial(Material'XEffectMat.shock_gradient_b'); + L.AddPrecacheMaterial(Material'XEffectMat.Shock_ring_a'); + L.AddPrecacheMaterial(Material'XEffectMat.ShockComboFlash'); + L.AddPrecacheMaterial(Material'XGameShaders.shock_muzflash_1st'); + L.AddPrecacheMaterial(Material'XGameShaders.WeaponShaders.shock_muzflash_3rd'); + L.AddPrecacheMaterial(Material'XWeapons_rc.ShockBeamTex'); + L.AddPrecacheMaterial(Material'XEffects.SaDScorcht'); + L.AddPrecacheMaterial(Material'DeployableTex.C_T_Electricity_SG'); + L.AddPrecacheMaterial(Material'UT2004Weapons.ShockRipple'); + */ + L.AddPrecacheStaticMesh(StaticMesh'Editor.TexPropSphere'); + L.AddPrecacheStaticMesh(StaticMesh'UT2341Weapons_SM.UTASMD'); +} + +simulated function UpdatePrecacheMaterials() +{ + /* + Level.AddPrecacheMaterial(Material'XEffects.ShockHeatDecal'); + Level.AddPrecacheMaterial(Material'XEffectMat.shock_flash'); + Level.AddPrecacheMaterial(Material'XEffectMat.shock_flare_a'); + Level.AddPrecacheMaterial(Material'XEffectMat.shock_core'); + Level.AddPrecacheMaterial(Material'XEffectMat.purple_line'); + Level.AddPrecacheMaterial(Material'XEffectMat.shock_sparkle'); + Level.AddPrecacheMaterial(Material'XEffectMat.shock_core_low'); + Level.AddPrecacheMaterial(Material'XEffectMat.shock_Energy_green_faded'); + Level.AddPrecacheMaterial(Material'XEffectMat.Shock_Elec_a'); + Level.AddPrecacheMaterial(Material'XEffectMat.shock_gradient_b'); + Level.AddPrecacheMaterial(Material'XEffectMat.Shock_ring_a'); + Level.AddPrecacheMaterial(Material'XEffectMat.ShockComboFlash'); + Level.AddPrecacheMaterial(Material'XGameShaders.shock_muzflash_1st'); + Level.AddPrecacheMaterial(Material'XGameShaders.WeaponShaders.shock_muzflash_3rd'); + Level.AddPrecacheMaterial(Material'XWeapons_rc.ShockBeamTex'); + Level.AddPrecacheMaterial(Material'DeployableTex.C_T_Electricity_SG'); + Level.AddPrecacheMaterial(Material'XEffects.SaDScorcht'); + Level.AddPrecacheMaterial(Material'UT2004Weapons.ShockRipple'); + */ + + Super(Weapon).UpdatePrecacheMaterials(); +} + +simulated function UpdatePrecacheStaticMeshes() +{ + //Level.AddPrecacheStaticMesh(StaticMesh'Editor.TexPropSphere'); + Super.UpdatePrecacheStaticMeshes(); +} + +defaultproperties +{ + InventoryType=Class'UT2341WeaponsReducedv1a.UT2341SuperShockRifle' + PickupMessage="You got the Super Shock Rifle." + PickupSound=Sound'UT2341Weapons_Sounds.General.WeaponPickup' + StaticMesh=StaticMesh'UT2341Weapons_SM.General.UTASMD' + DrawScale=0.075000 + PrePivot=(Z=100.000000) + Skins(0)=Shader'UT2341Weapons_Tex.ASMD-Weapon.InstagibShader' + AmbientGlow=64 + RotationRate=(Yaw=5000) +} diff --git a/Sources/System b/Sources/System new file mode 100644 index 0000000..582ffc4 Binary files /dev/null and b/Sources/System differ diff --git a/Sources/build.bat b/Sources/build.bat new file mode 100644 index 0000000..56c555b --- /dev/null +++ b/Sources/build.bat @@ -0,0 +1,48 @@ +@echo off +setlocal enabledelayedexpansion enableextensions +set BUILD_DIR=%~dp0 + +pushd "%BUILD_DIR%" + +for /f "delims=" %%X IN ('dir /B /A /S *') DO ( + for %%D in ("%%~dpX\.") do ( + set PACKAGE_NAME=%%~nxD + goto FoundPkgName + ) +) + +:FoundPkgName +pushd ..\System + +:: make sure to always rebuild the package +:: New package GUID, No doubts about staleness +del %PACKAGE_NAME%.u +del %PACKAGE_NAME%.ucl + +ucc make -ini="%BUILD_DIR%make.ini" + +popd +:: dont do the post-process steps if compilation failed +if ERRORLEVEL 1 goto cleanup +pushd ..\System + +:: Generate compressed file for redirects +ucc compress %PACKAGE_NAME%.u + +:: Dump i18n strings +del %PACKAGE_NAME%.int +ucc dumpint %PACKAGE_NAME%.u + +:: copy to release location +copy %PACKAGE_NAME%.u "%BUILD_DIR%System" >NUL +copy %PACKAGE_NAME%.ucl "%BUILD_DIR%System" >NUL +copy %PACKAGE_NAME%.int "%BUILD_DIR%System" >NUL +copy %PACKAGE_NAME%.u.uz2 "%BUILD_DIR%System" >NUL + +popd + +if exist "PostBuildHook.bat" call "PostBuildHook.bat" + +:cleanup +popd +endlocal diff --git a/Sources/make.ini b/Sources/make.ini new file mode 100644 index 0000000..ee86e47 --- /dev/null +++ b/Sources/make.ini @@ -0,0 +1,56 @@ +[Engine.Engine] +EditorEngine=Editor.EditorEngine + +[Editor.EditorEngine] +CacheSizeMegs=32 +EditPackages=Core +EditPackages=Engine +EditPackages=Fire +EditPackages=Editor +EditPackages=UnrealEd +EditPackages=IpDrv +EditPackages=UWeb +EditPackages=GamePlay +EditPackages=UnrealGame +EditPackages=XGame_rc +EditPackages=XEffects +EditPackages=XWeapons_rc +EditPackages=XPickups_rc +EditPackages=XPickups +EditPackages=XGame +EditPackages=XWeapons +EditPackages=XInterface +EditPackages=XAdmin +EditPackages=XWebAdmin +EditPackages=Vehicles +EditPackages=BonusPack +EditPackages=SkaarjPack_rc +EditPackages=SkaarjPack +EditPackages=UTClassic +EditPackages=UT2k4Assault +EditPackages=Onslaught +EditPackages=GUI2K4 +EditPackages=UT2k4AssaultFull +EditPackages=OnslaughtFull +EditPackages=xVoting +EditPackages=StreamlineFX +EditPackages=UTV2004c +EditPackages=UTV2004s +EditPackages=UT2341WeaponsReducedv1a + +[Core.System] +SavePath=../Save +CachePath=../Cache +CacheExt=.uxx +CacheRecordPath=../System/*.ucl +MusicPath=../Music +SpeechPath=../Speech +Paths=../System/*.u +Paths=../Maps/*.ut2 +Paths=../Textures/*.utx +Paths=../Sounds/*.uax +Paths=Sounds/*.uax +Paths=../Music/*.umx +Paths=../StaticMeshes/*.usx +Paths=../Animations/*.ukx +Paths=../Saves/*.uvx diff --git a/System/UT2341WeaponsReducedv1a.int b/System/UT2341WeaponsReducedv1a.int new file mode 100644 index 0000000..36bba67 --- /dev/null +++ b/System/UT2341WeaponsReducedv1a.int @@ -0,0 +1,195 @@ +[DamType_BioGel] +DeathString="%o drank a glass of %k's dripping green load." +FemaleSuicide="%o slimed herself." +MaleSuicide="%o slimed himself." + +[DamType_Enforcer] +DeathString="%k riddled %o full of holes with the Enforcer." +FemaleSuicide="%o shot herself in the foot." +MaleSuicide="%o shot himself in the foot." + +[DamType_Flak] +DeathString="%o was ripped to shreds by %k's flak cannon." +FemaleSuicide="%o was perforated by her own flak." +MaleSuicide="%o was perforated by his own flak." + +[DamType_FlakShell] +FemaleSuicide="%o blew herself up with a flak shell." +MaleSuicide="%o blew himself up with a flak shell." + +[DamType_Hammer] +DeathString="%o got smeared by %k's piston." +FemaleSuicide="%o threw her weight around once too often." +MaleSuicide="%o threw his weight around once too often." + +[DamType_MinigunBullet] +DeathString="%k's minigun turned %o into a leaky piece of meat." +FemaleSuicide="%o turned the minigun on herself." +MaleSuicide="%o turned the minigun on himself." + +[DamType_Pulse] +DeathString="%o ate %k's burning plasma death." +FemaleSuicide="%o fried herself with her own plasma blast." +MaleSuicide="%o fried himself with his own plasma blast." + +[DamType_RipperBlade] +DeathString="%k ripped a chunk of meat out of %o with the Ripper." +FemaleSuicide="%o shredded herself." +MaleSuicide="%o shredded himself." + +[DamType_RipperBladeHead] +DeathString="%k took off %o's head with the Ripper." +FemaleSuicide="%o took her own head off with a razorblade." +MaleSuicide="%o took his own head off with a razorblade." + +[DamType_Rocket] +DeathString="%o was smacked down by %k's rocket launcher." +FemaleSuicide="%o fired her rocket prematurely." +MaleSuicide="%o fired his rocket prematurely." + +[DamType_ShockRifleBeam] +DeathString="%k inflicted mortal damage upon %o with the shock rifle." + +[DamType_SniperHeadShot] +DeathString="%k put a bullet in %o's head." + +[DamType_SniperShot] +DeathString="%k put a hole in %o." + +[DamType_SuperShockRifleBeam] +DeathString="%k inflicted mortal damage upon %o with the shock rifle." + +[Mut_UT2341Instagib] +FriendlyName="UT2341: Instagib" +Description="Instagib, UT2341-style." + +[Mut_UT2341Replacement] +FriendlyName="Unreal Tournament 2341" +Description="Replaces the standard weapons with UT99 equivalents." + +[UT2341BioAmmo] +ItemName="Bio-Rifle Goop" + +[UT2341BioAmmoPickup] +PickupMessage="You picked up some Tarydium sludge." + +[UT2341BioRifle] +Description="Classification: Toxic Rifle||Primary Fire: Wads of Tarydium byproduct are lobbed at a medium rate of fire.||Secondary Fire: When trigger is held down, the BioRifle will create a much larger wad of byproduct. When this wad is launched, it will burst into smaller wads which will adhere to any surfaces.||Techniques: Byproducts will adhere to walls, floors, or ceilings. Chain reactions can be caused by covering entryways with this lethal green waste." +ItemName="GES Bio-Rifle" + +[UT2341BioRiflePickup] +PickupMessage="You got the Bio-Rifle." + +[UT2341Enforcer] +Description="Classification: Light PistolnnPrimary Fire: Accurate but slow firing instant hit.nnSecondary Fire: Sideways, or 'Gangsta' firing mode, shoots faster and less accurately than the primary fire.nnTechniques: Collect two for twice the damage." +ItemName="Enforcer" + +[UT2341EnforcerPickup] +PickupMessage="You got an Enforcer." + +[UT2341FlakAmmo] +ItemName="Flak Shells" + +[UT2341FlakAmmoPickup] +PickupMessage="You picked up 10 Flak Shells." + +[UT2341FlakCannon] +Description="Classification: Heavy Shrapnel||Primary Fire: White hot chunks of scrap metal are sprayed forth, shotgun style.||Secondary Fire: A grenade full of shrapnel is lobbed at the enemy.||Techniques: The Flak Cannon is far more useful in close range combat situations." +ItemName="Flak Cannon" + +[UT2341FlakCannonPickup] +PickupMessage="You got the Flak Cannon." + +[UT2341Hammer] +Description="Classification: Melee Piston||Primary Fire: When trigger is held down, touch opponents with this piston to inflict massive damage.||Secondary Fire: Damages opponents at close range and has the ability to deflect projectiles.||Techniques: Shoot at the ground while jumping to jump extra high." +ItemName="Impact Hammer" + +[UT2341HammerAmmo] +ItemName="HammerCharge" + +[UT2341Minigun] +Description="Classification: Gatling Gun||Primary Fire: Bullets are sprayed forth at a medium to fast rate of fire and good accuracy.||Secondary Fire: Minigun fires twice as fast and is half as accurate.||Techniques: Secondary fire is much more useful at close range, but can eat up tons of ammunition." + +[UT2341MinigunAmmo] +ItemName="Bullets" + +[UT2341MinigunAmmoPickup] +PickupMessage="You picked up 50 bullets." + +[UT2341MinigunPickup] +PickupMessage="You got the Minigun." + +[UT2341PulseAmmo] +ItemName="Pulse Ammo" + +[UT2341PulseAmmoPickup] +PickupMessage="You picked up pulse charges." + +[UT2341PulseGun] +Description="Classification: Plasma Rifle||Primary Fire: Medium sized, fast moving plasma balls are fired at a fast rate of fire.||Secondary Fire: A bolt of green lightning is expelled for 100 meters, which will shock all opponents.||Techniques: Firing and keeping the secondary fire's lightning on an opponent will melt them in seconds." +ItemName="Pulse Gun" + +[UT2341PulseGunPickup] +PickupMessage="You got the Pulse Gun." + +[UT2341Redeemer] +Description="Classification: Thermonuclear Device||Primary Fire: Launches a huge yet slow moving missile that, upon striking a solid surface, will explode and send out a gigantic shock wave, instantly pulverizing anyone or anything within its colossal radius, including yourself.||Secondary Fire: Take control of the missile and fly it anywhere. You can press the primary fire button to explode the missile early.||Techniques: Remember that while this rocket is being piloted you are a sitting duck. If an opponent manages to hit your incoming Redeemer missile while it's in the air, the missile will explode harmlessly." +ItemName="Redeemer" + +[UT2341RedeemerAmmo] +ItemName="UT Redeemer Ammo" + +[UT2341RedeemerPickup] +PickupMessage="You got the Redeemer." + +[UT2341Ripper] +Description="Classification: Ballistic Blade Launcher||Primary Fire: Razor sharp titanium disks are launched at a medium rate of speed. Shots will ricochet off of any surfaces.||Secondary Fire: Explosive disks are launched at a slow rate of fire.||Techniques: Aim for the necks of your opponents." +ItemName="Ripper" + +[UT2341RipperAmmo] +ItemName="Razorblades" + +[UT2341RipperAmmoPickup] +PickupMessage="You picked up razor blades." + +[UT2341RipperPickup] +PickupMessage="You got the Ripper." + +[UT2341RocketAmmo] +ItemName="Rockets" + +[UT2341RocketAmmoPickup] +PickupMessage="You picked up a rocket can." + +[UT2341RocketLauncher] +Description="Classification: Heavy Ballistic||Primary Fire: Slow moving but deadly rockets are fired at opponents. Trigger can be held down to load up to six rockets at a time, which can be fired at once.||Secondary Fire: Grenades are lobbed from the barrel. Secondary trigger can be held as well to load up to six grenades.||Techniques: Keeping this weapon pointed at an opponent will cause it to lock on, and while the gun is locked the next rocket fired will be a homing rocket. Because the Rocket Launcher can load up multiple rockets, it fires when you release the fire button." +ItemName="Rocket Launcher" + +[UT2341RocketLauncherPickup] +PickupMessage="You got the Rocket Launcher." + +[UT2341ShockRifle] +Description="Classification: Energy Rifle||Primary Fire: Instant hit laser beam.||Secondary Fire: Large, slow moving plasma balls.||Techniques: Hitting the secondary fire plasma balls with the regular fire's laser beam will cause an immensely powerful explosion." +ItemName="ASMD Shock Rifle" + +[UT2341ShockRiflePickup] +PickupMessage="You got the ASMD Shock Rifle." + +[UT2341SniperAmmo] +ItemName="Sniper Rounds" + +[UT2341SniperAmmoPickup] +PickupMessage="You picked up a box of sniper rounds." + +[UT2341SniperRifle] +Description="Classification: Long Range Ballistic||Regular Fire: Fires a high powered bullet. Can kill instantly when applied to the cranium of opposing forces. ||Secondary Fire: Zooms the rifle in, up to eight times normal vision. Allows for extreme precision from hundreds of yards away.||Techniques: Great for long distance headshots!" + +[UT2341SuperShockRifle] +ItemName="Super Shock Rifle" + +[UT2341SuperShockRifleAmmo] +ItemName="Super Shock Core" + +[UT2341SuperShockRiflePickup] +PickupMessage="You got the Super Shock Rifle." + diff --git a/System/UT2341WeaponsReducedv1a.u b/System/UT2341WeaponsReducedv1a.u new file mode 100644 index 0000000..866699c Binary files /dev/null and b/System/UT2341WeaponsReducedv1a.u differ diff --git a/System/UT2341WeaponsReducedv1a.ucl b/System/UT2341WeaponsReducedv1a.ucl new file mode 100644 index 0000000..51811c3 --- /dev/null +++ b/System/UT2341WeaponsReducedv1a.ucl @@ -0,0 +1,14 @@ +Mutator=(ClassName=UT2341WeaponsReducedv1a.Mut_UT2341Instagib,GroupName=Arena,IconMaterialName=MutatorArt.nosym,FriendlyName=UT2341WeaponsReducedv1a.Mut_UT2341Instagib.FriendlyName,Description=UT2341WeaponsReducedv1a.Mut_UT2341Instagib.Description,FriendlyName=UT2341WeaponsReducedv1a.Mut_UT2341Instagib.FriendlyName,FallbackName="UT2341: Instagib",FallbackDesc="Instagib, UT2341-style.") +Mutator=(ClassName=UT2341WeaponsReducedv1a.Mut_UT2341Replacement,GroupName=Arena,IconMaterialName=MutatorArt.nosym,FriendlyName=UT2341WeaponsReducedv1a.Mut_UT2341Replacement.FriendlyName,Description=UT2341WeaponsReducedv1a.Mut_UT2341Replacement.Description,FriendlyName=UT2341WeaponsReducedv1a.Mut_UT2341Replacement.FriendlyName,FallbackName="Unreal Tournament 2341",FallbackDesc="Replaces the standard weapons with UT99 equivalents.") +Weapon=(ClassName=UT2341WeaponsReducedv1a.UT2341BioRifle,PickupClassName=UT2341WeaponsReducedv1a.UT2341BioRiflePickup,AttachmentClassName=UT2341WeaponsReducedv1a.UT2341BioAttachment,FriendlyName=UT2341WeaponsReducedv1a.UT2341BioRifle.ItemName,Description=UT2341WeaponsReducedv1a.UT2341BioRifle.Description,FallbackName="GES Bio-Rifle",FallbackDesc="Classification: Toxic Rifle||Primary Fire: Wads of Tarydium byproduct are lobbed at a medium rate of fire.||Secondary Fire: When trigger is held down, the BioRifle will create a much larger wad of byproduct. When this wad is launched, it will burst into smaller wads which will adhere to any surfaces.||Techniques: Byproducts will adhere to walls, floors, or ceilings. Chain reactions can be caused by covering entryways with this lethal green waste.") +Weapon=(ClassName=UT2341WeaponsReducedv1a.UT2341Enforcer,PickupClassName=UT2341WeaponsReducedv1a.UT2341EnforcerPickup,AttachmentClassName=UT2341WeaponsReducedv1a.UT2341EnforcerAttachment,FriendlyName=UT2341WeaponsReducedv1a.UT2341Enforcer.ItemName,Description=UT2341WeaponsReducedv1a.UT2341Enforcer.Description,FallbackName="Enforcer",FallbackDesc="Classification: Light PistolnnPrimary Fire: Accurate but slow firing instant hit.nnSecondary Fire: Sideways, or 'Gangsta' firing mode, shoots faster and less accurately than the primary fire.nnTechniques: Collect two for twice the damage.") +Weapon=(ClassName=UT2341WeaponsReducedv1a.UT2341FlakCannon,PickupClassName=UT2341WeaponsReducedv1a.UT2341FlakCannonPickup,AttachmentClassName=UT2341WeaponsReducedv1a.UT2341FlakAttachment,FriendlyName=UT2341WeaponsReducedv1a.UT2341FlakCannon.ItemName,Description=UT2341WeaponsReducedv1a.UT2341FlakCannon.Description,FallbackName="Flak Cannon",FallbackDesc="Classification: Heavy Shrapnel||Primary Fire: White hot chunks of scrap metal are sprayed forth, shotgun style.||Secondary Fire: A grenade full of shrapnel is lobbed at the enemy.||Techniques: The Flak Cannon is far more useful in close range combat situations.") +Weapon=(ClassName=UT2341WeaponsReducedv1a.UT2341Hammer,PickupClassName=XWeapons.ShieldGunPickup,AttachmentClassName=UT2341WeaponsReducedv1a.UT2341HammerAttachment,FriendlyName=UT2341WeaponsReducedv1a.UT2341Hammer.ItemName,Description=UT2341WeaponsReducedv1a.UT2341Hammer.Description,FallbackName="Impact Hammer",FallbackDesc="Classification: Melee Piston||Primary Fire: When trigger is held down, touch opponents with this piston to inflict massive damage.||Secondary Fire: Damages opponents at close range and has the ability to deflect projectiles.||Techniques: Shoot at the ground while jumping to jump extra high.") +Weapon=(ClassName=UT2341WeaponsReducedv1a.UT2341Minigun,PickupClassName=UT2341WeaponsReducedv1a.UT2341MinigunPickup,AttachmentClassName=UT2341WeaponsReducedv1a.UT2341MinigunAttachment,FriendlyName=UT2341WeaponsReducedv1a.UT2341Minigun.ItemName,Description=UT2341WeaponsReducedv1a.UT2341Minigun.Description,FallbackName="Minigun",FallbackDesc="Classification: Gatling Gun||Primary Fire: Bullets are sprayed forth at a medium to fast rate of fire and good accuracy.||Secondary Fire: Minigun fires twice as fast and is half as accurate.||Techniques: Secondary fire is much more useful at close range, but can eat up tons of ammunition.") +Weapon=(ClassName=UT2341WeaponsReducedv1a.UT2341PulseGun,PickupClassName=UT2341WeaponsReducedv1a.UT2341PulseGunPickup,AttachmentClassName=UT2341WeaponsReducedv1a.UT2341PulseAttachment,FriendlyName=UT2341WeaponsReducedv1a.UT2341PulseGun.ItemName,Description=UT2341WeaponsReducedv1a.UT2341PulseGun.Description,FallbackName="Pulse Gun",FallbackDesc="Classification: Plasma Rifle||Primary Fire: Medium sized, fast moving plasma balls are fired at a fast rate of fire.||Secondary Fire: A bolt of green lightning is expelled for 100 meters, which will shock all opponents.||Techniques: Firing and keeping the secondary fire's lightning on an opponent will melt them in seconds.") +Weapon=(ClassName=UT2341WeaponsReducedv1a.UT2341Redeemer,PickupClassName=UT2341WeaponsReducedv1a.UT2341RedeemerPickup,AttachmentClassName=UT2341WeaponsReducedv1a.UT2341RedeemerAttachment,FriendlyName=UT2341WeaponsReducedv1a.UT2341Redeemer.ItemName,Description=UT2341WeaponsReducedv1a.UT2341Redeemer.Description,FallbackName="Redeemer",FallbackDesc="Classification: Thermonuclear Device||Primary Fire: Launches a huge yet slow moving missile that, upon striking a solid surface, will explode and send out a gigantic shock wave, instantly pulverizing anyone or anything within its colossal radius, including yourself.||Secondary Fire: Take control of the missile and fly it anywhere. You can press the primary fire button to explode the missile early.||Techniques: Remember that while this rocket is being piloted you are a sitting duck. If an opponent manages to hit your incoming Redeemer missile while it's in the air, the missile will explode harmlessly.") +Weapon=(ClassName=UT2341WeaponsReducedv1a.UT2341Ripper,PickupClassName=UT2341WeaponsReducedv1a.UT2341RipperPickup,AttachmentClassName=UT2341WeaponsReducedv1a.UT2341RipperAttachment,FriendlyName=UT2341WeaponsReducedv1a.UT2341Ripper.ItemName,Description=UT2341WeaponsReducedv1a.UT2341Ripper.Description,FallbackName="Ripper",FallbackDesc="Classification: Ballistic Blade Launcher||Primary Fire: Razor sharp titanium disks are launched at a medium rate of speed. Shots will ricochet off of any surfaces.||Secondary Fire: Explosive disks are launched at a slow rate of fire.||Techniques: Aim for the necks of your opponents.") +Weapon=(ClassName=UT2341WeaponsReducedv1a.UT2341RocketLauncher,PickupClassName=UT2341WeaponsReducedv1a.UT2341RocketLauncherPickup,AttachmentClassName=UT2341WeaponsReducedv1a.UT2341RocketAttachment,FriendlyName=UT2341WeaponsReducedv1a.UT2341RocketLauncher.ItemName,Description=UT2341WeaponsReducedv1a.UT2341RocketLauncher.Description,FallbackName="Rocket Launcher",FallbackDesc="Classification: Heavy Ballistic||Primary Fire: Slow moving but deadly rockets are fired at opponents. Trigger can be held down to load up to six rockets at a time, which can be fired at once.||Secondary Fire: Grenades are lobbed from the barrel. Secondary trigger can be held as well to load up to six grenades.||Techniques: Keeping this weapon pointed at an opponent will cause it to lock on, and while the gun is locked the next rocket fired will be a homing rocket. Because the Rocket Launcher can load up multiple rockets, it fires when you release the fire button.") +Weapon=(ClassName=UT2341WeaponsReducedv1a.UT2341ShockRifle,PickupClassName=UT2341WeaponsReducedv1a.UT2341ShockRiflePickup,AttachmentClassName=UT2341WeaponsReducedv1a.UT2341ShockRifleAttachment,FriendlyName=UT2341WeaponsReducedv1a.UT2341ShockRifle.ItemName,Description=UT2341WeaponsReducedv1a.UT2341ShockRifle.Description,FallbackName="ASMD Shock Rifle",FallbackDesc="Classification: Energy Rifle||Primary Fire: Instant hit laser beam.||Secondary Fire: Large, slow moving plasma balls.||Techniques: Hitting the secondary fire plasma balls with the regular fire's laser beam will cause an immensely powerful explosion.") +Weapon=(ClassName=UT2341WeaponsReducedv1a.UT2341SniperRifle,PickupClassName=UT2341WeaponsReducedv1a.UT2341SniperRiflePickup,AttachmentClassName=UT2341WeaponsReducedv1a.UT2341SniperRifleAttachment,FriendlyName=UT2341WeaponsReducedv1a.UT2341SniperRifle.ItemName,Description=UT2341WeaponsReducedv1a.UT2341SniperRifle.Description,FallbackName="Sniper Rifle",FallbackDesc="Classification: Long Range Ballistic||Regular Fire: Fires a high powered bullet. Can kill instantly when applied to the cranium of opposing forces. ||Secondary Fire: Zooms the rifle in, up to eight times normal vision. Allows for extreme precision from hundreds of yards away.||Techniques: Great for long distance headshots!") +Weapon=(ClassName=UT2341WeaponsReducedv1a.UT2341SuperShockRifle,PickupClassName=UT2341WeaponsReducedv1a.UT2341SuperShockRiflePickup,AttachmentClassName=UT2341WeaponsReducedv1a.UT2341SuperShockRifleAttachment,FriendlyName=UT2341WeaponsReducedv1a.UT2341SuperShockRifle.ItemName,Description=UT2341WeaponsReducedv1a.UT2341SuperShockRifle.Description,FallbackName="Super Shock Rifle",FallbackDesc="Classification: Energy Rifle||Primary Fire: Instant hit laser beam.||Secondary Fire: Large, slow moving plasma balls.||Techniques: Hitting the secondary fire plasma balls with the regular fire's laser beam will cause an immensely powerful explosion.") \ No newline at end of file diff --git a/System/UT2341Weapons_BETA3.u b/System/UT2341Weapons_BETA3.u deleted file mode 100644 index 62e5662..0000000 Binary files a/System/UT2341Weapons_BETA3.u and /dev/null differ diff --git a/System/UT2341Weapons_BETA3.ucl b/System/UT2341Weapons_BETA3.ucl deleted file mode 100644 index a782bbf..0000000 --- a/System/UT2341Weapons_BETA3.ucl +++ /dev/null @@ -1,15 +0,0 @@ -Mutator=(ClassName=UT2341Weapons_BETA3.Mut_UT2341Instagib,GroupName=Arena,IconMaterialName=MutatorArt.nosym,FriendlyName=UT2341Weapons_BETA3.Mut_UT2341Instagib.FriendlyName,Description=UT2341Weapons_BETA3.Mut_UT2341Instagib.Description,FriendlyName=UT2341Weapons_BETA3.Mut_UT2341Instagib.FriendlyName,FallbackName="UT2341: Instagib",FallbackDesc="Instagib, UT2341-style.") -Mutator=(ClassName=UT2341Weapons_BETA3.Mut_UT2341Replacement,GroupName=Arena,IconMaterialName=MutatorArt.nosym,FriendlyName=UT2341Weapons_BETA3.Mut_UT2341Replacement.FriendlyName,Description=UT2341Weapons_BETA3.Mut_UT2341Replacement.Description,FriendlyName=UT2341Weapons_BETA3.Mut_UT2341Replacement.FriendlyName,FallbackName="Unreal Tournament 2341",FallbackDesc="Replaces the standard weapons with UT2341 equivalents. Modifies Pawn properties and the gravity to simulate Unreal Tournament.") -Weapon=(ClassName=UT2341Weapons_BETA3.UT2341BioRifle,PickupClassName=UT2341Weapons_BETA3.UT2341BioRiflePickup,AttachmentClassName=UT2341Weapons_BETA3.UT2341BioAttachment,FriendlyName=UT2341Weapons_BETA3.UT2341BioRifle.ItemName,Description=UT2341Weapons_BETA3.UT2341BioRifle.Description,FallbackName="GES Bio-Rifle",FallbackDesc="Classification: Toxic Rifle||Primary Fire: Wads of Tarydium byproduct are lobbed at a medium rate of fire.||Secondary Fire: When trigger is held down, the BioRifle will create a much larger wad of byproduct. When this wad is launched, it will burst into smaller wads which will adhere to any surfaces.||Techniques: Byproducts will adhere to walls, floors, or ceilings. Chain reactions can be caused by covering entryways with this lethal green waste.") -Weapon=(ClassName=UT2341Weapons_BETA3.UT2341Enforcer,PickupClassName=UT2341Weapons_BETA3.UT2341EnforcerPickup,AttachmentClassName=UT2341Weapons_BETA3.UT2341EnforcerAttachment,FriendlyName=UT2341Weapons_BETA3.UT2341Enforcer.ItemName,Description=UT2341Weapons_BETA3.UT2341Enforcer.Description,FallbackName="Enforcer",FallbackDesc="Classification: Light PistolnnPrimary Fire: Accurate but slow firing instant hit.nnSecondary Fire: Sideways, or 'Gangsta' firing mode, shoots faster and less accurately than the primary fire.nnTechniques: Collect two for twice the damage.") -Weapon=(ClassName=UT2341Weapons_BETA3.UT2341FlakCannon,PickupClassName=UT2341Weapons_BETA3.UT2341FlakCannonPickup,AttachmentClassName=UT2341Weapons_BETA3.UT2341FlakAttachment,FriendlyName=UT2341Weapons_BETA3.UT2341FlakCannon.ItemName,Description=UT2341Weapons_BETA3.UT2341FlakCannon.Description,FallbackName="Flak Cannon",FallbackDesc="Classification: Heavy Shrapnel||Primary Fire: White hot chunks of scrap metal are sprayed forth, shotgun style.||Secondary Fire: A grenade full of shrapnel is lobbed at the enemy.||Techniques: The Flak Cannon is far more useful in close range combat situations.") -Weapon=(ClassName=UT2341Weapons_BETA3.UT2341Hammer,PickupClassName=XWeapons.ShieldGunPickup,AttachmentClassName=UT2341Weapons_BETA3.UT2341HammerAttachment,FriendlyName=UT2341Weapons_BETA3.UT2341Hammer.ItemName,Description=UT2341Weapons_BETA3.UT2341Hammer.Description,FallbackName="Impact Hammer",FallbackDesc="Classification: Melee Piston||Primary Fire: When trigger is held down, touch opponents with this piston to inflict massive damage.||Secondary Fire: Damages opponents at close range and has the ability to deflect projectiles.||Techniques: Shoot at the ground while jumping to jump extra high.") -Weapon=(ClassName=UT2341Weapons_BETA3.UT2341Minigun,PickupClassName=UT2341Weapons_BETA3.UT2341MinigunPickup,AttachmentClassName=UT2341Weapons_BETA3.UT2341MinigunAttachment,FriendlyName=UT2341Weapons_BETA3.UT2341Minigun.ItemName,Description=UT2341Weapons_BETA3.UT2341Minigun.Description,FallbackName="Minigun",FallbackDesc="Classification: Gatling Gun||Primary Fire: Bullets are sprayed forth at a medium to fast rate of fire and good accuracy.||Secondary Fire: Minigun fires twice as fast and is half as accurate.||Techniques: Secondary fire is much more useful at close range, but can eat up tons of ammunition.") -Weapon=(ClassName=UT2341Weapons_BETA3.UT2341PulseGun,PickupClassName=UT2341Weapons_BETA3.UT2341PulseGunPickup,AttachmentClassName=UT2341Weapons_BETA3.UT2341PulseAttachment,FriendlyName=UT2341Weapons_BETA3.UT2341PulseGun.ItemName,Description=UT2341Weapons_BETA3.UT2341PulseGun.Description,FallbackName="Pulse Gun",FallbackDesc="Classification: Plasma Rifle||Primary Fire: Medium sized, fast moving plasma balls are fired at a fast rate of fire.||Secondary Fire: A bolt of green lightning is expelled for 100 meters, which will shock all opponents.||Techniques: Firing and keeping the secondary fire's lightning on an opponent will melt them in seconds.") -Weapon=(ClassName=UT2341Weapons_BETA3.UT2341Redeemer,PickupClassName=UT2341Weapons_BETA3.UT2341RedeemerPickup,AttachmentClassName=UT2341Weapons_BETA3.UT2341RedeemerAttachment,FriendlyName=UT2341Weapons_BETA3.UT2341Redeemer.ItemName,Description=UT2341Weapons_BETA3.UT2341Redeemer.Description,FallbackName="Redeemer",FallbackDesc="Classification: Thermonuclear Device||Primary Fire: Launches a huge yet slow moving missile that, upon striking a solid surface, will explode and send out a gigantic shock wave, instantly pulverizing anyone or anything within its colossal radius, including yourself.||Secondary Fire: Take control of the missile and fly it anywhere. You can press the primary fire button to explode the missile early.||Techniques: Remember that while this rocket is being piloted you are a sitting duck. If an opponent manages to hit your incoming Redeemer missile while it's in the air, the missile will explode harmlessly.") -Weapon=(ClassName=UT2341Weapons_BETA3.UT2341Ripper,PickupClassName=UT2341Weapons_BETA3.UT2341RipperPickup,AttachmentClassName=UT2341Weapons_BETA3.UT2341RipperAttachment,FriendlyName=UT2341Weapons_BETA3.UT2341Ripper.ItemName,Description=UT2341Weapons_BETA3.UT2341Ripper.Description,FallbackName="Ripper",FallbackDesc="Classification: Ballistic Blade Launcher||Primary Fire: Razor sharp titanium disks are launched at a medium rate of speed. Shots will ricochet off of any surfaces.||Secondary Fire: Explosive disks are launched at a slow rate of fire.||Techniques: Aim for the necks of your opponents.") -Weapon=(ClassName=UT2341Weapons_BETA3.UT2341RocketLauncher,PickupClassName=UT2341Weapons_BETA3.UT2341RocketLauncherPickup,AttachmentClassName=UT2341Weapons_BETA3.UT2341RocketAttachment,FriendlyName=UT2341Weapons_BETA3.UT2341RocketLauncher.ItemName,Description=UT2341Weapons_BETA3.UT2341RocketLauncher.Description,FallbackName="Rocket Launcher",FallbackDesc="Classification: Heavy Ballistic||Primary Fire: Slow moving but deadly rockets are fired at opponents. Trigger can be held down to load up to six rockets at a time, which can be fired at once.||Secondary Fire: Grenades are lobbed from the barrel. Secondary trigger can be held as well to load up to six grenades.||Techniques: Keeping this weapon pointed at an opponent will cause it to lock on, and while the gun is locked the next rocket fired will be a homing rocket. Because the Rocket Launcher can load up multiple rockets, it fires when you release the fire button.") -Weapon=(ClassName=UT2341Weapons_BETA3.UT2341ShockRifle,PickupClassName=UT2341Weapons_BETA3.UT2341ShockRiflePickup,AttachmentClassName=UT2341Weapons_BETA3.UT2341ShockRifleAttachment,FriendlyName=UT2341Weapons_BETA3.UT2341ShockRifle.ItemName,Description=UT2341Weapons_BETA3.UT2341ShockRifle.Description,FallbackName="ASMD Shock Rifle",FallbackDesc="Classification: Energy Rifle||Primary Fire: Instant hit laser beam.||Secondary Fire: Large, slow moving plasma balls.||Techniques: Hitting the secondary fire plasma balls with the regular fire's laser beam will cause an immensely powerful explosion.") -Weapon=(ClassName=UT2341Weapons_BETA3.UT2341SniperRifle,PickupClassName=UT2341Weapons_BETA3.UT2341SniperRiflePickup,AttachmentClassName=UT2341Weapons_BETA3.UT2341SniperRifleAttachment,FriendlyName=UT2341Weapons_BETA3.UT2341SniperRifle.ItemName,Description=UT2341Weapons_BETA3.UT2341SniperRifle.Description,FallbackName="Sniper Rifle",FallbackDesc="Classification: Long Range Ballistic||Regular Fire: Fires a high powered bullet. Can kill instantly when applied to the cranium of opposing forces. ||Secondary Fire: Zooms the rifle in, up to eight times normal vision. Allows for extreme precision from hundreds of yards away.||Techniques: Great for long distance headshots!") -Weapon=(ClassName=UT2341Weapons_BETA3.UT2341SuperShockRifle,PickupClassName=UT2341Weapons_BETA3.UT2341SuperShockRiflePickup,AttachmentClassName=UT2341Weapons_BETA3.UT2341SuperShockRifleAttachment,FriendlyName=UT2341Weapons_BETA3.UT2341SuperShockRifle.ItemName,Description=UT2341Weapons_BETA3.UT2341SuperShockRifle.Description,FallbackName="Super Shock Rifle",FallbackDesc="Classification: Energy Rifle||Primary Fire: Instant hit laser beam.||Secondary Fire: Large, slow moving plasma balls.||Techniques: Hitting the secondary fire plasma balls with the regular fire's laser beam will cause an immensely powerful explosion.") -Weapon=(ClassName=UT2341Weapons_BETA3.UT2341Translocator,PickupClassName=UT2341Weapons_BETA3.UT2341TransPickup,AttachmentClassName=UT2341Weapons_BETA3.UT2341TransAttachment,FriendlyName=UT2341Weapons_BETA3.UT2341Translocator.ItemName,Description=UT2341Weapons_BETA3.UT2341Translocator.Description,FallbackName="Translocator",FallbackDesc="The Translocator was originally designed by Liandri Corporation's R&D sector to facilitate the rapid recall of miners during tunnel collapses. However, rapid deresolution and reconstitution can have several unwelcome effects, including increases in aggression and paranoia.||In order to prolong the careers of today's contenders, limits have been placed on Translocator use in the lower-ranked leagues. The latest iteration of the Translocator features a remotely operated camera, exceptionally useful when scouting out areas of contention.|It should be noted that while viewing the camera's surveillance output, the user is effectively blind to their immediate surroundings.") \ No newline at end of file