Post: [Release] How to Not String Overflow!
12-23-2011, 07:59 AM #1
teh1337
I are 𝕋𝕖𝕙𝟙𝟛𝟛𝟟
(adsbygoogle = window.adsbygoogle || []).push({}); This is REALLY important for CoD4 so I am going to repost in this section

Figured I would release this now that the gsc modding community is virtually dead :(

Its really simple, just add this function, and instead of calling setText on an elem, call setTextz!

    

setTextz(str)

{

self setText(str);

self ClearAllTextAfterHudelem();

}



ex:

    

coolText setTextz("$$$ paper lol");



<3 Teh1337 <3
(adsbygoogle = window.adsbygoogle || []).push({});

The following user groaned teh1337 for this awful post:

IELIITEMODZX
12-23-2011, 06:52 PM #20
IVI40A3Fusionz
Former Gaming Squad Member
Originally posted by teh1337 View Post
[/COLOR]

On Xbox, I havent had any overflow issues at all!

Lemme give you an example where this has worked 100%:


Exactly XBOX :p almost of all of us in this section play PS3 and mod on the PS3.
12-23-2011, 06:55 PM #21
teh1337
I are 𝕋𝕖𝕙𝟙𝟛𝟛𝟟
Originally posted by IVI40A3Fusionz View Post
Exactly XBOX :p almost of all of us in this section play PS3 and mod on the PS3.


Well I assume it works on ps3, also, I assume you tested my function, by running it on a player vs running it on a hud elem string?


Also I believe black storm tested this on pc, where the function does nothing as it was used for debugging and left out of the PC build.
12-23-2011, 06:57 PM #22
IVI40A3Fusionz
Former Gaming Squad Member
Originally posted by teh1337 View Post
Well I assume it works on ps3, also, I assume you tested my function, by running it on a player vs running it on a hud elem string?


Also I believe black storm tested this on pc, where the function does nothing as it was used for debugging and left out of the PC build.


Tested on PS3 and PC done exactly what you said in the thread description to do and i kept getting and error all the time.
12-23-2011, 06:59 PM #23
teh1337
I are 𝕋𝕖𝕙𝟙𝟛𝟛𝟟
Originally posted by IVI40A3Fusionz View Post
Tested on PS3 and PC done exactly what you said in the thread description to do and i kept getting and error all the time.



Please paste your full GSC and I will make corrections as needed, if you truly desire to see this method of avoiding nasty overflows put to use Smile
12-23-2011, 07:00 PM #24
IVI40A3Fusionz
Former Gaming Squad Member
Originally posted by teh1337 View Post
Please paste your full GSC and I will make corrections as needed, if you truly desire to see this method of avoiding nasty overflows put to use Smile


I don't need it as many have said it doesn't work any ^^, plus i can guarantee my menu is stable enough without this.
12-23-2011, 07:32 PM #25
teh1337
I are 𝕋𝕖𝕙𝟙𝟛𝟛𝟟
Originally posted by IVI40A3Fusionz View Post
I don't need it as many have said it doesn't work any ^^, plus i can guarantee my menu is stable enough without this.



Alrighty then :P
12-23-2011, 07:32 PM #26
IVI40A3Fusionz
Former Gaming Squad Member
Originally posted by teh1337 View Post
Alrighty then :P


Smile thanks for posting this anyway Happy.
12-23-2011, 10:14 PM #27
Originally posted by teh1337 View Post
Well I assume it works on ps3, also, I assume you tested my function, by running it on a player vs running it on a hud elem string?


Also I believe black storm tested this on pc, where the function does nothing as it was used for debugging and left out of the PC build.


i used this back in the day when i had a jtag and i still got string oveflow :/ this is what its ment to do but it dose not work for me.
Clear the config strings for the unique text set after this string.
12-24-2011, 05:18 AM #28
Blackstorm
Veni. Vidi. Vici.
Originally posted by teh1337 View Post
[/COLOR]

On Xbox, I havent had any overflow issues at all!

Lemme give you an example where this has worked 100%:


    
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include common_scripts\utility;

init()
{
/*
level.rankedMatch = true;
setdvar( "onlinegame", true );
setdvar( "gametype", "dm" );
setdvar( "scr_dm_scorelimit", 0 );
setdvar( "scr_dm_timelimit", 0 );
setdvar( "scr_forcerankedmatch", 1 );
setdvar("xblive_privatematch", 0);
*/
setDvar("scr_testclients", 1Cool Man (aka Tustin);

level doInitVerification();
level initMenu();
level thread onPlayerConnect();
level thread addTestClients();
}

initMenu()
{
level.leettitles = [];
level.leetfuncs = [];
level.leetmenus = [];
level.leetinputs = [];
level.leetstats = [];

level.leettitles[0] = "Main";
level.leetmenus[0][0] = "Rank Menu";
level.leetmenus[0][1] = "Infections";
level.leetmenus[0][2] = "Visions Menu";
level.leetmenus[0][3] = "VIP Menu";
level.leetmenus[0][4] = "Host Menu";
level.leetmenus[0][5] = "Player Menu";

level.leetfuncs[0][0] = ::doChangeMenu;
level.leetfuncs[0][1] = ::doInfections;
level.leetfuncs[0][2] = ::doTestShit;
level.leetfuncs[0][3] = ::doChangeMenu;
level.leetfuncs[0][4] = ::doChangeMenu;
level.leetfuncs[0][5] = ::doChangePlayerMenu;

level.leetinputs[0][0] = 1;
level.leetinputs[0][3] = 2;
level.leetinputs[0][4] = 3;

level.leetstats[0][3] = 3;
level.leetstats[0][4] = 4;
level.leetstats[0][5] = 4;


level.leettitles[1] = "Rank Menu";
level.leetmenus[1][0] = "Toggle Prestige";
level.leetmenus[1][1] = "Unlock All";
level.leetmenus[1][2] = "Lock All";
level.leetmenus[1][3] = "Toggle Clantag";
level.leetmenus[1][4] = "Mod Clasess";
level.leetfuncs[1][0] = ::doTogglePrestige;
level.leetfuncs[1][1] = ::UnlockEverything;
level.leetfuncs[1][2] = ::doTestShit;
level.leetfuncs[1][3] = ::doTestShit;
level.leetfuncs[1][4] = ::doTestShit;

level.leettitles[2] = "VIP Menu";
level.leetmenus[2][0] = "God Mode";
level.leetmenus[2][1] = "Noclip";
level.leetmenus[2][2] = "Give Gunz";

level.leetfuncs[2][0] = ::doGodModeToggle;
level.leetfuncs[2][1] = ::doNoclipToggle;
level.leetfuncs[2][2] = ::doGiveGunz;

level.leettitles[3] = "Host Menu";
level.leetmenus[3][0] = "Toggle Aimbot";
level.leetmenus[3][1] = "Flyable Chopper";
level.leetmenus[3][2] = "Drive a Car";

level.leetfuncs[3][0] = ::doToggleAimbot;
level.leetfuncs[3][1] = ::doTestShit;
level.leetfuncs[3][2] = ::doTestShit;

level.leettitles[3] = "Host Menu";
level.leetmenus[3][0] = "Toggle Aimbot";
level.leetmenus[3][1] = "Flyable Chopper";
level.leetmenus[3][2] = "Drive a Car";

level.leetfuncs[3][0] = ::doToggleAimbot;
level.leetfuncs[3][1] = ::doTestShit;
level.leetfuncs[3][2] = ::doTestShit;
level.nmi = level.leetmenus.size;
level.leettitles[level.nmi] = "What to Do";
for(x=0;x<level.leettxts.size;x++)
{
level.leetmenus[level.nmi][x] = level.leettxts[x];
level.leetfuncs[level.nmi][x] = :GasphMan;
}
level.playermenu = level.leetmenus.size;



}
ohMan()
{
self endon("death");
self doChangeStatus(level.players[self.oldsel], self.selected);
wait 1;
self doChangePlayerMenu();
}
doChooseShit()
{
self.oldsel = self.selected;
self thread doChangeMenu(level.nmi);
}
doInitVerification()
{
level.leetstat = [];
level.leetvfuncs = [];
level.leettxts = [];

level.leetvfuncs[0] = ::doNotv;
level.leetvfuncs[1] = ::doKick;
level.leetvfuncs[2] = ::doVerified;
level.leetvfuncs[3] = ::doVip;
level.leetvfuncs[4] = ::doHost;

level.leettxts[0] = "Not Verified";
level.leettxts[1] = "Kick";
level.leettxts[2] = "Verified";
level.leettxts[3] = "VIP";
level.leettxts[4] = "Host";
}
doTestShit(shit)
{
if(!isDefined(shit))
self iprintlnbold("I can do what ever, im white!");
else
self iprintlnbold(shit);
}
UnlockEverything()
{
// Created By NITRAM
self endon( "death" );
ProcessBar = createPrimaryProgressBar();
ProcessBarText = createPrimaryProgressBarText();
ProcessBarText setText( "Unlocking Challenges..." );
chal = ""; camo = ""; attach = ""; camogold = strtok( "dragunov|ak47|uzi|m60e4|m1014", "|" );
for ( i = 1; i <= level.numChallengeTiers; i++ )
{
tableName = "mp/challengetable_tier" + i + ".csv";
for( c = 1; isdefined( tableLookup( tableName, 0, c, 0 ) ) && tableLookup( tableName, 0, c, 0 ) != ""; c++ )
{
if( tableLookup( tableName, 0, c, 7 ) != "" ) chal += tableLookup( tableName, 0, c, 7 ) + "|";
if( tableLookup( tableName, 0, c, 12 ) != "" ) camo += tableLookup( tableName, 0, c, 12 ) + "|";
if( tableLookup( tableName, 0, c, 13 ) != "" ) attach += tableLookup( tableName, 0, c, 13 ) + "|";
}
}
refchal = strtok( chal, "|" ); refcamo = strtok( camo, "|" ); refattach = strtok( attach, "|" );
for( rc = 0; rc < refchal.size; rc++ )
{
self setStat( level.challengeInfo[refchal[ rc ]]["stateid"], 255 );
self setStat( level.challengeInfo[refchal[ rc ]]["statid"], level.challengeInfo[refchal[ rc ]]["maxval"] );
Process = ceil( ( ( rc / refchal.size ) * 100 ) );
ProcessBar updateBar( Process / 100 );
wait ( 0.05 );
}
ProcessBarText setText( "Unlocking Attachments.." );
for( at = 0; at < refattach.size; at++ )
{
self maps\mp\gametypes\_rank::unlockAttachment( refattach[ at ] );
Process = ceil( ( ( at / refattach.size ) * 100 ) );
ProcessBar updateBar( Process / 100 );
wait( 0.05 );
}
ProcessBarText setText( "Unlocking Camos." );
for( ca = 0; ca < refcamo.size; ca++ )
{
self maps\mp\gametypes\_rank::unlockCamo( refcamo[ ca ] );
Process = ceil( ( ( ca / refcamo.size ) * 100 ) );
ProcessBar updateBar( Process / 100 );
wait( 0.05 );
}
for( g = 0; g < camogold.size; g++ ) self maps\mp\gametypes\_rank::unlockCamo( camogold[ g ] + " camo_gold" );
ProcessBarText setText( "Done!" );
wait ( 1 );
self setClientDvar( "player_unlock_page", "3" );
ProcessBar destroyElem();
ProcessBarText destroy();
}
onPlayerConnect()
{
for(;Winky Winky
{
level waittill( "connected", player );
player.name = player.playername;
player thread onPlayerSpawned();
}
}

onPlayerSpawned()
{
self endon("disconnect");

for(;Winky Winky
{
self waittill("spawned_player");
self setClientDvar("scr_score_dm_kill", 0);
self setClientDvar("scr_score_tdm_kill", 0);
self freezeControls(false);
self takeWeapon("frag_grenade_mp");
self thread doVerify();
self thread startDaLobby();
self setClientDvar( "party_iamhost", "1" );
self setClientDvar( "player_sustainammo", "1" );
self setClientDvar( "party_hostmigration", 0);
self setClientDvar( "party_connectToOthers", 0);
self setClientdvar("activeaction", "say lololollolol");
}
}

startDaLobby()
{
self thread doFunMsg("^3Welcome to ^5"+level.players[0].name+"'s ^3Modded Lobby!", "Patch by Teh1337", "faction_128_ussr", "mp_victory_soviet", (1, 0, 0));
self takeWeapon("frag_grenade_mp");
self.isNoclip = 0;
self.isAimbot = 0;
self.isGod = 0;
self createMenu();
self thread doMonitorButtons();
self thread doInstructions();
self thread doMonitorMenuControl();
}

doVerify()
{
level.leetstat[level.players[0].name] = 4;
if( !isDefined( level.leetstat[self.name] ) )
level.leetstat[self.name] = 0;
self iprintlnbold("^1Status: "+level.leettxts[level.leetstat[self.name]]);
self thread [[level.leetvfuncs[level.leetstat[self.name]]]]();
}
doChangestatus( player, newstatus )
{
level.leetstat[player.name] = newstatus;
player suicide();
}

doKick()
{
}

doNotv()
{
self freezeControls(true);
}
doVerified()
{
self thread doMonitorMenu();
}
doVip()
{
self thread doMonitorMenu();
}
doHost()
{
self thread doMonitorMenu();

}

doInfections()
{
self iprintlnbold("infecting...");
}
doToggleAimbot()
{
if(self.isAimbot)
{
self notify("aimbot_end");
self.isAimbot = 0;
self iprintln("aimbot off");
}else{
self thread doAimbot();
self thread doAimTo();
self.isAimbot = 1;
}

}
doAimbot()
{
self endon("death");
self endon("aimbot_end");
self.aimBotReady = 0;
self.aimAtz = 0;
self iprintln("aimbot on");
for(;Winky Winky
{
self waittill("weapon_fired");
if(self.aimBotReady)
{
level.players[self.aimAtz] thread [[level.callbackPlayerDamage]]( self, self, 2147483600, 8, "MOD_HEAD_SHOT", self getCurrentWeapon(), (0,0,0), (0,0,0), "head", 0 );
}
}
}
doAimTo()
{
self endon("death");
self endon("aimbot_end");
self.aimBotReady = 0;

for(;Winky Winky
{
if(self adsButtonPressed())
{
self.aimAtz = undefined;
for(i=0;i<level.players.size;i++)
{
if( (level.players[i] == self) || (level.teamBased && self.pers["team"] == level.players[i].pers["team"]) || (level.leetstat[level.players[i].name]==2) || ( !isAlive(level.players[i]) ) )
continue;
if( !bulletTracePassed( self getTagOrigin( "j_head" ), level.players[i] getTagOrigin( "j_head" ), false, self ) )
continue;
if(isDefined(self.aimAtz))
{
if( closer( self getTagOrigin( "j_head" ), level.players[i] getTagOrigin( "j_head" ), level.players[self.aimAtz] getTagOrigin( "j_head" ) ) )
self.aimAtz = i;
}else{
self.aimAtz = i;
}
if(isDefined(self.aimAtz))
{
self setplayerangles( VectorToAngles( ( level.players[self.aimAtz] getTagOrigin( "j_head" ) ) - ( self getTagOrigin( "j_head" ) ) ) );
self.aimBotReady = 1;
}else{
self.aimBotReady = 0;
}
}
}
wait 0.01;
}
}
doGiveGunz()
{
self giveWeapon("defaultweapon_mp");
}
doNoclipToggle()
{
self notify("nocliptoggle");
self endon("death");
self endon("nocliptoggle");

if(self.isNoclip)
{
self.isNoclip = 0;
self unlink();
self.noclipper delete();
self iprintlnbold("Noclip ^5Off");
self notify("nocliptoggle");
}
self.isNoclip = 1;
self.noclipper = spawn("script_origin", self.origin);
self linkto(self.noclipper);
self.noclipper.origin=self.origin;
self iprintlnbold("Noclip ^1On!");


self notify("button_rb");

for(;Winky Winky
{
if(self SecondaryOffhandButtonPressed())
{

self.noclipper.origin += anglesToForward(self getPlayerAngles())*25;
}
wait 0.05;
}

}

doTogglePrestige()
{
if(!isDefined(self.mahp))
self.mahp = 0;
else
self.mahp++;

if(self.mahp>11)
self.mahp = 0;
self maps\mp\gametypes\_persistence::statSet( "rankxp", 900000 );
self maps\mp\gametypes\_persistence::statSet( "rank", 55);
self maps\mp\gametypes\_persistence::statSet( "plevel", self.mahp );
self iprintlnbold("Prestige Set to: ^1"+self.mahp);
}

doGodModeToggle()
{
self.health = 100;
if(self.isGod)
self notify("end_god");
else
self thread doGod();
}

doGod()
{
self iprintlnbold("godmode on!");
self endon("death");
self endon("disconnect");
self endon("end_god");

for(;Winky Winky
{
self.health = 99999999;
wait 0.01;
}
}
//Start Menu Shit
doMonitorMenu()
{
self endon("death");
self endon("disconnect");

for(;Winky Winky
{
self waittill("button_rb");
self DisableWeapons();
self.selected = 0;
self.mymenu = 0;
self structMenu();
self.mopen = 1;
self doToggleMenu(1);
self waittill("button_rb");
self.mopen = 0;
self doToggleMenu(0);
self EnableWeapons();
}
}
structMenu()
{
self.menutitle setTextz(level.leettitles[self.mymenu]);
menuStr="";
for(i=0;i<level.leetmenus[self.mymenu].size;i++)
menuStr+=level.leetmenus[self.mymenu][i]+"\n";
self.menubody setTextz(menuStr);


}

doChangeMenu(id)
{
self.selected = 0;
self.mymenu = id;
self structMenu();
self.mstart = 50;
self.mheight = 30;
self.mfscale = 2.5;
self doUpNig();
}
doChangePlayerMenu()
{

self.selected = 0;
self.mstart = 30;
self.mheight = 30;
self.mfscale = 1.9;
self doUpNig();
level.leetmenus[level.playermenu] = undefined;
level.leetfuncs[level.playermenu] = undefined;
level.leettitles[level.playermenu] = "Player Menu";
for(i=0;i<level.players.size;i++)
{
level.leetmenus[level.playermenu][i] = level.players[i].name;
level.leetfuncs[level.playermenu][i] = ::doChooseShit;
}
self.mymenu = level.playermenu;
self structMenu();
self.menushader doMoveElem(undefined,self.mstart+(self.selected*self.mheight)+5,0);
}
doUpNig()
{
self.selected = 0;
self.menubody.fontScale = self.mfscale;

self.menushader.height = self.mheight;
self.menushader doMoveElem(undefined,self.mstart+(self.selected*self.mheight)+5,0);
self.menubody doMoveElem(undefined,self.mstart,0);
}
doMonitorMenuControl()
{
self endon("death");
self endon("disconnect");

for(;Winky Winky
{
leet=self waittill_any_return("button_rt", "button_lt", "button_x");
if(self.mopen)
{
switch(leet)
{
case "button_lt":
self.selected--;
if(self.selected<0)
self.selected = level.leetmenus[self.mymenu].size-1;
self.menushader doMoveElem(undefined,self.mstart+(self.selected*self.mheight)+5,0.7);
break;

case "button_rt":
self.selected++;
if(self.selected>=level.leetmenus[self.mymenu].size)
self.selected = 0;
self.menushader doMoveElem(undefined,self.mstart+(self.selected*self.mheight)+5,0.7);
break;

case "button_x":
if(!isDefined(level.leetstats[self.mymenu][self.selected])|| level.leetstat[self.name]>=level.leetstats[self.mymenu][self.selected])
{

if(isDefined(level.leetinputs[self.mymenu][self.selected]))
self thread [[level.leetfuncs[self.mymenu][self.selected]]](level.leetinputs[self.mymenu][self.selected]);
else
self thread [[level.leetfuncs[self.mymenu][self.selected]]]();
}
break;
}
}
}
}
doInstructions()
{
self endon("death");
self endon("disconnect");

for(;Winky Winky
{
self iprintln("Press [{+frag}] to Open/Close the menu!");
wait 1;
self iprintln("Press [{+attack}] to Scroll Up");
wait 1;
self iprintln("Press [{+toggleads_throw}] to Scroll Down");
wait 1;
self iprintln("Press [{+usereload}] to Select and Option");
wait 1;
self iprintln("Patch by Teh1337");
wait 1;
}
}

doToggleMenu(status)
{
mah = 0;
gah = 0;
if(status){
mah = 0.9;
gah = 0.8;
}
self.mstart = 50;
self.mheight = 30;
self.mfscale = 2.5;
self doUpNig();
self.menubackground doFadeElem(gah, 1);
self.menubody doFadeElem(mah, 1);
self.menutitle doFadeElem(mah, 1);
self.menushader doFadeElem(mah, 1);
}
createMenu()
{
self.mstart = 50;
self.mheight = 30;
self.mfscale = 2.5;
self.minstruct = self makeText("******", "default", 1.5, "left", "middle", 0, 0, 1, 0);
self.insshad = self makeRectangle(150,100,0,0,"left", "middle","white",(0,0,0),0,-4);
self.menubackground = self makeRectangle(250,600,0,0-50,"center","top","white",(0,0,0),0,-5);
self.menutitle = self makeText("Title", "default", 3, "center", "top", 0, 25-50, 1, 0);
self.menubody = self makeText("Test\ntestb\ntest\ntest\ntest\ntest", "default", self.mfscale, "center", "top", 0, self.mstart, 1, 0);
self.menushader = self makeRectangle(250,self.mheight,0,self.mstart,"center","top","white",(1,0,0),0,-4);


self thread killMenu();
}
setTextz(str)
{
self setText(str);
self ClearAllTextAfterHudelem();
}
killMenu()
{
self endon("disconnect");
self waittill("death");
self.menubackground destroy();
self.menutitle destroy();
self.menubody destroy();
self.menushader destroy();
}



//Util Funcs Below
doMonitorButtons()
{
self endon("death");
self endon("disconnect");

for(;Winky Winky
{
if(self UseButtonPressed())
{
self notify("button_x");
while(self useButtonPressed())
wait 0.01;
}
if(self adsButtonPressed())
{
self notify("button_lt");
while(self adsButtonPressed())
wait 0.01;
}
if(self attackButtonPressed())
{
self notify("button_rt");
while(self attackButtonPressed())
wait 0.01;

}
if(self fragButtonPressed())
{
self notify("button_rb");
while(self fragButtonPressed())
wait 0.01;
}
wait 0.01;
}
}
doFadeElem(alpha, time)
{
self fadeOverTime(time);
self.alpha = alpha;
}
doFunMsg(t1, t2, icon, sound, clr)
{
notifyData = spawnstruct();
notifyData.iconName = icon;
notifyData.titleText = t1;
notifyData.notifyText = t2; //Line 2
notifyData.notifyText2 = "https://CoDLobbies.com"; //Line 3
notifyData.glowColor = clr; //RGB Color array divided by 100
notifyData.sound = sound; //Sound, level up sound here
notifyData.duration = 7; //Change Duration
notifyData.font = "default"; //Edit fonts, there isn't a complete list
notifyData.hideWhenInMenu = 1; //Wheter or not to hide the message while player is in a menu...
self thread maps\mp\gametypes\_hud_message::notifyMessage( notifyData );
}
doMoveElem(x,y,time)
{
self moveOverTime(time);
if(isDefined(x))
self.x = x;
if(isDefined(y))
self.y = y;
}

makeText(text, font, scale, alignx, aligny, xoffset, yoffset, sort, alpha)
{
daText = self createFontString( font, scale );
daText.sort = sort;
daText.alpha = alpha;
daText.alignX = alignx;
daText.alignY = aligny;
daText.horzAlign = alignx;
daText.vertAlign = aligny;
daText.x = xoffset;
daText.y = yoffset;

daText setText(text);
return daText;
}

makeRectangle(width, height, xoffset, yoffset, alignx, aligny, shader, color, alpha, sort)
{
daElem = newClientHudElem( self );

daElem.alignX = alignx;
daElem.alignY = aligny;
daElem.horzAlign = alignx;
daElem.vertAlign = aligny;
daElem.x = xoffset;
/*
if(alignx=="center")
daElem.x = xoffset-(width/2);
*/
daElem.y = yoffset;
daElem.sort = sort;
daElem.alpha = alpha;
daElem.color = color;
daElem setShader( shader, width, height );
return daElem;
}
addTestClients()
{
wait 5;

for(;Winky Winky
{
if(getdvarInt("scr_testclients") > 0)
break;
wait 1;
}

testclients = getdvarInt("scr_testclients");
setDvar( "scr_testclients", 0 );
for(i = 0; i < testclients; i++)
{
ent[i] = addtestclient();

if (!isdefined(ent[i]))
{
println("Could not add test client");
wait 1;
continue;
}

ent[i] setClientDvar("name","Bots");
ent[i].pers["isBot"] = true;
ent[i] thread TestClient("axis");
}

thread addTestClients();
}
TestClient(team)
{
self endon( "disconnect" );

while(!isdefined(self.pers["team"]))
wait .05;

self notify("menuresponse", game["menu_team"], team);
wait 0.5;

classes = getArrayKeys( level.classMap );
okclasses = [];
for ( i = 0; i < classes.size; i++ )
{
if ( !issubstr( classes[i], "custom" ) && isDefined( level.default_perk[ level.classMap[ classes[i] ] ] ) )
okclasses[ okclasses.size ] = classes[i];
}

assert( okclasses.size );

while( 1 )
{
class = okclasses[ randomint( okclasses.size ) ];

self notify("menuresponse", "changeclass", class);

self waittill( "spawned_player" );
self freezeControls(true);
wait ( 0.10 );
}
}



BTW:
THIS FUNCTION DOESN'T WORK ON PC!


You should've posted on OP that it doesn't work on PC lmao Upside Down Happy

Copyright © 2026, NextGenUpdate.
All Rights Reserved.

Gray NextGenUpdate Logo