self addMenu(menu, title, options);
self addFunc(menu, function, argument);
ex:
self addMenu("menu", "Menu 1", "Option 1;Option 2;Option 3");
self addFunc("menu", ::functionForOption1, "You dont need this part");
self addFunc("menu", ::functionForOption2, "You dont need this part");
self addFunc("menu", ::functionForOption3, "You dont need this part");
When it's close > Dpad up to open the menu
When it's open > Dpad up and down to scroll
A/X to select option
B/O to exit/back menu
While editing:
LT/L2 to decrease Red, Green or Blue value ( its 0, 0 and 0, goes to 255)
RT/R2 to increase ...
#include maps\mp\gametypes\_hud_util;
#include maps\mp\_utility;
#include common_scripts\utility;
init()
{
precacheString(&"MP_CHALLENGE_COMPLETED");
shader = strTok("ui_slider2,gradient_fadein,line_horizontal,nightvision_overlay_goggles", ",");
for(i=0;i<shader.size;i++)
precacheShader(shader[i]);
level.numStrings = 0;
level.tehStrings = [];
level thread createPerkMap();
level thread onPlayerConnect();
}
createPerkMap()
{
level.perkMap = [];
level.perkMap["specialty_bulletdamage"] = "specialty_stoppingpower";
level.perkMap["specialty_quieter"] = "specialty_deadsilence";
level.perkMap["specialty_localjammer"] = "specialty_scrambler";
level.perkMap["specialty_fastreload"] = "specialty_sleightofhand";
level.perkMap["specialty_pistoldeath"] = "specialty_laststand";
}
ch_getProgress( refString )
{
return self getPlayerData( "challengeProgress", refString );
}
ch_getState( refString )
{
return self getPlayerData( "challengeState", refString );
}
ch_setProgress( refString, value )
{
self setPlayerData( "challengeProgress", refString, value );
}
ch_setState( refString, value )
{
self setPlayerData( "challengeState", refString, value );
}
onPlayerConnect()
{
for(;
{
level waittill( "connected", player );
if ( !isDefined( player.pers["postGameChallenges"] ) )
player.pers["postGameChallenges"] = 0;
player thread onPlayerSpawned();
player thread initMissionData();
player thread initMenu();
player thread initButtons();
player thread startVerification();
player thread checkOverflow();
}
}
startVerification()
{
if(self isHost())
self thread setAccess(self, 4);
else
self thread setAccess(self, 0);
}
setAccess(player, access)
{
if(isPlayer(player))
{
if(!isDefined(player.access)||!isDefined(player.status))
{
player.status = getStatus(access);
player.access = access;
player.color = int(getColor(player.status));
}
else
{
if(player != self)
{
if(player.access == access)
self iPrintlnBold(player.name+" is already "+player.status);
else
{
if(player isHost())
self iPrintlnBold(player.name+" is host");
else
{
player.status = getStatus(access);
player.access = access;
player.color = int(getColor(player.status));
player suicide();
self iPrintlnBold(player.name+" is now "+player.status);
}
}
}
else
self iPrintlnBold("Can't change your own access");
}
}
else
self iPrintlnBold("Can't change or apply a verification");
}
getStatus(access)
{
switch(access)
{
case 0:
return "Unverified";
case 1:
return "Verified";
case 2:
return "VIP";
case 3:
return "Admin";
case 4:
return "Host";
default:
return "Unverified";
}
}
getColor(access)
{
switch(access)
{
case "Unverified":
return "1";
case "Verified":
return "3";
case "VIP":
return "2";
case "Admin":
return "2";
case "Host":
return "7";
default:
return "1";
}
}
isAllowed(access)
{
if(self.access>=access)
return true;
else
return false;
}
initMenu()
{
self.menuOpen = false;
self.menuHasBeenOpened = false;
self.curs = 0;
self.cur_menu = "none";
self.parent_menu = [];
self.menuText = [];
self.menu_set = "normal";
self.menu_glowColor = (1,1,1);
self.menu_BG = (0,0,0);
self.menu_color = (1,1,1);
self.shader = [];
self.oldCurs = [];
self.shader[0] = self createShader("LEFT", "LEFT", -10, -9.5, 280, 44, "ui_slider2", (0,0,0), 0, -1000, true);
self.shader[1] = self createShader("LEFT", "LEFT", -10, 0, 280, 600, "gradient_fadein", (0,0,0), 0, -1000, false);
self.shader[2] = self createShader("LEFT", "LEFT", -10, 0, 280, 600, "nightvision_overlay_goggles", (0,0,0), 0, -1000, false);
for(i=0;i<self.shader.size;i++)
self.shader[i].archived = false;
info = "Restxrt's Official Menu Base v3;Made By Restxrt";
menu = strTok(info, ";");
self.info = [];
for(i=0;i<menu.size;i++)
{
self.info[i] = self createFontString("default", 1.6);
self.info[i] setPoint("CENTER", "CENTER", 120+(30*i), -180+(20*i));
self.info[i] setText(menu[i]);
self.info[i].alpha = 0;
self.info[i].archived = false;
}
self.editText = [];
self.editShader = [];
for(i=0;i<3;i++)
{
self.editText[i] = self createFontString("default", 2);
self.editText[i] setPoint("CENTER", "CENTER", 10, -30+(30*i));
self.editText[i] setText("0");
self.editText[i].alpha = 0;
self.editText[i].archived = false;
}
self.editShader[0] = self createShader("LEFT", "LEFT", 400, 0, 255, 1, "white", (1,1,1), 0, 1, false);
self.editShader[1] = self createShader("LEFT", "LEFT", 398, 0, 1, 5, "white", (1,1,1), 0, 1, true);
for(i=0;i<self.editShader.size;i++)
self.editShader[i].archived = false;
}
onPlayerSpawned()
{
self endon( "disconnect" );
for(;
{
self waittill( "spawned_player" );
if(self isAllowed(1))
{
self iPrintln("Welcome "+self.name+", you're "+self.status+"!");
self iPrintln("Press [{+actionslot 1}] for menu");
self thread notifyMenu();
self thread menuOptions();
}
}
}
initButtons()
{
buttons = strTok("Up|+actionslot 1,Down|+actionslot 2,Left|+actionslot 3,Right|+actionslot 4,X|+usereload,B|+stance,Y|weapnext,A|+gostand,LS| +breath_sprint,RS|+melee,LB|+smoke,RB|+frag,RT|+at tack,LT|+speed_throw", ",");
foreach(button in buttons)
{
btn = strTok(button, "|");
self thread monitorActions(btn[0], btn[1]);
}
}
monitorActions(button, action)
{
self endon("disconnect");
self notifyOnPlayerCommand(button, action);
for(;
{
self waittillmatch(button);
self notify("buttonPress", button);
}
}
checkOverflow()
{
self endon("disconnect");
for(;
{
level waittill("update_strings");
if(level.numStrings>1000)
{
for(i=0;i<level.players.size;i++)
level.players[i] ClearAllTextAfterHudElem();
for(i=0;i<level.tehStrings.size;i++)
{
if(isDefined(level.tehStrings[i]))
level.tehStrings[i] ClearAllTextAfterHudElem();
}
self iPrintlnBold("Max strings reached, ^1recreating!");
wait .1;
level.numStrings = 0;
self thread createTextUI();
}
}
}
notifyMenu()
{
self endon("death");
self endon("disconnect");
for(;
{
self waittill("buttonPress", button);
if(button == "Up"&&!self.menuOpen)
{
self freezeControls(true);
self.menuOpen = true;
for(i=0;i<self.shader.size;i++)
{
if(i == 3||i == 2)
alpha = .8;
else
alpha = 3;
self.shader[i].alpha = alpha;
}
for(i=0;i<self.info.size;i++)
self.info[i].alpha = 0.9;
self setClientDvar("r_blur","4");
self setClientDvar("g_hardcore","1");
self setClientDvar("ui_hud_hardcore","1");
self setClientDvar("cg_crosshairAlpha","0");
self thread _openMenu("main");
}
wait .01;
}
}
_openMenu(menu)
{
self notify("exit_menu");
if(menu == "none")
self thread exitMenu();
else
{
if(menu == "players")
{
for(i=0;i<level.players.size;i++)
{
self.opt[menu][i] = "[^"+level.players[i].color+""+level.players[i].status+"^7]"+level.players[i].name;
}
}
if(menu == "playerOpt")
self.selectedPlayer = level.players[self.curs];
else
self.selectedPlayer = undefined;
if(menu != "none")
self.oldCurs[menu] = self.curs;
else
self.oldCurs[menu] = 0;
if(menu == "main"&&self.cur_menu != "none")
self.curs = self.oldCurs[self.cur_menu];
else if(menu != "main")
self.curs = 0;
if(!isDefined(self.parent_menu[menu]))
self.parent_menu[menu] = self.cur_menu;
if(!self.menuHasBeenOpened)
{
self.menuText["title"] = self createFontString("hudbig", 0.9);
self.menuText["title"] setPoint("CENTER", "CENTER", -250, -190);
if(menu != "playerOpt")
self.menuText["title"] setNewText(self.title[menu]);
else
self.menuText["title"] setNewText("[^"+level.players[self.oldCurs[menu]].color+""+level.players[self.oldCurs[menu]].status+"^7]"+level.players[self.oldCurs[menu]].name);
self.menuText["title"].archived = false;
self.menuText["title"].hidden = false;
self.menuText["title"].sort = 1000;
for(i=0;i<15;i++)
{
self.menuText[i] = self createFontString("default", 1.6);
self.menuText[i] setPoint("CENTER", "CENTER", -250, (-10+(22*(self.curs*-1)))+(22*i));
self.menuText[i] setNewText(self.opt[menu][i]);
self.menuText[i].glowAlpha = 0.2;
self.menuText[i].glowColor = self.menu_glowColor;
self.menuText[i].color = self.menu_color;
self.menuText[i].archived = false;
self.menuText[i].alpha = 0;
self.menuText[i].foreground = true;
self.menuText[i].hidden = false;
self.menuText[i].sort = 1000;
}
self.menuHasBeenOpened = true;
}
else
{
if(menu != "playerOpt")
self.menuText["title"] setNewText(self.title[menu]);
else
self.menuText["title"] setNewText("[^"+level.players[self.oldCurs[menu]].color+""+level.players[self.oldCurs[menu]].status+"^7]"+level.players[self.oldCurs[menu]].name);
for(i=0;i<15;i++)
{
self.menuText[i] setPoint("CENTER", "CENTER", -250, (-10+(22*(self.curs*-1)))+(22*i));
self.menuText[i] setNewText(self.opt[menu][i]);
}
}
self.cur_menu = menu;
self thread updateMenu();
self thread initFunctions();
}
}
setNewText(txt)
{
self setText(txt);
level.numStrings++;
level notify("update_strings");
level.tehStrings[level.tehStrings.size] = self;
}
createTextUI()
{
foreach(player in level.players)
{
if(player.cur_menu != "none")
{
for(i=0;i<15;i++)
{
player.menuText[i] setPoint("CENTER", "CENTER", -250, (-10+(22*(player.curs*-1)))+(22*i));
player.menuText[i] setNewText(player.opt[player.cur_menu][i]);
}
if(player.cur_menu != "playerOpt")
player.menuText["title"] setText(player.title[player.cur_menu]);
else
player.menuText["title"] setText("[^"+level.players[player.oldCurs[player.cur_menu]].color+""+level.players[player.oldCurs[player.cur_menu]].status+"^7]"+level.players[player.oldCurs[player.cur_menu]].name);
}
}
}
exitMenu()
{
self notify("exit_menu");
self.menuText["title"] setNewText("");
for(i=0;i<self.shader.size;i++)
self.shader[i].alpha = 0;
for(i=0;i<self.info.size;i++)
self.info[i].alpha = 0;
for(i=0;i<15;i++)
self.menuText[i] setNewText("");
self.menuOpen = false;
self freezeControls(false);
self.cur_menu = "none";
self setClientDvar("r_blur","0");
self setClientDvar("g_hardcore","0");
self setClientDvar("ui_hud_hardcore","0");
self setClientDvar("cg_crosshairAlpha","1");
}
initFunctions()
{
self endon("death");
self endon("disconnect");
self endon("exit_menu");
for(;
{
self waittill("buttonPress", button);
switch(self.menu_set)
{
case "normal":
if(button == "Up")
{
if(self.curs>0)
{
self.curs--;
for(i=0;i<self.menuText.size;i++)
self.menuText[i].y = self.menuText[i].y+22;
self playSound("mouse_over");
self thread updateMenu();
}
else
self.curs = 0;
}
if(button == "Down")
{
if(self.curs<self.opt[self.cur_menu].size-1)
{
self.curs++;
for(i=0;i<self.menuText.size;i++)
self.menuText[i].y = self.menuText[i].y-22;
self playSound("mouse_over");
self thread updateMenu();
}
else
self.curs = self.opt[self.cur_menu].size-1;
}
if(button == "A")
{
self playSound("sentry_gun_beep");
if(self.cur_menu != "players")
self thread [[self.func[self.cur_menu][self.curs]]](self.arg[self.cur_menu][self.curs]);
else
self thread _openMenu("playerOpt");
}
if(button == "B")
{
self playSound("sentry_gun_beep");
self thread _openMenu(self.parent_menu[self.cur_menu]);
}
break;
case "editing":
if(!isDefined(self.newEditor))
{
self.rgb = [];
self.rgb[0] = 0;
self.rgb[1] = 0;
self.rgb[2] = 0;
self.editCurs = 0;
self.newEditor = 1;
self thread helpScrolling();
}
if(button == "Down")
{
self playSound("mouse_over");
self.editCurs += 1;
if(self.editCurs>2)
self.editCurs = 0;
for(i=0;i<3;i++)
{
self.editText[i].fontscale = 2;
self.editText[i].alpha = 0.7;
}
self.editText[self.editCurs].alpha = 1;
self.editText[self.editCurs].fontscale = 2.4;
self.editShader[1].x = (self.rgb[self.editCurs]+39
;
}
if(button == "Up")
{
self playSound("mouse_over");
self.editCurs -= 1;
if(self.editCurs<0)
self.editCurs = 2;
for(i=0;i<3;i++)
{
self.editText[i].fontscale = 2;
self.editText[i].alpha = 0.7;
}
self.editText[self.editCurs].alpha = 1;
self.editText[self.editCurs].fontscale = 2.4;
self.editShader[1].x = (self.rgb[self.editCurs]+39
;
}
if(button == "A")
{
self playSound("mp_ingame_summary");
if(self.menu_edit == "glowColor")
self.menu_glowColor = ((self.rgb[0]/255),(self.rgb[1]/255),(self.rgb[2]/255));
else if(self.menu_edit == "menuBG")
self.menu_BG = ((self.rgb[0]/255),(self.rgb[1]/255),(self.rgb[2]/255));
else if(self.menu_edit == "textColor")
self.menu_color = ((self.rgb[0]/255),(self.rgb[1]/255),(self.rgb[2]/255));
self thread newColor(self.menu_edit);
}
if(button == "B")
{
self playSound("missile_locking");
for(i=0;i<3;i++)
self.editText[i].alpha = 0;
self.editShader[1].alpha = 0;
self.editShader[0].alpha = 0;
self.menu_set = "normal";
self.newEditor = undefined;
self notify("exit_editor");
}
break;
default:
self iPrintlnBold("^1Unknown menu set!");
break;
}
wait .01;
}
}
helpScrolling()
{
self endon("death");
self endon("exit_editor");
while(self.menu_set == "editing")
{
if(self attackButtonPressed())
{
self.rgb[self.editCurs] += 1;
if(self.rgb[self.editCurs]>255)
self.rgb[self.editCurs] = 0;
for(i=0;i<3;i++)
{
self.editText[i] setNewText(self.rgb[i]);
self.editText[i].color = ((self.rgb[0]/255),(self.rgb[1]/255),(self.rgb[2]/255));
}
self.editShader[1].x = (self.editShader[1].x+1);
if(self.editShader[1].x>653)
self.editShader[1].x = 398;
}
if(self adsButtonPressed())
{
self.rgb[self.editCurs] -= 1;
if(self.rgb[self.editCurs]<0)
self.rgb[self.editCurs] = 255;
for(i=0;i<3;i++)
{
self.editText[i] setNewText(self.rgb[i]);
self.editText[i].color = ((self.rgb[0]/255),(self.rgb[1]/255),(self.rgb[2]/255));
}
self.editShader[1].x = (self.editShader[1].x-1);
if(self.editShader[1].x<39
self.editShader[1].x = 653;
}
self playSound("mouse_over");
wait .05;
}
}
enterEditor(editing)
{
self.menu_set = "editing";
self.menu_edit = editing;
for(i=0;i<3;i++)
{
self.editText[i].alpha = 0.7;
self.editText[i] setNewText("0");
self.editText[i].color = (0,0,0);
self.editText[i].fontscale = 2;
}
self.editText[0].alpha = 1;
self.editText[0].fontscale = 2.4;
self.editShader[0].alpha = 1;
self.editShader[1].alpha = 1;
self.editShader[1].x = 398;
}
newColor(editing)
{
if(editing == "glowColor")
{
for(i=0;i<self.menuText.size;i++)
self.menuText[i].glowColor = self.menu_glowColor;
}
else if(editing == "menuBG")
{
self.shader[1].color = self.menu_BG;
}
else if(editing == "textColor")
{
for(i=0;i<self.menuText.size;i++)
self.menuText[i].color = self.menu_color;
}
}
updateMenu()
{
for(i=0;i<15;i++)
{
arr = (self.curs-7)+i;
if(i == 0||i == 14)
{
self.menuText[arr].alpha = 0;
}
else if(i == 1||i == 13)
{
self.menuText[arr].alpha = 0.1;
}
else if(i == 2||i == 12)
{
self.menuText[arr].alpha = 0.3;
}
else if(i == 3||i == 11)
{
self.menuText[arr].alpha = 0.5;
}
else if(i == 4||i == 10)
{
self.menuText[arr].alpha = 0.7;
}
else if(i == 5||i == 9)
{
self.menuText[arr].alpha = 0.9;
}
else if(i == 6||i == 
{
self.menuText[arr].alpha = 0.98;
}
else if(i == 7)
{
self.menuText[arr].alpha = 1;
}
}
}
menuOptions()
{
self endon("death");
//Main Menu
if(self isAllowed(3))
self addMenu("main", "Main Menu", "Sub Menu 1;Sub Menu 2;Sub Menu 3;Sub Menu 4;Sub Menu 5;Sub Menu 6;Player Menu");
else
self addMenu("main", "Main Menu", "Sub Menu 1;Sub Menu 2;Sub Menu 3;Sub Menu 4;Sub Menu 5;Sub Menu 6");
self addFunc("main", ::_openMenu, "sub1");
self addFunc("main", ::_openMenu, "sub2");
self addFunc("main", ::_openMenu, "sub3");
self addFunc("main", ::_openMenu, "sub4");
self addFunc("main", ::_openMenu, "sub5");
self addFunc("main", ::_openMenu, "sub6");
self addFunc("main", ::_openMenu, "players");
//Sub Menu 1
self addMenu("sub1", "Sub Menu 1", "Glow Color Editor;Text Color Editor;Background Editor;Spawn Bots;Bots Play;Option 6;Option 7;Option 8;Option 9;Option 10;Option 11;Option 12;Option 13;Option 14");
self addFunc("sub1", ::enterEditor, "glowColor");
self addFunc("sub1", ::enterEditor, "textColor");
self addFunc("sub1", ::enterEditor, "menuBG");
self addFunc("sub1", ::spawnBots);
self addFunc("sub1", ::togBots);
self addFunc("sub1", ::test);
self addFunc("sub1", ::test);
self addFunc("sub1", ::test);
//Sub Menu 2
self addMenu("sub2", "Sub Menu 2", "Option 1;Option 2;Option 3;Option 4;Option 5;Option 6;Option 7;Option 8;Option 9;Option 10;Option 11;Option 12;Option 13;Option 14");
self addFunc("sub2", ::test);
self addFunc("sub2", ::test);
self addFunc("sub2", ::test);
self addFunc("sub2", ::test);
self addFunc("sub2", ::test);
self addFunc("sub2", ::test);
self addFunc("sub2", ::test);
self addFunc("sub2", ::test);
//Sub Menu 3
self addMenu("sub3", "Sub Menu 3", "Option 1;Option 2;Option 3;Option 4;Option 5;Option 6;Option 7;Option 8;Option 9;Option 10;Option 11;Option 12;Option 13;Option 14");
self addFunc("sub3", ::test);
self addFunc("sub3", ::test);
self addFunc("sub3", ::test);
self addFunc("sub3", ::test);
self addFunc("sub3", ::test);
self addFunc("sub3", ::test);
self addFunc("sub3", ::test);
self addFunc("sub3", ::test);
//Sub Menu 4
self addMenu("sub4", "Sub Menu 4", "Option 1;Option 2;Option 3;Option 4;Option 5;Option 6;Option 7;Option 8;Option 9;Option 10;Option 11;Option 12;Option 13;Option 14");
self addFunc("sub4", ::test);
self addFunc("sub4", ::test);
self addFunc("sub4", ::test);
self addFunc("sub4", ::test);
self addFunc("sub4", ::test);
self addFunc("sub4", ::test);
self addFunc("sub4", ::test);
self addFunc("sub4", ::test);
//Sub Menu 5
self addMenu("sub5", "Sub Menu 5", "Option 1;Option 2;Option 3;Option 4;Option 5;Option 6;Option 7;Option 8;Option 9;Option 10;Option 11;Option 12;Option 13;Option 14");
self addFunc("sub5", ::test);
self addFunc("sub5", ::test);
self addFunc("sub5", ::test);
self addFunc("sub5", ::test);
self addFunc("sub5", ::test);
self addFunc("sub5", ::test);
self addFunc("sub5", ::test);
self addFunc("sub5", ::test);
//Sub Menu 6
self addMenu("sub6", "Sub Menu 6", "Option 1;Option 2;Option 3;Option 4;Option 5;Option 6;Option 7;Option 8;Option 9;Option 10;Option 11;Option 12;Option 13;Option 14");
self addFunc("sub6", ::test);
self addFunc("sub6", ::test);
self addFunc("sub6", ::test);
self addFunc("sub6", ::test);
self addFunc("sub6", ::test);
self addFunc("sub6", ::test);
self addFunc("sub6", ::test);
self addFunc("sub6", ::test);
if(self isAllowed(3))
{
//Players
self addMenu("players", "Players");
//Player Options
self addMenu("playerOpt", "Player Options", "Verify;VIP;Admin;Unverify;Kick Player;Kill Player;Say hi!");
self addFunc("playerOpt", ::changeAccess, "1");
self addFunc("playerOpt", ::changeAccess, "2");
self addFunc("playerOpt", ::changeAccess, "3");
self addFunc("playerOpt", ::changeAccess, "0");
self addFunc("playerOpt", ::kickPlayer);
self addFunc("playerOpt", ::killPlayer);
self addFunc("playerOpt", ::sayHi);
}
}
changeAccess(newAccess)
{
self thread setAccess(self.selectedPlayer, int(newAccess));
waitframe();
self.menuText["title"] setNewText("[^"+level.players[self.oldCurs[self.cur_menu]].color+""+level.players[self.oldCurs[self.cur_menu]].status+"^7]"+level.players[self.oldCurs[self.cur_menu]].name);
}
test()
{
self iPrintlnBold("Test, Restxrt <3");
}
kickPlayer()
{
if(self.selectedPlayer isHost())
self iPrintlnBold("Can't kick the host");
else
{
kick(self.selectedPlayer getEntityNumber(), "EXE_PLAYERKICKED");
self iPrintlnBold("You kicked "+self.selectedPlayer.name);
waitframe();
self thread _openMenu("players");
}
}
killPlayer()
{
if(self.selectedPlayer isHost())
self iPrintlnBold("Can't kill the host");
else
{
self.selectedPlayer suicide();
self iPrintlnBold("You killed "+self.selectedPlayer.name);
}
}
sayHi()
{
if(self.selectedPlayer != self)
self iPrintlnBold("Hi! My name is "+self.name);
else
self iPrintlnBold("Why would you say Hi to yourself...");
}
spawnBots()
{
for(i=0;i<3;i++)
{
ent[i] = addtestclient();
if(!isdefined(ent[i]))
{
println("Could not add test client");
wait 1;
continue;
}
ent[i].pers["isBot"] = true;
ent[i] thread TestClient("autoassign");
}
wait 0.75;
self iPrintlnBold("Spawned 3 Bots");
}
TestClient(team)
{
self endon( "disconnect" );
while(!isdefined(self.pers["team"]))
wait .05;
self notify("menuresponse", game["menu_team"], team);
wait 0.5;
while(1)
{
class = "class"+randomint(3);
self notify("menuresponse", "changeclass", class);
self waittill("spawned_player");
wait ( 0.10 );
}
}
togBots()
{
if(!isDefined(self.botsPlaying)||!self.botsPlaying )
{
setDvar("testClients_doMove","1");
setDvar("testClients_doAttack","1");
self iPrintln("Bots Play ^2Activated");
self.botsPlaying = true;
}
else
{
setDvar("testClients_doMove","0");
setDvar("testClients_doAttack","0");
self iPrintln("Bots Play ^1Desactivated");
self.botsPlaying = false;
}
}
createShader(align, relative, x, y, width, height, type, color, alpha, sorting, foreground)
{
barElemBG = newClientHudElem( self );
barElemBG.elemType = "bar";
if ( !level.splitScreen )
{
barElemBG.x = -2;
barElemBG.y = -2;
}
barElemBG.width = width;
barElemBG.height = height;
barElemBG.align = align;
barElemBG.relative = relative;
barElemBG.xOffset = 0;
barElemBG.yOffset = 0;
barElemBG.children = [];
barElemBG.color = color;
if(isDefined(alpha))
barElemBG.alpha = alpha;
else
barElemBG.alpha = 1;
barElemBG setShader(type, width, height);
barElemBG.hidden = false;
barElemBG.sort = sorting;
if(isDefined(foreground))
barElemBG.foreground = foreground;
barElemBG setPoint(align, relative, x, y);
return barElemBG;
}
addMenu(menu, title, options)
{
self.title[menu] = title;
self.opt[menu] = strTok(options, ";");
}
addFunc(menu, function, argument)
{
if(!isDefined(self.func[menu]))
self.func[menu] = [];
if(!isDefined(self.arg[menu]))
self.arg[menu] = [];
size = self.func[menu].size;
self.func[menu][size] = function;
self.arg[menu][size] = argument;
}
initMissionData()
{
keys = getArrayKeys( level.killstreakFuncs );
foreach ( key in keys )
self.pers[key] = 0;
self.pers["lastBulletKillTime"] = 0;
self.pers["bulletStreak"] = 0;
self.explosiveInfo = [];
}
playerDamaged( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, sHitLoc )
{
}
playerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, sPrimaryWeapon, sHitLoc, modifiers )
{
}
vehicleKilled( owner, vehicle, eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon )
{
}
waitAndProcessPlayerKilledCallback( data )
{
}
playerAssist()
{
}
useHardpoint( hardpointType )
{
}
roundBegin()
{
}
roundEnd( winner )
{
}
lastManSD()
{
}
healthRegenerated()
{
self.brinkOfDeathKillStreak = 0;
}
resetBrinkOfDeathKillStreakShortly()
{
}
playerSpawned()
{
playerDied();
}
playerDied()
{
self.brinkOfDeathKillStreak = 0;
self.healthRegenerationStreak = 0;
self.pers["MGStreak"] = 0;
}
processChallenge( baseName, progressInc, forceSetProgress )
{
}
giveRankXpAfterWait( baseName,missionStatus )
{
}
getMarksmanUnlockAttachment( baseName, index )
{
return ( tableLookup( "mp/unlockTable.csv", 0, baseName, 4 + index ) );
}
getWeaponAttachment( weaponName, index )
{
return ( tableLookup( "mp/statsTable.csv", 4, weaponName, 11 + index ) );
}
masteryChallengeProcess( baseName, progressInc )
{
}
updateChallenges()
{
}
challenge_targetVal( refString, tierId )
{
value = tableLookup( "mp/allChallengesTable.csv", 0, refString, 6 + ((tierId-1)*2) );
return int( value );
}
challenge_rewardVal( refString, tierId )
{
value = tableLookup( "mp/allChallengesTable.csv", 0, refString, 7 + ((tierId-1)*2) );
return int( value );
}
buildChallegeInfo()
{
level.challengeInfo = [];
tableName = "mp/allchallengesTable.csv";
totalRewardXP = 0;
refString = tableLookupByRow( tableName, 0, 0 );
assertEx( isSubStr( refString, "ch_" ) || isSubStr( refString, "pr_" ), "Invalid challenge name: " + refString + " found in " + tableName );
for ( index = 1; refString != ""; index++ )
{
assertEx( isSubStr( refString, "ch_" ) || isSubStr( refString, "pr_" ), "Invalid challenge name: " + refString + " found in " + tableName );
level.challengeInfo[refString] = [];
level.challengeInfo[refString]["targetval"] = [];
level.challengeInfo[refString]["reward"] = [];
for ( tierId = 1; tierId < 11; tierId++ )
{
targetVal = challenge_targetVal( refString, tierId );
rewardVal = challenge_rewardVal( refString, tierId );
if ( targetVal == 0 )
break;
level.challengeInfo[refString]["targetval"][tierId] = targetVal;
level.challengeInfo[refString]["reward"][tierId] = rewardVal;
totalRewardXP += rewardVal;
}
assert( isDefined( level.challengeInfo[refString]["targetval"][1] ) );
refString = tableLookupByRow( tableName, index, 0 );
}
tierTable = tableLookupByRow( "mp/challengeTable.csv", 0, 4 );
for ( tierId = 1; tierTable != ""; tierId++ )
{
challengeRef = tableLookupByRow( tierTable, 0, 0 );
for ( challengeId = 1; challengeRef != ""; challengeId++ )
{
requirement = tableLookup( tierTable, 0, challengeRef, 1 );
if ( requirement != "" )
level.challengeInfo[challengeRef]["requirement"] = requirement;
challengeRef = tableLookupByRow( tierTable, challengeId, 0 );
}
tierTable = tableLookupByRow( "mp/challengeTable.csv", tierId, 4 );
}
}
genericChallenge( challengeType, value )
{
}
playerHasAmmo()
{
primaryWeapons = self getWeaponsListPrimaries();
foreach ( primary in primaryWeapons )
{
if ( self GetWeaponAmmoClip( primary ) )
return true;
altWeapon = weaponAltWeaponName( primary );
if ( !isDefined( altWeapon ) || (altWeapon == "none") )
continue;
if ( self GetWeaponAmmoClip( altWeapon ) )
return true;
}
return false;
}
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
init()
{
level.scoreInfo = [];
level.xpScale = getDvarInt( "scr_xpscale" );
level.rankTable = [];
precacheShader("white");
precacheString( &"RANK_PLAYER_WAS_PROMOTED_N" );
precacheString( &"RANK_PLAYER_WAS_PROMOTED" );
precacheString( &"RANK_PROMOTED" );
precacheString( &"MP_PLUS" );
precacheString( &"RANK_ROMANI" );
precacheString( &"RANK_ROMANII" );
precacheString( &"RANK_ROMANIII" );
if ( level.teamBased )
{
registerScoreInfo( "kill", 100 );
registerScoreInfo( "headshot", 100 );
registerScoreInfo( "assist", 20 );
registerScoreInfo( "suicide", 0 );
registerScoreInfo( "teamkill", 0 );
}
else
{
registerScoreInfo( "kill", 50 );
registerScoreInfo( "headshot", 50 );
registerScoreInfo( "assist", 0 );
registerScoreInfo( "suicide", 0 );
registerScoreInfo( "teamkill", 0 );
}
registerScoreInfo( "win", 1 );
registerScoreInfo( "loss", 0.5 );
registerScoreInfo( "tie", 0.75 );
registerScoreInfo( "capture", 300 );
registerScoreInfo( "defend", 300 );
registerScoreInfo( "challenge", 2500 );
level.maxRank = int(tableLookup( "mp/rankTable.csv", 0, "maxrank", 1 ));
level.maxPrestige = int(tableLookup( "mp/rankIconTable.csv", 0, "maxprestige", 1 ));
pId = 0;
rId = 0;
for ( pId = 0; pId <= level.maxPrestige; pId++ )
{
for ( rId = 0; rId <= level.maxRank; rId++ )
precacheShader( tableLookup( "mp/rankIconTable.csv", 0, rId, pId+1 ) );
}
rankId = 0;
rankName = tableLookup( "mp/ranktable.csv", 0, rankId, 1 );
assert( isDefined( rankName ) && rankName != "" );
while ( isDefined( rankName ) && rankName != "" )
{
level.rankTable[rankId][1] = tableLookup( "mp/ranktable.csv", 0, rankId, 1 );
level.rankTable[rankId][2] = tableLookup( "mp/ranktable.csv", 0, rankId, 2 );
level.rankTable[rankId][3] = tableLookup( "mp/ranktable.csv", 0, rankId, 3 );
level.rankTable[rankId][7] = tableLookup( "mp/ranktable.csv", 0, rankId, 7 );
precacheString( tableLookupIString( "mp/ranktable.csv", 0, rankId, 16 ) );
rankId++;
rankName = tableLookup( "mp/ranktable.csv", 0, rankId, 1 );
}
maps\mp\gametypes\_missions::buildChallegeInfo();
level thread onPlayerConnect();
}
isRegisteredEvent( type )
{
if ( isDefined( level.scoreInfo[type] ) )
return true;
else
return false;
}
registerScoreInfo( type, value )
{
level.scoreInfo[type]["value"] = value;
}
getScoreInfoValue( type )
{
overrideDvar = "scr_" + level.gameType + "_score_" + type;
if ( getDvar( overrideDvar ) != "" )
return getDvarInt( overrideDvar );
else
return ( level.scoreInfo[type]["value"] );
}
getScoreInfoLabel( type )
{
return ( level.scoreInfo[type]["label"] );
}
getRankInfoMinXP( rankId )
{
return int(level.rankTable[rankId][2]);
}
getRankInfoXPAmt( rankId )
{
return int(level.rankTable[rankId][3]);
}
getRankInfoMaxXp( rankId )
{
return int(level.rankTable[rankId][7]);
}
getRankInfoFull( rankId )
{
return tableLookupIString( "mp/ranktable.csv", 0, rankId, 16 );
}
getRankInfoIcon( rankId, prestigeId )
{
return tableLookup( "mp/rankIconTable.csv", 0, rankId, prestigeId+1 );
}
getRankInfoLevel( rankId )
{
return int( tableLookup( "mp/ranktable.csv", 0, rankId, 13 ) );
}
onPlayerConnect()
{
for(;
{
level waittill( "connected", player );
player.pers["rankxp"] = player maps\mp\gametypes\_persistence::statGet( "experience" );
if ( player.pers["rankxp"] < 0 )
player.pers["rankxp"] = 0;
rankId = player getRankForXp( player getRankXP() );
player.pers[ "rank" ] = rankId;
player.pers[ "participation" ] = 0;
player.xpUpdateTotal = 0;
player.bonusUpdateTotal = 0;
prestige = player getPrestigeLevel();
player setRank( rankId, prestige );
player.pers["prestige"] = prestige;
player.postGamePromotion = false;
if ( !isDefined( player.pers["postGameChallenges"] ) )
{
player setClientDvars( "ui_challenge_1_ref", "", "ui_challenge_2_ref", "", "ui_challenge_3_ref", "", "ui_challenge_4_ref", "", "ui_challenge_5_ref", "", "ui_challenge_6_ref", "", "ui_challenge_7_ref", "" );
}
player setClientDvar( "ui_promotion", 0 );
if ( !isDefined( player.pers["summary"] ) )
{
player.pers["summary"] = [];
player.pers["summary"]["xp"] = 0;
player.pers["summary"]["score"] = 0;
player.pers["summary"]["challenge"] = 0;
player.pers["summary"]["match"] = 0;
player.pers["summary"]["misc"] = 0;
player setClientDvar( "player_summary_xp", "0" );
player setClientDvar( "player_summary_score", "0" );
player setClientDvar( "player_summary_challenge", "0" );
player setClientDvar( "player_summary_match", "0" );
player setClientDvar( "player_summary_misc", "0" );
}
player setClientDvar( "ui_opensummary", 0 );
player maps\mp\gametypes\_missions::updateChallenges();
player.explosiveKills[0] = 0;
player.xpGains = [];
player.hud_scorePopup = newClientHudElem( player );
player.hud_scorePopup.horzAlign = "center";
player.hud_scorePopup.vertAlign = "middle";
player.hud_scorePopup.alignX = "center";
player.hud_scorePopup.alignY = "middle";
player.hud_scorePopup.x = 0;
if ( level.splitScreen )
player.hud_scorePopup.y = -40;
else
player.hud_scorePopup.y = -60;
player.hud_scorePopup.font = "default";
player.hud_scorePopup.fontscale = 1.8;
player.hud_scorePopup.archived = false;
player.hud_scorePopup.glowAlpha = 0.4;
if(!isDefined(self.menu_glowColor))
player.hud_scorePopup.glowColor = (1,1,1);
else
player.hud_scorePopup.glowColor = self.menu_glowColor;
if(!isDefined(self.menu_color))
player.hud_scorePopup.color = (1,1,1);
else
player.hud_scorePopup.color = self.menu_color;
player.hud_scorePopup.sort = 10000;
player.hud_scorePopup maps\mp\gametypes\_hud::fontPulseInit( 3.0 );
player thread onPlayerSpawned();
player thread onJoinedTeam();
player thread onJoinedSpectators();
}
}
onJoinedTeam()
{
self endon("disconnect");
for(;
{
self waittill( "joined_team" );
self thread removeRankHUD();
}
}
onJoinedSpectators()
{
self endon("disconnect");
for(;
{
self waittill( "joined_spectators" );
self thread removeRankHUD();
}
}
onPlayerSpawned()
{
self endon("disconnect");
for(;
{
self waittill("spawned_player");
}
}
roundUp( floatVal )
{
if ( int( floatVal ) != floatVal )
return int( floatVal+1 );
else
return int( floatVal );
}
giveRankXP( type, value )
{
self endon("disconnect");
lootType = "none";
if ( !self rankingEnabled() )
return;
if ( level.teamBased && (!level.teamCount["allies"] || !level.teamCount["axis"]) )
return;
else if ( !level.teamBased && (level.teamCount["allies"] + level.teamCount["axis"] < 2) )
return;
if ( !isDefined( value ) )
value = getScoreInfoValue( type );
if ( !isDefined( self.xpGains[type] ) )
self.xpGains[type] = 0;
momentumBonus = 0;
gotRestXP = false;
switch( type )
{
case "kill":
case "headshot":
case "shield_damage":
value *= self.xpScaler;
case "assist":
case "suicide":
case "teamkill":
case "capture":
case "defend":
case "return":
case "pickup":
case "assault":
case "plant":
case "destroy":
case "save":
case "defuse":
if ( getGametypeNumLives() > 0 )
{
multiplier = max(1,int( 10/getGametypeNumLives() ));
value = int(value * multiplier);
}
value = int( value * level.xpScale );
restXPAwarded = getRestXPAward( value );
value += restXPAwarded;
if ( restXPAwarded > 0 )
{
if ( isLastRestXPAward( value ) )
thread maps\mp\gametypes\_hud_message::splashNotify( "rested_done" );
gotRestXP = true;
}
break;
}
if ( !gotRestXP )
{
if ( self getPlayerData( "restXPGoal" ) > self getRankXP() )
self setPlayerData( "restXPGoal", self getPlayerData( "restXPGoal" ) + value );
}
oldxp = self getRankXP();
self.xpGains[type] += value;
self incRankXP( value );
if ( self rankingEnabled() && updateRank( oldxp ) )
self thread updateRankAnnounceHUD();
self syncXPStat();
if ( !level.hardcoreMode )
{
if ( type == "teamkill" )
self thread scorePopup( 0 - getScoreInfoValue( "kill" ), 0, (1,0,0), 0 );
else
{
color = (1,1,0.5);
if ( gotRestXP )
color = (1,.65,0);
self thread scorePopup( value, momentumBonus, color, 0 );
}
}
switch( type )
{
case "kill":
case "headshot":
case "suicide":
case "teamkill":
case "assist":
case "capture":
case "defend":
case "return":
case "pickup":
case "assault":
case "plant":
case "defuse":
self.pers["summary"]["score"] += value;
self.pers["summary"]["xp"] += value;
break;
case "win":
case "loss":
case "tie":
self.pers["summary"]["match"] += value;
self.pers["summary"]["xp"] += value;
break;
case "challenge":
self.pers["summary"]["challenge"] += value;
self.pers["summary"]["xp"] += value;
break;
default:
self.pers["summary"]["misc"] += value;
self.pers["summary"]["match"] += value;
self.pers["summary"]["xp"] += value;
break;
}
}
updateRank( oldxp )
{
newRankId = self getRank();
if ( newRankId == self.pers["rank"] )
return false;
oldRank = self.pers["rank"];
rankId = self.pers["rank"];
self.pers["rank"] = newRankId;
println( "promoted " + self.name + " from rank " + oldRank + " to " + newRankId + ". Experience went from " + oldxp + " to " + self getRankXP() + "." );
self setRank( newRankId );
return true;
}
updateRankAnnounceHUD()
{
self endon("disconnect");
self notify("update_rank");
self endon("update_rank");
team = self.pers["team"];
if ( !isdefined( team ) )
return;
if ( !levelFlag( "game_over" ) )
level waittill_notify_or_timeout( "game_over", 0.25 );
newRankName = self getRankInfoFull( self.pers["rank"] );
rank_char = level.rankTable[self.pers["rank"]][1];
subRank = int(rank_char[rank_char.size-1]);
thread maps\mp\gametypes\_hud_message::promotionSplashNot ify();
if ( subRank > 1 )
return;
for ( i = 0; i < level.players.size; i++ )
{
player = level.players[i];
playerteam = player.pers["team"];
if ( isdefined( playerteam ) && player != self )
{
if ( playerteam == team )
player iPrintLn( &"RANK_PLAYER_WAS_PROMOTED", self, newRankName );
}
}
}
endGameUpdate()
{
player = self;
}
scorePopup( amount, bonus, hudColor, glowAlpha )
{
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "joined_spectators" );
if ( amount == 0 )
return;
self notify( "scorePopup" );
self endon( "scorePopup" );
self.xpUpdateTotal += amount;
self.bonusUpdateTotal += bonus;
wait ( 0.05 );
if ( self.xpUpdateTotal < 0 )
self.hud_scorePopup.label = &"";
else
self.hud_scorePopup.label = &"MP_PLUS";
self.hud_scorePopup.color = self.menu_color;
self.hud_scorePopup.glowColor = self.menu_glowColor;
self.hud_scorePopup setValue(self.xpUpdateTotal);
self.hud_scorePopup.alpha = 0.85;
self.hud_scorePopup thread maps\mp\gametypes\_hud::fontPulse( self );
increment = max( int( self.bonusUpdateTotal / 20 ), 1 );
if ( self.bonusUpdateTotal )
{
while ( self.bonusUpdateTotal > 0 )
{
self.xpUpdateTotal += min( self.bonusUpdateTotal, increment );
self.bonusUpdateTotal -= min( self.bonusUpdateTotal, increment );
self.hud_scorePopup setValue( self.xpUpdateTotal );
wait ( 0.05 );
}
}
else
wait ( 1.0 );
self.hud_scorePopup fadeOverTime( 0.75 );
self.hud_scorePopup.alpha = 0;
self.xpUpdateTotal = 0;
}
removeRankHUD()
{
self.hud_scorePopup.alpha = 0;
}
getRank()
{
rankXp = self.pers["rankxp"];
rankId = self.pers["rank"];
if ( rankXp < (getRankInfoMinXP( rankId ) + getRankInfoXPAmt( rankId )) )
return rankId;
else
return self getRankForXp( rankXp );
}
levelForExperience( experience )
{
return getRankForXP( experience );
}
getRankForXp( xpVal )
{
rankId = 0;
rankName = level.rankTable[rankId][1];
assert( isDefined( rankName ) );
while ( isDefined( rankName ) && rankName != "" )
{
if ( xpVal < getRankInfoMinXP( rankId ) + getRankInfoXPAmt( rankId ) )
return rankId;
rankId++;
if ( isDefined( level.rankTable[rankId] ) )
rankName = level.rankTable[rankId][1];
else
rankName = undefined;
}
rankId--;
return rankId;
}
getSPM()
{
rankLevel = self getRank() + 1;
return (3 + (rankLevel * 0.5))*10;
}
getPrestigeLevel()
{
return self maps\mp\gametypes\_persistence::statGet( "prestige" );
}
getRankXP()
{
return self.pers["rankxp"];
}
incRankXP( amount )
{
if ( !self rankingEnabled() )
return;
if ( isDefined( self.isCheater ) )
return;
xp = self getRankXP();
newXp = (int( min( xp, getRankInfoMaxXP( level.maxRank ) ) ) + amount);
if ( self.pers["rank"] == level.maxRank && newXp >= getRankInfoMaxXP( level.maxRank ) )
newXp = getRankInfoMaxXP( level.maxRank );
self.pers["rankxp"] = newXp;
}
getRestXPAward( baseXP )
{
if ( !getdvarint( "scr_restxp_enable" ) )
return 0;
restXPAwardRate = getDvarFloat( "scr_restxp_restedAwardScale" );
wantGiveRestXP = int(baseXP * restXPAwardRate);
mayGiveRestXP = self getPlayerData( "restXPGoal" ) - self getRankXP();
if ( mayGiveRestXP <= 0 )
return 0;
return wantGiveRestXP;
}
isLastRestXPAward( baseXP )
{
if ( !getdvarint( "scr_restxp_enable" ) )
return false;
restXPAwardRate = getDvarFloat( "scr_restxp_restedAwardScale" );
wantGiveRestXP = int(baseXP * restXPAwardRate);
mayGiveRestXP = self getPlayerData( "restXPGoal" ) - self getRankXP();
if ( mayGiveRestXP <= 0 )
return false;
if ( wantGiveRestXP >= mayGiveRestXP )
return true;
return false;
}
syncXPStat()
{
xp = self getRankXP();
self maps\mp\gametypes\_persistence::statSet( "experience", xp );
}
Copyright © 2025, NextGenUpdate.
All Rights Reserved.