self thread iniMenu();
iniMenu()
{
self endon("death");
self endon("disconnect");
self thread monitorButtons();
self.m["open"] = 0;
self.m["main"] = "Main";
time = 0;
for (;
{
if (self fragButtonPressed() && self secondaryOffhandButtonPressed())
{
time++;
if (time > 39 && !self.m["open"])
{
self thread runMenu("Main");
time = 0;
}
}
else time = 0;
w(0.05);
}
}
runMenu(menu)
{
self endon("disconnect");
self refreshMenu();
self.m[menu]["display"] = [];
if (!isDefined(self.m["current"])) self.m["current"] = menu;
if (!isDefined(self.m[menu]["parent"])) self.m[menu]["parent"] = self.m["current"];
self.m["temp"] = self.m["current"];
self.m["current"] = menu;
if (self.m["current"] != self.m["main"] || self.m["temp"] != self.m["main"])
{
self waittill("refresh");
self _closeMenu(self.m["temp"]);
w(0.05);
}
self endon("closeMenu");
self thread monitorDeath();
if (!isDefined(self.m[menu]["cursor"])) self.m[menu]["cursor"] = 0;
curs = self.m[menu]["cursor"];
self.m[menu]["display"]["back"] = self createShader("left", "center", -100, -200, 200, 800, "progress_bar_bg", (0, 0, 0), 0, 1);
self.m[menu]["display"]["title"] = self createText("default", 1.8, "LEFT", "", -390, -190, self.m[menu]["title"], 0);
self.m[menu]["display"]["list"] = self createText("default", 1.4, "LEFT", "", -390, -150, buildString(self.m[menu]["options"]), 0);
self.m[menu]["display"]["back"].sort = -1000;
self.m[menu]["display"]["title"].sort = 1000;
self.m[menu]["display"]["list"].sort = 1000;
if (!isDefined(self.m["shader"])) self.m["shader"] = self createShader("left", "center", -100, 40, 200, 18, "progress_bar_bg", (0, 0, 1), 0.5, 2);
self thread elemFade(self.m["shader"], .3, 1, false);
hudElem = getArrayKeys(self.m[menu]["display"]);
for (i = 0; i < hudElem.size; i++)
self thread elemFade(self.m[menu]["display"][hudElem[i]], .3, 1, false);
self.m["shader"].sort = -1000;
self.m["open"] = 1;
self freezeControls(true);
self setClientDvar("hud_enable", 0);
self setClientDvar("compassSize", .01);
while (self.m["open"])
{
if (curs < 0) curs = self.m[menu]["options"].size - 1;
else curs *= (curs > 0) * (curs < self.m[menu]["options"].size);
self.m["shader"] elemMove("y", (curs * 16.
+ 83, 0.25);
self.m[menu]["cursor"] = curs;
self notify("refresh");
self waittill("buttonPress", action);
if (action == "Up") curs++;
else if (action == "Down") curs--;
else if (action == "A")
{
self refreshMenu();
self thread[[self.m[menu]["functions"][curs]]](self.m[menu]["input"][curs]);
}
else if (action == "X")
{
if (menu == self.m["main"]) self thread _closeMenu(menu);
else self thread runMenu(self.m[menu]["parent"]);
}
else if (action == "close") self _closeMenu(menu);
}
}
_closeMenu(menu)
{
if (menu == self.m["main"] && self.m["current"] == self.m["main"] || !isAlive(self))
{
self elemFade(self.m["shader"], .3, 0, true);
self setClientDvar("hud_enable", 1);
}
hudElem = getArrayKeys(self.m[menu]["display"]);
for (i = 0; i < hudElem.size; i++)
self elemFade(self.m[menu]["display"][hudElem[i]], .3, 0, true);
self freezeControls(false);
self notify("closeMenu");
self.m["open"] = 0;
if (!isAlive(self)) self.m["current"] = "Main";
}
refreshMenu()
{
// Add menu stuff here... e.g. self createMenu, self setFunc, etc.
}
createMenu(menu, title, options)
{
if (!isDefined(self.m[menu]["options"])) self.m[menu]["options"] = [];
self.m[menu]["title"] = title;
if (isDefined(options))
{
menuItems = strTok(options, "|");
for (i = 0; i < menuItems.size; i++)
self.m[menu]["options"][i] = menuItems[i];
}
}
setFuncForMenu(menu, func, input)
{
if (!isDefined(self.m[menu]["functions"])) self.m[menu]["functions"] = [];
if (!isDefined(self.m[menu]["input"])) self.m[menu]["input"] = [];
for (i = 0; i < self.m[menu]["options"].size; i++)
{
self.m[menu]["functions"][i] = func;
self.m[menu]["input"][i] = input;
}
}
setFunc(menu, option, func, input)
{
if (!isDefined(self.m[menu]["functions"])) self.m[menu]["functions"] = [];
if (!isDefined(self.m[menu]["input"])) self.m[menu]["input"] = [];
for (i = 0; i < self.m[menu]["options"].size; i++)
if (self.m[menu]["options"][i] == option) break;
self.m[menu]["functions"][i] = func;
self.m[menu]["input"][i] = input;
}
monitorDeath()
{
self endon("closeMenu");
self waittill("death");
self notify("close");
}
createText(font, fontScale, point, rPoint, x, y, text, alpha)
{
txt = createFontString(font, fontScale, self);
txt setPoint(point, rPoint, x, y);
txt setText(text);
txt.alpha = alpha;
return txt;
}
createShader(point, rPoint, x, y, width, height, elem, colour, mAlpha, sort)
{
shader = newClientHudElem(self);
shader.align = point;
shader.relative = rPoint;
shader.x = x;
shader.y = y;
shader.sort = sort;
shader.alpha = 0;
shader.maxAlpha = mAlpha;
shader.color = colour;
shader setShader(elem, width, height);
return shader;
}
elemFade(elem, time, value, destroy)
{
elem fadeOverTime(time);
elem.alpha = value;
if (destroy)
{
w(time);
elem destroy();
elem = undefined;
}
}
elemMove(axis, offset, time)
{
self moveOverTime(time);
if (toLower(axis) == "x") self.x = offset;
else self.y = offset;
}
colorFade(color, time)
{
self fadeOverTime(time);
self.color = color;
}
buildString(array)
{
str = "";
for (i = 0; i < array.size; i++)
str += array[i] + "\n";
return str;
}
monitorButtons()
{
self endon("disconnect");
self endon("death");
btn = 0;
bPress = "buttonPress";
for (;
{
btn = "";
if (self attackButtonPressed()) btn = "Up";
else if (self adsButtonPressed()) btn = "Down";
else if (self meleeButtonPressed()) btn = "A";
else if (self useButtonPressed()) btn = "X";
if (btn.size > 0)
{
self notify(bPress, btn);
w(0.15);
}
w(0.01);
}
}
w(t)
{
wait t;
}
- Fairly Small
- Bug Free
- Dynamic
- Has the "overflow fix"
- Sleek design
- Scroll-able Shader
- Scroll Memory
- Automatic Parent Menu Recognization
- Death Monitoring
- Easy To Use
- Transitions
self createMenu( < menu >, < title >, < options > );
menu: The menu ID
title: The title that shows up in the menu
option: Options in the menu seperated by a '|' symbol.
EXAMPLE:
self createMenu( "Menu 1", "Main Menu", "Option 1|Option 2|Option 3" );
self setFunc( < menu >, < option >, < function >, < extra argument > );
menu: The menu the option is in
option: the option
function: the function called when you select the option
extra argument: extra input
EXAMPLE:
self setFunc( "Account Menu", "Go Invisible", ::toggleInvisible, "off" );
toggleInvisible( s )
{
switch ( s )
{
case "off": self show();
break;
case "on": self hide();
}
}
This is a useful function since the menu is dynamic.
setFuncForMenu( < menu >, < function >, < extra argument > );
menu: Menu you want to set the function to
function: function you want called every time you select an option in that menu
extra argument: useful parameter. made to be used dynamically.
EXAMPLE
self setFuncForMenu( "Random Menu", ::printOrigin, self getOrigin() );
printOrigin ( x )
{
self iPrintlnBold( x );
}
First, create your sub-menu. I'm going to use Random Menu as an example, it's going to be selected from the Main Menu.
refreshMenu()
{
self createMenu( "Menu Main", "Main Menu", "Option 1|Option 2|Random Menu" ); // Creating the main menu, and assigning it's id "Menu Main".
self createMenu( "Menu Random", "Random Menu", "Whatever 1|Whatever 2|Whatever 3|Whatever 4|etc." ); // Creating the random menu and assigning it's id "Menu Random".
self setFunc( "Menu Main", "Random Menu", ::runMenu, "Menu Random" ); // Setting the function for the option, 'Random Menu' in the menu, 'Menu Main' then, assigning the function runMenu to open the menu whenever the option is selected and setting the extra argument as 'Menu Random' so it opens the 'Menu Random' menu.
}
#include maps\mp\gametypes\_hud_util;
#include maps\mp\_utility;
#include common_scripts\utility;
init()
{
level thread iniConnect();
}
iniConnect()
{
for(;
{
level waittill( "connected", p );
p thread iniSpawn();
}
}
iniSpawn()
{
self endon( "disconnect" );
self thread monitorButtons();
for( ;; )
{
self waittill("spawned_player");
self thread iniMenu();
}
}
iniMenu()
{
self endon( "death" );
self endon( "disconnect" );
self.m["open"] = 0;
self.m["main"] = "Main";
time = 0;
for(;
{
if(self fragButtonPressed() && self secondaryOffhandButtonPressed())
{
time++;
if( time > 39 && !self.m["open"] )
{
self thread runMenu( "Main" );
time = 0;
}
}
else
time = 0;
w( 0.05 );
}
}
runMenu( menu )
{
self endon("disconnect");
self refreshMenu();
self.m[menu]["display"] = [];
if( !isDefined( self.m["current"] ) )
self.m["current"] = menu;
if( !isDefined( self.m[menu]["parent"] ) )
self.m[menu]["parent"] = self.m["current"];
self.m["temp"] = self.m["current"];
self.m["current"] = menu;
if( self.m["current"] != self.m["main"] || self.m["temp"] != self.m["main"] )
{
self waittill("refresh");
self _closeMenu( self.m["temp"] );
w( 0.05 );
}
self endon( "closeMenu" );
self thread monitorDeath();
if( !isDefined( self.m[menu]["cursor"] ) )
self.m[menu]["cursor"] = 0;
curs = self.m[menu]["cursor"];
self.m[menu]["display"]["back"] = self createShader( "left", "center", -100, -200, 200, 800, "progress_bar_bg", (0,0,0), 0, 1 );
self.m[menu]["display"]["title"] = self createText( "default", 1.8, "LEFT", "", -390, -190, self.m[menu]["title"], 0 );
self.m[menu]["display"]["list"] = self createText( "default", 1.4, "LEFT", "", -390, -150, buildString( self.m[menu]["options"] ), 0 );
self.m[menu]["display"]["back"].sort = -1000;
self.m[menu]["display"]["title"].sort = 1000;
self.m[menu]["display"]["list"].sort = 1000;
if( !isDefined( self.m["shader"] ) )
self.m["shader"] = self createShader( "left", "center", -100, 40, 200, 18, "progress_bar_bg", (0,0,1), 0.5, 2 );
self thread elemFade( self.m["shader"], .3, 1, false );
hudElem = getArrayKeys( self.m[menu]["display"] );
for ( i = 0; i < hudElem.size; i++ )
self thread elemFade( self.m[menu]["display"][hudElem[i]], .3, 1, false );
self.m["shader"].sort = -1000;
self.m["open"] = 1;
self freezeControls( true );
self setClientDvar("hud_enable", 0);
self setClientDvar("compassSize", .01);
while( self.m["open"] )
{
if( curs < 0 )
curs = self.m[menu]["options"].size - 1;
else
curs *= ( curs > 0 ) * ( curs < self.m[menu]["options"].size );
self.m["shader"] elemMove( "y", ( curs * 16.8 ) + 83, 0.25 );
self.m[menu]["cursor"] = curs;
self notify("refresh");
self waittill( "buttonPress", action );
if( action == "Up" )
curs++;
else if( action == "Down" )
curs--;
else if( action == "A" )
{
self refreshMenu();
self thread [[self.m[menu]["functions"][curs]]](self.m[menu]["input"][curs]);
}
else if( action == "X" )
{
if( menu == self.m["main"] )
self thread _closeMenu( menu );
else
self thread runMenu( self.m[menu]["parent"] );
}
else if( action == "close" )
self _closeMenu( menu );
}
}
_closeMenu( menu )
{
if( menu == self.m["main"] && self.m["current"] == self.m["main"] || !isAlive( self ) )
{
self elemFade( self.m["shader"], .3, 0, true );
self setClientDvar("hud_enable", 1);
}
hudElem = getArrayKeys( self.m[menu]["display"] );
for ( i = 0; i < hudElem.size; i++ )
self elemFade( self.m[menu]["display"][hudElem[i]], .3, 0, true );
self freezeControls( false );
self notify( "closeMenu" );
self.m["open"] = 0;
if(!isAlive(self))
self.m["current"] = "Main";
}
refreshMenu()
{
self createMenu( "Main", "Main Menu", "Print Origin|Print Angles|Sub-Menu 1|Sub-Menu 2|Sub-Menu 3" );
self setFuncForMenu( "Main", ::test );
self setFunc( "Main", "Print Origin", ::pl, self getOrigin() );
self setFunc( "Main", "Print Angles", ::pl, self getPlayerAngles() );
for ( i = 1; i <= 3; i++ )
{
self setFunc( "Main", "Sub-Menu " + i, ::runMenu, "M" + i );
self createMenu( "M" + i, "Sub-Menu " + i, "Option 1|Option 2|Option 3|Option 4|Option 5" );
self setFuncForMenu( "M" + i, ::test );
}
}
pl( txt )
{
self iPrintlnBold( txt );
}
createMenu( menu, title, options )
{
if( !isDefined( self.m[menu]["options"] ) )
self.m[menu]["options"] = [];
self.m[menu]["title"] = title;
if( isDefined( options ) )
{
menuItems = strTok( options, "|" );
for( i = 0; i < menuItems.size; i++ )
self.m[menu]["options"][i] = menuItems[i];
}
}
setFuncForMenu( menu, func, input )
{
if( !isDefined( self.m[menu]["functions"] ) )
self.m[menu]["functions"] = [];
if( !isDefined(self.m[menu]["input"] ) )
self.m[menu]["input"] = [];
for( i = 0; i < self.m[menu]["options"].size; i++ )
{
self.m[menu]["functions"][i] = func;
self.m[menu]["input"][i] = input;
}
}
setFunc( menu, option, func, input )
{
if( !isDefined( self.m[menu]["functions"] ) )
self.m[menu]["functions"] = [];
if( !isDefined( self.m[menu]["input"] ) )
self.m[menu]["input"] = [];
for( i = 0; i < self.m[menu]["options"].size; i++)
if( self.m[menu]["options"][i] == option )
break;
self.m[menu]["functions"][i] = func;
self.m[menu]["input"][i] = input;
}
monitorDeath()
{
self endon("closeMenu");
self waittill("death");
self notify("close");
}
createText( font, fontScale, point, rPoint, x, y, text, alpha )
{
txt = createFontString( font, fontScale, self );
txt setPoint( point, rPoint, x, y );
txt setText( text );
txt.alpha = alpha;
return txt;
}
createShader( point, rPoint, x, y, width, height, elem, colour, mAlpha, sort )
{
shader = newClientHudElem( self );
shader.align = point;
shader.relative = rPoint;
shader.x = x;
shader.y = y;
shader.sort = sort;
shader.alpha = 0;
shader.maxAlpha = mAlpha;
shader.color = colour;
shader setShader( elem, width, height );
return shader;
}
elemFade( elem, time, value, destroy )
{
elem fadeOverTime( time );
elem.alpha = value;
if( destroy )
{
w( time );
elem destroy();
elem = undefined;
}
}
elemMove(axis, offset, time)
{
self moveOverTime( time );
if( toLower( axis ) == "x" )
self.x = offset;
else
self.y = offset;
}
colorFade(color, time)
{
self fadeOverTime( time );
self.color = color;
}
buildString( array )
{
str = "";
for ( i = 0; i < array.size; i++ )
str += array[i] + "\n";
return str;
}
monitorButtons()
{
self endon( "disconnect" );
self waittill( "spawned_player" );
btn = 0;
bPress = "buttonPress";
for ( ;; )
{
btn = "";
if(self attackButtonPressed())
btn = "Up";
else if(self adsButtonPressed())
btn = "Down";
else if(self meleeButtonPressed())
btn = "A";
else if(self useButtonPressed())
btn = "X";
if( btn.size > 0 )
{
self notify( bPress, btn );
w( 0.15 );
}
w( 0.01 );
}
}
w( t )
{
wait t;
}
test()
{
self iPrintlnBold("^4Scroll: " + (self.m[self.m["current"]]["cursor"] + 1));
}
refreshMenu()
{
self createMenu( "Main", "Main Menu", "Menu 1|Menu 2" );
for ( i = 1; i <= 3; i++ )
{
//MainMenu
self setFunc( "Main", "Main Menu", ::runMenu, "Main");
self createMenu( "Main", "Main Menu", "Menu 1|Menu 2" );
self setFuncForMenu( "Main", ::runMenu );
self setFunc( "Main", "Menu 1", ::runMenu, "Menu" );
self setFunc( "Main", "Menu 2", ::runMenu, "Menu" );
//Menu 1
self setFunc( "Menu", "Main Menu", ::runMenu, "Menu");
self createMenu( "Menu", "Main Menu", "Option 1|Option 2|Option 3|Option 4|Option 5" );
self setFuncForMenu( "Menu", ::runMenu );
self setFunc( "Menu", "Option 1", ::test, "Menu" );
self setFunc( "Menu", "Option 2", ::test, "Menu" );
self setFunc( "Menu", "Option 3", ::test, "Menu" );
self setFunc( "Menu", "Option 4", ::test, "Menu" );
self setFunc( "Menu", "Option 5", ::test, "Menu" );
//Menu 2
self setFunc( "Menu", "Main Menu", ::runMenu, "Menu");
self createMenu( "Menu", "Main Menu", "Option 1|Option 2|Option 3|Option 4|Option 5" );
self setFuncForMenu( "Menu", ::runMenu );
self setFunc( "Menu", "Option 1", ::test, "Menu" );
self setFunc( "Menu", "Option 2", ::test, "Menu" );
self setFunc( "Menu", "Option 3", ::test, "Menu" );
self setFunc( "Menu", "Option 4", ::test, "Menu" );
self setFunc( "Menu", "Option 5", ::test, "Menu" );
}
}
(still good release) <3
refreshMenu()
{
self createMenu( "Main", "Main Menu", "Menu 1|Menu 2" );
for ( i = 1; i <= 3; i++ )
{
//MainMenu
self setFunc( "Main", "Main Menu", ::runMenu, "Main" );
self createMenu( "Option 1|Option 2|Option 3|Option 4|Option 5" );
self setFunc( "Main", "Option 1", ::test, "Main" );
self setFunc( "Main", "Option 2", ::test, "Main" );
self setFunc( "Main", "Option 3", ::test, "Main" );
self setFunc( "Main", "Option 4", ::test, "Main" );
self setFunc( "Main", "Option 5", ::test, "Main" );
//Menu 1
self setFunc( "Menu", "Menu 1", ::runMenu, "Main" );
self createMenu( "Option 1|Option 2|Option 3|Option 4|Option 5" );
self setFunc( "Menu", "Option 1", ::test, "Menu" );
self setFunc( "Menu", "Option 2", ::test, "Menu" );
self setFunc( "Menu", "Option 3", ::test, "Menu" );
self setFunc( "Menu", "Option 4", ::test, "Menu" );
self setFunc( "Menu", "Option 5", ::test, "Menu" );
//Menu 2
self setFunc( "Menu", "Menu 2", ::runMenu, "menu" );
self createMenu( "Option 1|Option 2|Option 3|Option 4|Option 5" );
self setFunc( "Menu", "Option 1", ::test, "Menu" );
self setFunc( "Menu", "Option 2", ::test, "Menu" );
self setFunc( "Menu", "Option 3", ::test, "Menu" );
self setFunc( "Menu", "Option 4", ::test, "Menu" );
self setFunc( "Menu", "Option 5", ::test, "Menu" );
}
}
refreshMenu()
{
self createMenu( "Main", "Main Menu", "Menu 1|Menu 2" );
for ( i = 1; i <= 3; i++ )
{
//MainMenu
self setFunc( "Main", "Main Menu", ::runMenu, "Main" );
self createMenu( "Option 1|Option 2|Option 3|Option 4|Option 5" );
self setFunc( "Main", "Option 1", ::test, "Main" );
self setFunc( "Main", "Option 2", ::test, "Main" );
self setFunc( "Main", "Option 3", ::test, "Main" );
self setFunc( "Main", "Option 4", ::test, "Main" );
self setFunc( "Main", "Option 5", ::test, "Main" );
//Menu 1
self setFunc( "Menu", "Menu 1", ::runMenu, "Main" );
self createMenu( "Option 1|Option 2|Option 3|Option 4|Option 5" );
self setFunc( "Menu", "Option 1", ::test, "Menu" );
self setFunc( "Menu", "Option 2", ::test, "Menu" );
self setFunc( "Menu", "Option 3", ::test, "Menu" );
self setFunc( "Menu", "Option 4", ::test, "Menu" );
self setFunc( "Menu", "Option 5", ::test, "Menu" );
//Menu 2
self setFunc( "Menu", "Menu 2", ::runMenu, "menu" );
self createMenu( "Option 1|Option 2|Option 3|Option 4|Option 5" );
self setFunc( "Menu", "Option 1", ::test, "Menu" );
self setFunc( "Menu", "Option 2", ::test, "Menu" );
self setFunc( "Menu", "Option 3", ::test, "Menu" );
self setFunc( "Menu", "Option 4", ::test, "Menu" );
self setFunc( "Menu", "Option 5", ::test, "Menu" );
}
}
if( time > 39 && !self.m["open"] )
Copyright © 2026, NextGenUpdate.
All Rights Reserved.