void ShowAllyInviteMenu (edict_t *ent) { edict_t *e = ent->client->allytarget; if (!ShowMenu(ent)) return; clearmenu(ent); // xxxxxxxxxxxxxxxxxxxxxxxxxxx (max length 27 chars) addlinetomenu(ent, va("%s", e->client->pers.netname), MENU_GREEN_CENTERED); addlinetomenu(ent, "would like to ally.", MENU_GREEN_CENTERED); addlinetomenu(ent, " ", 0); //Menu footer addlinetomenu(ent, "Accept", 1); addlinetomenu(ent, "Decline", 2); //Set handler setmenuhandler(ent, ShowAllyInviteMenu_handler); //Set current line ent->client->menustorage.currentline = 5; //Display the menu showmenu(ent); }
void openTalentMenu(edict_t *ent, int talentID) { talent_t *talent = &ent->myskills.talents.talent[getTalentSlot(ent, talentID)]; int level = talent->upgradeLevel; int lineCount = 7;//12; if (!ShowMenu(ent)) return; clearmenu(ent); addlinetomenu(ent, "Talent", MENU_GREEN_CENTERED); addlinetomenu(ent, GetTalentString(talentID), MENU_WHITE_CENTERED); addlinetomenu(ent, " ", 0); lineCount += writeTalentDescription(ent, talentID); addlinetomenu(ent, " ", 0); //addlinetomenu(ent, "Current", MENU_GREEN_CENTERED); //writeTalentUpgrade(ent, talentID, level); addlinetomenu(ent, " ", 0); if(talent->upgradeLevel < talent->maxLevel) addlinetomenu(ent, "Upgrade this talent.", -1*(talentID+1)); else addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Previous menu.", talentID+1); setmenuhandler(ent, TalentUpgradeMenu_handler); ent->client->menustorage.currentline = lineCount; showmenu(ent); }
void OpenWeaponUpgradeMenu (edict_t *ent, int lastline) { int i; if (!ShowMenu(ent)) return; clearmenu(ent); addlinetomenu(ent, "Weapon Upgrades", MENU_GREEN_CENTERED); addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Select the weapon you", 0); addlinetomenu(ent, "want to upgrade:", 0); addlinetomenu(ent, " ", 0); for (i = 0; i < MAX_WEAPONS; ++i) { char weaponString[24]; strcpy(weaponString, GetWeaponString(i)); padRight(weaponString, 18); addlinetomenu(ent, va("%s%d%c", weaponString, V_WeaponUpgradeVal(ent, i),'%'), (i+10)*100); } addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Exit", 6666); setmenuhandler(ent, weaponmenu_handler); if (lastline) ent->client->menustorage.currentline = lastline + 5; else ent->client->menustorage.currentline = MAX_WEAPONS + 7; showmenu(ent); // try to shortcut to chat-protect mode if (ent->client->idle_frames < CHAT_PROTECT_FRAMES-51) ent->client->idle_frames = CHAT_PROTECT_FRAMES-51; }
void ShowInventoryMenu(edict_t *ent, int lastline, qboolean selling) { int i; //Usual menu stuff if (!ShowMenu(ent)) return; clearmenu(ent); //Print header addlinetomenu(ent, va("%s's items", ent->client->pers.netname), MENU_GREEN_CENTERED); addlinetomenu(ent, " ", 0); //Print each item for (i = 0; i < MAX_VRXITEMS; ++i) { item_t *item; item = &ent->myskills.items[i]; //Print equip slot (if required) switch(i) { case 0: addlinetomenu(ent, " Hand", MENU_GREEN_LEFT); break; case 1: addlinetomenu(ent, " Neck", MENU_GREEN_LEFT); break; case 2: addlinetomenu(ent, " Belt", MENU_GREEN_LEFT); break; case 3: addlinetomenu(ent, " Stash", MENU_GREEN_LEFT);break; } addlinetomenu(ent, va("%s", V_MenuItemString(item, ' ')), i+1); } //Menu footer addlinetomenu(ent, " ", 0); addlinetomenu(ent, " Exit", 666); //Set handler setmenuhandler(ent, ShowInventoryMenu_handler); //Where are we in the menu? if (lastline) { switch(lastline) { case 1: ent->client->menustorage.currentline = 4; break; case 2: ent->client->menustorage.currentline = 6; break; case 3: ent->client->menustorage.currentline = 8; break; default: ent->client->menustorage.currentline = 6 + lastline; break; //start at line 10 } } else ent->client->menustorage.currentline = 18; //Display the menu (don't show it if this menu was loaded from the armory!) if (!selling) showmenu(ent); }
void ShowAddAllyMenu (edict_t *ent) { int i; int j = 0; edict_t *temp; if (!ShowMenu(ent)) return; clearmenu(ent); addlinetomenu(ent, "Select a player:", MENU_GREEN_CENTERED); addlinetomenu(ent, " ", 0); for_each_player(temp, i) { if (CanAlly(ent, temp, ALLY_RANGE)) { //Add player to the list addlinetomenu(ent, va(" %s (%s)", temp->myskills.player_name, GetClassString(temp->myskills.class_num)), GetClientNumber(temp)); ++j; // 3.65 can only display up to 10 possible allies // any more than this will cause the game to crash // FIXME: split this up into multiple menus? if (j >= 10) break; } } //Menu footer addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Exit", 666); //Set handler setmenuhandler(ent, ShowAddAllyMenu_handler); //Set current line ent->client->menustorage.currentline = 4 + j; //Display the menu showmenu(ent); }
void ItemDeleteMenu(edict_t *ent, int itemindex) { item_t *item = &ent->myskills.items[itemindex]; //Process the header StartShowInventoryMenu(ent, item); //Menu footer addlinetomenu(ent, " ", 0); addlinetomenu(ent, " Delete this item?", 0); addlinetomenu(ent, "No, I changed my mind!", 667 + itemindex); addlinetomenu(ent, "Yes, delete this item.", 778 + itemindex); //Set handler setmenuhandler(ent, DeleteMenu_handler); ent->client->menustorage.currentline += 4; //Display the menu showmenu(ent); }
void ShowItemMenu(edict_t *ent, int itemindex) { item_t *item = &ent->myskills.items[itemindex]; //Load the item StartShowInventoryMenu(ent, item); //Check to see if this item can be equipped or not if (!((item->itemtype & ITEM_GRAVBOOTS) || (item->itemtype & ITEM_FIRE_RESIST) || (item->itemtype & ITEM_AUTO_TBALL))) { if (itemindex < 3) addlinetomenu(ent, "Stash this item", 4445 + itemindex); else addlinetomenu(ent, "Equip this item", 4445 + itemindex); ++ent->client->menustorage.currentline; } //Append a footer to the menu addlinetomenu(ent, "Previous menu", 7778 + itemindex); addlinetomenu(ent, "Exit", 666); addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Delete this item", 10000 + itemindex); //set currentline ent->client->menustorage.currentline += 2; //Set handler setmenuhandler(ent, ShowItemMenu_handler); //Display the menu showmenu(ent); }
void OpenPurchaseMenu (edict_t *ent, int page_num, int lastline) { int i; //Usual menu stuff if (!ShowMenu(ent)) return; clearmenu(ent); //Header addlinetomenu(ent, va("You have %d credits", ent->myskills.credits), MENU_GREEN_CENTERED); addlinetomenu(ent, "Please make a selection:", MENU_GREEN_CENTERED); addlinetomenu(ent, " ", 0); //Print this page's items for (i = (page_num-1)*10; i < page_num*10; ++i) { if (i < ARMORY_ITEMS) addlinetomenu(ent, va("%s", GetArmoryItemString(i+1)), i+1); else addlinetomenu(ent, " ", 0); } //Footer addlinetomenu(ent, " ", 0); if (i < ARMORY_ITEMS) addlinetomenu(ent, "Next", (page_num*1000)+2); addlinetomenu(ent, "Back", (page_num*1000)+1); addlinetomenu(ent, "Exit", 99); //Menu handler setmenuhandler(ent, PurchaseMenu_handler); //Set the menu cursor if (lastline % 10) //selected 0-9 in this page ent->client->menustorage.currentline = (lastline % 10) + 3; else if (lastline) //selected #10 in this page ent->client->menustorage.currentline = 13; else if (ARMORY_ITEMS > 10) //menu is under 10 items ent->client->menustorage.currentline = 15; else ent->client->menustorage.currentline = 5 + i; //Show the menu showmenu(ent); }
void ShowAllyWaitMenu (edict_t *ent) { if (!ShowMenu(ent)) return; clearmenu(ent); // xxxxxxxxxxxxxxxxxxxxxxxxxxx (max length 27 chars) addlinetomenu(ent, "Please wait for player to ", MENU_GREEN_CENTERED); addlinetomenu(ent, "accept your invitation. ", MENU_GREEN_CENTERED); addlinetomenu(ent, " ", 0); //Menu footer addlinetomenu(ent, "Close Window", 666); addlinetomenu(ent, "Cancel Invitation", 1); //Set handler setmenuhandler(ent, ShowAllyWaitMenu_handler); //Set current line ent->client->menustorage.currentline = 4; //Display the menu showmenu(ent); }
void ShowRemoveAllyMenu (edict_t *ent) { int i; int j = 0; edict_t *temp; if (!ShowMenu(ent)) return; clearmenu(ent); addlinetomenu(ent, "Select a player:", MENU_GREEN_CENTERED); addlinetomenu(ent, " ", 0); for_each_player(temp, i) { if (IsAlly(ent, temp)) { //Add player to the list addlinetomenu(ent, va(" %s", temp->myskills.player_name), GetClientNumber(temp)); ++j; } } //Menu footer addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Exit", 666); //Set handler setmenuhandler(ent, ShowRemoveAllyMenu_handler); //Set current line ent->client->menustorage.currentline = 4 + j; //Display the menu showmenu(ent); }
void ShowAllyMenu (edict_t *ent) { int i; int j = 0; edict_t *temp; //Don't bother displaying the menu if alliances are disabled if (!allies->value) { safe_cprintf(ent, PRINT_HIGH, "Alliances are disabled.\n"); return; } // alliance only work in pvp mode if (!ValidAllyMode()) { safe_cprintf(ent, PRINT_HIGH, "Alliances are disabled.\n"); return; } if (!ShowMenu(ent)) return; clearmenu(ent); addlinetomenu(ent, "Currently allied with:", MENU_GREEN_CENTERED); addlinetomenu(ent, " ", 0); for_each_player(temp, i) { if (IsAlly(ent, temp)) { //Add player to the list addlinetomenu(ent, va(" %s", temp->myskills.player_name), 0); ++j; } } //Menu footer addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Add Ally", 1); addlinetomenu(ent, "Remove Ally", 2); addlinetomenu(ent, "Exit", 666); //Set handler setmenuhandler(ent, ShowAllyMenu_handler); //Set current line ent->client->menustorage.currentline = 6 + j; //Display the menu showmenu(ent); }
void OpenTalentUpgradeMenu (edict_t *ent, int lastline) { talent_t *talent; char buffer[30]; int i; if (!ShowMenu(ent)) return; clearmenu(ent); // menu header addlinetomenu(ent, "Talents", MENU_GREEN_CENTERED); addlinetomenu(ent, " ", 0); for (i = 0; i < ent->myskills.talents.count; i++) { talent = &ent->myskills.talents.talent[i]; //create menu string strcpy(buffer, GetTalentString(talent->id)); strcat(buffer, ":"); padRight(buffer, 15); addlinetomenu(ent, va("%d. %s %d/%d", i+1, buffer, talent->upgradeLevel, talent->maxLevel), talent->id); } // menu footer addlinetomenu(ent, " ", 0); addlinetomenu(ent, va("You have %d talent points.", ent->myskills.talents.talentPoints), 0); addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Exit", 9999); setmenuhandler(ent, openTalentMenu_handler); if (!lastline) ent->client->menustorage.currentline = ent->myskills.talents.count + 6; else ent->client->menustorage.currentline = lastline + 2; showmenu(ent); // try to shortcut to chat-protect mode if (ent->client->idle_frames < CHAT_PROTECT_FRAMES-51) ent->client->idle_frames = CHAT_PROTECT_FRAMES-51; }
void OpenBuyRuneConfirmMenu(edict_t *ent, int option) { int page_num = option / 1000; int selection = (option % 1000)-1; armoryRune_t *firstItem; item_t *rune; switch(page_num) { case 1: firstItem = WeaponRunes; break; case 2: firstItem = AbilityRunes; break; case 3: firstItem = ComboRunes; break; default: gi.dprintf("Error in OpenBuyRuneConfirmMenu(). Invalid page number: %d\n", page_num); return; } rune = &((firstItem + selection)->rune); //Process the header StartShowInventoryMenu(ent, rune); //Menu footer addlinetomenu(ent, va(" Price: %d", getBuyValue(rune)), 0); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " Buy this item?", 0); addlinetomenu(ent, "No, I changed my mind!", (page_num * 10) + selection); addlinetomenu(ent, "Yes, GIMME GIMME!!.", option); //Set handler setmenuhandler(ent, BuyRuneConfirmMenu_handler); ent->client->menustorage.currentline += 7; //Display the menu showmenu(ent); }
void OpenSellConfirmMenu(edict_t *ent, int itemindex) { item_t *item = &ent->myskills.items[itemindex]; //Process the header StartShowInventoryMenu(ent, item); //Menu footer addlinetomenu(ent, va(" Sell value: %d", GetSellValue(item)), 0); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " Sell this item?", 0); addlinetomenu(ent, "No, I changed my mind!", 667 + itemindex); addlinetomenu(ent, "Yes, sell this item.", 778 + itemindex); //Set handler setmenuhandler(ent, SellConfirmMenu_handler); ent->client->menustorage.currentline += 7; //Display the menu showmenu(ent); }
void ShowTradeHelpMenu(edict_t *ent) { //Usual menu stuff if (!ShowMenu(ent)) return; clearmenu(ent); //Print header // xxxxxxxxxxxxxxxxxxxxxxxxxxx (max length 27 chars) addlinetomenu(ent, "Trading", MENU_GREEN_LEFT); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " To start a trade, use the", 0); addlinetomenu(ent, " command: trade.", 0); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " Select up to 3 items", 0); addlinetomenu(ent, " for the trade queue,", 0); addlinetomenu(ent, " then select 'accept'", 0); addlinetomenu(ent, " to complete the trade.", 0); addlinetomenu(ent, " ", 0); addlinetomenu(ent, "cmd: trade [on/off]", 0); //Menu footer addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Previous", 60); addlinetomenu(ent, "Exit", 666); //Set handler setmenuhandler(ent, ShowSecondaryMenu_handler); //Set current line ent->client->menustorage.currentline = 13; //Display the menu showmenu(ent); }
//Adds menu lines that describe the general use of the talent. int writeTalentDescription(edict_t *ent, int talentID) { switch(talentID) { //Soldier talents case TALENT_IMP_STRENGTH: addlinetomenu(ent, "Increases damage,", MENU_WHITE_CENTERED); addlinetomenu(ent, "but reduces resist.", MENU_WHITE_CENTERED); return 2; case TALENT_IMP_RESIST: addlinetomenu(ent, "Increases resist,", MENU_WHITE_CENTERED); addlinetomenu(ent, "but reduces damage.", MENU_WHITE_CENTERED); return 2; case TALENT_BLOOD_OF_ARES: addlinetomenu(ent, "Increases the damage you", MENU_WHITE_CENTERED); addlinetomenu(ent, "give/take as you spree.", MENU_WHITE_CENTERED); return 2; case TALENT_BASIC_HA: addlinetomenu(ent, "Increases ammo pickups.", MENU_WHITE_CENTERED); return 1; case TALENT_BOMBARDIER: addlinetomenu(ent, "Reduces self-inflicted", MENU_WHITE_CENTERED); addlinetomenu(ent, "grenade damage and", MENU_WHITE_CENTERED); addlinetomenu(ent, "reduces cost.", MENU_WHITE_CENTERED); return 3; //Poltergeist talents case TALENT_MORPHING: addlinetomenu(ent, "Reduces the cost", MENU_WHITE_CENTERED); addlinetomenu(ent, "of your morphs.", MENU_WHITE_CENTERED); return 2; case TALENT_MORE_AMMO: addlinetomenu(ent, "Increases maximum ammo", MENU_WHITE_CENTERED); addlinetomenu(ent, "capacity for", MENU_WHITE_CENTERED); addlinetomenu(ent, "tank/caco/flyer/medic.", MENU_WHITE_CENTERED); return 3; case TALENT_SUPERIORITY: addlinetomenu(ent, "Increased damage and", MENU_WHITE_CENTERED); addlinetomenu(ent, "resistance to monsters.", MENU_WHITE_CENTERED); return 2; case TALENT_RETALIATION: addlinetomenu(ent, "Damage increases as", MENU_WHITE_CENTERED); addlinetomenu(ent, "health is reduced.", MENU_WHITE_CENTERED); return 2; case TALENT_PACK_ANIMAL: addlinetomenu(ent, "Increased damage and", MENU_WHITE_CENTERED); addlinetomenu(ent, "resistance when near", MENU_WHITE_CENTERED); addlinetomenu(ent, "friendly morphed", MENU_WHITE_CENTERED); addlinetomenu(ent, "players.", MENU_WHITE_CENTERED); return 4; //Vampire talents case TALENT_IMP_CLOAK: addlinetomenu(ent, "Move while cloaked", MENU_WHITE_CENTERED); addlinetomenu(ent, "(must be crouching).", MENU_WHITE_CENTERED); addlinetomenu(ent, "1/3 pc cost at night!", MENU_WHITE_CENTERED); return 3; case TALENT_ARMOR_VAMP: addlinetomenu(ent, "Also gain armor using", MENU_WHITE_CENTERED); addlinetomenu(ent, "your vampire skill.", MENU_WHITE_CENTERED); return 2; case TALENT_FATAL_WOUND: addlinetomenu(ent, "Adds chance for flesh", MENU_WHITE_CENTERED); addlinetomenu(ent, "eater to cause a fatal", MENU_WHITE_CENTERED); addlinetomenu(ent, "wound.", MENU_WHITE_CENTERED); return 3; case TALENT_SECOND_CHANCE: addlinetomenu(ent, "100% chance of ghost", MENU_WHITE_CENTERED); addlinetomenu(ent, "working when hit.", MENU_WHITE_CENTERED); return 2; case TALENT_IMP_MINDABSORB: addlinetomenu(ent, "Increases frequency of", MENU_WHITE_CENTERED); addlinetomenu(ent, "mind absorb attacks.", MENU_WHITE_CENTERED); return 2; case TALENT_CANNIBALISM: addlinetomenu(ent, "Increases your maximum", MENU_WHITE_CENTERED); addlinetomenu(ent, "health using corpse eater.", MENU_WHITE_CENTERED); return 2; //Mage talents case TALENT_ICE_BOLT: addlinetomenu(ent, "Use 'icebolt' instead of", MENU_WHITE_CENTERED); addlinetomenu(ent, "fireball to chill targets.", MENU_WHITE_CENTERED); return 2; case TALENT_MEDITATION: addlinetomenu(ent, "Meditate to build power", MENU_WHITE_CENTERED); addlinetomenu(ent, "cubes (cmd 'meditate').", MENU_WHITE_CENTERED); return 2; case TALENT_OVERLOAD: addlinetomenu(ent, "Use extra power cubes", MENU_WHITE_CENTERED); addlinetomenu(ent, "to overload spells,", MENU_WHITE_CENTERED); addlinetomenu(ent, "increasing their", MENU_WHITE_CENTERED); addlinetomenu(ent, "effectiveness", MENU_WHITE_CENTERED); addlinetomenu(ent, "(cmd 'overload').", MENU_WHITE_CENTERED); return 5; case TALENT_FROST_NOVA: addlinetomenu(ent, "Special nova spell", MENU_WHITE_CENTERED); addlinetomenu(ent, "that chills players.", MENU_WHITE_CENTERED); addlinetomenu(ent, "(cmd frostnova)", MENU_WHITE_CENTERED); return 3; case TALENT_IMP_MAGICBOLT: addlinetomenu(ent, "Power cubes are refunded", MENU_WHITE_CENTERED); addlinetomenu(ent, "on successful hits.", MENU_WHITE_CENTERED); return 2; case TALENT_MANASHIELD: addlinetomenu(ent, "Reduces physical damage", MENU_WHITE_CENTERED); addlinetomenu(ent, "by 80%%. All damage", MENU_WHITE_CENTERED); addlinetomenu(ent, "absorbed consumes power", MENU_WHITE_CENTERED); addlinetomenu(ent, "cubes. (cmd manashield)", MENU_WHITE_CENTERED); return 4; //Engineer talents case TALENT_LASER_PLATFORM: addlinetomenu(ent, "Create a laser platform", MENU_WHITE_CENTERED); addlinetomenu(ent, "(cmd 'laserplatform').", MENU_WHITE_CENTERED); return 2; case TALENT_ALARM: addlinetomenu(ent, "Use 'lasertrap' instead", MENU_WHITE_CENTERED); addlinetomenu(ent, "of detector to build a", MENU_WHITE_CENTERED); addlinetomenu(ent, "laser trap.", MENU_WHITE_CENTERED); return 3; case TALENT_RAPID_ASSEMBLY: addlinetomenu(ent, "Reduces build time.", MENU_WHITE_CENTERED); addlinetomenu(ent, "Can't be combined with", MENU_WHITE_CENTERED); addlinetomenu(ent, "Precision Tune.", MENU_WHITE_CENTERED); return 3; case TALENT_PRECISION_TUNING: addlinetomenu(ent, "Increased cost and", MENU_WHITE_CENTERED); addlinetomenu(ent, "build time to build", MENU_WHITE_CENTERED); addlinetomenu(ent, "higher level devices.", MENU_WHITE_CENTERED); addlinetomenu(ent, "Can't be combined with", MENU_WHITE_CENTERED); addlinetomenu(ent, "Rapid Assembly.", MENU_WHITE_CENTERED); return 3; case TALENT_STORAGE_UPGRADE: addlinetomenu(ent, "Increases ammunition", MENU_WHITE_CENTERED); addlinetomenu(ent, "capacity of SS/sentry/AC.", MENU_WHITE_CENTERED); return 2; //Knight talents case TALENT_REPEL: addlinetomenu(ent, "Adds chance for projectiles", MENU_WHITE_CENTERED); addlinetomenu(ent, "to deflect from shield.", MENU_WHITE_CENTERED); return 2; case TALENT_MAG_BOOTS: addlinetomenu(ent, "Reduces effect of knockback.", MENU_WHITE_CENTERED); return 1; case TALENT_LEAP_ATTACK: addlinetomenu(ent, "Adds stun/knockback effect", MENU_WHITE_CENTERED); addlinetomenu(ent, "to boost spell when landing.", MENU_WHITE_CENTERED); return 2; case TALENT_MOBILITY: addlinetomenu(ent, "Reduces boost cooldown", MENU_WHITE_CENTERED); return 1; case TALENT_DURABILITY: addlinetomenu(ent, "Increases your health", MENU_WHITE_CENTERED); addlinetomenu(ent, "per level bonus!", MENU_WHITE_CENTERED); return 2; //Cleric talents case TALENT_BALANCESPIRIT: addlinetomenu(ent, "New spirit that can", MENU_WHITE_CENTERED); addlinetomenu(ent, "use the skills of both", MENU_WHITE_CENTERED); addlinetomenu(ent, "yin and yang spirits.", MENU_WHITE_CENTERED); return 3; case TALENT_HOLY_GROUND: addlinetomenu(ent, "Designate an area as", MENU_WHITE_CENTERED); addlinetomenu(ent, "holy ground to regenerate", MENU_WHITE_CENTERED); addlinetomenu(ent, "teammates (cmd 'holyground').", MENU_WHITE_CENTERED); return 3; case TALENT_UNHOLY_GROUND: addlinetomenu(ent, "Designate an area as", MENU_WHITE_CENTERED); addlinetomenu(ent, "unholy ground to damage", MENU_WHITE_CENTERED); addlinetomenu(ent, "enemies (cmd 'unholyground').", MENU_WHITE_CENTERED); return 3; case TALENT_BOOMERANG: addlinetomenu(ent, "Turns blessed hammers", MENU_WHITE_CENTERED); addlinetomenu(ent, "into boomerangs", MENU_WHITE_CENTERED); addlinetomenu(ent, "(cmd 'boomerang').", MENU_WHITE_CENTERED); return 3; case TALENT_PURGE: addlinetomenu(ent, "Removes curses and grants", MENU_WHITE_CENTERED); addlinetomenu(ent, "temporary invincibility", MENU_WHITE_CENTERED); addlinetomenu(ent, "and immunity to curses", MENU_WHITE_CENTERED); addlinetomenu(ent, "(cmd 'purge').", MENU_WHITE_CENTERED); return 4; //Weaponmaster talents case TALENT_BASIC_AMMO_REGEN: addlinetomenu(ent, "Basic ammo regeneration.", MENU_WHITE_CENTERED); addlinetomenu(ent, "Regenerates one ammo pack", MENU_WHITE_CENTERED); addlinetomenu(ent, "for the weapon in use.", MENU_WHITE_CENTERED); return 3; case TALENT_COMBAT_EXP: addlinetomenu(ent, "Increases physical,", MENU_WHITE_CENTERED); addlinetomenu(ent, "damage, but reduces", MENU_WHITE_CENTERED); addlinetomenu(ent, "resistance.", MENU_WHITE_CENTERED); return 3; case TALENT_TACTICS: addlinetomenu(ent, "Increases your levelup", MENU_WHITE_CENTERED); addlinetomenu(ent, "health and armor bonus!", MENU_WHITE_CENTERED); return 2; case TALENT_SIDEARMS: addlinetomenu(ent, "Gives you additional", MENU_WHITE_CENTERED); addlinetomenu(ent, "respawn weapons. Weapon", MENU_WHITE_CENTERED); addlinetomenu(ent, "choice is determined by", MENU_WHITE_CENTERED); addlinetomenu(ent, "weapon upgrade level.", MENU_WHITE_CENTERED); return 4; //Necromancer talents case TALENT_EVIL_CURSE: addlinetomenu(ent, "Increases curse duration.", MENU_WHITE_CENTERED); return 1; case TALENT_CHEAPER_CURSES: addlinetomenu(ent, "Reduces curse cost.", MENU_WHITE_CENTERED); return 1; case TALENT_CORPULENCE: addlinetomenu(ent, "Increases hellspawn", MENU_WHITE_CENTERED); addlinetomenu(ent, "and monster health/armor,", MENU_WHITE_CENTERED); addlinetomenu(ent, "but reduces damage. Can't,", MENU_WHITE_CENTERED); addlinetomenu(ent, "combine with Life Tap.", MENU_WHITE_CENTERED); return 4; case TALENT_LIFE_TAP: addlinetomenu(ent, "Increases hellspawn", MENU_WHITE_CENTERED); addlinetomenu(ent, "and monster damage,", MENU_WHITE_CENTERED); addlinetomenu(ent, "but slowly saps life.", MENU_WHITE_CENTERED); addlinetomenu(ent, "Can't combine with", MENU_WHITE_CENTERED); addlinetomenu(ent, "Corpulence.", MENU_WHITE_CENTERED); return 5; case TALENT_DIM_VISION: addlinetomenu(ent, "Adds chance to", MENU_WHITE_CENTERED); addlinetomenu(ent, "automatically curse", MENU_WHITE_CENTERED); addlinetomenu(ent, "enemies that shoot you.", MENU_WHITE_CENTERED); return 3; case TALENT_FLIGHT: addlinetomenu(ent, "Reduces jetpack cost.", MENU_WHITE_CENTERED); return 1; //Shaman talents case TALENT_TOTEM: addlinetomenu(ent, "Allows you to spawn an", MENU_WHITE_CENTERED); addlinetomenu(ent, "extra totem. Totem can not", MENU_WHITE_CENTERED); addlinetomenu(ent, "be of the opposite element.", MENU_WHITE_CENTERED); return 3; case TALENT_ICE: addlinetomenu(ent, "Allows your water totem", MENU_WHITE_CENTERED); addlinetomenu(ent, "to damage its targets.", MENU_WHITE_CENTERED); return 2; case TALENT_WIND: addlinetomenu(ent, "Allows your air totem to", MENU_WHITE_CENTERED); addlinetomenu(ent, "ghost attacks for you.", MENU_WHITE_CENTERED); return 2; case TALENT_STONE: addlinetomenu(ent, "Allows your earth totem to", MENU_WHITE_CENTERED); addlinetomenu(ent, "increase your resistance.", MENU_WHITE_CENTERED); return 2; case TALENT_SHADOW: addlinetomenu(ent, "Allows your darkness totem", MENU_WHITE_CENTERED); addlinetomenu(ent, "to let you vamp beyond your", MENU_WHITE_CENTERED); addlinetomenu(ent, "maximum health limit.", MENU_WHITE_CENTERED); return 3; case TALENT_PEACE: addlinetomenu(ent, "Allows your nature totem to", MENU_WHITE_CENTERED); addlinetomenu(ent, "regenerate your power cubes.", MENU_WHITE_CENTERED); return 2; case TALENT_VOLCANIC: addlinetomenu(ent, "Adds a chance for fire", MENU_WHITE_CENTERED); addlinetomenu(ent, "totem to shoot a fireball.", MENU_WHITE_CENTERED); return 2; //Alien talents case TALENT_PHANTOM_OBSTACLE: addlinetomenu(ent, "Reduces time to cloak.", MENU_WHITE_CENTERED); return 1; case TALENT_SUPER_HEALER: addlinetomenu(ent, "Allows healer to heal", MENU_WHITE_CENTERED); addlinetomenu(ent, "beyond maximum health.", MENU_WHITE_CENTERED); return 2; case TALENT_PHANTOM_COCOON: addlinetomenu(ent, "Allows cocoon to cloak.", MENU_WHITE_CENTERED); return 1; case TALENT_SWARMING: addlinetomenu(ent, "Increases spore count,", MENU_WHITE_CENTERED); addlinetomenu(ent, "but reduces damage.", MENU_WHITE_CENTERED); return 2; case TALENT_EXPLODING_BODIES: addlinetomenu(ent, "Makes alien-summons'", MENU_WHITE_CENTERED); addlinetomenu(ent, "corpses explode.", MENU_WHITE_CENTERED); return 2; default: return 0; } }
void StartShowInventoryMenu(edict_t *ent, item_t *item) { int type = item->itemtype; int linecount = 1; int i; if (!ShowMenu(ent)) return; clearmenu(ent); //If item has a name, use that instead if (strlen(item->name) > 0) { if (item->setCode == 0) addlinetomenu(ent, va(" %s", item->name), MENU_GREEN_LEFT); else addlinetomenu(ent, va(" %s (set item)", item->name), MENU_GREEN_LEFT); } else { //Print header, depending on the item type addlinetomenu(ent, va("%s", V_MenuItemString(item, ' ')), MENU_GREEN_LEFT); } //Unique runes need to display stats too if (type & ITEM_UNIQUE) type ^= ITEM_UNIQUE; //Item's stats switch(type) { case ITEM_WEAPON: { int wIndex = (item->modifiers[0].index / 100) - 10; addlinetomenu(ent, " ", 0); addlinetomenu(ent, va(" %s", GetWeaponString(wIndex)), 0); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " Stats:", MENU_GREEN_LEFT); linecount += 4; for (i = 0; i < MAX_VRXITEMMODS; ++i) { int mIndex; char buf[30]; if ((item->modifiers[i].type == TYPE_NONE) || (V_HiddenMod(ent, item, &item->modifiers[i]))) continue; mIndex = item->modifiers[i].index % 100; strcpy(buf, GetModString(wIndex, mIndex)); padRight(buf, 20); addlinetomenu(ent, va(" %s [%d]", buf, item->modifiers[i].value ), 0); ++linecount; } addlinetomenu(ent, " ", 0); ++linecount; } break; case ITEM_ABILITY: { addlinetomenu(ent, " ", 0); addlinetomenu(ent, " Stats:", MENU_GREEN_LEFT); linecount += 2; for (i = 0; i < MAX_VRXITEMMODS; ++i) { int aIndex; char buf[30]; aIndex = item->modifiers[i].index; if ((item->modifiers[i].type == TYPE_NONE) || (V_HiddenMod(ent, item, &item->modifiers[i]))) continue; strcpy(buf, GetAbilityString(aIndex)); padRight(buf, 20); addlinetomenu(ent, va(" %s [%d]", buf, item->modifiers[i].value ), 0); linecount++; } } break; case ITEM_COMBO: { addlinetomenu(ent, " ", 0); addlinetomenu(ent, " Stats:", MENU_GREEN_LEFT); linecount += 2; for (i = 0; i < MAX_VRXITEMMODS; ++i) { char buf[30]; if ((item->modifiers[i].type == TYPE_NONE) || (V_HiddenMod(ent, item, &item->modifiers[i]))) continue; switch(item->modifiers[i].type) { case TYPE_ABILITY: { int aIndex; aIndex = item->modifiers[i].index; strcpy(buf, GetAbilityString(aIndex)); padRight(buf, 20); addlinetomenu(ent, va(" %s [%d]", buf, item->modifiers[i].value ), 0); linecount++; } break; case TYPE_WEAPON: { int wIndex = (item->modifiers[i].index / 100) - 10; int mIndex = item->modifiers[i].index % 100; strcpy(buf, GetShortWeaponString(wIndex)); strcat(buf, va(" %s", GetModString(wIndex, mIndex))); padRight(buf, 20); addlinetomenu(ent, va(" %s [%d]", buf, item->modifiers[i].value ), 0); linecount++; } break; } } } break; case ITEM_CLASSRUNE: { addlinetomenu(ent, " ", 0); addlinetomenu(ent, " Stats:", MENU_GREEN_LEFT); linecount += 2; for (i = 0; i < MAX_VRXITEMMODS; ++i) { int aIndex; char buf[30]; aIndex = item->modifiers[i].index; if (item->modifiers[i].type == TYPE_NONE) continue; strcpy(buf, GetAbilityString(aIndex)); padRight(buf, 20); addlinetomenu(ent, va(" %s [%d]", buf, item->modifiers[i].value ), 0); linecount++; } } break; } //Menu footer addlinetomenu(ent, " ", 0); //Items such as Gravity boots need to show the number of charges left if ((item->itemtype & ITEM_GRAVBOOTS) || (item->itemtype & ITEM_FIRE_RESIST) || (item->itemtype & ITEM_AUTO_TBALL)) { addlinetomenu(ent, va(" Charges left: %d", item->quantity), 0); addlinetomenu(ent, " ", 0); linecount += 2; } ent->client->menustorage.currentline = linecount; }
void OpenGeneralWeaponMenu (edict_t *ent, int lastline) { int WeaponIndex = (lastline / 100) - 10; int modIndex = (lastline % 100); int i; if (!ShowMenu(ent)) return; clearmenu(ent); addlinetomenu(ent, va("%s\n(%d%c)", GetWeaponString(WeaponIndex), V_WeaponUpgradeVal(ent, WeaponIndex), '%'), MENU_GREEN_CENTERED); addlinetomenu(ent, va("Weapon points left: %d", ent->myskills.weapon_points), MENU_GREEN_CENTERED); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " Select the weapon", 0); addlinetomenu(ent, " attribute you want to", 0); addlinetomenu(ent, " improve upon.", 0); addlinetomenu(ent, " ", 0); for (i = 0; i < MAX_WEAPONMODS; ++i) { char sMod[30]; int level, cur; level = ent->myskills.weapons[WeaponIndex].mods[i].level; cur = ent->myskills.weapons[WeaponIndex].mods[i].current_level; strcpy(sMod, GetModString(WeaponIndex, i)); padRight(sMod, 15); strcat(sMod, va("%d", level)); padRight(sMod, 18); addlinetomenu(ent, va("%s[%d]", sMod, cur), ((WeaponIndex+10)*100) + i + 1); } setmenuhandler(ent, generalWeaponMenu_handler); if (modIndex) ent->client->menustorage.currentline = modIndex + 7; else ent->client->menustorage.currentline = 14; addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Previous Menu", 7777 + WeaponIndex); addlinetomenu(ent, "Exit", 6666); showmenu(ent); }
void ShowItemsHelpMenu(edict_t *ent) { //Usual menu stuff if (!ShowMenu(ent)) return; clearmenu(ent); //Print header // xxxxxxxxxxxxxxxxxxxxxxxxxxx (max length 27 chars) addlinetomenu(ent, "Item types:", MENU_GREEN_LEFT); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " Health potions", MENU_GREEN_LEFT); addlinetomenu(ent, " Heals 50% max health.", 0); addlinetomenu(ent, " Holy water", MENU_GREEN_LEFT); addlinetomenu(ent, " Removes all curses.", 0); addlinetomenu(ent, " Tballs", MENU_GREEN_LEFT); addlinetomenu(ent, " Teleport self/others.", 0); addlinetomenu(ent, " Gravity Boots", MENU_GREEN_LEFT); addlinetomenu(ent, " Jump great distances.", 0); addlinetomenu(ent, " Fire Resistant Clothing", MENU_GREEN_LEFT); addlinetomenu(ent, " Resists burns.", 0); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " To use: cmd use <item>", 0); addlinetomenu(ent, " Some items are automatic.", 0); addlinetomenu(ent, " Tballs can not be dropped.", 0); //Menu footer addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Previous", 50); addlinetomenu(ent, "Exit", 666); //Set handler setmenuhandler(ent, ShowSecondaryMenu_handler); //Set current line ent->client->menustorage.currentline = 18; //Display the menu showmenu(ent); }
void ShowRuneTypes(edict_t *ent) { //Usual menu stuff if (!ShowMenu(ent)) return; clearmenu(ent); //Print header // xxxxxxxxxxxxxxxxxxxxxxxxxxx (max length 27 chars) addlinetomenu(ent, "Rune types:", MENU_GREEN_LEFT); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " Ability runes (blue)", 0); addlinetomenu(ent, " Weapon runes (red)", 0); addlinetomenu(ent, " Combo runes (purple)", 0); addlinetomenu(ent, " Class runes (cyan)", 0); addlinetomenu(ent, " Unique runes (yellow)", 0); addlinetomenu(ent, " Special Uniques (green)", 0); //Menu footer addlinetomenu(ent, " ", 0); addlinetomenu(ent, " Previous", 40); addlinetomenu(ent, " Exit", 666); //Set handler setmenuhandler(ent, ShowSecondaryMenu_handler); //Set current line ent->client->menustorage.currentline = 10; //Display the menu showmenu(ent); }
void ShowCommandsMenu(edict_t *ent) { //Usual menu stuff if (!ShowMenu(ent)) return; clearmenu(ent); //Print header // xxxxxxxxxxxxxxxxxxxxxxxxxxx (max length 27 chars) addlinetomenu(ent, "Standard Vortex Commands:", MENU_GREEN_LEFT); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " set vrx_password <pass> u", 0); addlinetomenu(ent, " email <address>", 0); addlinetomenu(ent, " upgrade_weapon", 0); addlinetomenu(ent, " upgrade_ability", 0); addlinetomenu(ent, " vrxarmory", 0); addlinetomenu(ent, " vrxrespawn", 0); addlinetomenu(ent, " vrxinfo", 0); addlinetomenu(ent, " rune", 0); addlinetomenu(ent, " vote", 0); addlinetomenu(ent, " vrxid", 0); addlinetomenu(ent, " use tball [self]", 0); addlinetomenu(ent, " togglesecondary", 0); //Menu footer addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Previous", 20); addlinetomenu(ent, "Exit", 666); //Set handler setmenuhandler(ent, ShowSecondaryMenu_handler); //Set current line ent->client->menustorage.currentline = 16; //Display the menu showmenu(ent); }
void OpenDOMJoinMenu (edict_t *ent) { if (debuginfo->value) gi.dprintf("DEBUG: OpenDOMJoinMenu()\n"); if (!ShowMenu(ent)) return; // new character if (!ent->myskills.class_num) { OpenClassMenu(ent, 1); return; } clearmenu(ent); if (!ent->myskills.administrator && !InJoinedQueue(ent) && (level.time > pregame_time->value)) { // xxxxxxxxxxxxxxxxxxxxxxxxxxx (max length 27 chars) addlinetomenu(ent, "Vortex Domination:", MENU_GREEN_CENTERED); addlinetomenu(ent, " ", 0); addlinetomenu(ent, "The match has already", 0); addlinetomenu(ent, "begun. You will be joined", 0); addlinetomenu(ent, "automatically when the", 0); addlinetomenu(ent, "flag is dropped.", 0); addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Exit", 3); setmenuhandler(ent, jointeam_handler); ent->client->menustorage.currentline = 8; showmenu(ent); // indicate that the player wants to join ent->client->waiting_to_join = true; ent->client->waiting_time = level.time; return; } addlinetomenu(ent, "Vortex Domination:", MENU_GREEN_CENTERED); addlinetomenu(ent, " ", 0); // xxxxxxxxxxxxxxxxxxxxxxxxxxx (max length 27 chars) addlinetomenu(ent, "Your goal is to help your", 0); addlinetomenu(ent, "team capture the flag.", 0); addlinetomenu(ent, "While your team is in", 0); addlinetomenu(ent, "control of the flag, you", 0); addlinetomenu(ent, "gain points. Protect your", 0); addlinetomenu(ent, "flag carrier! Don't let", 0); addlinetomenu(ent, "the flag into enemy hands.", 0); addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Join", 1); addlinetomenu(ent, "Back", 2); addlinetomenu(ent, "Exit", 3); setmenuhandler(ent, jointeam_handler); ent->client->menustorage.currentline = 11; showmenu(ent); }
void OpenArmoryMenu (edict_t *ent) { if (!ShowMenu(ent)) return; clearmenu(ent); addlinetomenu(ent, "The Armory", MENU_GREEN_CENTERED); addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Welcome to the Armory!", 0); addlinetomenu(ent, "Select the item you want", 0); addlinetomenu(ent, "to purchase from the", 0); addlinetomenu(ent, va("Armory. You have %d", ent->myskills.credits), 0); addlinetomenu(ent, "credits.", 0); addlinetomenu(ent, " ", 0); if (level.time < pregame_time->value) addlinetomenu(ent, "Buy", 1); addlinetomenu(ent, "Buy Runes", 2); addlinetomenu(ent, "Sell", 3); addlinetomenu(ent, "Exit", 4); setmenuhandler(ent, armorymenu_handler); ent->client->menustorage.currentline = 9; showmenu(ent); }
void OpenBuyRuneMenu(edict_t *ent, int page_num, int lastline) { int i; armoryRune_t *firstItem; //Usual menu stuff if (!ShowMenu(ent)) return; clearmenu(ent); //Header addlinetomenu(ent, va("You have %d credits", ent->myskills.credits), MENU_GREEN_CENTERED); addlinetomenu(ent, "Please make a selection:", MENU_GREEN_CENTERED); addlinetomenu(ent, " ", 0); switch(page_num) { case 1: firstItem = WeaponRunes; break; case 2: firstItem = AbilityRunes; break; case 3: firstItem = ComboRunes; break; default: gi.dprintf("Error in OpenBuyRuneMenu(). Invalid page number: %d\n", page_num); return; } //Print this page's items for (i = 0; i < ARMORY_MAX_RUNES; ++i) { item_t *rune = &((firstItem + i)->rune); if (rune->itemtype != ITEM_NONE) { char buf[32]; strcpy(buf, V_MenuItemString(rune, ' ')); padRight(buf, 18); addlinetomenu(ent, va("%s%d", buf, getBuyValue(rune)), (page_num * 1000) + i + 1); } else { switch(page_num) { case 1: addlinetomenu(ent, " <Empty Weapon Slot>", 0); break; case 2: addlinetomenu(ent, " <Empty Ability Slot>", 0); break; case 3: addlinetomenu(ent, " <Empty Combo Slot>", 0); break; } } } //Footer addlinetomenu(ent, " ", 0); if (page_num < 3) addlinetomenu(ent, "Next", (page_num*10)+2); addlinetomenu(ent, "Back", (page_num*10)+1); addlinetomenu(ent, "Exit", 99); //Menu handler setmenuhandler(ent, BuyRuneMenu_handler); //Set the menu cursor if (lastline) ent->client->menustorage.currentline = 4 + lastline; else ent->client->menustorage.currentline = 15; //Show the menu showmenu(ent); }
void ShowModeHelpMenu(edict_t *ent) { //Usual menu stuff if (!ShowMenu(ent)) return; clearmenu(ent); //Print header // xxxxxxxxxxxxxxxxxxxxxxxxxxx (max length 27 chars) addlinetomenu(ent, "Game modes:", MENU_GREEN_LEFT); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " Player Vs. Player (PvP)", 0); addlinetomenu(ent, " Player Vs. Monters (PvM)", 0); addlinetomenu(ent, " Domination (DOM)", 0); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " Domination is a variation", 0); addlinetomenu(ent, " of capture the flag.", 0); addlinetomenu(ent, " Protect your flag runner!", 0); //Menu footer addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Previous", 80); addlinetomenu(ent, "Exit", 666); //Set handler setmenuhandler(ent, ShowSecondaryMenu_handler); //Set current line ent->client->menustorage.currentline = 11; //Display the menu showmenu(ent); }
void ShowBasicsMenu(edict_t *ent) { //Usual menu stuff if (!ShowMenu(ent)) return; clearmenu(ent); //Print header // xxxxxxxxxxxxxxxxxxxxxxxxxxx (max length 27 chars) addlinetomenu(ent, " ", 0); addlinetomenu(ent, " To find out more about the", 0); addlinetomenu(ent, " basics of Vortex, go", 0); addlinetomenu(ent, " visit our website at:", 0); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " www.project-vortex.com", MENU_GREEN_CENTERED); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " There is too much info", 0); addlinetomenu(ent, " to show in this menu.", 0); //Menu footer addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Previous", 10); addlinetomenu(ent, "Exit", 666); //Set handler setmenuhandler(ent, ShowSecondaryMenu_handler); //Set current line ent->client->menustorage.currentline = 11; //Display the menu showmenu(ent); }
void ShowVoteHelpMenu(edict_t *ent) { //Usual menu stuff if (!ShowMenu(ent)) return; clearmenu(ent); //Print header // xxxxxxxxxxxxxxxxxxxxxxxxxxx (max length 27 chars) addlinetomenu(ent, "Voting", MENU_GREEN_LEFT); addlinetomenu(ent, " ", 0); addlinetomenu(ent, " To vote for the next game", 0); addlinetomenu(ent, " and map, use the command:", 0); addlinetomenu(ent, " vote. You must vote for", 0); addlinetomenu(ent, " both a game mode and ", 0); addlinetomenu(ent, " a map in order for your", 0); addlinetomenu(ent, " vote to be recorded.", 0); //Menu footer addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Previous", 70); addlinetomenu(ent, "Exit", 666); //Set handler setmenuhandler(ent, ShowSecondaryMenu_handler); //Set current line ent->client->menustorage.currentline = 10; //Display the menu showmenu(ent); }
void ShowHelpMenu(edict_t *ent, int lastpick) { //Usual menu stuff if (!ShowMenu(ent)) return; clearmenu(ent); //Print header addlinetomenu(ent, "Choose a help topic:", MENU_GREEN_LEFT); addlinetomenu(ent, " ", 0); // xxxxxxxxxxxxxxxxxxxxxxxxxxx (max length 27 chars) addlinetomenu(ent, " Basics", 10); addlinetomenu(ent, " Standard commands", 20); addlinetomenu(ent, " Print full command list", 30); addlinetomenu(ent, " Rune Types", 40); addlinetomenu(ent, " Consumable items", 50); addlinetomenu(ent, " Trading", 60); addlinetomenu(ent, " Voting", 70); addlinetomenu(ent, " Game modes", 80); //Menu footer addlinetomenu(ent, " ", 0); addlinetomenu(ent, "Exit", 666); //Set handler setmenuhandler(ent, ShowHelpMenu_handler); //Set current line if (lastpick) ent->client->menustorage.currentline = (lastpick / 10) + 2; else ent->client->menustorage.currentline = 12; //Display the menu showmenu(ent); }