Įƒ*žDL@>5²Ą”…lĻ“ÓŠĘ@śGĮLNoneReallyIsRelevantTouchCore EspritDeCorpSystemEngineEspritTeamTriggerOnTouchClientMessage FireWeaponEspritBlueTeamTriggerTeamPawnEspritRedTeamTriggerTrigger UnTriggerTimerUnTouchSpecialHandlingFindTriggerActorCTFGameClass NamePropertyMessagePackageEvent TextBufferLevelClassProperty Projectile GameInfo LevelInfoWeaponA ReturnValueiObjectPropertyFloatPropertyPlayerReplicationInfoActorStructProperty StrProperty Location IntelligencebInitiallyActiveOtherDamagebCanDoSpecialbTriggerOnceOnlyTriggerActor2Game Touching InstigatorTarget TimeSecondsbShootSpecialDamageThreshold TriggerActor TriggerTypeClassProximityTypeRepeatTriggerTimeReTriggerDelay TriggerTime bKeepTimingbFire bAltFire SpecialGoalObject Function bIsPlayer pawnOther BoolProperty IntProperty BytePropertybCollideActors€ƒ €‚ƒ„’’’’’’’’a@’’’’’’’’’’2#ļR‡„Wķ‚ś©¬ ‚ś©¬ ˆ’ŌūRˆ’ŌūR‚ś©¬ ‚ś©¬ ‚ś©¬ ƒ¦TŒŌƒ¦TŒŌ‚ś©¬ ƒ¦TŒŌƒ¦TŒŌ‚ś©¬ ƒ¦TŒŌ‚ś©¬ ƒ¦TŒŌƒ¦TŒŌƒ¦TŒŌƒ¦TŒŌƒ¦TŒŌƒ¦TŒŌƒ¦TŒŌƒ¦TŒŌˆ’ŌūR±įkųļR‡ƒ¦TŒŌš.ź;ūļR‡ƒ¦TŒŌƒ¦TŒŌ‚ś©¬ Ž€Å_Š€‚ €‚‚‚© Ų y- (%e–,[‚w‰*‰- '‰„w- a‘( Ø £*XVV’!/a0 ‚ U ”10 ŗ/ -ž(.ƒ…‚‚“§a/! w*›: ,’…›:Ŗ¢: ( ®$‚w*-— Õ$‚w*—:¤:$ ń$a¬² ų$' *$‚w.Ž*³.ŽÆ« ’’ °m’ 64O± ?%;°Æ“™œ  œ“™—’!/a0 ‚ – ”10Ū‚a/! r.ƒŸ.ƒŸ*{›”  ›-a())±‘?%a‘( €³:f«‚- -„*>‚š::$-—*ȁ-žZrŒ*grŒ**Ā‚w•*C°įŲ• ‹ ‹įŲŒ ‹ ‹•ČŒZš::$„-£r“**µ-”' ­$®$§%„–,›r‰„o ÷s?//============================================================================= // EspritTeamTrigger. //============================================================================= // Original RealCTF source code by mouse (mailto:mouse@SquirrelSoftware.com) // Edited by Decker to replace the broken UT teamtrigger class EspritTeamTrigger expands Trigger; var() byte Team; function OnTouch(actor Other) { // Override in subclass } // Unfortunately IsRelevant is declared final so it can't be overridden // Therefore we have to write a replacement, then duplicate all the calling code // Lame. // function bool ReallyIsRelevant( actor Other ) { local Pawn pawnOther; if( !bInitiallyActive ) return false; pawnOther = Pawn(Other); if (Level.Game.IsA('CTFGame') && (pawnOther != none) && (self.Team != 255)) { // Touched by a pawn, and this is a team-specific trigger if (pawnOther.PlayerReplicationInfo.Team != self.Team) { // Team must match return(false); } } switch( TriggerType ) { case TT_PlayerProximity: return pawnOther!=None && pawnOther.bIsPlayer; case TT_PawnProximity: return pawnOther!=None && ( pawnOther.Intelligence > BRAINS_None ); case TT_ClassProximity: return ClassIsChildOf(Other.Class, ClassProximityType); case TT_AnyProximity: return true; case TT_Shoot: return ( (Projectile(Other) != None) && (Projectile(Other).Damage >= DamageThreshold) ); } } // All remaining functions are identical to the originals // except for the IsRelevant call function Actor SpecialHandling(Pawn Other) { local int i; if ( bTriggerOnceOnly && !bCollideActors ) return None; if ( (TriggerType == TT_PlayerProximity) && !Other.bIsPlayer ) return None; if ( !bInitiallyActive ) { if ( TriggerActor == None ) FindTriggerActor(); if ( TriggerActor == None ) return None; if ( (TriggerActor2 != None) && (VSize(TriggerActor2.Location - Other.Location) < VSize(TriggerActor.Location - Other.Location)) ) return TriggerActor2; else return TriggerActor; } // is this a shootable trigger? if ( TriggerType == TT_Shoot ) { if ( !Other.bCanDoSpecial || (Other.Weapon == None) ) return None; Other.Target = self; Other.bShootSpecial = true; Other.FireWeapon(); Other.bFire = 0; Other.bAltFire = 0; return Other; } // can other trigger it right away? if ( ReallyIsRelevant(Other) ) { for (i=0;i<4;i++) if (Touching[i] == Other) Touch(Other); return self; } return self; } // // Called when something touches the trigger. // function Touch( actor Other ) { local actor A; if( ReallyIsRelevant( Other ) ) { if ( ReTriggerDelay > 0 ) { if ( Level.TimeSeconds - TriggerTime < ReTriggerDelay ) return; TriggerTime = Level.TimeSeconds; } // Broadcast the Trigger message to all matching actors. if( Event != '' ) foreach AllActors( class 'Actor', A, Event ) A.Trigger( Other, Other.Instigator ); if ( Other.IsA('Pawn') && (Pawn(Other).SpecialGoal == self) ) Pawn(Other).SpecialGoal = None; if( Message != "" ) // Send a string message to the toucher. Other.Instigator.ClientMessage( Message ); if( bTriggerOnceOnly ) // Ignore future touches. SetCollision(False); else if ( RepeatTriggerTime > 0 ) SetTimer(RepeatTriggerTime, false); OnTouch(Other); } } function Timer() { local bool bKeepTiming; local int i; bKeepTiming = false; for (i=0;i<4;i++) if ( (Touching[i] != None) && ReallyIsRelevant(Touching[i]) ) { bKeepTiming = true; Touch(Touching[i]); } if ( bKeepTiming ) SetTimer(RepeatTriggerTime, false); } // // When something untouches the trigger. // function UnTouch( actor Other ) { local actor A; if( ReallyIsRelevant( Other ) ) { // Untrigger all matching actors. if( Event != '' ) foreach AllActors( class 'Actor', A, Event ) A.UnTrigger( Other, Other.Instigator ); } } æ €‚€‚ ’’’’’’’’a@’’’’’’’’’’2ŗ`]ĘļR‡Š ÷x//============================================================================= // EspritBlueTeamTrigger. //============================================================================= class EspritBlueTeamTrigger expands EspritTeamTrigger; ’’’’’’’’a@’’’’’’’’’’2źŹüļR‡Šõv//============================================================================= // EspritRedTeamTrigger. //============================================================================= class EspritRedTeamTrigger expands EspritTeamTrigger; ’’’’(’’’’ ’’’’ū’’’%ū’’’E’’’’ %ž’’’4ū’’’D)ž’’’+%ü’’’:ž’’’’’’’ū’’’Jü’’’;&ü’’’=ū’’’%ž’’’%ž’’’5%ü’’’2ū’’’HHż’’’Fū’’’I&ų’’’7’’’’'*ü’’’&ü’’’?Hü’’’1Hü’’’-%ż’’’C&ü’’’>Hż’’’8Ję’’’ Hż’’’0Jż’’’,Hž’’’Kū’’’J%ų’’’3Eü’’’Eü’’’%ż’’’'&ü’’’9ö’’’Jż’’’AJż’’’B&ņ’’’/Eü’’’’’’’ü’’’<Eü’’’%ż’’’!%ž’’’6†. ~†. K†G X„$~e˜ $ c˜$ o†. {†. H– @ U¦  a†" n†" {‡©eH‡ØMm‡qz‡°]k"–# H&‡³zT&4~?N+‡Lk†. gk†# tk $XAl 4CYm$U\q4Aqr