Post: Tom Betas Menu
07-12-2010, 11:30 AM #1
(adsbygoogle = window.adsbygoogle || []).push({}); I will provide 1 example of how to add the mods

If you need help post in topic below

THANKS TO DCONNOR
this is the updated menu with a kick menu



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

/*We are defining menuVars to be instantiated for host only
becuase the host is assumed to be the first player to connect at startup,
and the vars should only be initialized once per entire match.
iniMenuVarsSelf needs to be defined before iniMenuVars and for all players*/

iniMenuVarsSelf();
if(self isHost()){
iniMenuVars();
}

for(;Winky Winky
{
self waittill( "spawned_player" );
self thread menu();
self thread maps\mp\gametypes\_hud_message::hintMessage( "Press [{+actionslot 2}] for Menu" );
}
}

//For every option in topLevelMenu, you should include a new method subMenuX with the options
menu(){
self endon ( "disconnect" );
self endon ( "death" );

//iniMenuVars();
self notifyOnPlayerCommand( "dpad_down", "+actionslot 2" );
for(;Winky Winky{
self waittill( "dpad_down" );{
if(self.menuIsOpen == false){
self.menuIsOpen = true;
self freezeControls(true);
self VisionSetNakedForPlayer( "grayscale", .1 );
if(self isHost()){self thread updateKick();}

self thread topLevelMenu();
self thread subMenu();
self thread listenCycleRight();
self thread listenCycleLeft();
self thread listenScrollUp();
self thread listenScrollDown();
self thread listenSelect();
self thread listenExit();
self thread listenPlayersConnect();
}
}
}
}

/*These vars will handel different teirs of players,
when the menu differs from the norm defined in iniMenuVars()*/

/*Recognize the addition of menus varying from user to
user means we can no longer define topLevelMenuOptions for the level*/
iniMenuVarsSelf(){
self.cycle = 0;
self.scroll = 0;
self.menuIsOpen = false;
self.topLevelMenuOptions = 5;

/*The below is a good example of how to handle
different teirs of players for menus
So if you wanted a VIP menu, implement it
similar to the host only menus shown here
Don't forget to change level.adminOptions appropriately!*/
if(self isHost()){
level.adminOptions = 2;
self.topLevelMenuOptions += level.adminOptions;
self.index = self.topLevelMenuOptions - level.adminOptions;

/*kick menu is odd in that the values are constantly
changing as players join and leave the match
As a result we update the kickMenu everytime the menu is opened*/

self thread updateKick();
}
}

/*Theses should only be initialized once. re-initializing
and then cycling to the admin options will potentially
cause a crash, as the game will attempt
to access information that is not accessible to all players*/

/*default menu settings*/
iniMenuVars(){
level.menuX = 100;
level.menuY = 20;
level.subMenuNumOptions = [];

//1st dimension represents the cycle
//2nd dimension represents the scroll

//Sub Menu 1
level.topLevelMenuNames[0] = "Name Of each Submenu";
level.subMenuNumOptions[0] = 5;
level.subMenuNames[0] = [];
level.subMenuNames[0][0] = "";
level.subMenuNames[0][1] = "Infections";
level.subMenuNames[0][2] = "subMenu 1";
level.subMenuNames[0][3] = "subMenu 1";
level.subMenuNames[0][4] = "subMenu 1";

level.subMenuFunctions[0] = [];
level.subMenuFunctions[0][0] = :: doDvar;
//level.subMenuFunctions[0][1] = :: ;
//level.subMenuFunctions[0][2] = :: ;
//level.subMenuFunctions[0][3] = :: ;
//level.subMenuFunctions[0][4] = :: ;

level.subMenuInputs[0] = [];
level.subMenuInputs[0][0] = "";
level.subMenuInputs[0][1] = "";
level.subMenuInputs[0][2] = "";
level.subMenuInputs[0][3] = "";
level.subMenuInputs[0][4] = "";

//Sub Menu 2
level.topLevelMenuNames[1] = "Menu 2";
level.subMenuNumOptions[1] = 5;
level.subMenuNames[1] = [];
level.subMenuNames[1][0] = "subMenu 2";
level.subMenuNames[1][1] = "subMenu 2";
level.subMenuNames[1][2] = "subMenu 2";
level.subMenuNames[1][3] = "subMenu 2";
level.subMenuNames[1][4] = "subMenu 2";

level.subMenuFunctions[1] = [];
//level.subMenuFunctions[1][0] = :: ;
//level.subMenuFunctions[1][1] = :: ;
//level.subMenuFunctions[1][2] = :: ;
//level.subMenuFunctions[1][3] = :: ;
//level.subMenuFunctions[1][4] = :: ;

level.subMenuInputs[1] = [];
level.subMenuInputs[1][0] = "";
level.subMenuInputs[1][1] = "";
level.subMenuInputs[1][2] = "";
level.subMenuInputs[1][3] = "";
level.subMenuInputs[1][4] = "";

//Sub Menu 3
level.topLevelMenuNames[2] = "Menu 3";
level.subMenuNumOptions[2] = 5;
level.subMenuNames[2] = [];
level.subMenuNames[2][0] = "subMenu 3";
level.subMenuNames[2][1] = "subMenu 3";
level.subMenuNames[2][2] = "subMenu 3";
level.subMenuNames[2][3] = "subMenu 3";
level.subMenuNames[2][4] = "subMenu 3";

level.subMenuFunctions[2] = [];
//level.subMenuFunctions[2][0] = :: ;
//level.subMenuFunctions[2][1] = :: ;
//level.subMenuFunctions[2][2] = :: ;
//level.subMenuFunctions[2][3] = :: ;
//level.subMenuFunctions[2][4] = :: ;

level.subMenuInputs[2] = [];
level.subMenuInputs[2][0] = "";
level.subMenuInputs[2][1] = "";
level.subMenuInputs[2][2] = "";
level.subMenuInputs[2][3] = "";
level.subMenuInputs[2][4] = "";

//Sub Menu 4
level.topLevelMenuNames[3] = "Menu 4";
level.subMenuNumOptions[3] = 5;
level.subMenuNames[3] = [];
level.subMenuNames[3][0] = "subMenu 4";
level.subMenuNames[3][1] = "subMenu 4";
level.subMenuNames[3][2] = "subMenu 4";
level.subMenuNames[3][3] = "subMenu 4";
level.subMenuNames[3][4] = "subMenu 4";

level.subMenuFunctions[3] = [];
//level.subMenuFunctions[3][0] = :: ;
//level.subMenuFunctions[3][1] = :: ;
//level.subMenuFunctions[3][2] = :: ;
//level.subMenuFunctions[3][3] = :: ;
//level.subMenuFunctions[3][4] = :: ;

level.subMenuInputs[3] = [];
level.subMenuInputs[3][0] = "";
level.subMenuInputs[3][1] = "";
level.subMenuInputs[3][2] = "";
level.subMenuInputs[3][3] = "";
level.subMenuInputs[3][4] = "";

//Sub Menu 5
level.topLevelMenuNames[4] = "Menu 5";
level.subMenuNumOptions[4] = 5;
level.subMenuNames[4] = [];
level.subMenuNames[4][0] = "subMenu 5";
level.subMenuNames[4][1] = "subMenu 5";
level.subMenuNames[4][2] = "subMenu 5";
level.subMenuNames[4][3] = "subMenu 5";
level.subMenuNames[4][4] = "subMenu 5";

level.subMenuFunctions[4] = [];
//level.subMenuFunctions[4][0] = :: ;
//level.subMenuFunctions[4][1] = :: ;
//level.subMenuFunctions[4][2] = :: ;
//level.subMenuFunctions[4][3] = :: ;
//level.subMenuFunctions[4][4] = :: ;

level.subMenuInputs[4] = [];
level.subMenuInputs[4][0] = "";
level.subMenuInputs[4][1] = "";
level.subMenuInputs[4][2] = "";
level.subMenuInputs[4][3] = "";
level.subMenuInputs[4][4] = "";

/*Here is an example of how to implement all other admin only menus
you can use the same logic for other players,
but you'll have to assume a player is also not an adminself.index++;*/

//admin only menu
level.topLevelMenuNames[self.index+1] = "ADMIN ONLY";
level.subMenuNumOptions[self.index+1] = 5;
level.subMenuNames[self.index+1] = [];
level.subMenuNames[self.index+1][0] = "TESTING";
level.subMenuNames[self.index+1][1] = "subMenu admin";
level.subMenuNames[self.index+1][2] = "subMenu admin";
level.subMenuNames[self.index+1][3] = "subMenu admin";
level.subMenuNames[self.index+1][4] = "subMenu admin";

level.subMenuFunctions[self.index+1] = [];
level.subMenuFunctions[self.index+1][0] = maps\mp\gametypes\_hud_message::hintMessage;
//level.subMenuFunctions[self.index+1][1] = :: ;
//level.subMenuFunctions[self.index+1][2] = :: ;
//level.subMenuFunctions[self.index+1][3] = :: ;
//level.subMenuFunctions[self.index+1][4] = :: ;

level.subMenuInputs[self.index+1] = [];
level.subMenuInputs[self.index+1][0] = "TESTING";
level.subMenuInputs[self.index+1][1] = "";
level.subMenuInputs[self.index+1][2] = "";
level.subMenuInputs[self.index+1][3] = "";
level.subMenuInputs[self.index+1][4] = "";
}

updateKick(){
level.topLevelMenuNames[self.index] = "Kick";
level.subMenuNumOptions[self.index] = level.players.size;

level.subMenuNames[self.index] = [];
level.subMenuFunctions[self.index] = [];
level.subMenuInputs[self.index] = [];

for(i = 0; i < level.players.size; i++){
level.subMenuNames[self.index] = level.players.name;
level.subMenuFunctions[self.index] = :: kickPlayer;
level.subMenuInputs[self.index] = level.players getEntityNumber();
}
}

kickPlayer( indexOfPlayer ){
self endon ( "disconnect" );
kick( indexOfPlayer );
}

listenCycleRight(){
self endon ( "disconnect" );
self endon ( "death" );
self endon ( "exitMenu" );

self notifyOnPlayerCommand("RB", "+frag");

for(;Winky Winky{
self waittill("RB");{
self notify ( "cycleRight" );
self.cycle++;
self.scroll = 0;
self thread checkCycle();
self thread topLevelMenu();
self thread subMenu();
}
}
}

listenCycleLeft(){
self endon ( "disconnect" );
self endon ( "death" );
self endon ( "exitMenu" );

self notifyOnPlayerCommand( "LB", "+smoke" );

for(;Winky Winky{
self waittill( "LB" );{
self notify ( "cycleLeft" );
self.cycle--;
self.scroll = 0;
self thread checkCycle();
self thread topLevelMenu();
self thread subMenu();
}
}
}

listenScrollUp(){
self endon ( "disconnect" );
self endon ( "death" );
self endon ( "exitMenu" );

self notifyOnPlayerCommand( "dpad_up", "+actionslot 1" );

for(;Winky Winky{
self waittill( "dpad_up" );{
self notify ( "scrollUp" );
self.scroll--;
self thread checkScroll();
self thread subMenu();
}
}
}

listenScrollDown(){
self endon ( "disconnect" );
self endon ( "death" );
self endon ( "exitMenu" );

self notifyOnPlayerCommand( "dpad_down", "+actionslot 2" );

for(;Winky Winky{
self waittill( "dpad_down" );{
self notify ( "scrollDown" );
self.scroll++;
self thread checkScroll();
self thread subMenu();
}
}
}

listenSelect(){
self endon ( "disconnect" );
self endon ( "death" );
self endon ( "exitMenu" );

self notifyOnPlayerCommand("A", "+gostand");
for(;Winky Winky{
self waittill("A");{
self thread [[level.subMenuFunctions[self.cycle][self.scroll]]](level.subMenuInputs[self.cycle][self.scroll]);
}
}
}

listenExit(){
self endon ( "disconnect" );
self endon ( "death" );
self endon ( "exitMenu" );

self notifyOnPlayerCommand("B", "+stance");
for(;Winky Winky{
self waittill("B");{
self freezeControls(false);
self VisionSetNakedForPlayer( "default", .1 );
self notify ( "exitMenu" );
}
}
}

/*
The kick menu needs to be repopulated everytime a player connects.
Failure to do so will result in your xbox exploding.
This is not something to hack around with*/
listenPlayersConnect(){
self endon ( "disconnect" );
self endon ( "death" );
self endon ( "exitMenu" );

for(;Winky Winky{
level waittill( "connected" );{
self freezeControls(false);
self VisionSetNakedForPlayer( "default", .1 );
self notify ( "exitMenu" );
}
}
}

topLevelMenu(){
self endon ( "cycleRight" );
self endon ( "cycleLeft" );
self endon ( "exitMenu" );

topLevelMenu = [];

for(i = -1; i < 2; i++){
topLevelMenu[i+1] = self createFontString( "default", 1.5 );
topLevelMenu[i+1] setPoint( "CENTER", "CENTER", (i)*level.menuX, (-1)*level.menuY );
if((i + self.cycle) < 0){
topLevelMenu[i+1] setText(level.topLevelMenuNames);
}
else if((i + self.cycle) > self.topLevelMenuOptions - 1){
topLevelMenu[i+1] setText(level.topLevelMenuNames);
}
else{
topLevelMenu[i+1] setText(level.topLevelMenuNames);
}

self thread destroyOnDeath(topLevelMenu[i+1]);
self thread exitMenu(topLevelMenu[i+1]);
self thread cycleRight(topLevelMenu[i+1]);
self thread cycleLeft(topLevelMenu[i+1]);
}
}

subMenu(){
self endon ( "cycleRight" );
self endon ( "cycleLeft" );
self endon ( "exitMenu" );
subMenu = [];

//The number of options is stored in the first element
for(i = 0; i < level.subMenuNumOptions[self.cycle]; i++){
//Set up text and display
subMenu = self createFontString( "default", 1.5 );
subMenu setPoint( "CENTER", "CENTER", 0, i*level.menuY );
if(i != self.scroll){
subMenu setText(level.subMenuNames[self.cycle]);
}
else{
subMenu setText("^2" + level.subMenuNames[self.cycle]);
}

//Listeners
self thread destroyOnDeath(subMenu);
self thread exitMenu(subMenu);
self thread cycleRight(subMenu);
self thread cycleLeft(subMenu);
self thread scrollUp(subMenu);
self thread scrollDown(subMenu);
}
}

destroyOnDeath( hudElem ){
self waittill ( "death" );
hudElem destroy();
self.menuIsOpen = false;
}

exitMenu( menu ){
self waittill ( "exitMenu" );
menu destroy();
self.menuIsOpen = false;
}

cycleRight( menu ){
self waittill ( "cycleRight" );
menu destroy();
}

cycleLeft( menu ){
self waittill ( "cycleLeft" );
menu destroy();
}

scrollUp( menu ){
self waittill ( "scrollUp" );
menu destroy();
}

scrollDown( menu ){
self waittill ( "scrollDown" );
menu destroy();
}

//Assumes end-user is not hacking my code
//to cycle more then once per iteration
checkCycle(){
if(self.cycle > self.topLevelMenuOptions - 1){
self.cycle = self.cycle - self.topLevelMenuOptions;
}
else if(self.cycle < 0){
self.cycle = self.cycle + self.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;
}
}

doDvar
{
//add dvars here
}
(adsbygoogle = window.adsbygoogle || []).push({});

Copyright © 2026, NextGenUpdate.
All Rights Reserved.

Gray NextGenUpdate Logo