UE1:NBSPMsgMutator (Class)
Purpose
Variables
Discussion
Possible improvements
Complete source code
<uscript>//============================================================================= // NBSPMsgMutator ==> NoBullShitPlus v1.09 //=============================================================================
class NBSPMsgMutator expands Mutator;
var NBSP nbsp; var string cmd[10];
function PostBeginPlay() { Level.Game.RegisterMessageMutator(self); Disable('Tick'); }
function bool MutatorBroadcastMessage( Actor Sender,Pawn Receiver, out coerce string Msg, optional bool bBeep, out optional name Type ) { local Actor A; local bool l; A = Sender;
// Hack ... for AdminLogout() going in PHYS_Walking while state is 'PlayerWaiting' If (A.IsA('GameInfo') && Receiver != None && Receiver.PlayerReplicationInfo != None && (Receiver.PlayerReplicationInfo.PlayerName@"gave up administrator abilities.") == Msg && (Receiver.GetStateName() == 'PlayerWaiting' || Receiver.PlayerReplicationInfo.bIsSpectator))
{ Receiver.GotoState(); Receiver.GotoState('PlayerWaiting'); }
while (!A.isa('Pawn') && A.Owner != None) A=A.Owner;
if (A.isa('spectator')) l=((left(msg,len(spectator(A).playerreplicationinfo.playername)+1))==(spectator(A).playerreplicationinfo.playername$":") || A.IsA('MessagingSpectator'));
if (l) l=(type=='Event');
if (A.isa('Pawn') && !l) return false;
if ( NextMessageMutator != None ) {
return NextMessageMutator.MutatorBroadcastMessage( Sender,Receiver, Msg, bBeep ); }
else
return Super.MutatorBroadcastMessage( Sender,Receiver, Msg, bBeep );
}
function bool MutatorBroadcastLocalizedMessage( Actor Sender, Pawn Receiver, out class<LocalMessage> Message, out optional int Switch, out optional PlayerReplicationInfo RelatedPRI_1, out optional PlayerReplicationInfo RelatedPRI_2, out optional Object OptionalObject ) { local Actor A;
A = Sender; while (!A.isa('Pawn') && A.Owner != None) A=A.Owner;
if (A.isa('Pawn')) return false;
if ( NextMessageMutator != None ) {
return NextMessageMutator.MutatorBroadcastLocalizedMessage( Sender, Receiver, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); } else return Super.MutatorBroadcastLocalizedMessage( Sender, Receiver, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject );
} // MutatorBroadcastLocalizedMessage
function bool MutatorTeamMessage (Actor Sender, Pawn Receiver, PlayerReplicationInfo PRI, coerce string S, name Type, optional bool bBeep) { if ( (Sender != None) && (Receiver != None) ) { if ((Sender.IsA('PlayerPawn')) && (Receiver.IsA('PlayerPawn')) && (nbsp.xx())) {
if (!Sender.IsA('Spectator')) {
S=ets(S,PlayerPawn(Sender));
if (NextMessageMutator != None) { if (NextMessageMutator.MutatorTeamMessage(Sender,Receiver,PRI,S,Type,bBeep)) { Receiver.TeamMessage(PRI,S,Type,bBeep); } }
else {
Receiver.TeamMessage(PRI,S,Type,bBeep); }
} else { if ( NextMessageMutator != None )
{ if ( NextMessageMutator.MutatorTeamMessage(Sender,Receiver,PRI,S,Type,bBeep) ) { Receiver.TeamMessage(PRI,S,Type,bBeep); } }
else {
Receiver.TeamMessage(PRI,S,Type,bBeep); } } return False; }
else {
if ( NextMessageMutator != None ) { return NextMessageMutator.MutatorTeamMessage(Sender,Receiver,PRI,S,Type,bBeep); }
else {
return True; }
} } }
function float DistanceFrom (Actor P1, Actor P2) { local float dx; local float dy; local float dz; local float ad;
dx=P1.Location.X - P2.Location.X; dy=P1.Location.Y - P2.Location.Y; dz=P1.Location.Z - P2.Location.Z; ad=Sqrt(Square(dx) + Square(dy) + Square(dz)); return ad; }
function string NearestObj (PlayerPawn s) { local FortStandard F; local FortStandard nf; local float dt; local float tf;
dt=0.00; foreach AllActors(Class'FortStandard',F) { tf=DistanceFrom(s,F); if ( (dt == 0) || (tf < dt) ) { nf=F; dt=tf; } } if ( nf.FortName == "Assault Target" ) { return string(nf); } else { if ( (nf.FortName == "") || (nf.FortName == " ") ) { return string(nf); } else { return nf.FortName; } } }
function string NearestTeamMate (PlayerPawn s) { local PlayerPawn PP, xPP; local float dtx, tpd;
dtx=0.00; foreach AllActors(Class'PlayerPawn',PP) { tpd=DistanceFrom(s,PP); if ( (PP != s) && (PP.PlayerReplicationInfo.Team == s.PlayerReplicationInfo.Team) && ((dtx == 0) || (tpd < dtx)) ) { xPP=PP; dtx=tpd; } } if ( xPP != None ) { return xPP.PlayerReplicationInfo.PlayerName; } else { return "NO TEAM MATES"; } }
function int GetArmourAmount (Pawn P) { local int a; local Inventory v;
v=P.Inventory; while (v != None) { if ( v.bIsAnArmor ) { a += v.Charge; } v=v.Inventory; } return a; }
function string ets (string t, PlayerPawn s) { local string ls, m, o, c; local int p, z, X, k; local CTFFlag F, Red_F, Blue_F; local FlagBase Red_FB, Blue_FB; local float dRed_b, dBlue_b, dBlue_f, dRed_f;
m=t; p=InStr(m,"%");
while (p != -1) { // if there is a % if ( p > 0 ) { //this sets o to whatever is before the % o=o $ Left(m,p); m=Mid(m,p); p=0; } X=Len(m); //set c to the % command c=Mid(m,p,2);
// if the len(m) > 2, there must be a command if ( X - 2 > 0 ) m=Right(m,X - 2); else m="";
//find the c Switch (c) { Case cmd[0]: if ( Level.Game.IsA('TeamGamePlus') ) { if ( s.PlayerReplicationInfo.PlayerLocation != None ) ls=s.PlayerReplicationInfo.PlayerLocation.LocationName; else { if (s.PlayerReplicationInfo.PlayerZone != None) ls=s.PlayerReplicationInfo.PlayerZone.ZoneName; } if (len(ls) == 0) { if (Level.Game.IsA('Assault')) ls="Near" @ NearestObj(s); else ls="Unknown"; } o=o $ ls; } else o=o $ c; break; Case cmd[1]: if (s.Health > 0) o=o $ string(s.Health); else o=o $ "0";
break; case cmd[2]: o=o $ string(GetArmourAmount(s)); break; case cmd[3]: if (s.Health > 0) { if (s.Weapon != None) o=o $ s.Weapon.ItemName; else o=o $ "Empty hands"; } else o=o $ "Empty hands"; break; case cmd[4]: if (s.Health > 0) { if (s.Weapon.ItemName != "Translocator") o=o $ string(s.Weapon.AmmoType.AmmoAmount); else o=o $ "0"; } else o=o $ "0"; break; case cmd[5]: o=o $ s.PlayerReplicationInfo.PlayerName; break; case cmd[6]: if ( Level.Game.IsA('TeamGamePlus') && Level.Game.IsA('Assault')) o=o $ NearestObj(s); else o=o $ c; break; case cmd[7]: if ( Level.Game.IsA('TeamGamePlus') ) o=o $ NearestTeamMate(s); else o=o $ c; break; case cmd[8]: if ( s.GameReplicationInfo.IsA('CTFReplicationInfo') ) { for (k=0;k<2;k++ ) { F = CTFReplicationInfo(Level.Game.GameReplicationInfo).FlagList[k];
if ( F.HomeBase.Team == 0 ) Red_FB = F.HomeBase;
else if ( F.HomeBase.Team == 1 ) Blue_FB = F.HomeBase;
if ( F.Team == 0 ) Red_F = F;
else if ( F.Team == 1 ) Blue_F = F; }
dRed_b = VSize(Location - Red_FB.Location); dBlue_b = VSize(Location - Blue_FB.Location); dRed_f = VSize(Location - Red_F.position().Location); dBlue_f = VSize(Location - Blue_F.position().Location);
if ( s.PlayerReplicationInfo.Team == 0 ) { if ( (dRed_f < 2048) && (Red_F.Holder != None) && ((Blue_F.Holder == None) || (dRed_f < dBlue_f)) ) z=0; else if ( (dBlue_f < 2048) && (Blue_F.Holder != None) && ((Red_F.Holder == None) || (dRed_f > dBlue_f)) ) z=1; else if ( dBlue_b < 2049 ) z=2; else if ( dRed_b < 2048 ) z=3; else z=4; } else if ( s.PlayerReplicationInfo.Team == 1 ) { if ( (dBlue_f < 2048) && (Blue_F.Holder != None) && ((Red_F.Holder == None) || (dRed_f >= dBlue_f)) ) z=0; else if ( (dRed_f < 2048) && (Red_F.Holder != None) && ((Blue_F.Holder == None) || (dRed_f < dBlue_f)) ) z=1; else if ( dRed_b < 2048 ) z=2; else if ( dBlue_b < 2048 ) z=3; else z=4; } if ( (Blue_F.Holder == s) || (Red_F.Holder == s) ) z=5;
switch (z) { case 0: o=o $ "Attacking Enemy Flag Carrier"; break; case 1: o=o $ "Supporting Our Flag Carrier"; break; case 2: o=o $ "Attacking"; break; case 3: o=o $ "Defending"; break; case 4: o=o $ "Floating"; break; case 5: o=o $ "Carrying Flag"; break; } } else if ( Level.Game.IsA('TeamGamePlus') && Level.Game.IsA('Assault')) { if (s.PlayerReplicationInfo.Team == (Assault(Level.Game).CurrentDefender)) o=o $ "Defending"; else o=o $ "Attacking"; } else o=o $ c;
break;
case cmd[9]:
o=o $ "%"; break; default: o=o $ c; break; } p=InStr(m,"%"); }
if ( Len(m) > 0 ) o=o $ m;
return o;
}
defaultproperties { cmd(0)="%L" cmd(1)="%H" cmd(2)="%A" cmd(3)="%W" cmd(4)="%M" cmd(5)="%N" cmd(6)="%O" cmd(7)="%T" cmd(8)="%P" cmd(9)="%%" }</uscript>