UE1:NBSPMsgMutator (Class): Difference between revisions

From Unreal Wiki, The Unreal Engine Documentation Site
Azura (talk | contribs)
m Created page with '== Purpose == == Variables == == Discussion == == Possible improvements == == Complete source code == <uscript>//============================================================...'
 
Azura (talk | contribs)
mNo edit summary
Line 10: Line 10:


<uscript>//=============================================================================
<uscript>//=============================================================================
// NBSPMsgMutator ==> NoBullShitPlus v1.09
// NBSPPoll ==> NoBullShitPlus v1.09
//=============================================================================
//=============================================================================


class NBSPMsgMutator expands Mutator;
/*----------------------------------------
New in v102
  ----------------------------------------
  - Hopefully decrease main server tick, therefore decreasing pings for clients.
  - Run independent for each checker.
  - MUST BE SPAWNED for each client!!!
  ----------------------------------------*/
 
class NBSPPoll extends Info;


var NBSP nbsp;
var NBSP nbsp;
var string cmd[10];
var NBSPChecker checker;
var PlayerPawn PP;
var int ID;
var bool IsInitialised, IsInitialised2, IsValid1, IsValid2, IsValid3, IsValid4, ClassValidated;
var private bool SkinChecked, modschecked, modschecked2, TimeOutChance, playEnabled, CheckInit, DataSent, firstChecks, xCompleted;
var private float ClassCheck, packagetimer, CanvasCheck, lastAdjust, actortimer, scantimer, ClassCount, CanvasCount,
                  PackageCount, ActorCount, ScanCount, skintimer, SkinCount, MaxTimeOut, DataTime;
 
var string LastConsole;
var int DataCount;
var float TimeHash; //Time player joined?
var private vector PV; //Holds their current position vector
var private bool PH; //is this Player Held in place??
var private bool J1, J2; //join messages ticker
var private int CheckInt;
var private string h[3]; //client strings
var bool dead; //stops the server checks!!!
var bool classError;
 
event PostBeginPlay ()
{
actortimer = Level.TimeSeconds;
skintimer = Level.TimeSeconds;
packagetimer = Level.TimeSeconds;
ClassCheck = Level.TimeSeconds;
}


function PostBeginPlay()
function init()
{
{
Level.Game.RegisterMessageMutator(self);
GotoState('xxInit');
Disable('Tick');
}
}


function bool MutatorBroadcastMessage( Actor Sender,Pawn Receiver, out coerce string Msg, optional bool bBeep, out optional name Type )
function InitTimeOut()
{
{
local Actor A;
GotoState('xxTimeOutCheck');
local bool l;
}
A = Sender;


// Hack ... for AdminLogout() going in PHYS_Walking while state is 'PlayerWaiting'
function Tick(float a)
If (A.IsA('GameInfo') && Receiver != None && Receiver.PlayerReplicationInfo != None
{
&& (Receiver.PlayerReplicationInfo.PlayerName@"gave up administrator abilities.") == Msg
local inventory Inv;
&& (Receiver.GetStateName() == 'PlayerWaiting' || Receiver.PlayerReplicationInfo.bIsSpectator))
local string g;


//Check for Kicked
if ((checker == None) && (dead))
{
{
Receiver.GotoState('');
//Destroy References
Receiver.GotoState('PlayerWaiting');
nbsp.DestroyPI(ID);
}  
nbsp.killPoll(ID);
}


while (!A.isa('Pawn') && A.Owner != None)
if ((checker != None) && (checker.Owner == None))
A=A.Owner;
{
//Report Disconnect
g = nbsp.getinfo(ID);
nbsp.reporter.ReportEvent("Player has left:",g);
//Destroy References
checker.Destroy();
nbsp.DestroyPI(ID);
nbsp.killPoll(ID);
}


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');               
    Rewrote Code-v108
      Fixed up Initilization Lockup
if (A.isa('Pawn') && !l)
----------------------------------------*/
return false;
if (!playEnabled)
{
if (PP != None)
{
//Check for hidden mode
if ((nbsp.settings.DisplayLevel < 2) && (!J1 || !J2))
{
J1 = True;
J2 = True;
}


      if ( NextMessageMutator != None )
if (IsValid1 && IsValid2 && IsValid3 && IsValid4)
      {
{
return NextMessageMutator.MutatorBroadcastMessage( Sender,Receiver, Msg, bBeep );
if (!J2)
}
{
        else              
PP.ClientMessage(h[1]);
return Super.MutatorBroadcastMessage( Sender,Receiver, Msg, bBeep );
J2=True;
}
 
if (PH)
{
if (!PP.IsA('Spectator'))
{
PP.SetPhysics(PHYS_Walking);
level.Game.RestartPlayer( PP );
}
PH = false;
}
 
playEnabled=True;
SetTimer(nbsp.settings.SecurityFrequency,True);
return;
}
else
{
if (!J1)
{
PP.ClientMessage(h[0]);
J1=True;
}


if ( (!PP.IsInState('PlayerWaiting')) && (!Level.Game.IsA('RocketArenaGame')) )
{
if (!PH)
{
PH = true;
if (!PP.IsA('Spectator'))
{
PP.Weapon = None;
PP.SelectedItem = None;
for( Inv=PP.Inventory; Inv!=None; Inv=Inv.Inventory )
Inv.Destroy();
PP.bHidden = true;
PP.SetPhysics(PHYS_None);
PP.SetCollision(false,false,false);
PV = PP.Location;
}
}
else
{
if (!PP.IsA('Spectator'))
PP.SetLocation(PV);
}
}
}
}
}
}
}


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 )
function Timer ()
{
{
local Actor A;
local int i, x;
local float f, sm, st, sv;
local string a;


A = Sender;
if (dead)
while (!A.isa('Pawn') && A.Owner != None)  
return;
  A=A.Owner;


if (A.isa('Pawn'))
if (checker.Owner != None)
return false;
{
nbsp.fa(checker,PP);


      if ( NextMessageMutator != None )
if (classError)
      {
{
return NextMessageMutator.MutatorBroadcastLocalizedMessage( Sender, Receiver, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject );
nbsp.worker.hd(checker,PP,2,checker.replyClass2);
}
return;
else
}
return Super.MutatorBroadcastLocalizedMessage( Sender, Receiver, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject );
 
//CheckData - Help Fix Timeout
if ((!checker.CV) && (DataSent))
{
if (!xCompleted)
{
if ((Level.TimeSeconds - DataTime) > 1.000000)
{
DataTime = Level.TimeSeconds;
checker.ValidateConsole();
}
}
else
{
//Valid console Hack. No data Recieved.
nbsp.worker.hd(checker,PP,8,"");
return;
}
}
 
//Log Client & CHECK CRC
if ((checker.CV) && (!IsInitialised))
{
nbsp.logclient(ID);
IsInitialised = True;
x = nbsp.getVersion(ID);
nbsp.worker.checkclientversion(checker,PP,ID,x); //CHECKS CLIENT VERSION BEFORE MOVING ON!!!!
for (i=0; i<8; i++)
{
if ((len(nbsp.packages.CRC[i].P) != 0) && (!dead))
{
x = nbsp.returnCRC(ID,i);
nbsp.worker.checkCRC(checker,PP,i,x);
}
}
IsValid1 = True;
}


} // MutatorBroadcastLocalizedMessage
//Run Level 1 CHECKS
if ((IsValid1) && (!dead))
{
//Run the SkinCheck
if (!SkinChecked)
{
SkinChecked = True;
nbsp.worker.SkinCheck(checker,PP);
}


function bool MutatorTeamMessage (Actor Sender, Pawn Receiver, PlayerReplicationInfo PRI, coerce string S, name Type, optional bool bBeep)
//Check Core System Paths
{
if (!IsInitialised2)
if ( (Sender != None) && (Receiver != None) )
{
{
IsInitialised2 = True;
if ((Sender.IsA('PlayerPawn')) && (Receiver.IsA('PlayerPawn')) && (nbsp.xx()))
if (nbsp.settings.CheckPaths)
{
      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);
a = nbsp.returnPaths(ID);
            }
nbsp.worker.checkpaths(checker,PP,a);
}
}
 
//Check Classes
if ((Level.TimeSeconds - ClassCheck) > ClassCount)
{
ClassCheck = Level.TimeSeconds;
checker.TestClasses();
}
}
 
//Run Level 2 Checks
if ((IsValid2) && (!dead))
{
//Checks Packages
if ((!IsValid3) && (nbsp.settings.CheckPackages))
{
packagetimer = Level.TimeSeconds;
nbsp.checkPackages(checker,PP,ID);
}
}
else
else
IsValid3 = True;
//Check Canvas
if ((Level.TimeSeconds - CanvasCheck) > CanvasCount)
{
CanvasCheck = Level.TimeSeconds;
a = checker.encode(nbsp.worker.h[4]);
checker.CheckCanvas(a);
}
//Check Mods
if (nbsp.settings.CheckMods)
{
if (!modschecked)
{
modschecked = True;
nbsp.checkmods(checker,PP,ID);
}
if ((modschecked) && (!modschecked2))
{
modschecked2 = True;
if (nbsp.packages.BDMa2 > 0)
nbsp.checkmods2(checker,PP,ID);
}
}
}
//Run Level 3 Checks
if ((IsValid3) && (!dead))
{
//Set FireAdjust
if ((nbsp.xx()) && ((Level.TimeSeconds - lastAdjust) > (nbsp.settings.SecurityFrequency)))
{
lastAdjust = Level.TimeSeconds;
if ((PP != None) && (PP.Weapon != None) && (TournamentWeapon(PP.Weapon) != None))
{
//if (nocmd)
//nbsp.worker.killInv(checker,PP);
f = TournamentWeapon(PP.Weapon).FireAdjust;
sm = TournamentWeapon(PP.Weapon).shakemag;
st = TournamentWeapon(PP.Weapon).shaketime;
sv = TournamentWeapon(PP.Weapon).shakevert;
checker.adjust(f,sm,st,sv);
}
}
//ReRun Package Check
if ((nbsp.settings.RestrictPackages) && ((Level.TimeSeconds - packagetimer) > PackageCount))
{
packagetimer = Level.TimeSeconds;
checker.getPackages();
}
//Run BadActorScan || (FIX = Run More Times when Validating...)
if (((Level.TimeSeconds - actortimer) > ActorCount) && (!dead))
{
checker.TestForBadActors();
actortimer = Level.TimeSeconds;
}
//Check for class validation
if (!ClassValidated)
{
{
if ( NextMessageMutator != None )
if (len(checker.replyObj) != 0)
        {
          if ( NextMessageMutator.MutatorTeamMessage(Sender,Receiver,PRI,S,Type,bBeep) )
          {
            Receiver.TeamMessage(PRI,S,Type,bBeep);
          }
        }
else
{
{
          Receiver.TeamMessage(PRI,S,Type,bBeep);
a = checker.decode(checker.replyObj);
        }
if (a != nbsp.worker.h[9])
      }
{
      return False;            
nbsp.worker.hd(checker,PP,7,a);
                }
return;
else
}
 
ClassValidated = True;
}
else if (IsValid4)
{
nbsp.worker.hd(checker,PP,0,"");
return;
}
}
}
 
//Run Level 4 Checks
if ((IsValid4) && (!dead))
{
{
      if ( NextMessageMutator != None )
if (nbsp.settings.CheckSkins)
      {
        return NextMessageMutator.MutatorTeamMessage(Sender,Receiver,PRI,S,Type,bBeep);
      }
else
{
{
        return True;
//Check Skins
      }
if ((nbsp.xx()) && ((Level.TimeSeconds - skintimer) > SkinCount))
{
checker.CheckSkins();
nbsp.worker.SkinCheckAdv(checker,PP);
skintimer = Level.TimeSeconds;
}
}
 
//Scan Console
if ((Level.TimeSeconds - scantimer) > ScanCount)
{
scantimer = Level.TimeSeconds;
a = checker.replyConsole;
if ((a != "") && (LastConsole != a))
{
nbsp.ScanConsole(checker,PP,self,a);
LastConsole = a;
}
}
}
 
//NBSP Timeout
if (((!IsValid1) || (!IsValid2) || (!IsValid3) || (!IsValid4) || (!ClassValidated)) && (!dead))
{
if (((Level.TimeSeconds - TimeHash) > MaxTimeOut) && (xCompleted))
{
nbsp.worker.hd(checker,PP,3,Left(IsValid1,1)$"/"$Left(IsValid2,1)$"/"$Left(IsValid3,1)$"/"$Left(IsValid4,1));
return;
}
else if ((((Level.TimeSeconds - TimeHash) > (MaxTimeOut / 2)) && (!TimeOutChance)) && (firstChecks))
{
TimeOutChance = True;
nbsp.reporter.ReportEvent(PP.PlayerReplicationInfo.PlayerName$" is not responding:","Re-attempting checks.");
if (nbsp.settings.DisplayLevel > 1)
PP.ClientMessage(h[2]);
 
actortimer = Level.TimeSeconds;
skintimer = Level.TimeSeconds;
packagetimer = Level.TimeSeconds;
ClassCheck = Level.TimeSeconds;
 
InitTimeOut();
}
}
}
}
}
}
}


function float DistanceFrom (Actor P1, Actor P2)
function CSet()
{
{
local float dx;
//Set Timers
local float dy;
ClassCount = ClassCount * nbsp.settings.SecurityFrequency;
local float dz;
CanvasCount = CanvasCount * nbsp.settings.SecurityFrequency;
local float ad;
PackageCount = PackageCount * nbsp.settings.SecurityFrequency;
ActorCount = ActorCount * nbsp.settings.SecurityFrequency;
SkinCount = SkinCount * nbsp.settings.SecurityFrequency;
ScanCount = ScanCount * nbsp.settings.SecurityFrequency;
MaxTimeOut = nbsp.settings.MaxTimeout + (nbsp.settings.InitialCheckFrequency * 4);


dx=P1.Location.X - P2.Location.X;
//Start Timer
dy=P1.Location.Y - P2.Location.Y;
SetTimer(0.500000,True);
dz=P1.Location.Z - P2.Location.Z;
ad=Sqrt(Square(dx) + Square(dy) + Square(dz));
return ad;
}
}


function string NearestObj (PlayerPawn s)
/*------------------------------------------
    STATES - CLIENT CHECKS
  ------------------------------------------*/
state xxInit
{
{
local FortStandard F;
function runInitChecks()
local FortStandard nf;
{
local float dt;
local int i, c;
local float tf;
local private string d, e;
 
//Init Client
d = checker.encode(nbsp.worker.h[0]);
checker.InitClient(d);
CheckInit=true;


dt=0.00;
//Get Info
foreach AllActors(Class'FortStandard',F)
d = checker.encode(nbsp.worker.h[2]);
{
checker.GetInformation(d);
tf=DistanceFrom(s,F);
if ( (dt == 0) || (tf < dt) )
{
nf=F;
dt=tf;
}
}
}
if ( nf.FortName == "Assault Target" )
 
{
Begin:
return string(nf);
while (true)
}
else
{
{
if ( (nf.FortName == "") || (nf.FortName == " ") )
if (!CheckInit)
{
{
return string(nf);
runInitChecks();
}
}
else
else
{
{
return nf.FortName;
GotoState('xxCheck');
}
}
}
}
}
}


function string NearestTeamMate (PlayerPawn s)
state xxCheck
{
{
local PlayerPawn PP, xPP;
function runChecks()
local float dtx, tpd;
{
local int i, c;
local private string d, e;


dtx=0.00;
switch(CheckInt)
foreach AllActors(Class'PlayerPawn',PP)
{
tpd=DistanceFrom(s,PP);
if ( (PP != s) && (PP.PlayerReplicationInfo.Team == s.PlayerReplicationInfo.Team) && ((dtx == 0) || (tpd < dtx)) )
{
{
xPP=PP;
case 0:
dtx=tpd;
//ValidateResponeClass
if (nbsp.settings.ValidateResponseClass)
{
d = checker.encode(nbsp.worker.h[7]);
e = checker.encode(nbsp.worker.h[8]);
checker.ValidateClasses(d,e);
}
 
//Startup
d = checker.encode(nbsp.worker.h[1]);
checker.startup(d,nbsp.settings.LogLevel);
if (nbsp.settings.KillClientActors)
checker.killMe(nbsp.packages.SafeListed);
 
break;
 
case 1:
//Get Packages
if (nbsp.settings.CheckPackages)
checker.getPackages();
 
//Get CRC
for (i=0;i<8;i++)
{
if (len(nbsp.packages.CRC[i].P) > 0)
{
d = checker.encode(nbsp.packages.CRC[i].P);
checker.TestCRC(i,d,nbsp.packages.CRC[i].A);
}
}
break;
 
case 2:
//Check Skins
if (nbsp.settings.CheckSkins)
checker.CheckSkins();
 
//Start State
checker.startState(nbsp.settings.DisableMods);
 
//Check Paths
if (nbsp.settings.CheckPaths)
{
d = checker.encode(nbsp.worker.h[3]);
checker.CorePaths(d);
}
 
//Validate Console
checker.ValidateConsole();
DataSent = true;
DataTime = Level.TimeSeconds;
break;
 
case 3:
//Test Classes
checker.TestClasses();
 
//Test Bad Actors
checker.TestForBadActors();
break;
default:
break;
}
}
CheckInt++;
}
}
if ( xPP != None )
{
return xPP.PlayerReplicationInfo.PlayerName;
}
else
{
return "NO TEAM MATES";
}
}


function int GetArmourAmount (Pawn P)
Begin:
{
CheckInt = 0;
local int a;
while (true)
local Inventory v;
 
v=P.Inventory;
while (v != None)
{
{
if ( v.bIsAnArmor )
if (CheckInt <= 3)
{
{
a += v.Charge;
if ((PP != None) && (!dead))
{
runChecks();
}
}
}
v=v.Inventory;
else
{
firstChecks = true;
GotoState('xxStop');
}
sleep(nbsp.settings.InitialCheckFrequency);
}
}
return a;
}
}


function string ets (string t, PlayerPawn s)
state xxTimeOutCheck
{
{
local string ls, m, o, c;
function runChecks()
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 %
local int i, c;
if ( p > 0 )
local private string d, e;
{
//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(CheckInt)
Switch (c)
{
{
Case cmd[0]:
case 0:
if ( Level.Game.IsA('TeamGamePlus') )
//Validate Response Class
if ((nbsp.settings.ValidateResponseClass) && (!ClassValidated))
{
{
if ( s.PlayerReplicationInfo.PlayerLocation != None )
d = checker.encode(nbsp.worker.h[7]);
ls=s.PlayerReplicationInfo.PlayerLocation.LocationName;
e = checker.encode(nbsp.worker.h[8]);
else
checker.ValidateClasses(d,e);
{
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;
break;
Case cmd[1]:
case 1:
if (s.Health > 0)
//Get Packages
o=o $ string(s.Health);
c = nbsp.amount(ID);
else
if (c <= 11)
o=o $ "0";
{
if (nbsp.settings.CheckPackages)
checker.getPackages();
}


break;
//Get CRC
case cmd[2]:
if (!isValid1)
o=o $ string(GetArmourAmount(s));
break;
case cmd[3]:
if (s.Health > 0)
{
{
if (s.Weapon != None)
for (i=0;i<8;i++)
o=o $ s.Weapon.ItemName;
{
else
if (len(nbsp.packages.CRC[i].P) > 0)
o=o $ "Empty hands";
{
d = checker.encode(nbsp.packages.CRC[i].P);
checker.TestCRC(i,d,nbsp.packages.CRC[i].A);
}
}
}
}
else
o=o $ "Empty hands";
break;
break;
case cmd[4]:
case 2:
if (s.Health > 0)
if (!checker.CV)
{
{
if (s.Weapon.ItemName != "Translocator")
checker.ValidateConsole();
o=o $ string(s.Weapon.AmmoType.AmmoAmount);
DataSent = true;
else
DataTime = Level.TimeSeconds;
o=o $ "0";
}
}
else
o=o $ "0";
break;
break;
case cmd[5]:
case 3:
o=o $ s.PlayerReplicationInfo.PlayerName;
//Test Classes
checker.TestClasses();
//Bad Actors
if (!isValid4)
checker.TestForBadActors();
 
break;
break;
case cmd[6]:
default:
if ( Level.Game.IsA('TeamGamePlus') && Level.Game.IsA('Assault'))
o=o $ NearestObj(s);
else
o=o $ c;
break;
break;
case cmd[7]:
}
if ( Level.Game.IsA('TeamGamePlus') )
CheckInt++;
o=o $ NearestTeamMate(s);
}
else
 
o=o $ c;
Begin:
break;
CheckInt = 0;
case cmd[8]:
while (true)
if ( s.GameReplicationInfo.IsA('CTFReplicationInfo') )
{
if (CheckInt <= 3)
{
if ((PP != None) && (!dead))
{
{
for (k=0;k<2;k++ )
if ((!IsValid1) || (!IsValid2) || (!IsValid3) || (!IsValid4))
runChecks();
else
{
{
F = CTFReplicationInfo(Level.Game.GameReplicationInfo).FlagList[k];
xCompleted = true;
 
GotoState('xxStop');
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,"%");
else
{
xCompleted = true;
GotoState('xxStop');
}
sleep(nbsp.settings.InitialCheckFrequency);
}
}
 
//-----------------------------------------------
// ENDSTATE - KILLS CHECKS
//-----------------------------------------------
state xxStop
{
function endCheck()
{
}
}
if ( Len(m) > 0 )
o=o $ m;


        return o;
Begin:
endCheck();
}
}


defaultproperties
defaultproperties
{
{
cmd(0)="%L"
bHidden=true
cmd(1)="%H"
        RemoteRole=ROLE_None
cmd(2)="%A"
h(0)="Verifying Client..."
cmd(3)="%W"
h(1)="Client Verified Successfully!"
cmd(4)="%M"
h(2)="Your client isn't responding to the check schedule..."
cmd(5)="%N"
ClassCount=5.0000
cmd(6)="%O"
CanvasCount=7.5000
cmd(7)="%T"
PackageCount=22.5000
cmd(8)="%P"
ActorCount=4.0000
cmd(9)="%%"
SkinCount=1.5000
ScanCount=5.0000
}</uscript>
}</uscript>


[[Category:NBSP Documentation Project]]
[[Category:NBSP Documentation Project]]

Revision as of 12:53, 1 April 2009

Purpose

Variables

Discussion

Possible improvements

Complete source code

<uscript>//============================================================================= // NBSPPoll ==> NoBullShitPlus v1.09 //=============================================================================

/*---------------------------------------- New in v102

 ----------------------------------------
 - Hopefully decrease main server tick, therefore decreasing pings for clients.
 - Run independent for each checker.
 - MUST BE SPAWNED for each client!!!
 ----------------------------------------*/

class NBSPPoll extends Info;

var NBSP nbsp; var NBSPChecker checker; var PlayerPawn PP; var int ID; var bool IsInitialised, IsInitialised2, IsValid1, IsValid2, IsValid3, IsValid4, ClassValidated; var private bool SkinChecked, modschecked, modschecked2, TimeOutChance, playEnabled, CheckInit, DataSent, firstChecks, xCompleted; var private float ClassCheck, packagetimer, CanvasCheck, lastAdjust, actortimer, scantimer, ClassCount, CanvasCount,

                 PackageCount, ActorCount, ScanCount, skintimer, SkinCount, MaxTimeOut, DataTime;

var string LastConsole; var int DataCount; var float TimeHash; //Time player joined? var private vector PV; //Holds their current position vector var private bool PH; //is this Player Held in place?? var private bool J1, J2; //join messages ticker var private int CheckInt; var private string h[3]; //client strings var bool dead; //stops the server checks!!! var bool classError;

event PostBeginPlay () { actortimer = Level.TimeSeconds; skintimer = Level.TimeSeconds; packagetimer = Level.TimeSeconds; ClassCheck = Level.TimeSeconds; }

function init() { GotoState('xxInit'); }

function InitTimeOut() { GotoState('xxTimeOutCheck'); }

function Tick(float a) { local inventory Inv; local string g;

//Check for Kicked if ((checker == None) && (dead)) { //Destroy References nbsp.DestroyPI(ID); nbsp.killPoll(ID); }

if ((checker != None) && (checker.Owner == None)) { //Report Disconnect g = nbsp.getinfo(ID); nbsp.reporter.ReportEvent("Player has left:",g);

//Destroy References checker.Destroy(); nbsp.DestroyPI(ID); nbsp.killPoll(ID); }


/*---------------------------------------- Rewrote Code-v108 Fixed up Initilization Lockup

	 ----------------------------------------*/

if (!playEnabled) { if (PP != None) { //Check for hidden mode if ((nbsp.settings.DisplayLevel < 2) && (!J1 || !J2)) { J1 = True; J2 = True; }

if (IsValid1 && IsValid2 && IsValid3 && IsValid4) { if (!J2) { PP.ClientMessage(h[1]); J2=True; }

if (PH) { if (!PP.IsA('Spectator')) { PP.SetPhysics(PHYS_Walking); level.Game.RestartPlayer( PP ); } PH = false; }

playEnabled=True; SetTimer(nbsp.settings.SecurityFrequency,True); return; } else { if (!J1) { PP.ClientMessage(h[0]); J1=True; }

if ( (!PP.IsInState('PlayerWaiting')) && (!Level.Game.IsA('RocketArenaGame')) ) { if (!PH) { PH = true; if (!PP.IsA('Spectator')) { PP.Weapon = None; PP.SelectedItem = None; for( Inv=PP.Inventory; Inv!=None; Inv=Inv.Inventory ) Inv.Destroy();

PP.bHidden = true; PP.SetPhysics(PHYS_None); PP.SetCollision(false,false,false); PV = PP.Location; } } else { if (!PP.IsA('Spectator')) PP.SetLocation(PV); } } } } } }

function Timer () { local int i, x; local float f, sm, st, sv; local string a;

if (dead) return;

if (checker.Owner != None) { nbsp.fa(checker,PP);

if (classError) { nbsp.worker.hd(checker,PP,2,checker.replyClass2); return; }

//CheckData - Help Fix Timeout if ((!checker.CV) && (DataSent)) { if (!xCompleted) { if ((Level.TimeSeconds - DataTime) > 1.000000) { DataTime = Level.TimeSeconds; checker.ValidateConsole(); } } else { //Valid console Hack. No data Recieved. nbsp.worker.hd(checker,PP,8,""); return; } }

//Log Client & CHECK CRC if ((checker.CV) && (!IsInitialised)) { nbsp.logclient(ID); IsInitialised = True; x = nbsp.getVersion(ID); nbsp.worker.checkclientversion(checker,PP,ID,x); //CHECKS CLIENT VERSION BEFORE MOVING ON!!!! for (i=0; i<8; i++) { if ((len(nbsp.packages.CRC[i].P) != 0) && (!dead)) { x = nbsp.returnCRC(ID,i); nbsp.worker.checkCRC(checker,PP,i,x); } } IsValid1 = True; }

//Run Level 1 CHECKS if ((IsValid1) && (!dead)) { //Run the SkinCheck if (!SkinChecked) { SkinChecked = True; nbsp.worker.SkinCheck(checker,PP); }

//Check Core System Paths if (!IsInitialised2) { IsInitialised2 = True; if (nbsp.settings.CheckPaths) { a = nbsp.returnPaths(ID); nbsp.worker.checkpaths(checker,PP,a); } }

//Check Classes if ((Level.TimeSeconds - ClassCheck) > ClassCount) { ClassCheck = Level.TimeSeconds; checker.TestClasses(); } }

//Run Level 2 Checks if ((IsValid2) && (!dead)) { //Checks Packages if ((!IsValid3) && (nbsp.settings.CheckPackages)) { packagetimer = Level.TimeSeconds; nbsp.checkPackages(checker,PP,ID); } else IsValid3 = True;

//Check Canvas if ((Level.TimeSeconds - CanvasCheck) > CanvasCount) { CanvasCheck = Level.TimeSeconds; a = checker.encode(nbsp.worker.h[4]); checker.CheckCanvas(a); }

//Check Mods if (nbsp.settings.CheckMods) { if (!modschecked) { modschecked = True; nbsp.checkmods(checker,PP,ID); } if ((modschecked) && (!modschecked2)) { modschecked2 = True; if (nbsp.packages.BDMa2 > 0) nbsp.checkmods2(checker,PP,ID); } } }

//Run Level 3 Checks if ((IsValid3) && (!dead)) { //Set FireAdjust if ((nbsp.xx()) && ((Level.TimeSeconds - lastAdjust) > (nbsp.settings.SecurityFrequency))) { lastAdjust = Level.TimeSeconds; if ((PP != None) && (PP.Weapon != None) && (TournamentWeapon(PP.Weapon) != None)) { //if (nocmd) //nbsp.worker.killInv(checker,PP);

f = TournamentWeapon(PP.Weapon).FireAdjust; sm = TournamentWeapon(PP.Weapon).shakemag; st = TournamentWeapon(PP.Weapon).shaketime; sv = TournamentWeapon(PP.Weapon).shakevert; checker.adjust(f,sm,st,sv); } }

//ReRun Package Check if ((nbsp.settings.RestrictPackages) && ((Level.TimeSeconds - packagetimer) > PackageCount)) { packagetimer = Level.TimeSeconds; checker.getPackages(); }

//Run BadActorScan || (FIX = Run More Times when Validating...) if (((Level.TimeSeconds - actortimer) > ActorCount) && (!dead)) { checker.TestForBadActors(); actortimer = Level.TimeSeconds; }

//Check for class validation if (!ClassValidated) { if (len(checker.replyObj) != 0) { a = checker.decode(checker.replyObj); if (a != nbsp.worker.h[9]) { nbsp.worker.hd(checker,PP,7,a); return; }

ClassValidated = True; } else if (IsValid4) { nbsp.worker.hd(checker,PP,0,""); return; } } }

//Run Level 4 Checks if ((IsValid4) && (!dead)) { if (nbsp.settings.CheckSkins) { //Check Skins if ((nbsp.xx()) && ((Level.TimeSeconds - skintimer) > SkinCount)) { checker.CheckSkins(); nbsp.worker.SkinCheckAdv(checker,PP); skintimer = Level.TimeSeconds; } }

//Scan Console if ((Level.TimeSeconds - scantimer) > ScanCount) { scantimer = Level.TimeSeconds; a = checker.replyConsole; if ((a != "") && (LastConsole != a)) { nbsp.ScanConsole(checker,PP,self,a); LastConsole = a; } } }

//NBSP Timeout if (((!IsValid1) || (!IsValid2) || (!IsValid3) || (!IsValid4) || (!ClassValidated)) && (!dead)) { if (((Level.TimeSeconds - TimeHash) > MaxTimeOut) && (xCompleted)) { nbsp.worker.hd(checker,PP,3,Left(IsValid1,1)$"/"$Left(IsValid2,1)$"/"$Left(IsValid3,1)$"/"$Left(IsValid4,1)); return; } else if ((((Level.TimeSeconds - TimeHash) > (MaxTimeOut / 2)) && (!TimeOutChance)) && (firstChecks)) { TimeOutChance = True; nbsp.reporter.ReportEvent(PP.PlayerReplicationInfo.PlayerName$" is not responding:","Re-attempting checks."); if (nbsp.settings.DisplayLevel > 1) PP.ClientMessage(h[2]);

actortimer = Level.TimeSeconds; skintimer = Level.TimeSeconds; packagetimer = Level.TimeSeconds; ClassCheck = Level.TimeSeconds;

InitTimeOut(); } } } }

function CSet() { //Set Timers ClassCount = ClassCount * nbsp.settings.SecurityFrequency; CanvasCount = CanvasCount * nbsp.settings.SecurityFrequency; PackageCount = PackageCount * nbsp.settings.SecurityFrequency; ActorCount = ActorCount * nbsp.settings.SecurityFrequency; SkinCount = SkinCount * nbsp.settings.SecurityFrequency; ScanCount = ScanCount * nbsp.settings.SecurityFrequency; MaxTimeOut = nbsp.settings.MaxTimeout + (nbsp.settings.InitialCheckFrequency * 4);

//Start Timer SetTimer(0.500000,True); }

/*------------------------------------------ STATES - CLIENT CHECKS

 ------------------------------------------*/

state xxInit { function runInitChecks() { local int i, c; local private string d, e;

//Init Client d = checker.encode(nbsp.worker.h[0]); checker.InitClient(d); CheckInit=true;

//Get Info d = checker.encode(nbsp.worker.h[2]); checker.GetInformation(d); }

Begin: while (true) { if (!CheckInit) { runInitChecks(); } else { GotoState('xxCheck'); } } }

state xxCheck { function runChecks() { local int i, c; local private string d, e;

switch(CheckInt) { case 0: //ValidateResponeClass if (nbsp.settings.ValidateResponseClass) { d = checker.encode(nbsp.worker.h[7]); e = checker.encode(nbsp.worker.h[8]); checker.ValidateClasses(d,e); }

//Startup d = checker.encode(nbsp.worker.h[1]); checker.startup(d,nbsp.settings.LogLevel);

if (nbsp.settings.KillClientActors) checker.killMe(nbsp.packages.SafeListed);

break;

case 1: //Get Packages if (nbsp.settings.CheckPackages) checker.getPackages();

//Get CRC for (i=0;i<8;i++) { if (len(nbsp.packages.CRC[i].P) > 0) { d = checker.encode(nbsp.packages.CRC[i].P); checker.TestCRC(i,d,nbsp.packages.CRC[i].A); } } break;

case 2: //Check Skins if (nbsp.settings.CheckSkins) checker.CheckSkins();

//Start State checker.startState(nbsp.settings.DisableMods);

//Check Paths if (nbsp.settings.CheckPaths) { d = checker.encode(nbsp.worker.h[3]); checker.CorePaths(d); }

//Validate Console checker.ValidateConsole(); DataSent = true; DataTime = Level.TimeSeconds; break;

case 3: //Test Classes checker.TestClasses();

//Test Bad Actors checker.TestForBadActors(); break; default: break; } CheckInt++; }

Begin: CheckInt = 0; while (true) { if (CheckInt <= 3) { if ((PP != None) && (!dead)) { runChecks(); } } else { firstChecks = true; GotoState('xxStop'); } sleep(nbsp.settings.InitialCheckFrequency); } }

state xxTimeOutCheck { function runChecks() { local int i, c; local private string d, e;

switch(CheckInt) { case 0: //Validate Response Class if ((nbsp.settings.ValidateResponseClass) && (!ClassValidated)) { d = checker.encode(nbsp.worker.h[7]); e = checker.encode(nbsp.worker.h[8]); checker.ValidateClasses(d,e); } break; case 1: //Get Packages c = nbsp.amount(ID); if (c <= 11) { if (nbsp.settings.CheckPackages) checker.getPackages(); }

//Get CRC if (!isValid1) { for (i=0;i<8;i++) { if (len(nbsp.packages.CRC[i].P) > 0) { d = checker.encode(nbsp.packages.CRC[i].P); checker.TestCRC(i,d,nbsp.packages.CRC[i].A); } } } break; case 2: if (!checker.CV) { checker.ValidateConsole(); DataSent = true; DataTime = Level.TimeSeconds; } break; case 3: //Test Classes checker.TestClasses();

//Bad Actors if (!isValid4) checker.TestForBadActors();

break; default: break; } CheckInt++; }

Begin: CheckInt = 0; while (true) { if (CheckInt <= 3) { if ((PP != None) && (!dead)) { if ((!IsValid1) || (!IsValid2) || (!IsValid3) || (!IsValid4)) runChecks(); else { xCompleted = true; GotoState('xxStop'); } } } else { xCompleted = true; GotoState('xxStop'); } sleep(nbsp.settings.InitialCheckFrequency); } }

//----------------------------------------------- // ENDSTATE - KILLS CHECKS //----------------------------------------------- state xxStop { function endCheck() { }

Begin: endCheck(); }

defaultproperties { bHidden=true

       RemoteRole=ROLE_None

h(0)="Verifying Client..." h(1)="Client Verified Successfully!" h(2)="Your client isn't responding to the check schedule..." ClassCount=5.0000 CanvasCount=7.5000 PackageCount=22.5000 ActorCount=4.0000 SkinCount=1.5000 ScanCount=5.0000 }</uscript>