00001
00002
00003
00004 class EvoETV extends Mutator;
00005
00006 var TeamInfo Teams[4];
00007 var int MessageCount;
00008 var Pawn MovingPawn;
00009 var bool debug;
00010 var string MyIP;
00011 var string MyLocalIP;
00012
00013 function PostBeginPlay()
00014 {
00015 local int i;
00016 super.PostBeginPlay();
00017 Level.Game.RegisterMessageMutator(Self);
00018
00019 for (i=0;i<TeamGamePlus(Level.Game).MaxTeams;i++)
00020 Teams[i]=TeamGamePlus(Level.Game).Teams[i];
00021
00022 if ((TeamGamePlus(Level.Game)!=None)&&(TeamGamePlus(Level.Game).TimeLimit!=0))
00023 SetTimer(float((TeamGamePlus(Level.Game).TimeLimit*60)/3),true);
00024 else SetTimer(600.0,true);
00025
00026 Timer();
00027 }
00028
00029 function Timer()
00030 {
00031 BroadcastMessage("SYSTEM: type 'mutate et' in your console to even the teams.");
00032 }
00033
00034 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 )
00035 {
00036 local int OldTeam;
00037 if ((Message==class'DeathMatchMessage')&&(switch==3))
00038 {
00039 if (RelatedPRI_1!=None)
00040 {
00041 if ((MovingPawn!=None)&&(RelatedPRI_1.Owner==MovingPawn))
00042 {
00043 if (++MessageCount<NumPlayers())
00044 {
00045 if (debug)
00046 {
00047 log(class@"Intercepting message to"@Receiver.PlayerReplicationInfo.PlayerName@"that"@RelatedPRI_1.PlayerName@"is changing teams.");
00048 log(class@"Count:"@MessageCount@"NumPlayers:"@NumPlayers());
00049 }
00050 return false;
00051 }
00052 else
00053 {
00054 MovingPawn=None;
00055 RelatedPRI_1.TweenRate=0;
00056 MessageCount=0;
00057 if (debug)
00058 {
00059 if (RelatedPRI_1.Team==0)
00060 OldTeam=1;
00061 log(class@"Teams were successfully balanced."@RelatedPRI_1.PlayerName@"was moved to"@TeamGamePlus(Level.Game).TeamColor[OldTeam]);
00062 }
00063 }
00064 }
00065 else
00066 {
00067 RelatedPRI_1.TweenRate = Level.TimeSeconds;
00068 if (debug)
00069 log(class@"TEAMCHANGE("$Level.TimeSeconds$"):"@RelatedPRI_1.PlayerName@RelatedPRI_1.Team@RelatedPRI_1.TweenRate);
00070 }
00071 }
00072 }
00073
00074 if ( NextMessageMutator != None )
00075 return NextMessageMutator.MutatorBroadcastLocalizedMessage( Sender, Receiver, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject );
00076 else
00077 return true;
00078 }
00079
00080 function Mutate(string MutateString, PlayerPawn Sender)
00081 {
00082 local int pos;
00083 local string address;
00084 local Pawn P;
00085 if (MutateString~="et")
00086 {
00087 if (debug)
00088 log("*************************ET CALLED****************************");
00089 if ((Max(Teams[0].Size,Teams[1].Size) - Min(Teams[0].Size,Teams[1].Size))>1)
00090 {
00091 EvenTeams(Sender);
00092 if (debug)
00093 log(class@"Call to EvenTeams from"@Sender.PlayerReplicationInfo.PlayerName@"complete - team were NOT even");
00094 }
00095 else
00096 {
00097 Sender.ClientMessage("Teams are even,"@Sender.PlayerReplicationInfo.PlayerName);
00098 if (debug)
00099 {
00100 log(class@"Call to EvenTeams from"@Sender.PlayerReplicationInfo.PlayerName@"complete - teams were even");
00101 log(class@"Red Size:"$Teams[0].Size@"Blue Size:"$Teams[1].Size);
00102 for (P=Level.PawnList;P!=None;P=P.NextPawn)
00103 if (P.PlayerReplicationInfo!=None)
00104 log(Class@p.playerreplicationinfo.playername@"on team"@p.playerreplicationinfo.team);
00105 }
00106
00107 }
00108 return;
00109 }
00110 else if (MutateString~="etdebug")
00111 {
00112 address = Sender.GetPlayerNetworkAddress();
00113 if (((InStr(Address,MyIP)!=-1)||(InStr(Address,MyLocalIP)!=-1))||Sender.bAdmin)
00114 {
00115 log(class@"etdebug was called!!!"@Address);
00116 debug=true;
00117 Sender.ClientMessage("Debug has been enabled!!!");
00118 return;
00119 }
00120 }
00121 else if (MutateString~="etalert")
00122 {
00123 address = Sender.GetPlayerNetworkAddress();
00124 if (((InStr(Address,MyIP)!=-1)||(InStr(Address,MyLocalIP)!=-1))||Sender.bAdmin)
00125 log(class@"ETALERT:"@Level.TimeSeconds@"Red:"$TeamGamePlus(Level.Game).TeamColor[0]@"Blue:"$TeamGamePlus(Level.Game).TeamColor[1]);
00126 return;
00127 }
00128
00129 else if (NextMutator!=None)
00130 NextMutator.Mutate(MutateString, Sender);
00131 }
00132
00133 function EvenTeams(PlayerPawn Sender)
00134 {
00135 local Pawn P;
00136 local float NewestTime;
00137 local Pawn NewestPawn;
00138 local int Smallest,Biggest,i;
00139
00140 for (i=1;i<TeamGamePlus(Level.Game).MaxTeams;i++)
00141 if (Teams[i].Size>Teams[Biggest].Size)
00142 Biggest=i;
00143
00144 if (debug)
00145 log(class@"Biggest Team:"@TeamGamePlus(Level.Game).TeamColor[Biggest]);
00146
00147 for (P=Level.PawnList;P!=None;P=P.NextPawn)
00148 {
00149 if ((P.PlayerReplicationInfo!=None)&&(P.PlayerReplicationInfo.Team==Biggest) && (P.PlayerReplicationInfo.HasFlag==None)&&(Spectator(P)==None))
00150 {
00151 if (debug)
00152 log(class@"Checking"@P@P.PlayerReplicationInfo.PlayerName@TeamGamePlus(Level.Game).TeamColor[P.PlayerReplicationInfo.Team]@P.PlayerReplicationInfo.TweenRate);
00153
00154 if (P.PlayerReplicationInfo.TweenRate > NewestTime)
00155 {
00156 if (debug)
00157 log(class@"Found newer time than"@NewestTime@P@P.PlayerReplicationInfo.PlayerName);
00158 NewestTime = P.PlayerReplicationInfo.TweenRate;
00159 NewestPawn = P;
00160 }
00161 }
00162 }
00163 if (newestPawn!=none)
00164 {
00165
00166 if (debug)
00167 log(class@"Attempting to move"@NewestPawn.PlayerReplicationInfo.PlayerName@PlayerPawn(NewestPawn).GetPlayerNetworkaddress());
00168 if (newestPawn.PlayerReplicationInfo.HasFlag!=None)
00169 {
00170 Sender.ClientMessage("Not allowed to switch"@NewestPawn.PlayerReplicationInfo.PlayerName@"while the player is holding a flag.");
00171 if (debug)
00172 log(class@"Failed to switch"@NewestPawn.PlayerReplicationInfo.PlayerName$", FC");
00173 return;
00174 }
00175
00176 MovingPawn=NewestPawn;
00177 NewestPawn.Died( None, '', NewestPawn.Location );
00178 Smallest = 0;
00179
00180 for( i=1; i<TeamGamePlus(Level.Game).MaxTeams; i++ )
00181 if ( Teams[Smallest].Size > Teams[i].Size )
00182 Smallest = i;
00183
00184 if (TeamGamePlus(Level.Game).ChangeTeam(NewestPawn, Smallest))
00185 BroadcastMessage(NewestPawn.PlayerReplicationInfo.PlayerName@"was moved to the"@TeamGamePlus(Level.Game).TeamColor[Smallest]@"team.");
00186 else BroadcastMessage(NewestPawn.PlayerReplicationInfo.PlayerName@"could not be moved!!!");
00187 }
00188 else
00189 {
00190 log(class@"NEWEST PAWN WAS NONE!");
00191 Sender.ClientMessage("There was an error balancing the teams. Please try again in a few seconds.");
00192 }
00193 }
00194
00195 function int NumPlayers()
00196 {
00197 if (debug)
00198 log(class@"NumPlayer()::NumPlayers:"$DeathMatchPlus(Level.Game).NumPlayers@"NumBots:"$DeathMatchPlus(Level.Game).NumBots);
00199 if (LastManStanding(Level.Game)!=None)
00200 return DeathMatchPlus(Level.Game).NumPlayers+DeathMatchPlus(Level.Game).NumBots-LastManStanding(Level.Game).NumGhosts;
00201 else return DeathMatchPlus(Level.Game).NumPlayers+DeathMatchPlus(Level.Game).NumBots;
00202 }