|
|
Line 7: |
Line 7: |
| | | |
| <uscript> | | <uscript> |
− | //See Timer function for relevant code. Entire class is provided for context purposes. | + | //paste code here!!! |
− | | + | |
− | class EONSScorpionEnergyProjectileRed extends Projectile;
| + | |
− | | + | |
− | #exec AUDIO IMPORT FILE="Sounds\DP_Explode.wav" NAME="DP_Explode" GROUP="Scorpion"
| + | |
− | | + | |
− | var vector initialDir;
| + | |
− | var float FlyingDamageRadius;
| + | |
− | var class<Emitter> ProjectileEffectClass;
| + | |
− | var Emitter ProjectileEffect;
| + | |
− | var class<xEmitter> HitEmitterClass;
| + | |
− | var class<Emitter> ExplosionEmitterClass;
| + | |
− | var bool bZap, bEffects;
| + | |
− | var byte Team;
| + | |
− | | + | |
− | | + | |
− | replication
| + | |
− | {
| + | |
− | reliable if(bNetDirty && Role==ROLE_Authority)
| + | |
− | bZap, Team;
| + | |
− | }
| + | |
− | | + | |
− | | + | |
− | simulated function PostBeginPlay()
| + | |
− | {
| + | |
− | local Rotator R;
| + | |
− | | + | |
− | if (Level.NetMode != NM_DedicatedServer)
| + | |
− | {
| + | |
− | ProjectileEffect = spawn(ProjectileEffectClass, self,, Location, Rotation);
| + | |
− | ProjectileEffect.SetBase(self);
| + | |
− | }
| + | |
− | | + | |
− | Super.PostBeginPlay();
| + | |
− | | + | |
− | Velocity = Speed * Vector(Rotation);
| + | |
− | R = Rotation;
| + | |
− | R.Roll = 32768;
| + | |
− | SetRotation(R);
| + | |
− | Velocity.z += TossZ;
| + | |
− | initialDir = Velocity;
| + | |
− |
| + | |
− | Team = Instigator.GetTeamNum();
| + | |
− | | + | |
− | //Use the timer for electromagnetic shocks while travelling
| + | |
− | SetTimer(0.05, True); //Was 0.05, upping to 0.20 to see if it reduces lag
| + | |
− | bEffects = false;
| + | |
− | }
| + | |
− | | + | |
− | | + | |
− | simulated function Destroyed()
| + | |
− | {
| + | |
− | //If we didn't zap someone, and destroy got called before we hit something (our lifetime probably expired), then explode
| + | |
− | if (!bZap)
| + | |
− | {
| + | |
− | if ( Role == ROLE_Authority )
| + | |
− | {
| + | |
− | HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, Location);
| + | |
− | }
| + | |
− | }
| + | |
− | | + | |
− | //If the explosion effects weren't previously called, we can call them now so our projectile always explodes a the end of its life
| + | |
− | if (!bEffects)
| + | |
− | SpawnEffects(vect(0,0,0),vect(0,0,0));
| + | |
− | | + | |
− | if (ProjectileEffect != None)
| + | |
− | ProjectileEffect.Destroy();
| + | |
− | | + | |
− | Super.Destroyed();
| + | |
− | }
| + | |
− | | + | |
− | | + | |
− | simulated function ProcessTouch(Actor Other, Vector HitLocation)
| + | |
− | {
| + | |
− | if ( Other != Instigator )
| + | |
− | {
| + | |
− | SpawnEffects(HitLocation, -1 * Normal(Velocity) );
| + | |
− | bEffects = true;
| + | |
− | Explode(HitLocation,Normal(HitLocation-Other.Location));
| + | |
− | }
| + | |
− | }
| + | |
− | | + | |
− | | + | |
− | simulated function SpawnEffects( vector HitLocation, vector HitNormal )
| + | |
− | {
| + | |
− | if ( EffectIsRelevant(Location,false) )
| + | |
− | {
| + | |
− | if (bZap)
| + | |
− | {
| + | |
− | spawn(class'xEffects.GoopSparks',,,Location);
| + | |
− | PlaySound(sound'WeaponSounds.BioRifle.BioRifleGoo1',,8*TransientSoundVolume);
| + | |
− | }
| + | |
− | else
| + | |
− | {
| + | |
− | PlaySound(ImpactSound,,8*TransientSoundVolume);
| + | |
− | }
| + | |
− | | + | |
− | spawn(ExplosionEmitterClass,,,Location);
| + | |
− | spawn(class'ONSPlasmaHitGreen',,,Location);
| + | |
− | | + | |
− | if ( (ExplosionDecal != None) && (Level.NetMode != NM_DedicatedServer) )
| + | |
− | Spawn(ExplosionDecal,self,,HitLocation, rotator(-HitNormal));
| + | |
− | }
| + | |
− | }
| + | |
− | | + | |
− | | + | |
− | simulated function Landed( vector HitNormal )
| + | |
− | {
| + | |
− | SpawnEffects( Location, HitNormal );
| + | |
− | bEffects = true;
| + | |
− | Explode(Location,HitNormal);
| + | |
− | }
| + | |
− | | + | |
− | | + | |
− | simulated function HitWall (vector HitNormal, actor Wall)
| + | |
− | {
| + | |
− | Landed(HitNormal);
| + | |
− | }
| + | |
− | | + | |
− | | + | |
− | simulated function Explode(vector HitLocation, vector HitNormal)
| + | |
− | {
| + | |
− | Destroy();
| + | |
− | }
| + | |
− | | + | |
− | | + | |
− | simulated function Timer()
| + | |
− | {
| + | |
− | local Vehicle Other;
| + | |
− | local Controller C, NextC;
| + | |
− | local xEmitter HitEmitter;
| + | |
− | local int TempDamage;
| + | |
− | | + | |
− | bZap = false;
| + | |
− | | + | |
− | C = Level.ControllerList;
| + | |
− |
| + | |
− | //Instead of using ForEach VisibleCollidingActors, lets traverse the Controller List, it may be faster //ForEach VisibleCollidingActors(class'Vehicle',Other,FlyingDamageRadius)
| + | |
− | while (C != None)
| + | |
− | {
| + | |
− | NextC = C.NextController;
| + | |
− | | + | |
− | if (C.Pawn != None && Vehicle(C.Pawn) != None)
| + | |
− | log("C.Pawn != None && Vehicle(C.Pawn) != None is true. C.Pawn is a "$C.Pawn.class);
| + | |
− | else log("C.Pawn != None && Vehicle(C.Pawn) != None is false. C.Pawn is a "$C.Pawn.class);
| + | |
− | | + | |
− | //if (Vehicle(C.Pawn) != None)
| + | |
− | // log("Vehicle(C.Pawn) != None is true");
| + | |
− | //else log("Vehicle(C.Pawn) != None is false");
| + | |
− | | + | |
− | //if (C.Pawn != Instigator)
| + | |
− | // log("C.Pawn != Instigator is true");
| + | |
− | //else log("C.Pawn != Instigator is false");
| + | |
− | | + | |
− | //if (C.Pawn.Health > 0)
| + | |
− | // log("C.Pawn.Health > 0 is true");
| + | |
− | //else log("C.Pawn.Health > 0 is false");
| + | |
− | | + | |
− | if (!C.SameTeamAs(Instigator.Controller))
| + | |
− | log("This target is on the opposite team");
| + | |
− | else log("This target is on the same team.");
| + | |
− | | + | |
− | if (VSize(C.Pawn.Location - Instigator.Location) < FlyingDamageRadius)
| + | |
− | log("This target is within the zap distance.");
| + | |
− | else log("This target is outside the zap distance.");
| + | |
− | | + | |
− | if (FastTrace(C.Pawn.Location, Instigator.Location))
| + | |
− | log("There is a clear shot to this target.");
| + | |
− | else log("There is not a clear shot to this target.");
| + | |
− |
| + | |
− | if ((Vehicle(C.Pawn).IsA('ONSHoverBike') || Vehicle(C.Pawn).IsA('ONSAttackCraft') || Vehicle(C.Pawn).IsA('ONSDualAttackCraft') || Vehicle(C.Pawn).IsA('ONSHoverCraft') ))
| + | |
− | log("This is one of our target vehicles.");
| + | |
− | else log("This is not one of our target vehicles.");
| + | |
− | | + | |
− | | + | |
− | //If the vehicle is not on our team, is being driven, has a clear trace between the projectile and the vehicle, and is of a specified type, then we proceed
| + | |
− | if ( C.Pawn != None && Vehicle(C.Pawn) != None && C.Pawn != Instigator && C.Pawn.Health > 0 && !C.SameTeamAs(Instigator.Controller) && VSize(C.Pawn.Location - Instigator.Location) < FlyingDamageRadius && FastTrace(C.Pawn.Location, Instigator.Location) && (Vehicle(C.Pawn).IsA('ONSHoverBike') || Vehicle(C.Pawn).IsA('ONSAttackCraft') || Vehicle(C.Pawn).IsA('ONSDualAttackCraft') || Vehicle(C.Pawn).IsA('ONSHoverCraft') ) )
| + | |
− | {
| + | |
− | | + | |
− | //
| + | |
− | log("Success!!!");
| + | |
− | | + | |
− | if ( Role == ROLE_Authority )
| + | |
− | {
| + | |
− | if (Other.Health < 100 && Other.Health > 25)
| + | |
− | {
| + | |
− | TempDamage = Max(1,(Other.Health - 25));
| + | |
− | Other.TakeDamage( TempDamage, Instigator, Other.Location, Normal(Location-Other.Location), MyDamageType);
| + | |
− | Other.DriverRadiusDamage( (TempDamage/3)+Rand(10), DamageRadius, Instigator.Controller, MyDamageType, MomentumTransfer, (Other.Location + VRand()*30) ); //We may need to change Hitlocation to Other.Location
| + | |
− | Other.EjectDriver();
| + | |
− | bZap = true;
| + | |
− | }
| + | |
− | else
| + | |
− | {
| + | |
− | Other.TakeDamage(Damage, Instigator, Other.Location, Normal(Location-Other.Location), MyDamageType);
| + | |
− | Other.DriverRadiusDamage( (Damage/3)+Rand(10), DamageRadius, Instigator.Controller, MyDamageType, MomentumTransfer, Other.Location );
| + | |
− | bZap = true;
| + | |
− | }
| + | |
− | | + | |
− | //Log("Applying damage to nearby vehicle: "$(FlyingDamageRadius-(VSize(Location-Other.Location))) * Default.FlyingDamage/FlyingDamageRadius);
| + | |
− | }
| + | |
− |
| + | |
− | //Once this projectile has zapped something, draw the zap and then the projectile goes away.
| + | |
− | if (bZap)
| + | |
− | {
| + | |
− | HitEmitter = spawn(HitEmitterClass,,, Self.Location, rotator(Other.Location - Self.Location));
| + | |
− | if (HitEmitter != None)
| + | |
− | HitEmitter.mSpawnVecA = Other.Location;
| + | |
− | Other.PlaySound(ImpactSound,,8*TransientSoundVolume);
| + | |
− | Self.Destroy();
| + | |
− | }
| + | |
− | }
| + | |
− | | + | |
− | C = NextC;
| + | |
− | }
| + | |
− | | + | |
− | if (Velocity.Z > -1000)
| + | |
− | {
| + | |
− | Velocity.Z -= 30;
| + | |
− | }
| + | |
− | }
| + | |
− | | + | |
− | | + | |
− | defaultproperties
| + | |
− | {
| + | |
− | Speed=4500.000000 //4500/5000/4000
| + | |
− | Damage=80.000000
| + | |
− | DamageRadius=275.000000 //275/220
| + | |
− | FlyingDamageRadius=1000.000000 //Because we reduced the frequency of the checks from .05 to .20, we increase the range here simply to increase the odds of it triggering successfully. Was 575/500/525/440
| + | |
− | MomentumTransfer=50000.000000
| + | |
− | LifeSpan=2.000000 //1.6
| + | |
− | | + | |
− | ProjectileEffectClass=class'EONSScorpionEnergyProjectileEffectRed'
| + | |
− | HitEmitterClass=class'EONSScorpionEnergyProjectileZapEmitter'
| + | |
− | ExplosionEmitterClass=class'ONSPlasmaHitRed'
| + | |
− | ExplosionDecal=class'LinkBoltScorch'
| + | |
− | DrawScale=0.3
| + | |
− | AmbientGlow=100
| + | |
− | CullDistance=+8000.0
| + | |
− | | + | |
− | TossZ=+0.0 //225.0
| + | |
− | bFixedRotationDir=True
| + | |
− | DesiredRotation=(Pitch=12000,Yaw=5666,Roll=2334)
| + | |
− | | + | |
− | bProjTarget=True
| + | |
− | bNetTemporary=True
| + | |
− | | + | |
− | ImpactSound=Sound'DP_Explode'
| + | |
− | AmbientSound=Sound'WeaponSounds.BTranslocatorHoverModule'
| + | |
− | SoundRadius=100
| + | |
− | SoundVolume=255
| + | |
− | | + | |
− | ForceType=FT_Constant
| + | |
− | ForceScale=5.0
| + | |
− | ForceRadius=60.0
| + | |
− | | + | |
− | MyDamageType=class'DamTypeEONSScorpionEnergyProjectile'
| + | |
− | }
| + | |
| </uscript> | | </uscript> |
This page is for pasting code you want to show someone as an example or to get assistance with. This allows you to easily collaborate with someone to solve a problem, and allows easy comparisons of the edits.
You are free to remove any existing code from below, and paste your code between the <uscript> </uscript> tags. If the page hasn't been edited in the last few hours (the last edit timestamp is 2008-09-12 16:20:39), you can assume it isn't needed anymore and can be removed. A full edit history will be available, so don't worry about losing anything you removed.