*v@B/&CDэDƊ)@NoneMaxRangeMin RangeVectorXZY SuperWeaponsCoreEngineSystem Postal2Game RelativeTime RelativeSize InventoryTextureColorLifetimeRange UseSizeScale SizeScaleInitialParticlesPerSecondSecondsBeforeInactiveUseRegularSizeScaleAutomaticInitialSpawningStartVelocityRangeStartSizeRange MaxParticles DrawStyle GenExplosionRespawnDeadParticlesStartLocationRangeSpinParticlesSpinsPerSecondRangeTextureUSubdivisionsVectorSkinsTextureVSubdivisions StaticMeshStartSpinRangeBump AccelerationCollisionHeightInventoryTypeCollisionRadiusVelocityLossRangeBounceOffSomething PickupClassBaseFXUseAmmoForShotBlendBetweenSubdivisionsHasAmmo GetFireStartGetViewRotationFlying PreBeginPlay EmittersAddRelativeVelocityFadeOutPickupMessage SetupShot VelDampen ItemNameGetVelocityDirectionFrom DrawTypeUseRandomSubdivision MyDamageTypeStartFuelLeak BounceCrazy AmmoNameAttachmentClass BounceSound BlastOff ReplaceWith bUsesAltFire LifeSpanMesh GroupOffset ColorScaleShortSleeveTypeBegin GetMaker ShakeCameraFX GetRandPitchFirstStraightMPAmmoGiveCountUseColorScale Straight BeginStateDeadNPCAmmoGiveRangeServerAltFireCheckForHitTypeAltFire ProcessTouch Disabled MaleSuicideFemaleSuicidePouringAndDyingTickExplosionRadiusNotify_ShootLauncherHitWallSphereRadiusRangeExplosionDamage AmbientGlow GibModifierTimerFire RespawnTime RefireRate SwapClassAmmoGiveCountRotatorRelativeLocationStartVelocityRadialRange FireSoundWarnTargetPctProjectileClass bLeadTarget TakeDamagebBounceMaxAmmoUseDirectionAsMinSpeedForBounce MaxAmmoMP SetupThrownClientShootItNotifyControllersStaticPostBeginPlayServerForceFinishShootItClientForceFinish MaxSpeed DeathString ValidTargetMPNukeAttachmentDampingFactorRangeTransientSoundRadiusMPNukeAmmoPickup SoundPitchMPNukeAmmoInvHealth HolyWeaponSSbUpdateSimulatedPositionPlagueFixWeapon AmmoAmount HolyWeaponMPNukeWeaponSSbDynamicLight HolyTrailMakeSmokeTrailLightSaturation LightPeriod LightConeBlastOffVelMag FriendlyName Description LightRadiusCheckReplacementLightBrightness SoundRadiusPlayReloadingCalcAIChargeTimebReplicateMovement ThrowGrenadebNetTemporaryRelativeRotation MPNukeDamage RotationRateStartTumbling GravAccZMomentumTransferbFixedRotationDir Shoot1UnloadspeedGrenadeExplodeGroundGrenadeExplodeAir WeapClassPhysics RocketFlyingSetDir RocketLaunch MultiBasebAlwaysRelevantEject UseCollision SoundVolume MovementFadeOutStartTimeKarmaFadeInEndTimeFadeIn LightColorForceStartLocationShape Collision Lighting Destroyed Shoot2UnloadMPNukeExplosion MPNukePickup UniformSizeParticlesPerSecondMPNukeProjectile MPNukeWeaponNotify_ShootNapalmPlagueFixPickupPlagueFixProjectilePlagueFixBounceProjectileNotify_ShootPlagueGrenadeBounce NukeTrail DamageMP StartSpinMag RotDampenNapalmFixWeapon DamageAmountFirstBounceSpinMag DetonateTimeWeaponSpeedShoot1RandDamage HudHint2 HudHint1NapalmFixProjectileNapalmFixPickup ForceType ForceRadius ForceScale AutoDestroyDamageTypeInflictedMomentumHitMagTravelPostAccept MPAmmoAmount BounceRecoil NapalmBounce FirstFlyingGetThrownVelocity MultiGame MutPlagueFixHolyProjectileWeaponSpeedShoot1StartViewingRocketRocketDetonatedGrenadeLauncherAttachmentGrenadeLauncherPickupGrenadeLauncherWeapon SetAblazeExplodingSoundGrenadeLauncherWeaponSS HolyAmmoInvHolyAttachment ExplosionMagPlayAltFiring HolyDamageHallelujahSoundHolyExplosion HolyPickupbTrailerSameRotation LightTypeLocationShapeExtend WeaponSoundsnewhit newnormalbCanBeDamagedMyOwnerForceLocation napalm_firenapalm_bounceendpt P2WeaponExplodedDamage ExplosionP2WeaponPickupFluid SparkHitGrenadeDamage P2AmmoPickup SmashDamageSuperSpriteEmitterLauncherRocket P2PlayerP2WeaponAttachment P2ProjectilePersonControllerP2Pawn P2MoCapPawn P2AmmoInv TimedMarkerNapalmProjectileShotCountMaxForNotifyWeaponSpeedReload LauncherPropsMetalCrateDoor MiscSoundsstuff1stuff StartLocsmoke5 bloodchunks1nathansbAdvancedFiring MP_FPArmsLS_armsLS_hands_dudeMyPawnbPlayerFPSPawnbUseRocketCameraspercp2pFPSGameWindow SpawnLocOther ReloadSound ShotCountShotMarkerMade bAltFiring DeltaTime HitNormal HitLocation markerpos MomentumDir instigatedBy aClassNameaClassbSuperRelevant softwhitedotpour2 darkchunks expl1color firegroup4spark1WeaponsNetMode DMMutatorGamebIsSingleplayerValue ViewTargetNextSparkHitProjectileRocketPlagueTrail RocketFireRocketExplosionPlagueExplosionNapalmPourFeederNapalmExplosionMolotovExplosion GrenadeTrailGrenadeExplosionGasPourFeederDamSpriteEmitter22SpriteEmitter27SpriteEmitter29SpriteEmitter30 UseNormal ImpactActorSpriteEmitter31SuperSpriteEmitter16gtrailFTrail bStopped ExploWallOut EndTrace StartTrace AdjustedAim FireOffset bForceReload AmmoTypeThirdPersonActor Instigator HitActorOwner aimerrorForwardAccelerationMag TimeDilationPlayOwnedSound RandSpinMass MultiPickup AdjustAimbWorldGeometryFallAfterNoFuelTime Location RocketBounce Velocity RotationbStaticbHidden PlagueWeapon PlaguePickup NapalmWeapon NapalmPickupWallLauncherWeaponLauncherProjectileLauncherAttachmentGrenadeWeaponGrenadePickupGrenadeAmmoInvGrenadeProjectile ScriptTextA ReturnValueAltFireOffsetExpDynamicLoadObjectWeapon LevelInfo Patch1_mesh WMD_Rocket MP_WeaponsMP_SS_LauncherMP_SS_Grenade ChargeTimegrenShootStyleChanger TestTarget givebacklpronproppro BounceCount WallHitPointSTrailOrigLoc ViewThing useowner FuelLeakbExplodeOnContactSTART_LEAK_TIME MOVE_UP_DIST DAMPEN_EXTRAbExplodeOnHitbStartLeakAfterLaunch velcheckvnorm crazydirnexp VelDampenAddFLY_STRAIGHT_TIMEFIRST_STRAIGHT_TIMEDAMPEN_ADD_MAXDAMPEN_ADD_MIN GameInfo xMutator Projectile AmmunitionMutator ControllerPlayerController DamageTypeLevelPawn SkeletalMeshSpriteEmitterActorSoundRoleTagEventClassPackageConst TextBufferObject FunctionStateStruct StrPropertyStructPropertyClassProperty NamePropertyObjectPropertyFloatProperty BoolProperty IntProperty BytePropertySpriteEmitter25SpriteEmitter26SpriteEmitter28SuperWeaponSoundsNuke nuke_launchHOLYGRENADEIMPACTBig-Ass-Explosion HOLYGRENADEHolyFXGenFX LensFlarflare6SuperWeaponTexTrifoil NukeIcon NukeLauncher NukeRocket HolyIconPurpleGrenadeGrenadeLauncher_HiGrenadeLauncher_LonadeSuperWeaponMeshesHolyGrenadeProjholy bDoneAnthem P2EmitterSpriteEmitter53SpriteEmitter54HDS; | ]7mXgP" A~ʗfNi2 2 2 2  =$p}?BK$A&,$A*$A n`L"e ~ʌ V3"3"fff vmff vmNiNi;Qʎʎʎʎ V V3" V3" tv$Y eF`#C6W"H H H H #^H #^FFH H H ;Q;QH H H  Z$@Gk[$@|$HB=$@?W$33s?V$@EN" U$Ao$DE$;E]$Al$PCGBfSP@K$B):#H&i`a$`A{Ld,$pA*$pAymi:qPbc$Bd$@z9%=U{Op# Dtu=;Qއއއއf vmȡa S|$B=$33S?U&i*$AC`$BX^$BY ZZS<_Tx[S2+c.n0"Q. V V V;Q;QDtuhwfDtu~ ;Q;Q JS_]Be careful! This thing packs^]a punch! EJMd/~FE>] Holy Grenade$YZ,/o-m^M21(tsL V V V;Q;Qe hwfe e V;Q~ V V9 9 Q. JSEVtMe/fFR>]Nuke Launcher$YbDov24מsL V V V V V;Q;Q=hwf== V;Q~ V V9 9 Q. JSq$̌?\$>EtMf/QFK>]Grenade Launcher$YL:"LA$NjU@KFYQO2IP%7. ZZ $?$@+I,$*$G ~2Mj7~d50 F].-%o had a run-in with %k's Holy Hand Grenade.a]76%o underestimated the power of the Holy Hand Grenade.`]76%o underestimated the power of the Holy Hand Grenade.j$BPORzV@U|%ȡaS0 8YSuM2Vۼ~  }"z"wvu$L>n$p}?/s*fPa2X8&H +y,$*$p[\nY]^EacdoJI2f`1 GOl+1m$B;] You picked up a Nuke Launcher.@&$Y,$*$kn68,pH@h ʎS 0 x|$PCHh$Cd$DBi8Y MNOPQRxK$@Arh2iO!dĦC0 F]%o was gibbed by %k's nuke.a]$#%o nuked her own dumb self. Idiot.`]$#%o nuked his own dumb self. Idiot.j$BW31lT2lXD1(t LmkqgtK2sۗ i"R"+V;]"!You picked up a Nuclear Missile.&$Yr+vO2uE+c. Lx!cTX2ypO(Q. V V V;Q;Q~ CCC V;Q /X8d`T@}Ni0 8YTeBds r:#B|A2~%u: p"GV"Ou++;]$#You picked up a Holy Hand Grenade.&A~@@@cއS 0 qph$Cd$aDBM8Y IJKLJ$DDA{E\@j r+@r:# A@33g:q& _GQ"Fj g Ab2 V;Q;QfNi k$z[$C=$33s?E$DyBHWVQ2IXxuiQ. V V V;Q;Q VB4B4%-~ Ahwf A A V;Q;Q V /I>]Weapon of Mass DestructionBz2J~  Y$PAg$@FfM}"z"wvu$L>n$p}?HtKr: $Y?4Cy2M[4 LP#EKu2Qi֢1 p"ZZ $?$ AGV"OM+4m$pB;]#"You picked up a Grenade Launcher.@&$Y,$*$sHRU2: $Y`ON tw*3 5`EK#4`EK #9D9?, aOP #'r *( - - a  #qw *.1  <-- 9 w * (  JWCR#zxw*3 5JGF4JGF 9D9?,aCD 'xr*(--".Cw"*w"*"--'o-a  a F Yw*.1;A w.*.-; <;9 Yw* (xw* ( Yb9M-a!G<0a!nL=$?  9:9:$ w*-=  9?,27ra 7 * == a hQ 7 \R w*w.* r.jw.*AuA. sAa }W-' S\wew.*3c 5SRO!4SRO !9D9?,awx !'r*(--a  !w*w.*.- ~.1w* (w*-' h + b'e4"nlw* 5_^]'4_^] '9D9?,%aqp ''r*(--a  'w*A]w.*.- <9 w* (lw*. 1?lw* w*Y lw*.@.*Y Xd6u >HF(>99>>&9:9:$r*-$$r*a }$ w*-a*&r*a $ a* c_lE/r*3DB -(C g[  a)Yh [HYw*).Yw)*)-)r e da Q e dRca je] hiGa( flyzY_ a>( 2H(~29922|9:9:$|r*a  a* q0e5Ww* 5,Z[-4,Z[ -9D9?,%amn -'0-,60?r*(-- a  09P,w *L? w.*.- ~ 9 w* ( w *. 1?w* w*\ w*.@.*\ xplE/r*3DB -(C ( 0.3r 1.3s 0.7t -0.2uARJ9:9:$Jr*a  a*  v^!Vw.*.%Sw|--.w( {[  wQf:k3-.QP1QP Ey] z5.PNa  9P5(L=U(333?(LL=(9?,55a+9PNa C333?Tq!6!X |@ABCDN~Gj( }lq( q!6!U PgFH6paff?6T !Pa>6Taj P8XUPIc a+9P 7 FapBA 7QapBA 6A$"9?%a9?,( LWfdr*O-a U a*da U  Mk- O%-6#?*MaL$ T-6'a@( N?49:9:$2-6aL$ Tw:*:-%9?,29a9%%a @Q 9 \:R %a 7IapB A 7IapB A RV_.Eyr wISuperWeapons.PlagueFixPickupCouldn't replace the WMD at9X (r ISuperWeapons.NapalmFixPickupCouldn't replace the Napalm at9X (Aw.*.o  I.o  X' I zD'Fa/! #( D w *a   .r* 69?, a  jw* aa w*'( e)class PlagueFixWeapon extends PlagueWeapon; simulated function PlayAltFiring() { bForceReload=true; Super.PlayAltFiring(); } /////////////////////////////////////////////////////////////////////////////// // play reloading for each type of shot /////////////////////////////////////////////////////////////////////////////// simulated function PlayReloading() { // temp speed up because with no animation, you can't tell you're // why you can't shoot (becuase it's playing a reload anim) //log (self $ ":: PlayReloading() bAltWMD =" @ bAltWMD); if(bAltFiring) PlayAnim('Shoot2Unload', WeaponSpeedReload, 0.025); // make alt-firing reload slow for balance in MP else PlayAnim('Shoot1Unload', WeaponSpeedReload, 0.05); Instigator.PlayOwnedSound(ReloadSound, SLOT_Misc, 1.0); } /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// function Notify_ShootPlague() { local vector HitLocation, HitNormal, StartTrace, EndTrace, X,Y,Z; local actor HitActor; local PlagueFixProjectile ppro; local float ChargeTime; local PersonController perc; if(AmmoType != None && AmmoType.HasAmmo()) { GetAxes(Instigator.GetViewRotation(),X,Y,Z); StartTrace = GetFireStart(X,Y,Z); AdjustedAim = Instigator.AdjustAim(AmmoType, StartTrace, 2*AimError); // Make sure there's nothing right in the way HitActor = Trace(HitLocation, HitNormal, Instigator.Location, StartTrace, true); if(HitActor == None || (!HitActor.bStatic && !HitActor.bWorldGeometry)) { perc = PersonController(Instigator.Controller); if(perc != None && perc.MyPawn != None && perc.MyPawn.bAdvancedFiring) bAltFiring=true; //bAltWMD = bAltFiring; if(!bAltFiring) ppro = spawn(class'PlagueFixProjectile',Instigator,,StartTrace, AdjustedAim); else ppro = spawn(class'PlagueFixBounceProjectile',Instigator,,StartTrace, AdjustedAim); if(ppro != None) { P2AmmoInv(AmmoType).UseAmmoForShot(); ChargeTime=30; ppro.Instigator = Instigator; // Compensate for catnip time, if necessary. Don't do this for NPCs if(FPSPawn(Instigator) != None && FPSPawn(Instigator).bPlayer) ChargeTime /= Level.TimeDilation; ppro.SetupShot(ChargeTime); ppro.AddRelativeVelocity(Instigator.Velocity); // Touch any actor that was in between, just in case. if(HitActor != None) HitActor.Bump(ppro); } // Touch any actor that was in between, just in case. if(HitActor != None) HitActor.Bump(ppro); } } } rclass PlagueFixProjectile extends LauncherProjectile; /////////////////////////////////////////////////////////////////////////////// // Blow up and generate effects /////////////////////////////////////////////////////////////////////////////// function GenExplosion(vector HitLocation, vector HitNormal, Actor Other) { // local PlagueExplosion exp; // local vector WallHitPoint, OrigLoc; // local Actor ViewThing; local PlagueExplosion exp; exp = spawn(class'PlagueExplosion',GetMaker(),,HitLocation); exp.UseNormal = HitNormal; exp.ShakeCamera(exp.ExplosionDamage); exp.ImpactActor = Other; Destroy(); } auto state Eject { /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// simulated function BeginState() { SetTimer(0.3, false); } } state Flying { /////////////////////////////////////////////////////////////////////////////// // Start moving and shoot out flames and smoke /////////////////////////////////////////////////////////////////////////////// simulated function BlastOff() { local vector Dir; Dir = vector(Rotation); // blast off Velocity += BlastOffVelMag*Dir; //Velocity.z/=8; Acceleration = ForwardAccelerationMag*Dir; if (Level.NetMode != NM_DedicatedServer) { // Send player as owner so it will keep up in slomo time if ( FTrail == None ) { FTrail = spawn(class'Fx.RocketPlagueTrail',Owner,,Location); FTrail.SetBase(self); } } } } Aclass PlagueFixPickup extends PlaguePickup; event PreBeginPlay() { Super.PreBeginPlay(); SetCollisionSize(60,10); } B 0.25Z 800[ 0.25\F*"w*q!b* ]G<&rW69:9:$m>-H-GU-Ba>( xLclass PlagueFixBounceProjectile extends PlagueFixProjectile; /////////////////////////////////////////////////////////////////////////////// // Vars and Consts /////////////////////////////////////////////////////////////////////////////// var float VelDampenAdd; var float GravAccZ; const FLY_STRAIGHT_TIME = 0.3; const FIRST_STRAIGHT_TIME= 1.3; const DAMPEN_ADD_MAX = 0.7; const DAMPEN_ADD_MIN = -0.2; simulated event PostBeginPlay() { if (Level.NetMode != NM_DedicatedServer) { // Send player as owner so it will keep up in slomo time if ( FTrail == None ) { FTrail = spawn(class'Fx.RocketPlagueTrail',Owner,,Location); FTrail.SetBase(self); } } Super.PostBeginPlay(); } /////////////////////////////////////////////////////////////////////////////// // Explode on contact with walls.. people.. everything else makes you bounce off /////////////////////////////////////////////////////////////////////////////// simulated function ProcessTouch(Actor Other, Vector HitLocation) { if ((Pawn(Other) != None && Pawn(Other).Health > 0)) { if(Other != Instigator) { GenExplosion(HitLocation,-Normal(Velocity), Other); } } // try to bounce off static stuff else if(Other.bStatic && bBounce) { BounceOffSomething(-Velocity, Other); } else if(Other != self) { Other.Bump(self); } } /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// simulated function HitWall( vector HitNormal, actor Wall ) { // try to bounce off static stuff if(bBounce) { BounceOffSomething(HitNormal, Wall); } else GenExplosion(Location, HitNormal, Wall); } /////////////////////////////////////////////////////////////////////////////// // Bounces off anything that's not your target, in a reflective manner // and record the bounce. /////////////////////////////////////////////////////////////////////////////// function BounceOffSomething( vector HitNormal, actor Wall ) { local vector newhit, newnormal, EndPt; local bool bStopped; local float speed; local SparkHit spark1; // Cough //EmitSmokePuff(1.0); // Throw off some sparks from the hit spark1 = spawn(class'Fx.SparkHitProjectile',Owner,,Location,rotator(HitNormal)); // Make it bounce up and off the normal a little strangely VelDampenAdd += 0.05*FRand(); if(VelDampenAdd > DAMPEN_ADD_MAX) VelDampenAdd = DAMPEN_ADD_MIN + 0.05*FRand(); VelDampen = VelDampenAdd + default.VelDampen; // Update velocity Velocity = VelDampen * (Velocity - 2 * HitNormal * (Velocity Dot HitNormal));// + (speed*Frand()*HitNormal); // Update direction SetRotation(rotator(Velocity)); Acceleration = ForwardAccelerationMag*Normal(Velocity); // play a noise (make it much lower) spark1.PlaySound(RocketBounce,,,,150,0.7*GetRandPitch()); // Let it go straight for a little while GotoState('Flying', 'Straight'); } /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // FirstFlying // When we first take off, set up a straight flying without gravity. /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// auto state FirstFlying { Begin: GotoState('Flying', 'FirstStraight'); } /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // Flying // Actually cruising through the air /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// state Flying { /////////////////////////////////////////////////////////////////////////////// // Change our direction from falling and all /////////////////////////////////////////////////////////////////////////////// function Tick(float DeltaTime) { //log(self$" vel after "$Velocity); SetRotation(rotator(Velocity)); } FirstStraight: Sleep(FIRST_STRAIGHT_TIME); Acceleration.z += GravAccZ; Goto('Begin'); Straight: Sleep(FLY_STRAIGHT_TIME); Acceleration.z += GravAccZ; Begin: // After this time make the rocket fall for lack of fuel before // a given amount of time, before it's supposed to die. Sleep(LifeSpan - FallAfterNoFuelTime); StartTumbling(); } L/////////////////////////////////////////////////////////////////////////////// // RocketTrail // // Smoke trail for rockets (fire is seperate) /////////////////////////////////////////////////////////////////////////////// class NukeTrail extends P2Emitter; ^k7AC a{x@G{2%t#?* r Dclass NapalmFixWeapon extends NapalmWeapon; /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// function Notify_ShootNapalm() { local vector HitLocation, HitNormal, StartTrace, EndTrace, X,Y,Z; local actor HitActor; local NapalmFixProjectile npro; if(AmmoType != None && AmmoType.HasAmmo()) { GetAxes(Instigator.GetViewRotation(),X,Y,Z); StartTrace = GetFireStart(X,Y,Z); AdjustedAim = Instigator.AdjustAim(AmmoType, StartTrace, 2*AimError); // Make sure there's nothing right in the way HitActor = Trace(HitLocation, HitNormal, Instigator.Location, StartTrace, true); if(HitActor == None || (!HitActor.bStatic && !HitActor.bWorldGeometry)) { npro = spawn(class'NapalmFixProjectile',Instigator,,StartTrace, AdjustedAim); if(npro != None) { P2AmmoInv(AmmoType).UseAmmoForShot(); npro.Instigator = Instigator; npro.SetupShot(!bAltFiring, !bAltFiring); npro.AddRelativeVelocity(Instigator.Velocity); } // Touch any actor that was in between, just in case. if(HitActor != None) HitActor.Bump(npro); } } } tY/////////////////////////////////////////////////////////////////////////////// // NapalmProjectile. // Copyright 2002 Running With Scissors, Inc. All Rights Reserved. // // This is the actual napalm cannister that goes flying through the air. // /////////////////////////////////////////////////////////////////////////////// class NapalmFixProjectile extends P2Projectile; var byte BounceCount; // Number of times we've bounced var float FirstBounceSpinMag; // After the first bounce you take this spin mag var GasPourFeeder FuelLeak; // feeder of fuel to leak out after you've bounced once var Sound NapalmBounce; var bool bExplodeOnContact; // If you should blow up on the first thing you hit const START_LEAK_TIME = 0.25; const MOVE_UP_DIST = 800; const DAMPEN_EXTRA = 0.25; /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// function Destroyed() { if(FuelLeak != None) { FuelLeak.GotoState('PouringAndDying'); FuelLeak=None; } Super.Destroyed(); } /////////////////////////////////////////////////////////////////////////////// // Send it with a certain speed and arm it /////////////////////////////////////////////////////////////////////////////// function SetupShot(bool bExplodeOnHit, bool bStartLeakAfterLaunch) { if ( Role == ROLE_Authority ) { Velocity = GetThrownVelocity(Instigator, Rotation, 0.4); RandSpin(StartSpinMag); } bExplodeOnContact = bExplodeOnHit; if(bStartLeakAfterLaunch) SetTimer(START_LEAK_TIME, false); } /////////////////////////////////////////////////////////////////////////////// // Start the fuel leak after this time. /////////////////////////////////////////////////////////////////////////////// function Timer() { StartFuelLeak(); } /////////////////////////////////////////////////////////////////////////////// // Take damage or be force around /////////////////////////////////////////////////////////////////////////////// function TakeDamage( int Dam, Pawn instigatedBy, Vector hitlocation, Vector momentum, class damageType) { Health-=Dam; if(Health <= 0) { GenExplosion(HitLocation, vect(0, 0, 1), None); return; } // Now add in momentum if we didn't explode Velocity+=(Momentum/Mass); } /////////////////////////////////////////////////////////////////////////////// // Make it start leaking /////////////////////////////////////////////////////////////////////////////// function StartFuelLeak() { if(FuelLeak == None) { FuelLeak = spawn(class'NapalmPourFeeder',Instigator,,Location); FuelLeak.MyOwner = Instigator; FuelLeak.SetBase(self); } } /////////////////////////////////////////////////////////////////////////////// // Bounces off walls /////////////////////////////////////////////////////////////////////////////// function BounceOffSomething( vector HitNormal, actor Wall ) { local vector newhit, newnormal, EndPt; local bool bStopped; local float speed; if(bBounce == true) { if(bExplodeOnContact) { GenExplosion(Location, HitNormal, Wall); return; } else { speed = VSize(Velocity); // Check for a slowed z if(speed < MinSpeedForBounce) { // Check for possible stop by seeing if we're stopped in z and // on the ground. EndPt = Location; EndPt.z-=DIST_CHECK_BELOW; // If there is a hit below (ground) then you are stopped. if(Trace(newhit, newnormal, EndPt, Location, false) != None) bStopped=true; } // If we've stopped, Explode if(bStopped) { GenExplosion(Location, HitNormal, Wall); return; } else // do bouncing { BounceCount++; // Start before the recoil so you effect the recoil itself if(BounceCount == 1) StartSpinMag = FirstBounceSpinMag; BounceCrazy(HitNormal, Wall); // if it's the first bounce, start leaking napalm // Start after the recoil so you get the new rotation if(BounceCount == 1) { StartFuelLeak(); } } } } } /////////////////////////////////////////////////////////////////////////////// // Bounce very irractically /////////////////////////////////////////////////////////////////////////////// function BounceCrazy(vector HitNormal, Actor HitActor) { local float velcheck; local vector vnorm; local float crazydir; // Crazily bounce it based on the normal and the cross from the velocity and the normal, // so sometimes it bounces harshly left and right vnorm = Normal(Velocity); velcheck = VSize(Velocity); // Don't bounce crazily when you hit a person (only bounce left or right or your original velocity) if(Pawn(HitActor) != None) { Velocity = VelDampen*VSize(Velocity)*(Normal(Velocity) Cross vect(0, 0, 1)); if(FRand() < 0.5) Velocity = -Velocity; // go right, instead of left, 50% of the time } else // do bounce crazy when you hit anything else { crazydir = Frand() - 0.5; if(crazydir > 0.1) crazydir = 0.5; else if(crazydir < -0.1) crazydir = -0.5; Velocity = VelDampen * velcheck * ( crazydir*(vnorm Cross HitNormal) + vnorm - 2 * HitNormal * (vnorm Dot HitNormal)); } // Toggle the dampening effects around 1.0, greater and lesser than, each hit if(VelDampen < 1.0) VelDampen = default.VelDampen + 2*DAMPEN_EXTRA; else VelDampen = default.VelDampen - DAMPEN_EXTRA; // Spin it using a random direction StartSpinMag = RotDampen*StartSpinMag; RandSpin(StartSpinMag); // Play a noise PlaySound(NapalmBounce); } /////////////////////////////////////////////////////////////////////////////// // Bounce very irractically /////////////////////////////////////////////////////////////////////////////// function BounceRecoil(vector HitNormal) { BounceCrazy(HitNormal, None); } /////////////////////////////////////////////////////////////////////////////// // Bounce off walls.. people.. all the same /////////////////////////////////////////////////////////////////////////////// simulated function ProcessTouch(Actor Other, Vector HitLocation) { local vector HitNormal; if(Other != Instigator) { // Don't bounce off windows, go right through them, and break them if(Window(Other) != None) Other.Bump(self); else { HitNormal = -Normal(Velocity); BounceOffSomething(HitNormal, Other); // after bouncing off it, hurt the thing we hit Other.TakeDamage(Damage, Instigator, HitLocation, -MomentumTransfer*HitNormal, MyDamageType); } } } /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// simulated function HitWall( vector HitNormal, actor Wall ) { BounceOffSomething(HitNormal, Wall); } /////////////////////////////////////////////////////////////////////////////// // Blow up and generate effects /////////////////////////////////////////////////////////////////////////////// function GenExplosion(vector HitLocation, vector HitNormal, Actor Other) { local NapalmExplosion nexp; local vector endpt; // Check to grab the feeder, and set it's next trail on fire autmatically if(FuelLeak != None && FuelLeak.Next != None) { //log(FuelLeak$" has next as "$FuelLeak.Next$" and prev as "$FuelLeak.Prev); // Light it's next on fire automatically FuelLeak.Next.bCanBeDamaged=true; FuelLeak.Next.SetAblaze(HitLocation, true); } nexp = spawn(class'NapalmExplosion',,,HitLocation); nexp.UseNormal = HitNormal; nexp.ImpactActor = Other; if(FuelLeak != None) { // Move it up, and make it invisible, so it'll keep pouring fluid // towards the impact spot endpt = FuelLeak.Location; endpt.z = endpt.z + (MOVE_UP_DIST*HitNormal.z); if(Trace(HitLocation, HitNormal, endpt, Location, false) != None) endpt = HitLocation; FuelLeak.SetLocation(endpt); FuelLeak.GotoState('PouringAndDying'); FuelLeak=None; } Destroy(); } /////////////////////////////////////////////////////////////////////////////// // Constantly snap the fuel leak to the projectile /////////////////////////////////////////////////////////////////////////////// simulated function Tick( float DeltaTime ) { local vector dir; if(FuelLeak != None) { // always reset the dir on each bounce dir = -vector(Rotation); dir.z-=0.3; FuelLeak.SetDir(FuelLeak.Location, dir); } } Aclass NapalmFixPickup extends NapalmPickup; event PreBeginPlay() { Super.PreBeginPlay(); SetCollisionSize(60,10); } bCP1 GEr*a  a* h..a& -'/-H./ aa3639?,dwaok3(*-b'-b./ B9:B&ND./9:B&C Sclass MutPlagueFix extends xMutator; function bool ReplaceWith(actor Other, string aClassName) { local Actor A; local class aClass; local Vector SpawnLoc; // RWS CHANGE: Merged check for empty class name from UT2003 if ( aClassName == "" ) return true; if ( Other.IsA('Inventory') && (Other.Location == vect(0,0,0)) ) return false; aClass = class(DynamicLoadObject(aClassName, class'Class')); if ( aClass != None ) A = Spawn(aClass,Other.Owner,Other.tag,Other.Location, Other.Rotation); if (A == None) { SpawnLoc = Other.Location; SpawnLoc.Z += 2*(aClass.Default.CollisionHeight); A = Spawn(aClass,Other.Owner,Other.tag,SpawnLoc, Other.Rotation); } if (A != None) { SpawnLoc = Other.Location; Other.Destroy(); A.SetLocation(SpawnLoc); } if ( A != None ) { A.event = Other.event; A.tag = Other.tag; return true; } return false; } /////////////////////////////////////////////////////////////////////////////// // Change rocket launchers to nuke launchers. /////////////////////////////////////////////////////////////////////////////// function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { // Check normal pickups if (Other.Class==class'PlaguePickup') { if (!ReplaceWith(Other, "SuperWeapons.PlagueFixPickup")) warn("Couldn't replace the WMD at" @ Other.Location); return false; } if (Other.Class==class'NapalmPickup') { if (!ReplaceWith(Other, "SuperWeapons.NapalmFixPickup")) warn("Couldn't replace the Napalm at" @ Other.Location); return false; } // Remove also from cycling pickups. Some levels have cycling pickups but not WMDs if(MultiPickup(Other) != None) { MultiPickup(Other).SwapClass(class'PlaguePickup', class'SuperWeapons.PlagueFixPickup'); MultiPickup(Other).SwapClass(class'NapalmPickup', class'SuperWeapons.NapalmFixPickup'); } return true; } jTo6k7q;Q;Q;Q;Q,,;Q;Q;Q;Q;Q;Q;Q;Q;Q;Q;Q;Q;Q;Q;Q;Q;Q;Qnw |DEA~B\MWMD/Napalm Fix]]65Fixes WMD and Napalm weapons to work in multiplayer.@/////////////////////////////////////////////////////////////////////////////// // LauncherWeaponSS // Copyright 2003 Running With Scissors, Inc. All Rights Reserved. // // short sleeves /////////////////////////////////////////////////////////////////////////////// class MPNukeWeaponSS extends MPNukeWeapon; /////////////////////////////////////////////////////////////////////////////// // Default properties /////////////////////////////////////////////////////////////////////////////// OPclass MPNukeWeapon extends LauncherWeapon; function bool ValidTarget(FPSPawn TestTarget) { return false; } simulated function AltFire( float Value ); function ServerAltFire(); /////////////////////////////////////////////////////////////////////////////// // Skip the charge, go straight to the fire /////////////////////////////////////////////////////////////////////////////// simulated function Fire( float Value ) { if ( AmmoType == None || !AmmoType.HasAmmo() ) { ClientForceFinish(); ServerForceFinish(); return; } bAltFiring=false; ShootIt(); ClientShootIt(); //ServerFire(); } /* /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// function ServerFire() { PlayFiring(); LocalFire(); ClientPlayFiring(); ShootIt(); ClientShootIt(); }*/ /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// function Notify_ShootLauncher() { local vector StartTrace, X,Y,Z, markerpos, HitNormal, HitLocation; local actor HitActor; local MPNukeProjectile lpro; //local MPNukeSeekingProjectileTrad lspro; local float giveback; if(AmmoType != None) { GetAxes(Instigator.GetViewRotation(),X,Y,Z); StartTrace = GetFireStart(X,Y,Z); AdjustedAim = Instigator.AdjustAim(AmmoType, StartTrace, 2*AimError); //CalcAIChargeTime(); ShootStyleChanger=0; // Make sure we're not generating this on the other side of a thin wall //if(FastTrace(Instigator.Location, StartTrace)) HitActor = Trace(HitLocation, HitNormal, Instigator.Location, StartTrace, true); if(HitActor == None || (!HitActor.bStatic && !HitActor.bWorldGeometry)) { /*if(!bSeeking) // fire a normal rocket {*/ lpro = spawn(class'MPNukeProjectile',Instigator,,StartTrace, AdjustedAim); if(lpro != None) { ChargeTime=30; lpro.Instigator = Instigator; // Compensate for catnip time, if necessary. Don't do this for NPCs if(FPSPawn(Instigator) != None && FPSPawn(Instigator).bPlayer) ChargeTime /= Level.TimeDilation; lpro.SetupShot(ChargeTime); lpro.AddRelativeVelocity(Instigator.Velocity); // Touch any actor that was in between, just in case. if(HitActor != None) HitActor.Bump(lpro); } /*} else // fire a seeking rocket { // Shoot either a traditional seeking rocket or a new super seeker if(!bShootTradSeeker) lspro = spawn(class'MPNukeSeekingProjectile',Instigator,,StartTrace, AdjustedAim); else lspro = spawn(class'MPNukeSeekingProjectileTrad',Instigator,,StartTrace, AdjustedAim); if(lspro != None) { lspro.Instigator = Instigator; // if we're not aimed at anything, figure out a target if(CurrentTarget == None) { lspro.DetermineTarget(ProjectedHitLoc); } else lspro.SetNewTarget(CurrentTarget); lspro.SetupShot(SeekingChargeMultiplier*ChargeTime); lspro.AddRelativeVelocity(Instigator.Velocity); // Touch any actor that was in between, just in case. if(HitActor != None) HitActor.Bump(lspro); } }*/ } // Clear our target regardless //CurrentTarget = None; // If we didn't make a valid rocket, then give him his ammo back if(lpro != None) //&& lspro == None) /*{ giveback = ChargeStartAmmo - AmmoType.AmmoAmount; if(giveback > 0) AmmoType.AddAmmo(giveback); } else*/ { // Say we just fired ShotCount++; P2AmmoInv(AmmoType).UseAmmoForShot(1); // Only make a new danger marker if the consecutive fires were as high // as the max if(ShotCount >= ShotCountMaxForNotify && Instigator.Controller != None && ShotMarkerMade != None) { // tell it we know this just happened, by recording it. ShotCount -= ShotCountMaxForNotify; // Records the first (gun fire) markerpos = Instigator.Location; // Primary (the gun shooting, making a loud noise) if(ShotMarkerMade != None) { ShotMarkerMade.static.NotifyControllersStatic( Level, ShotMarkerMade, FPSPawn(Instigator), None, ShotMarkerMade.default.CollisionRadius, markerpos); } } } // Reset the ammo you started with //ChargeStartAmmo = AmmoType.AmmoAmount; } } /* No longer necessary, the skin gives it away // Tell 'em you're using TEH SOOPAR Nuke state Active { function BeginState() { Super.BeginState(); P2Player(Instigator.Controller).ClientMessage("Nuke Launcher selected"); } }*/ /* // Disable seekers for MPNukes state ChargeWaitLauncher { /////////////////////////////////////////////////////////////////////////////// // Set to seeking when you get to this state /////////////////////////////////////////////////////////////////////////////// simulated function BeginState() { PlayChargeWait(); } }*/ I4/////////////////////////////////////////////////////////////////////////////// // LauncherProjectile. // Copyright 2002 Running With Scissors, Inc. All Rights Reserved. // // This is the actual rocket that goes flying through the air. // It fires straight, but it can run out fuel, at which point it tumbles // to the ground, still potent. // Detonates on contact with anything. // /////////////////////////////////////////////////////////////////////////////// class MPNukeProjectile extends LauncherProjectile; /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // Blow up and generate effects /////////////////////////////////////////////////////////////////////////////// function GenExplosion(vector HitLocation, vector HitNormal, Actor Other) { local RocketExplosion exp; local vector WallHitPoint, OrigLoc; local Actor ViewThing; if (Role < ROLE_Authority) return; if(Other != None && Other.bStatic) { // Make sure the force of this explosion is all the way against the wall that // we hit OrigLoc = HitLocation; WallHitPoint = HitLocation - FORCE_RAD_CHECK*HitNormal; if(Trace(HitLocation, HitNormal, WallHitPoint, HitLocation) == None) { HitLocation = OrigLoc; WallHitPoint = OrigLoc; } } else WallHitPoint = HitLocation; exp = spawn(class'MPNukeExplosion',GetMaker(),,HitLocation + ExploWallOut*HitNormal); exp.CheckForHitType(Other); exp.ShakeCamera(exp.ExplosionDamage); exp.ForceLocation = WallHitPoint; // If we're controlling this particular rocket, tell the player about it if(Instigator != None && P2Player(Instigator.Controller) != None && P2Player(Instigator.Controller).ViewTarget == self) { // If we hit a person or animal or interesting thing, view it directly if(FPSPawn(Other) != None) ViewThing = Other; else // Otherwise, just watch the pretty explosion ViewThing = exp; P2Player(Instigator.Controller).RocketDetonated(ViewThing); } Destroy(); } state Flying { simulated function BlastOff() { local vector Dir; local Actor useowner; Dir = vector(Rotation); // blast off Velocity += BlastOffVelMag*Dir; //Velocity.z/=8; Acceleration = ForwardAccelerationMag*Dir; if (Level.NetMode != NM_DedicatedServer) { if(Level.Game == None || !Level.Game.bIsSinglePlayer) useowner = self; else // Send player as owner so it will keep up in slomo time useowner = Owner; // Send player as owner so it will keep up in slomo time if(STrail == None ) { STrail = spawn(class'NukeTrail',useowner,,Location); if(Level.Game != None && Level.Game.bIsSinglePlayer) STrail.SetBase(self); } if (FTrail == None ) { FTrail = spawn(class'Fx.RocketFire',useowner,,Location); FTrail.SetBase(self); } } } simulated function BeginState() { local P2Player p2p; BlastOff(); /*// Play flying sound Timer();*/ // Turn on camera if necessary if(Instigator != None) { p2p = P2Player(Instigator.Controller); if(p2p != None && p2p.bUseRocketCameras) // Make the rocket the view target p2p.StartViewingRocket(self); } } } ~/////////////////////////////////////////////////////////////////////////////// // LauncherPickup // Copyright 2002 Running With Scissors, Inc. All Rights Reserved. // /////////////////////////////////////////////////////////////////////////////// class MPNukePickup extends P2WeaponPickup; event PreBeginPlay() { Super.PreBeginPlay(); SetCollisionSize(60,20); } pC/////////////////////////////////////////////////////////////////////////////// // RocketExpl // // explosion for a rocket /////////////////////////////////////////////////////////////////////////////// class MPNukeExplosion extends RocketExplosion; /*Begin Object Class=SpriteEmitter Name=SpriteEmitter32 UseColorScale=True ColorScale(0)=(Color=(G=100,R=255)) ColorScale(1)=(RelativeTime=0.800000,Color=(G=16,R=128)) ColorScale(2)=(RelativeTime=1.000000) MaxParticles=20 StartLocationRange=(X=(Min=-100.000000,Max=100.000000),Y=(Min=-100.000000,Max=100.000000),Z=(Min=-100.000000,Max=100.000000)) SpinParticles=True SpinsPerSecondRange=(X=(Max=0.050000)) StartSpinRange=(X=(Max=1.000000)) UseSizeScale=True UseRegularSizeScale=False SizeScale(0)=(RelativeSize=0.200000) SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.000000) StartSizeRange=(X=(Min=350.000000,Max=450.000000)) ParticlesPerSecond=1.500000 InitialParticlesPerSecond=6.000000 AutomaticInitialSpawning=False DrawStyle=PTDS_Brighten Texture=Texture'nathans.Skins.wispsmoke' TextureUSubdivisions=2 TextureVSubdivisions=4 BlendBetweenSubdivisions=True SecondsBeforeInactive=0.000000 LifetimeRange=(Max=5.000000) StartVelocityRange=(X=(Min=-25.000000,Max=25.000000),Y=(Min=-25.000000,Max=25.000000),Z=(Min=-35.000000,Max=35.000000)) MaxAbsVelocity=(X=50.000000,Y=50.000000,Z=50.000000) Name="SpriteEmitter32" End Object Emitters(6)=SpriteEmitter'SpriteEmitter32' Begin Object Class=SpriteEmitter Name=SpriteEmitter33 UseColorScale=True ColorScale(0)=(Color=(G=128,R=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=31,G=58,R=78)) StartLocationRange=(X=(Min=-60.000000,Max=60.000000),Y=(Min=-60.000000,Max=60.000000),Z=(Min=-60.000000,Max=60.000000)) SpinParticles=True SpinsPerSecondRange=(X=(Min=0.100000,Max=0.200000)) StartSpinRange=(X=(Max=1.000000)) UseSizeScale=True UseRegularSizeScale=False SizeScale(1)=(RelativeTime=0.500000,RelativeSize=1.000000) SizeScale(2)=(RelativeTime=1.000000) SizeScaleRepeats=3.000000 StartSizeRange=(X=(Min=3.000000,Max=5.000000)) ParticlesPerSecond=1.000000 InitialParticlesPerSecond=3.000000 AutomaticInitialSpawning=False DrawStyle=PTDS_AlphaBlend Texture=Texture'nathans.Skins.bubbles' TextureUSubdivisions=1 TextureVSubdivisions=4 BlendBetweenSubdivisions=True SecondsBeforeInactive=0.000000 LifetimeRange=(Max=3.000000) StartVelocityRange=(X=(Min=-10.000000,Max=10.000000),Y=(Min=-10.000000,Max=10.000000),Z=(Min=-3.000000,Max=3.000000)) Name="SpriteEmitter33" End Object Emitters(7)=SpriteEmitter'SpriteEmitter33' Begin Object Class=SpriteEmitter Name=SpriteEmitter34 UseColorScale=True ColorScale(0)=(Color=(G=128,R=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=38,G=72,R=89)) StartLocationRange=(X=(Min=-60.000000,Max=60.000000),Y=(Min=-60.000000,Max=60.000000),Z=(Min=-60.000000,Max=60.000000)) SpinParticles=True SpinsPerSecondRange=(X=(Min=0.200000,Max=0.300000)) StartSpinRange=(X=(Max=1.000000)) UseSizeScale=True UseRegularSizeScale=False SizeScale(1)=(RelativeTime=0.500000,RelativeSize=1.000000) SizeScale(2)=(RelativeTime=1.000000) SizeScaleRepeats=2.000000 StartSizeRange=(X=(Min=3.000000,Max=5.000000)) ParticlesPerSecond=1.000000 InitialParticlesPerSecond=3.000000 AutomaticInitialSpawning=False Texture=Texture'nathans.Skins.bubbles' TextureUSubdivisions=1 TextureVSubdivisions=4 BlendBetweenSubdivisions=True SecondsBeforeInactive=0.000000 LifetimeRange=(Max=3.000000) StartVelocityRange=(X=(Min=-10.000000,Max=10.000000),Y=(Min=-10.000000,Max=10.000000),Z=(Min=-3.000000,Max=3.000000)) Name="SpriteEmitter34" End Object Emitters(8)=SpriteEmitter'SpriteEmitter34'*/ iCD#d*Wrw.j*ի#?o??=?̽իW*C*9?,C*C+?9?,>=>aH /class MPNukeDamage extends ExplodedDamage; 7class MPNukeAttachment extends LauncherAttachment; 1class MPNukeAmmoPickup extends P2AmmoPickup; +class MPNukeAmmoInv extends P2AmmoInv; dclass HolyWeaponSS extends HolyWeapon; /////////////////////////////////////////////////////////////////////////////// // Default properties /////////////////////////////////////////////////////////////////////////////// qvj+Dv* n&class HolyWeapon extends GrenadeWeapon; /////////////////////////////////////////////////////////////////////////////// // Check to restore proper hints /////////////////////////////////////////////////////////////////////////////// event TravelPostAccept() { // don't use alt fire hints Super(P2Weapon).TravelPostAccept(); } /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// function ThrowGrenade() { local vector HitLocation, HitNormal, StartTrace, EndTrace, X,Y,Z; local actor HitActor; local HolyProjectile holy; if(P2AmmoInv(AmmoType) != None && AmmoType.HasAmmo()) { CalcAIChargeTime(); FireOffset = AltFireOffset; // Alt-firing the grenade, drops it at your feet, and doesn't // arm it /* if(bAltFiring) { ChargeTime = 0.0; FireOffset = AltFireOffset; } else */ FireOffset = default.FireOffset; GetAxes(Instigator.GetViewRotation(),X,Y,Z); StartTrace = GetFireStart(X,Y,Z); AdjustedAim = Instigator.AdjustAim(AmmoType, StartTrace, 2*AimError); // Make sure we're not generating this on the other side of a thin wall // Also, bump anything along the way, so the grenade can break a window if // you're standing really close to one. //if(FastTrace(Instigator.Location, StartTrace)) HitActor = Trace(HitLocation, HitNormal, Instigator.Location, StartTrace, true); if(HitActor == None || (!HitActor.bStatic && !HitActor.bWorldGeometry)) { // if(!bAltFiring) holy = spawn(class'HolyProjectile',Instigator,,StartTrace, AdjustedAim); // else // gren = spawn(class'GrenadeAltProjectile',Instigator,,StartTrace, AdjustedAim); // Make sure it got made, it could have gotten spawned in a wall and not made if(holy != None) { holy.Instigator = Instigator; // Compensate for catnip time, if necessary. Don't do this for NPCs if(FPSPawn(Instigator) != None && FPSPawn(Instigator).bPlayer) ChargeTime /= Level.TimeDilation; holy.SetupThrown(ChargeTime); //gren.AddRelativeVelocity(Instigator.Velocity); P2AmmoInv(AmmoType).UseAmmoForShot(); // Touch any actor that was in between, just in case. if(HitActor != None) HitActor.Bump(holy); } } } // Turn off the thing in his hand as it leaves if(ThirdPersonActor != None) ThirdPersonActor.bHidden=true; } w^w2w.*(8.8*x9Dzթ8 *class HolyTrail extends GrenadeTrail; K'// ampHolyProjectile // Projectile for bouncing betty // Copied from GrenadeProjectile and not extended because we mess with a bunch of stuff here class HolyProjectile extends GrenadeProjectile; var bool bDoneAnthem; var sound HallelujahSound; /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// simulated function PostBeginPlay() { Super.PostBeginPlay(); if(DetonateTime > 0) { // Arm the grenade SetTimer(DetonateTime-2,false); } } /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// function MakeSmokeTrail() { if(GTrail == None) { if(Level.Game.bIsSinglePlayer) { // Send player as owner so it will keep up in slomo time GTrail = spawn(class'HolyTrail',Owner,,Location); GTrail.SetBase(self); } else GTrail = spawn(class'HolyTrail',self,,Location); } } /////////////////////////////////////////////////////////////////////////////// // It explodes after DetonateTime no matter what /////////////////////////////////////////////////////////////////////////////// simulated function Timer() { if (bDoneAnthem) GenExplosion(Location, vect(0,0,1), None); else { PlaySound(HallelujahSound,SLOT_Misc,,,TransientSoundRadius,GetRandPitch()); bDoneAnthem=true; SetTimer(2, false); } } /////////////////////////////////////////////////////////////////////////////// // Blow up and generate effects /////////////////////////////////////////////////////////////////////////////// simulated function GenExplosion(vector HitLocation, vector HitNormal, Actor Other) { local GrenadeExplosion exp; local vector WallHitPoint; if(Role == ROLE_Authority) { if (!bDoneAnthem) PlaySound(HallelujahSound,SLOT_Misc,,,TransientSoundRadius,GetRandPitch()); if(Other != None && Other.bStatic) { // Make sure the force of this explosion is all the way against the wall that // we hit WallHitPoint = HitLocation - FORCE_RAD_CHECK*HitNormal; Trace(HitLocation, HitNormal, WallHitPoint, HitLocation); } else WallHitPoint = HitLocation; exp = spawn(class'HolyExplosion',GetMaker(),,HitLocation + ExploWallOut*HitNormal); exp.CheckForHitType(Other); exp.ShakeCamera(exp.ExplosionDamage); exp.ForceLocation = WallHitPoint; } Destroy(); } ,class HolyPickup extends GrenadePickup; yf.A q// ampHolyExplosion // Explosion that causes ampHolyDamage class HolyExplosion extends GrenadeExplosion; U// HolyDamage // DamageType for holy grenades. class HolyDamage extends GrenadeDamage; // Need this so the death string shows up correctly. }&5Yw*w*-' w&'?a  &? <?L0w* 669? 6<wa&<(*&a q!b*a M/////////////////////////////////////////////////////////////////////////////// // Grenade attachment for 3rd person // Copyright 2002 Running With Scissors, Inc. All Rights Reserved. // // It's a grenade in a guy's hand, that you can see in 3rd person // /////////////////////////////////////////////////////////////////////////////// class HolyAttachment extends P2WeaponAttachment; ^/////////////////////////////////////////////////////////////////////////////// // GrenadeAmmoInv // Copyright 2002 Running With Scissors, Inc. All Rights Reserved. // // Grenade ammo inventory item (as opposed to pickup). // /////////////////////////////////////////////////////////////////////////////// class HolyAmmoInv extends P2AmmoInv; /////////////////////////////////////////////////////////////////////////////// // Default properties /////////////////////////////////////////////////////////////////////////////// |class GrenadeLauncherWeaponSS extends GrenadeLauncherWeapon; /////////////////////////////////////////////////////////////////////////////// // Default properties /////////////////////////////////////////////////////////////////////////////// qRclass GrenadeLauncherWeapon extends LauncherWeapon; function bool ValidTarget(FPSPawn TestTarget) { return false; } simulated function AltFire( float Value ); function ServerAltFire(); /////////////////////////////////////////////////////////////////////////////// // Skip the charge, go straight to the fire /////////////////////////////////////////////////////////////////////////////// simulated function Fire( float Value ) { if ( AmmoType == None || !AmmoType.HasAmmo() ) { ClientForceFinish(); ServerForceFinish(); return; } bAltFiring=false; ShootIt(); ClientShootIt(); //ServerFire(); } /* /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// function ServerFire() { PlayFiring(); LocalFire(); ClientPlayFiring(); ShootIt(); ClientShootIt(); }*/ /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// function Notify_ShootLauncher() { local vector startloc, StartTrace, X,Y,Z, markerpos, HitNormal, HitLocation; local actor HitActor; //local MPNukeProjectile lpro; //local MPNukeSeekingProjectileTrad lspro; local GrenadeProjectile gren; local float giveback; if(AmmoType != None) { GetAxes(Instigator.GetViewRotation(),X,Y,Z); StartTrace = GetFireStart(X,Y,Z); AdjustedAim = Instigator.AdjustAim(AmmoType, StartTrace, 2*AimError); //CalcAIChargeTime(); ShootStyleChanger=0; // Make sure we're not generating this on the other side of a thin wall //if(FastTrace(Instigator.Location, StartTrace)) HitActor = Trace(HitLocation, HitNormal, Instigator.Location, StartTrace, true); StartLoc = sTARTTrace+ ((Instigator.CollisionRadius)*X); StartLoc.z+=(Instigator.CollisionRadius*0.5); if(HitActor == None || (!HitActor.bStatic && !HitActor.bWorldGeometry)) { /*if(!bSeeking) // fire a normal rocket {*/ gren = spawn(class'GrenadeProjectile',Instigator,,StartLoc, Rotator(X)); if(gren != None) { ChargeTime=0.8; gren.Instigator = Instigator; // Compensate for catnip time, if necessary. Don't do this for NPCs if(FPSPawn(Instigator) != None && FPSPawn(Instigator).bPlayer) ChargeTime /= Level.TimeDilation; gren.SetupThrown(ChargeTime); gren.AddRelativeVelocity(Instigator.Velocity); // Touch any actor that was in between, just in case. if(HitActor != None) HitActor.Bump(gren); } /*} else // fire a seeking rocket { // Shoot either a traditional seeking rocket or a new super seeker if(!bShootTradSeeker) lspro = spawn(class'MPNukeSeekingProjectile',Instigator,,StartTrace, AdjustedAim); else lspro = spawn(class'MPNukeSeekingProjectileTrad',Instigator,,StartTrace, AdjustedAim); if(lspro != None) { lspro.Instigator = Instigator; // if we're not aimed at anything, figure out a target if(CurrentTarget == None) { lspro.DetermineTarget(ProjectedHitLoc); } else lspro.SetNewTarget(CurrentTarget); lspro.SetupShot(SeekingChargeMultiplier*ChargeTime); lspro.AddRelativeVelocity(Instigator.Velocity); // Touch any actor that was in between, just in case. if(HitActor != None) HitActor.Bump(lspro); } }*/ } // Clear our target regardless //CurrentTarget = None; // If we didn't make a valid rocket, then give him his ammo back if(gren != None) //&& lspro == None) /*{ giveback = ChargeStartAmmo - AmmoType.AmmoAmount; if(giveback > 0) AmmoType.AddAmmo(giveback); } else*/ { // Say we just fired ShotCount++; P2AmmoInv(AmmoType).UseAmmoForShot(1); // Only make a new danger marker if the consecutive fires were as high // as the max if(ShotCount >= ShotCountMaxForNotify && Instigator.Controller != None && ShotMarkerMade != None) { // tell it we know this just happened, by recording it. ShotCount -= ShotCountMaxForNotify; // Records the first (gun fire) markerpos = Instigator.Location; // Primary (the gun shooting, making a loud noise) if(ShotMarkerMade != None) { ShotMarkerMade.static.NotifyControllersStatic( Level, ShotMarkerMade, FPSPawn(Instigator), None, ShotMarkerMade.default.CollisionRadius, markerpos); } } } // Reset the ammo you started with //ChargeStartAmmo = AmmoType.AmmoAmount; } } /* No longer necessary, the skin gives it away // Tell 'em you're using TEH SOOPAR Nuke state Active { function BeginState() { Super.BeginState(); P2Player(Instigator.Controller).ClientMessage("Nuke Launcher selected"); } }*/ /* // Disable seekers for MPNukes state ChargeWaitLauncher { /////////////////////////////////////////////////////////////////////////////// // Set to seeking when you get to this state /////////////////////////////////////////////////////////////////////////////// simulated function BeginState() { PlayChargeWait(); } }*/ Iclass GrenadeLauncherPickup extends P2WeaponPickup; event PreBeginPlay() { Super.PreBeginPlay(); SetCollisionSize(60,20); } @Gc OMw*@996@>u @ @@class GrenadeLauncherAttachment extends LauncherAttachment; "SZ4Z $$AZ $$AZ $$A !:Z$=':Z$?SY $=$33? $?$@Z4Z $*C$\CZ $B$BZ $B$B$BS""%"2$Z $@$ @Z4Z $$CZ $$CZ $$B-Z4Z $@$@Z $@$@Z $@$@):#"SZ4Z $$AZ $$AZ $$A !:Z$@':Z$?SY$@ $?Z4Z $@$pAZ $B$BZ $B$B$CS""%"A$Z $?$?Z.Z $$DZ $$DZ$C{):#WNY%*dx $L>*dd $?*dd:" SZ4Z $$AZ $$AZ $H$SY $>$33? $?$@Z4Z $B$HCZ $HC$CZ $B$B$;ES$Z $ @$,@Z4Z $$CZ $$CZ $\C$C-Z4Z $?$?Z $?$?Z $?$?):#"S_Z4Z $@$@@Z $@$@@Z $@$@@ !:Z$@':Z$?SY$@ $?Z4Z $@$ BZ $B$BZ $B$B$CS""%"A$Z $?$?Z.Z $$CZ $$CZ$C"SZ4Z $H$HCZ $H$HCZ $a$@F !:Z$=':Z$?SY $=$333? $?$?Z4Z $zD$zDZ $B$BZ $B$B$@ES""%"2$Z $@@$(AZ4Z $$CZ $$CZ $B$D-Z4Z $@$@Z $@$@Z $@$@?{}$?:$?@"SCgZ $B$CZ4Z $?$?Z $ A$AZ $B$B$HCS$Z $?$?sZ $aD$zD-Z4Z $?$?Z $?$?Z $?$??):#"S_Z4Z $@$@@Z $@$@@Z $@$@@ !:Z$@':Z$?SY$? $?Z4Z $@$ BZ $B$BZ $B$B$CS""%"A$Z $?$?Z.Z $$CZ $$CZ$C"SZ4Z $/$/GZ $/$/GZ $PCG$}G !:Z$=':Z$?SY $=$333? $?$?Z4Z $E$@FZ $B$BZ $B$B$zDS""%"2$AZ $A$HAZ4Z $$CZ $$CZ $$B-Z4Z $A$AZ $A$AZ $@$A?):#zIZ4Z $?$fff?Z $?$fff?Z $?$fff?",SZ4Z $$AZ $$AZ $$B !:Z$@':Z$?SY$? $ AZ4Z $?$BZ $B$BZ $B$B$CS""%"A$Z $?$@Z.Z $$DZ $$DZ$ED):#pBNY* $?*):SZ4Z $$AZ $$AZ $$@FgZ$HC !:Z$<SY"$L> $>$? $?$?Z4Z $D$DZ $B$BZ $B$B$BS""%"2$Z $@$PAZZ $C$HCsZ $$-Z4Z $L?$L?Z $L?$L?Z $=$L>?:"(SY$= $?$L=JK$A$ASZ $?$?Z4Z $HB$HZ $HB$HZ $HB$HWNY $>* $?*"Z4Z $@$@@Z $@$@@Z $@$@@ !:Z$>':Z$?SY$L> $?$?Z4Z $B$BZ $B$BZ $B$B""%"2$Z $?$?Z4Z $p$pAZ $p$pAZ $p$pA S S RM RV S S Y# R[ ^w SS RW RJ R\ RR R^ RP RU RN [D [F R[ S0 R] Sp ^u Rt Sx RU R_ RO R_ ^I RR RQ Rb S$ Sm RL _= R` [r RY \~ ^m _ RC W7 `H _c ^y Sf Ra R[ RT ^F ` RR q y RJ R\ X6 [G a} R\ RA R~ `B _V WA R@ _z [) RX RP RD ^S RQ _| R` ]P RM Si `s Sh R^ _, RK ^l ab R_ ^W RO RL &{ ^m _h q Sp _{ SE So bO `T R` S` M [s s Sz `y bQ RZ RU Ka Nyf NK _c W} W[ ^r &d Sn Wl W] RB _[ WA _[ ]Q aN R\ RT Nj Sce \R WH l ae t WG [J W W~ [h WA RS We ^av ^i Ni RS Rb RY WF x Sg _J R Xy _o RN L S^ RG RH RE J aN K W^ RZ RX `I Ra R] _ WYI WR Ry W[ WN WH_ RDR We Wc W Sw _C k WY W`Y W. [Y ^[V ^E Wf _| `u ^| _W Wj `"n Wf RT Wh Wc Wh Wb WW Wk NL &a &X S\P &)_ `t _* Wk _] Kb R] R^ _K RV N Ng Sm Sn o RZ `H ^I \B v RW _l W} Wx W^ u r w Nh Nkq^{l{zj H{UW cx ph}B KdXPxfx ^i kz xM DZ Qx ^Ltkx _x l`By{{B I{ V| cZ pl }qJz XpleZQH_qmv {qHp Vl cB pq}| Kw Xy eSDrvq DA QN^j lMIyE BMOvl]AI} WA dA qA ~{ Kc XAdnrE @{ME [o hkuACG Q^ lyr GO@SS an~K|OG UN bAo}Kk YVdeMFIx Oan[CIWeCsAO]ko yn E{ RA_BmIn{ 6+iHWThTkxG M1T`ZB zAGFUAcB qD~K]LBi+O`wA WBdA rXOB Nc [B hTBuAcwAZ@MhN uw BBNA \{Ii Qsrv ekrQuAzUvteK{ p4y`}Z ]BiA wuQDHeUpzyNWHp_RombW\as}'Tp{+eRI+h![g |1ehHU p6+|Hig1lNP1[ ^YY~U W ^c1]AX `fl1G z y-ZY&Gg mgHny4eSgU z4lNF} T~ ] h@ rAV}^HS4[ [U {f=G4]DX c.{ofjNxFFGTMbn po }4G Jl@jg6|jc%f@ Kf7+W7+BA9mWffkYLCeX7+hI7+SX ~IJ_bXX zIxFV4p)~ V4}nIV4Lks wt Bu LF9W<[PV4CMk}V4Wnk"ExRgyV4OyFHV4eVXV4L{HGCIV.z_V4^Yo\wlV4KS1V4ZP^V4T4xfV4ILhV4{CUDZPiV49jV4AcsV4;dVV45_uV4oTj'C+V4y&j^ocUV44RV4V'F~V46\f(RV4|zMV4`vaVV4XwV4iOV4Gx4V4|RV4T{cRO@ aV4Kncfydk_yJ@oCeireb[fo}gil jhU kH} lIE d@N