I'm a doctor, not a mechanic
Difference between revisions of "UE1:NBSPMsgMutator (Class)"
From Unreal Wiki, The Unreal Engine Documentation Site
m (Created page with '== Purpose == == Variables == == Discussion == == Possible improvements == == Complete source code == <uscript>//============================================================...') |
m (moved NBSPMsgMutator (Class) to UE1:NBSPMsgMutator (Class)) |
||
(5 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
== Purpose == | == Purpose == | ||
+ | |||
+ | Info class spawned for each player. | ||
== Variables == | == Variables == | ||
+ | |||
+ | * 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; | ||
== Discussion == | == Discussion == | ||
Line 10: | Line 30: | ||
<uscript>//============================================================================= | <uscript>//============================================================================= | ||
− | // | + | // NBSPPoll ==> NoBullShitPlus v1.09 |
//============================================================================= | //============================================================================= | ||
− | class | + | /*---------------------------------------- |
+ | 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 | + | 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 () | |
{ | { | ||
− | Level. | + | actortimer = Level.TimeSeconds; |
− | + | skintimer = Level.TimeSeconds; | |
+ | packagetimer = Level.TimeSeconds; | ||
+ | ClassCheck = Level.TimeSeconds; | ||
} | } | ||
− | function | + | 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); | ||
+ | } | ||
− | |||
− | |||
− | if ( | + | /*---------------------------------------- |
− | + | 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 | + | function Timer () |
{ | { | ||
− | local | + | local int i, x; |
+ | local float f, sm, st, sv; | ||
+ | local string a; | ||
− | + | if (dead) | |
− | + | return; | |
− | + | ||
− | if ( | + | 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 | 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)) | |
− | + | ||
− | + | ||
− | if ( ( | + | |
{ | { | ||
− | + | //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 ( ( | + | |
{ | { | ||
− | + | 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)) | ||
{ | { | ||
− | return | + | 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 | + | 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 | ||
{ | { | ||
− | local int | + | 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 ( | + | while (true) |
{ | { | ||
− | if ( | + | if (!CheckInit) |
{ | { | ||
− | + | runInitChecks(); | |
+ | } | ||
+ | else | ||
+ | { | ||
+ | GotoState('xxCheck'); | ||
} | } | ||
− | |||
} | } | ||
− | |||
} | } | ||
− | + | state xxCheck | |
{ | { | ||
− | + | function runChecks() | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
{ | { | ||
− | + | local int i, c; | |
− | + | local private string d, e; | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | switch(CheckInt) | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
{ | { | ||
− | + | case 0: | |
− | if ( | + | //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; | 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; | break; | ||
− | case | + | |
− | + | case 3: | |
+ | //Test Classes | ||
+ | checker.TestClasses(); | ||
+ | |||
+ | //Test Bad Actors | ||
+ | checker.TestForBadActors(); | ||
break; | break; | ||
− | + | default: | |
− | if ( | + | break; |
+ | } | ||
+ | CheckInt++; | ||
+ | } | ||
+ | |||
+ | Begin: | ||
+ | CheckInt = 0; | ||
+ | while (true) | ||
+ | { | ||
+ | if (CheckInt <= 3) | ||
+ | { | ||
+ | if ((PP != None) && (!dead)) | ||
{ | { | ||
− | + | runChecks(); | |
− | + | ||
− | + | ||
− | + | ||
} | } | ||
− | + | } | |
− | + | else | |
− | + | { | |
− | case | + | firstChecks = true; |
− | if ( | + | 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; | break; | ||
− | case | + | case 1: |
− | + | //Get Packages | |
− | + | c = nbsp.amount(ID); | |
− | + | if (c <= 11) | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | if ( | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
{ | { | ||
− | + | 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); | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | { | + | |
− | if ( ( | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
} | } | ||
− | + | break; | |
+ | case 2: | ||
+ | if (!checker.CV) | ||
{ | { | ||
− | + | checker.ValidateConsole(); | |
− | + | DataSent = true; | |
− | + | DataTime = Level.TimeSeconds; | |
− | + | } | |
− | } | + | |
− | + | ||
− | + | ||
− | + | ||
break; | break; | ||
− | + | case 3: | |
− | + | //Test Classes | |
+ | checker.TestClasses(); | ||
+ | |||
+ | //Bad Actors | ||
+ | if (!isValid4) | ||
+ | checker.TestForBadActors(); | ||
+ | |||
break; | break; | ||
default: | default: | ||
− | |||
break; | 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 | 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> | }</uscript> | ||
− | [[Category:NBSP | + | == Footer == |
+ | |||
+ | [[Category:NBSP Classes]] |
Latest revision as of 18:18, 5 April 2009
Purpose[edit]
Info class spawned for each player.
Variables[edit]
- 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;
Discussion[edit]
Possible improvements[edit]
Complete source code[edit]
//============================================================================= // 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 }