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 SetTemplateTalents(Player* player, std::string& playerSpecStr) { QueryResult select = CharacterDatabase.PQuery("SELECT talentId FROM template_npc_talents WHERE playerClass = '%s' AND " "playerSpec = '%s';", GetClassString(player).c_str(), playerSpecStr.c_str()); if (!select) { return; } else { do { Field* fields = select->Fetch(); uint32 talentId = fields[0].GetUInt32(); player->learnSpell(talentId, false); player->AddTalent(talentId, player->GetActiveSpec(), true); } while (select->NextRow()); player->SetFreeTalentPoints(0); player->SendTalentsInfoData(false); } }
void DeathmatchScoreboardMessage (edict_t *ent, edict_t *killer) { char entry[MAX_ENTRY_SIZE]; char string[MAX_STRING_SIZE]; char name[20], classname[20];//3.78 int stringlength; int i, j, k; int sorted[MAX_CLIENTS]; int sortedscores[MAX_CLIENTS]; int score, total, highscore=0; int y; //float accuracy; int time_left=999, frag_left=999; gclient_t *cl; edict_t *cl_ent; // if we are looking at the scoreboard or inventory, deactivate the scanner if (ent->client->showscores || ent->client->showinventory) { if (ent->client->pers.scanner_active) ent->client->pers.scanner_active = 2; } else { *string = 0; // Scanner active ? if (ent->client->pers.scanner_active & 1) ShowScanner(ent,string); // normal quake code ... gi.WriteByte (svc_layout); gi.WriteString (string); return; } // sort the clients by score total = 0; for (i=0 ; i<game.maxclients ; i++) { cl_ent = g_edicts + 1 + i; //3.0 scoreboard code fix if (!cl_ent->client || !cl_ent->inuse || cl_ent->client->resp.spectator) continue; score = game.clients[i].resp.score; for (j=0 ; j<total ; j++) { if (score > sortedscores[j]) break; } for (k=total ; k>j ; k--) { sorted[k] = sorted[k-1]; sortedscores[k] = sortedscores[k-1]; } sorted[j] = i; sortedscores[j] = score; total++; } // print level name and exit rules string[0] = 0; stringlength = strlen(string); // make a header for the data //K03 Begin if (timelimit->value) time_left = (timelimit->value*60 - level.time); else time_left = 60*99; if (fraglimit->value) frag_left = (fraglimit->value - V_HighestFragScore()); if (time_left < 0) time_left = 0; Com_sprintf(entry, sizeof(entry), "xv 0 yv 16 string2 \"Time:%2im %2is Frags:%3i Players:%3i\" " "xv 0 yv 24 string2 \"Name Lv Cl Score Frg Spr Png\" ", (int)(time_left/60), (int)(time_left-(int)((time_left/60)*60)), frag_left, total_players()); //K03 End j = strlen(entry); //gi.dprintf("header string length=%d\n", j); if (stringlength + j < MAX_ENTRY_SIZE) { strcpy (string + stringlength, entry); stringlength += j; } // add the clients in sorted order if (total > 24) total = 24; /* The screen is only so big :( */ for (i=0 ; i<total ; i++) { cl = &game.clients[sorted[i]]; cl_ent = g_edicts + 1 + sorted[i]; if (!cl_ent) continue; y = 34 + 8 * i; // 3.78 truncate client's name and class string strcpy(name, V_TruncateString(cl->pers.netname, 11)); strcpy(classname, V_TruncateString(GetClassString(cl_ent->myskills.class_num), 3)); padRight(name, 10); Com_sprintf(entry, sizeof(entry), "xv 0 yv %i string \"%s %2i %s %5i %3i %3i %3i\" ", y, name, cl_ent->myskills.level, classname, cl->resp.score, cl->resp.frags, cl_ent->myskills.streak, cl->ping); j = strlen(entry); //gi.dprintf("player string length=%d\n", j); if (stringlength + j > MAX_ENTRY_SIZE) break; strcpy (string + stringlength, entry); stringlength += j; } gi.WriteByte (svc_layout); gi.WriteString (string); }
void EquipFullTemplateGear(Player* player, std::string& playerSpecStr) // Merge { if (CanEquipTemplate(player, playerSpecStr) == false) { player->GetSession()->SendAreaTriggerMessage("There's no templates for %s specialization yet.", playerSpecStr.c_str()); return; } EquipTmpGear(player, playerSpecStr); SetTemplateTalents(player, playerSpecStr); SetTemplateGlyphs(player, playerSpecStr); LearnPlateMailSpells(player); LearnWeaponSkills(player); player->GetSession()->SendAreaTriggerMessage("Successfuly equipped %s %s template!", playerSpecStr.c_str(), GetClassString(player).c_str()); }
void EquipTmpGear(Player* player, std::string& playerSpecStr) { if (player->getRace() == RACE_HUMAN) { for (uint8 equipmentSlot = EQUIPMENT_SLOT_START; equipmentSlot < EQUIPMENT_SLOT_END; ++equipmentSlot) { QueryResult result = CharacterDatabase.PQuery("SELECT itemEntry, enchant, socket1, socket2, socket3, bonusEnchant, prismaticEnchant " "FROM template_npc_human WHERE playerClass = '%s' AND playerSpec = '%s' AND pos = '%u';", GetClassString(player).c_str(), playerSpecStr.c_str(), equipmentSlot); if (!result) continue; Field* fields = result->Fetch(); uint32 itemEntry = fields[0].GetUInt32(); uint32 enchant = fields[1].GetUInt32(); uint32 socket1 = fields[2].GetUInt32(); uint32 socket2 = fields[3].GetUInt32(); uint32 socket3 = fields[4].GetUInt32(); uint32 bonusEnchant = fields[5].GetUInt32(); uint32 prismaticEnchant = fields[6].GetUInt32(); // Equip Gear player->EquipNewItem(equipmentSlot, itemEntry, true); // Apply Enchants and Gems ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), PERM_ENCHANTMENT_SLOT, enchant); ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), SOCK_ENCHANTMENT_SLOT, socket1); ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), SOCK_ENCHANTMENT_SLOT_2, socket2); ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), SOCK_ENCHANTMENT_SLOT_3, socket3); ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), BONUS_ENCHANTMENT_SLOT, bonusEnchant); ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), PRISMATIC_ENCHANTMENT_SLOT, prismaticEnchant); } } else if (player->GetTeam() == ALLIANCE && player->getRace() != RACE_HUMAN) { for (uint8 equipmentSlot = EQUIPMENT_SLOT_START; equipmentSlot < EQUIPMENT_SLOT_END; ++equipmentSlot) { QueryResult result = CharacterDatabase.PQuery("SELECT itemEntry, enchant, socket1, socket2, socket3, bonusEnchant, prismaticEnchant " "FROM template_npc_alliance WHERE playerClass = '%s' AND playerSpec = '%s' AND pos = '%u';", GetClassString(player).c_str(), playerSpecStr.c_str(), equipmentSlot); if (!result) continue; Field* fields = result->Fetch(); uint32 itemEntry = fields[0].GetUInt32(); uint32 enchant = fields[1].GetUInt32(); uint32 socket1 = fields[2].GetUInt32(); uint32 socket2 = fields[3].GetUInt32(); uint32 socket3 = fields[4].GetUInt32(); uint32 bonusEnchant = fields[5].GetUInt32(); uint32 prismaticEnchant = fields[6].GetUInt32(); // Equip Gear player->EquipNewItem(equipmentSlot, itemEntry, true); // Apply Enchants and Gems ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), PERM_ENCHANTMENT_SLOT, enchant); ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), SOCK_ENCHANTMENT_SLOT, socket1); ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), SOCK_ENCHANTMENT_SLOT_2, socket2); ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), SOCK_ENCHANTMENT_SLOT_3, socket3); ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), BONUS_ENCHANTMENT_SLOT, bonusEnchant); ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), PRISMATIC_ENCHANTMENT_SLOT, prismaticEnchant); } } else if (player->GetTeam() == HORDE) { for (uint8 equipmentSlot = EQUIPMENT_SLOT_START; equipmentSlot < EQUIPMENT_SLOT_END; ++equipmentSlot) { QueryResult result = CharacterDatabase.PQuery("SELECT itemEntry, enchant, socket1, socket2, socket3, bonusEnchant, prismaticEnchant " "FROM template_npc_horde WHERE playerClass = '%s' AND playerSpec = '%s' AND pos = '%u';", GetClassString(player).c_str(), playerSpecStr.c_str(), equipmentSlot); if (!result) continue; Field* fields = result->Fetch(); uint32 itemEntry = fields[0].GetUInt32(); uint32 enchant = fields[1].GetUInt32(); uint32 socket1 = fields[2].GetUInt32(); uint32 socket2 = fields[3].GetUInt32(); uint32 socket3 = fields[4].GetUInt32(); uint32 bonusEnchant = fields[5].GetUInt32(); uint32 prismaticEnchant = fields[6].GetUInt32(); // Equip Gear player->EquipNewItem(equipmentSlot, itemEntry, true); // Apply Enchants and Gems ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), PERM_ENCHANTMENT_SLOT, enchant); ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), SOCK_ENCHANTMENT_SLOT, socket1); ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), SOCK_ENCHANTMENT_SLOT_2, socket2); ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), SOCK_ENCHANTMENT_SLOT_3, socket3); ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), BONUS_ENCHANTMENT_SLOT, bonusEnchant); ApplyBonus(player, player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipmentSlot), PRISMATIC_ENCHANTMENT_SLOT, prismaticEnchant); } } }
void SetTemplateGlyphs(Player* player, std::string& playerSpecStr) { for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot) { QueryResult result = CharacterDatabase.PQuery("SELECT glyph FROM template_npc_glyphs " "WHERE playerClass = '%s' AND playerSpec = '%s' AND slot = '%u';", GetClassString(player).c_str(), playerSpecStr.c_str(), slot); if (!result) continue; Field* fields = result->Fetch(); uint32 glyph = fields[0].GetUInt32(); ApplyGlyph(player, slot, glyph); } player->SendTalentsInfoData(false); }