home *** CD-ROM | disk | FTP | other *** search
/ Game Level Design / GLDesign.bin / Software / UnrealEngine2Runtime / UE2Runtime-22262001_Demo.exe / Engine / Classes / Projectile.uc < prev    next >
Text File  |  2003-06-23  |  5KB  |  172 lines

  1. //=============================================================================
  2. // Projectile.
  3. //
  4. // A delayed-hit projectile that moves around for some time after it is created.
  5. //=============================================================================
  6. class Projectile extends Actor
  7.     abstract
  8.     native;
  9.  
  10. //-----------------------------------------------------------------------------
  11. // Projectile variables.
  12.  
  13. // Motion information.
  14. var        float   Speed;               // Initial speed of projectile.
  15. var        float   MaxSpeed;            // Limit on speed of projectile (0 means no limit)
  16. var        float    TossZ;
  17. var        Actor    ZeroCollider;
  18. var        bool    bSwitchToZeroCollision; // if collisionextent nonzero, and hit actor with bBlockNonZeroExtents=0, switch to zero extent collision
  19.  
  20. // Damage attributes.
  21. var   float    Damage; 
  22. var      float       DamageRadius;        
  23. var   float       MomentumTransfer; // Momentum magnitude imparted by impacting projectile.
  24. var   class<DamageType>       MyDamageType;
  25.  
  26. // Projectile sound effects
  27. var   sound    SpawnSound;        // Sound made when projectile is spawned.
  28. var   sound       ImpactSound;        // Sound made when projectile hits something.
  29.  
  30. // explosion effects
  31. var   class<Projector> ExplosionDecal;
  32. var   float        ExploWallOut;    // distance to move explosions out from wall
  33.  
  34. //==============
  35. // Encroachment
  36. function bool EncroachingOn( actor Other )
  37. {
  38.     if ( (Other.Brush != None) || (Brush(Other) != None) )
  39.         return true;
  40.         
  41.     return false;
  42. }
  43.  
  44. //==============
  45. // Touching
  46. simulated singular function Touch(Actor Other)
  47. {
  48.     local actor HitActor;
  49.     local vector HitLocation, HitNormal, VelDir, AdjustedLocation;
  50.     local bool bBeyondOther;
  51.     local float BackDist, DirZ;
  52.  
  53.     if ( Other == None ) // Other just got destroyed in its touch?
  54.         return;
  55.     if ( Other.bProjTarget || (Other.bBlockActors && Other.bBlockPlayers) )
  56.     {
  57.         if ( Velocity == vect(0,0,0) || Other.IsA('Mover') ) 
  58.         {
  59.             ProcessTouch(Other,Location);
  60.             return;
  61.         }
  62.         
  63.         //get exact hitlocation - trace back along velocity vector
  64.         bBeyondOther = ( (Velocity Dot (Location - Other.Location)) > 0 );
  65.         VelDir = Normal(Velocity);
  66.         DirZ = sqrt(abs(VelDir.Z));
  67.         BackDist = Other.CollisionRadius * (1 - DirZ) + Other.CollisionHeight * DirZ;
  68.         if ( bBeyondOther )
  69.             BackDist += VSize(Location - Other.Location);
  70.         else
  71.             BackDist -= VSize(Location - Other.Location);
  72.  
  73.          HitActor = Trace(HitLocation, HitNormal, Location, Location - 1.1 * BackDist * VelDir, true);
  74.         if (HitActor == Other)
  75.             AdjustedLocation = HitLocation;
  76.         else if ( bBeyondOther )
  77.             AdjustedLocation = Other.Location - Other.CollisionRadius * VelDir;
  78.         else
  79.             AdjustedLocation = Location;
  80.         ProcessTouch(Other, AdjustedLocation);
  81.         if ( (Role < ROLE_Authority) && (Other.Role == ROLE_Authority) )
  82.             ClientSideTouch(Other, AdjustedLocation);
  83.     }
  84.     }
  85.  
  86. /* ClientSideTouch()
  87. Allows client side actors (with Role==ROLE_Authority on the client, like ragdolls)
  88. to be affected by projectiles
  89. */
  90. simulated function ClientSideTouch(Actor Other, Vector HitLocation)
  91. {
  92.     Other.TakeDamage(Damage, instigator, Location, MomentumTransfer * Normal(Velocity), MyDamageType);
  93. }
  94.  
  95. simulated function ProcessTouch(Actor Other, Vector HitLocation)
  96. {
  97.     if ( Other != Instigator )
  98.         Explode(HitLocation,Normal(HitLocation-Other.Location));
  99. }
  100.  
  101. simulated function HitWall (vector HitNormal, actor Wall)
  102. {
  103.     if ( Role == ROLE_Authority )
  104.     {
  105.         if ( Mover(Wall) != None )
  106.             Wall.TakeDamage( Damage, instigator, Location, MomentumTransfer * Normal(Velocity), MyDamageType);
  107.  
  108.         MakeNoise(1.0);
  109.     }
  110.     Explode(Location + ExploWallOut * HitNormal, HitNormal);
  111.     if ( (ExplosionDecal != None) && (Level.NetMode != NM_DedicatedServer) )
  112.         Spawn(ExplosionDecal,self,,Location, rotator(-HitNormal));
  113. }
  114.  
  115. simulated function BlowUp(vector HitLocation)
  116. {
  117.     HurtRadius(Damage,DamageRadius, MyDamageType, MomentumTransfer, HitLocation );
  118.     if ( Role == ROLE_Authority )
  119.         MakeNoise(1.0);
  120. }
  121.  
  122. simulated function Explode(vector HitLocation, vector HitNormal)
  123. {
  124.     Destroy();
  125. }
  126.  
  127. simulated final function RandSpin(float spinRate)
  128. {
  129.     DesiredRotation = RotRand();
  130.     RotationRate.Yaw = spinRate * 2 *FRand() - spinRate;
  131.     RotationRate.Pitch = spinRate * 2 *FRand() - spinRate;
  132.     RotationRate.Roll = spinRate * 2 *FRand() - spinRate;    
  133. }
  134.  
  135. static function vector GetTossVelocity(Pawn P, Rotator R)
  136. {
  137.     local vector V;
  138.  
  139.     V = Vector(R);
  140.     V *= ((P.Velocity Dot V)*0.4 + Default.Speed);
  141.     V.Z += Default.TossZ;
  142.     return V;
  143. }
  144.  
  145. defaultproperties
  146. {
  147.     bCanBeDamaged=true
  148.      bAcceptsProjectors=false
  149.      bUseCylinderCollision=true
  150.      DamageRadius=+220.0
  151.      MaxSpeed=+02000.000000
  152.      DrawType=DT_Mesh
  153.      Texture=S_Camera
  154.      SoundVolume=0
  155.      CollisionRadius=+00000.000000
  156.      CollisionHeight=+00000.000000
  157.      bCollideActors=True
  158.      bCollideWorld=True
  159.      bNetTemporary=true
  160.      bGameRelevant=true
  161.      bReplicateInstigator=true
  162.      Physics=PHYS_Projectile
  163.      LifeSpan=+0014.000000
  164.      NetPriority=+00002.500000
  165.      MyDamageType=class'DamageType'
  166.      RemoteRole=ROLE_SimulatedProxy
  167.      bUnlit=true
  168.      TossZ=+100.0
  169.      bNetInitialRotation=true
  170.      bDisturbFluidSurface=true
  171. }
  172.