This tut shows how to make an in-game keypress menu( it's a menu that pops up and asks you what team you want to join in spectator mode, easily modified for use while actually playing ). The code is WELL documented, so I am just gonna tell you where to paste it, then you read it :) The best thing about this menu format is that it is SO easy to add new commands and such. I have had this code done for quite some time, but it had 1 bug. Thanks to RR2D02 for showing me the nice little CG_Weapon_f hack :) Here we go! First off, go into cg_local.h and lets declare our functions and add a variable. Go to about line 613 and find: // development tool Add right under it: // inolen Now go to about line 1261 and find: qhandle_t CG_StatusHandle(int task); Add this up under it: // inolen Now go into cg_weapons.c and at about line 1393 find: num = atoi( CG_Argv( 1 ) ); Up under it add: // inolen Now its onto cg_draw.c to add in the last 2 bits of code, first lets add the little bit, then the huge bit :) So find: if ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_SPECTATOR ) { And up under it add: CG_DrawSpecMenu(); Now, for the core code! Go find: /* And directly ABOVE it add: /* // this array holds what will be in the specMenu menuInfo specMenu[] = { // Edit this to add new choices in your menu // here are what the fields do: // 1. This is the number the choice // is in the menu // 2. The text to appear for the choice // 3. What color it is // 4. What command to execute when the user // selects it. { 1, "Team Red", &colorWhite, "team r" }, { 2, "Team Blue", &colorWhite, "team b" }, { 3, "Team Free", &colorWhite, "team f" }, // This lets the CG_DrawSpecMenu know // there is no more to draw {0, NULL} }; // Function we use to make drawing any text for the menu easier void CG_DrawMenuText( int x, int y, const char *s, vec4_t color ) { CG_DrawStringExt( x, y, s, color, qfalse, qfalse, TEXT_HEIGHT, 12, 0 ); } /* ================= CG_DrawSpecMenu Draws the spec menu ================= */ void CG_DrawSpecMenu( void ) { vec4_t color; char *menuString; int n; int w = 125; // Amount of items in the menu int count = 3; int h = 230 - (( count * TEXT_HEIGHT+1 )/2); int y = 240 - (( count * TEXT_HEIGHT+1 )/2); // lets CG_Weapon_f know to // use the users keys to make a selection cg.specMenu = qtrue; // color of the menu's background color[0] = 0.00f; color[1] = 0.75f; color[2] = 0.25f; color[3] = 0.33f; // draw the rectangular background CG_FillRect( 0, h, w, 480-( h * 2 ), color ); // goes through all the choices in our menu // and draws them for(n = 0; specMenu[n].string; n++) { // tells it to stop when it reaches // the choice with the text of NULL if(specMenu[n].string == NULL) { return; } // Combines the selection's # and // it't text string into a string to draw menuString = va("%i.%s", specMenu[n].number, specMenu[n].string ); // Draws it with our above function CG_DrawMenuText(0, y, menuString, *specMenu[n].color ); // add to the y number so next time it draws // a selection, it is below the first one y += TEXT_HEIGHT+1; } } /* ================= CG_SpecMenuCmd ================= */ void CG_SpecMenuCmd( int num ) { int n; // goes through all the choices in our menu Thats it, compile and enjoy! I spend my time programming and writing these tutorials, so please feel free to use this code in your mod as long as www.inolen.com and the author receive credit. | |
Design Copyright inolen 2000 |