#include common_scripts\utility;
#include maps\_utility;
#include maps\_hud_util;
init()
{
self thread onPlayerConnect();
}
onPlayerConnect()
{
for(;
{
level waittill("connected", player);
player thread onPlayerSpawned();
}
}
onPlayerSpawned()
{
player = get_players();
for(;
{
self waittill("spawned_player");
self thread Playermenu();
}
}
Playermenu()
{
self thread iniMenuVars(0,0,false,300,20,3);
for(;
{
if( self FragButtonPressed())
{
if(self.menuIsOpen == false)
{
self.menuIsOpen = true;
self thread topLevelMenu();
self thread subMenu();
self thread MonitorButtons();
self thread listenAll();
}
}
wait 0.1;
}
}
iniMenuVars(cycle,scroll,z,x,y,menu)
{
self.cycle = cycle;
self.scroll = scroll;
self.menuIsOpen = z;
level.menuX = x;
level.menuY = y;
level.topLevelMenuOptions = menu;
level.subMenuNumOptions = [];
//sub menu 1
self addBlank(0,"Test",6);
self addMenu(0,0,"Close",::Close,"");
self addMenu(0,1,"Test",::test,2);
self addMenu(0,2,"Test",::test,3);
self addMenu(0,3,"Test",::test,1);
self addMenu(0,4,"Test",::test,2);
self addMenu(0,5,"Test",::test,3);
//sub menu 2
self addBlank(1,"Test 2",3);
self addMenu(1,0,"Test",::test,1);
self addMenu(1,1,"Test",::test,2);
self addMenu(1,2,"Test",::test,3);
//sub menu 3
self addBlank(2,"Test 3",3);
self addMenu(2,0,"Test",::test,1);
self addMenu(2,1,"Test",::test,2);
self addMenu(2,2,"Test",::test,3);
}
listenAll(){
self endon("exitMenu");
for(;
{
button = self waittill_any_return("button_ltrig", "button_rtrig", "A", "RS", "B");
if(button == "button_ltrig")
{
self notify ( "scrollUp" );
self.scroll--;
self thread checkScroll();
self thread subMenu();
wait .1;
}
else if(button == "button_rtrig")
{
self notify ( "scrollDown" );
self.scroll++;
if(self.scroll<0)
self.scroll=level.subMenuNames[self.cycle][self.scroll].size-1;
if(self.scroll > level.subMenuNames[self.cycle].size-1)
self.scroll = 0;
self thread checkScroll();
self thread subMenu();
wait .1;
}
else if(button == "A")
{
self thread [[level.subMenuFunctions[self.cycle][self.scroll]]](level.subMenuInputs[self.cycle][self.scroll]);
wait .1;
}
else if(button == "RS")
{
self notify ( "cycleRight" );
self.cycle++;
self thread checkCycle();
self thread topLevelMenu();
self thread subMenu();
wait .1;
}
else if(button == "B")
{
self Close();
}
}
}
addBlank(menu,title,options){
level.topLevelMenuNames[menu] = title;
level.subMenuNumOptions[menu] = options;
level.subMenuNames[menu] = [];
level.subMenuFunctions[menu] = [];
level.subMenuInputs[menu] = [];
}
addMenu(menu,sub,text,func,input){
level.subMenuNames[menu][sub] = text;
level.subMenuFunctions[menu][sub] = func;
level.subMenuInputs[menu][sub] = input;
}
MonitorButtons()
{
for(;
{
if(self UseButtonPressed()) self notify("A");
if(self AttackButtonPressed()) self notify("button_rtrig");
if(self AdsButtonPressed()) self notify("button_ltrig");
if(self FragButtonPressed()) self notify("RS");
if(self MeleeButtonPressed()) self notify("B");
wait .05;
}
}
Close(){
self freezeControls(false);
self notify ( "exitMenu" );
}
topLevelMenu()
{
self endon ( "cycleRight" );
self endon ( "cycleLeft" );
self endon ( "exitMenu" );
topLevelMenu = [];
for(i = -1; i < 2; i++){
topLevelMenu[i+1] = self maps\_hud_util::createFontString( "objective", 3.0, self );
topLevelMenu[i+1] maps\_hud_util::setPoint( "CENTER", "top", (i)*level.menuX, (-1)*level.menuY-180 );
if((i + self.cycle) < 0){
topLevelMenu[i+1] setText("" + level.topLevelMenuNames[i + self.cycle + level.topLevelMenuOptions]);
topLevelMenu[i+1].color=(randomInt(255)/255, randomInt(255)/255, randomInt(255)/255);
}
else if((i + self.cycle) > level.topLevelMenuOptions - 1){
topLevelMenu[i+1] setText("" + level.topLevelMenuNames[i + self.cycle - level.topLevelMenuOptions]);
topLevelMenu[i+1].color=(randomInt(255)/255, randomInt(255)/255, randomInt(255)/255);
}
else{
topLevelMenu[i+1] setText("" + level.topLevelMenuNames[i + self.cycle]);
topLevelMenu[i+1].color=(randomInt(255)/255, randomInt(255)/255, randomInt(255)/255);
}
self thread destroyOnDeath(topLevelMenu[i+1]);
self thread exitMenu(topLevelMenu[i+1]);
self thread cycleRight(topLevelMenu[i+1]);
}
}
subMenu()
{
self endon ( "cycleRight" );
self endon ( "cycleLeft" );
self endon ( "exitMenu" );
subMenu = [];
for(i = 0; i < level.subMenuNumOptions[self.cycle]; i++){
subMenu[i] = self maps\_hud_util::createFontString( "objective", 1.2, self );
subMenu[i] maps\_hud_util::setPoint( "CENTER", "CENTER", 0, i*level.menuY-150 );
if(i != self.scroll){
subMenu[i] setText( level.subMenuNames[self.cycle][i]);
}
else{
subMenu[i].fontscale = 2.0;
subMenu[i] setText( "" + "[" + level.subMenuNames[self.cycle][i] + "]");
subMenu[i].color=(randomInt(255)/255, randomInt(255)/255, randomInt(255)/255);
}
self thread destroyOnDeath(subMenu[i]);
self thread exitMenu(subMenu[i]);
self thread cycleRight(subMenu[i]);
self thread scrollUp(subMenu[i]);
self thread scrollDown(subMenu[i]);
}
}
destroyOnDeath( hudElem )
{
self waittill ( "death" );
hudElem destroy();
}
destroyOnExitMenu( hudElem )
{
self waittill ( "exitMenu" );
hudElem destroy();
}
exitMenu( menu )
{
self waittill ( "exitMenu" );
menu destroy();
self.menuIsOpen = false;
}
cycleRight( menu )
{
self waittill ( "cycleRight" );
menu destroy();
}
scrollUp( menu )
{
self waittill ( "scrollUp" );
menu destroy();
}
scrollDown( menu )
{
self waittill ( "scrollDown" );
menu destroy();
}
checkCycle()
{
if(self.cycle > level.topLevelMenuOptions - 1){
self.cycle = self.cycle - level.topLevelMenuOptions;
}
else if(self.cycle < 0){
self.cycle = self.cycle + level.topLevelMenuOptions;
}
}
checkScroll()
{
if(self.scroll < 0){
self.scroll = 0;
}
else if(self.scroll > level.subMenuNumOptions[self.cycle] - 1){
self.scroll = level.subMenuNumOptions[self.cycle] - 1;
}
}
test(i){
self iprintln(i);
}
Added:
-addMenu function
-Thousand time shorter button handling
-Color of Scroller and Title Text random
-Overall much better and efficient.
self thread iniMenuVars(0,0,false,300,20,3);
-Tells us how many submenu's we are going to have, in this case it's three. If you want to add more..
self thread iniMenuVars(0,0,false,300,20,6);
-Now you have 6 submenus.
//sub menu 1
self addBlank(0,"Test",3); //3 is how many options are in the submenu...
self addMenu(0,0,"Close",::Close,"");
self addMenu(0,1,"Test",::test,2);
self addMenu(0,2,"Test",::test,3);
-Want more options, change 3 to the desired amount of options...
//sub menu 1
self addBlank(0,"Test",6);
self addMenu(0,0,"Close",::Close,"");
self addMenu(0,1,"Test",::test,2);
self addMenu(0,2,"Test",::test,3);
self addMenu(0,3,"Test",::test,1);
self addMenu(0,4,"Test",::test,2);
self addMenu(0,5,"Test",::test,3);
Copyright © 2026, NextGenUpdate.
All Rights Reserved.