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

  1. //=============================================================================
  2. // Trigger: senses things happening in its proximity and generates 
  3. // sends Trigger/UnTrigger to actors whose names match 'EventName'.
  4. //=============================================================================
  5. class Trigger extends Triggers
  6.     native;
  7.  
  8. #exec Texture Import File=Textures\Trigger.pcx Name=S_Trigger Mips=Off MASKED=1
  9.  
  10. //-----------------------------------------------------------------------------
  11. // Trigger variables.
  12.  
  13. // Trigger type.
  14. var() enum ETriggerType
  15. {
  16.     TT_PlayerProximity,    // Trigger is activated by player proximity.
  17.     TT_PawnProximity,    // Trigger is activated by any pawn's proximity
  18.     TT_ClassProximity,    // Trigger is activated by actor of ClassProximityType only
  19.     TT_AnyProximity,    // Trigger is activated by any actor in proximity.
  20.     TT_Shoot,            // Trigger is activated by player shooting it.
  21.     TT_HumanPlayerProximity,    // Trigger activated by human player (not bot)
  22. } TriggerType;
  23.  
  24. // Human readable triggering message.
  25. var() localized string Message;
  26.  
  27. // Only trigger once and then go dormant.
  28. var() bool bTriggerOnceOnly;
  29.  
  30. // For triggers that are activated/deactivated by other triggers.
  31. var() bool bInitiallyActive;
  32.  
  33. var() class<actor> ClassProximityType;
  34.  
  35. var() float    RepeatTriggerTime; //if > 0, repeat trigger message at this interval is still touching other
  36. var() float ReTriggerDelay; //minimum time before trigger can be triggered again
  37. var      float TriggerTime;
  38. var() float DamageThreshold; //minimum damage to trigger if TT_Shoot
  39.  
  40. // AI vars
  41. var    actor TriggerActor;    // actor that triggers this trigger
  42. var actor TriggerActor2;
  43.  
  44. // store for reset
  45.  
  46. var bool bSavedInitialCollision;
  47. var bool bSavedInitialActive;
  48.  
  49. //=============================================================================
  50. // AI related functions
  51.  
  52. function PreBeginPlay()
  53. {
  54.     Super.PreBeginPlay();
  55.  
  56.     if ( (TriggerType == TT_PlayerProximity)
  57.         || (TriggerType == TT_PawnProximity)
  58.         || (TriggerType == TT_HumanPlayerProximity)
  59.         || ((TriggerType == TT_ClassProximity) && ClassIsChildOf(ClassProximityType,class'Pawn')) )    
  60.         OnlyAffectPawns(true);
  61. }
  62.  
  63. function PostBeginPlay()
  64. {
  65.     if ( !bInitiallyActive )
  66.         FindTriggerActor();
  67.     if ( TriggerType == TT_Shoot )
  68.     {
  69.         bHidden = false;
  70.         bProjTarget = true;
  71.         SetDrawType(DT_None);
  72.     }
  73.     bSavedInitialActive = bInitiallyActive;
  74.     bSavedInitialCollision = bCollideActors;
  75.     Super.PostBeginPlay();
  76. }
  77.  
  78. /* Reset() 
  79. reset actor to initial state - used when restarting level without reloading.
  80. */
  81. function Reset()
  82. {
  83.     Super.Reset();
  84.  
  85.     // collision, bInitiallyactive
  86.     bInitiallyActive = bSavedInitialActive;
  87.     SetCollision(bSavedInitialCollision, bBlockActors, bBlockPlayers );
  88. }    
  89.  
  90.  
  91. function FindTriggerActor()
  92. {
  93.     local Actor A;
  94.  
  95.     TriggerActor = None;
  96.     TriggerActor2 = None;
  97.     ForEach AllActors(class 'Actor', A)
  98.         if ( A.Event == Tag)
  99.         {
  100.             if (TriggerActor == None)
  101.                 TriggerActor = A;
  102.             else
  103.             {
  104.                 TriggerActor2 = A;
  105.                 return;
  106.             }
  107.         }
  108. }
  109.  
  110. function Actor SpecialHandling(Pawn Other)
  111. {
  112.     local Actor A;
  113.  
  114.     if ( bTriggerOnceOnly && !bCollideActors )
  115.         return None;
  116.  
  117.     if ( (TriggerType == TT_HumanPlayerProximity) && !Other.IsHumanControlled() )
  118.         return None;
  119.  
  120.     if ( (TriggerType == TT_PlayerProximity) && !Other.IsPlayerPawn() )
  121.         return None;
  122.  
  123.     if ( !bInitiallyActive )
  124.     {
  125.         if ( TriggerActor == None )
  126.             FindTriggerActor();
  127.         if ( TriggerActor == None )
  128.             return None;
  129.         if ( (TriggerActor2 != None) 
  130.             && (VSize(TriggerActor2.Location - Other.Location) < VSize(TriggerActor.Location - Other.Location)) )
  131.             return TriggerActor2;
  132.         else
  133.             return TriggerActor;
  134.     }
  135.  
  136.     // is this a shootable trigger?
  137.     if ( TriggerType == TT_Shoot )
  138.         return Other.ShootSpecial(self);
  139.  
  140.     // can other trigger it right away?
  141.     if ( IsRelevant(Other) )
  142.     {
  143.         ForEach TouchingActors(class'Actor', A)
  144.             if ( A == Other )
  145.                 Touch(Other);
  146.         return self;
  147.     }
  148.  
  149.     return self;
  150. }
  151.  
  152. // when trigger gets turned on, check its touch list
  153.  
  154. function CheckTouchList()
  155. {
  156.     local Actor A;
  157.  
  158.     ForEach TouchingActors(class'Actor', A)
  159.         Touch(A);
  160. }
  161.  
  162. //=============================================================================
  163. // Trigger states.
  164.  
  165. // Trigger is always active.
  166. state() NormalTrigger
  167. {
  168. }
  169.  
  170. // Other trigger toggles this trigger's activity.
  171. state() OtherTriggerToggles
  172. {
  173.     function Trigger( actor Other, pawn EventInstigator )
  174.     {
  175.         bInitiallyActive = !bInitiallyActive;
  176.         if ( bInitiallyActive )
  177.             CheckTouchList();
  178.     }
  179. }
  180.  
  181. // Other trigger turns this on.
  182. state() OtherTriggerTurnsOn
  183. {
  184.     function Trigger( actor Other, pawn EventInstigator )
  185.     {
  186.         local bool bWasActive;
  187.  
  188.         bWasActive = bInitiallyActive;
  189.         bInitiallyActive = true;
  190.         if ( !bWasActive )
  191.             CheckTouchList();
  192.     }
  193. }
  194.  
  195. // Other trigger turns this off.
  196. state() OtherTriggerTurnsOff
  197. {
  198.     function Trigger( actor Other, pawn EventInstigator )
  199.     {
  200.         bInitiallyActive = false;
  201.     }
  202. }
  203.  
  204. //=============================================================================
  205. // Trigger logic.
  206.  
  207. //
  208. // See whether the other actor is relevant to this trigger.
  209. //
  210. function bool IsRelevant( actor Other )
  211. {
  212.     if( !bInitiallyActive )
  213.         return false;
  214.     switch( TriggerType )
  215.     {
  216.     case TT_HumanPlayerProximity:
  217.             return (Pawn(Other) != None) && Pawn(Other).IsHumanControlled();
  218.         case TT_PlayerProximity:
  219.             return (Pawn(Other) != None) && (Pawn(Other).IsPlayerPawn() || Pawn(Other).WasPlayerPawn());
  220.         case TT_PawnProximity:
  221.             return (Pawn(Other) != None) && Pawn(Other).CanTrigger(self);
  222.         case TT_ClassProximity:
  223.             return ClassIsChildOf(Other.Class, ClassProximityType);
  224.         case TT_AnyProximity:
  225.             return true;
  226.         case TT_Shoot:
  227.             return ( (Projectile(Other) != None) && (Projectile(Other).Damage >= DamageThreshold) );
  228.     }
  229. }
  230. //
  231. // Called when something touches the trigger.
  232. //
  233. function Touch( actor Other )
  234. {
  235.     local int i;
  236.  
  237.     if( IsRelevant( Other ) )
  238.     {
  239.         if ( ReTriggerDelay > 0 )
  240.         {
  241.             if ( Level.TimeSeconds - TriggerTime < ReTriggerDelay )
  242.                 return;
  243.             TriggerTime = Level.TimeSeconds;
  244.         }
  245.         // Broadcast the Trigger message to all matching actors.
  246.         TriggerEvent(Event, self, Other.Instigator);
  247.  
  248.         if ( (Pawn(Other) != None) && (Pawn(Other).Controller != None) )
  249.         {
  250.             for ( i=0;i<4;i++ )
  251.                 if ( Pawn(Other).Controller.GoalList[i] == self )
  252.                 {
  253.                     Pawn(Other).Controller.GoalList[i] = None;
  254.                     break;
  255.                 }
  256.         }    
  257.                 
  258.         if( (Message != "") && (Other.Instigator != None) )
  259.             // Send a string message to the toucher.
  260.             Other.Instigator.ClientMessage( Message );
  261.  
  262.         if( bTriggerOnceOnly )
  263.             // Ignore future touches.
  264.             SetCollision(False);
  265.         else if ( RepeatTriggerTime > 0 )
  266.             SetTimer(RepeatTriggerTime, false);
  267.     }
  268. }
  269.  
  270. function Timer()
  271. {
  272.     local bool bKeepTiming;
  273.     local Actor A;
  274.  
  275.     bKeepTiming = false;
  276.  
  277.     ForEach TouchingActors(class'Actor', A)
  278.         if ( IsRelevant(A) )
  279.         {
  280.             bKeepTiming = true;
  281.             Touch(A);
  282.         }
  283.  
  284.     if ( bKeepTiming )
  285.         SetTimer(RepeatTriggerTime, false);
  286. }
  287.  
  288. function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, 
  289.                         Vector momentum, class<DamageType> damageType)
  290. {
  291.     if ( bInitiallyActive && (TriggerType == TT_Shoot) && (Damage >= DamageThreshold) && (instigatedBy != None) )
  292.     {
  293.         if ( ReTriggerDelay > 0 )
  294.         {
  295.             if ( Level.TimeSeconds - TriggerTime < ReTriggerDelay )
  296.                 return;
  297.             TriggerTime = Level.TimeSeconds;
  298.         }
  299.         // Broadcast the Trigger message to all matching actors.
  300.         TriggerEvent(Event, self, instigatedBy);
  301.  
  302.         if( Message != "" )
  303.             // Send a string message to the toucher.
  304.             instigatedBy.Instigator.ClientMessage( Message );
  305.  
  306.         if( bTriggerOnceOnly )
  307.             // Ignore future touches.
  308.             SetCollision(False);
  309.     }
  310. }
  311.  
  312. //
  313. // When something untouches the trigger.
  314. //
  315. function UnTouch( actor Other )
  316. {
  317.     if( IsRelevant( Other ) )
  318.         UntriggerEvent(event, self, Other.Instigator);
  319. }
  320.  
  321. defaultproperties
  322. {
  323.      Texture=S_Trigger
  324.      bInitiallyActive=True
  325.      InitialState=NormalTrigger
  326. }
  327.