// Enables or disables hiding of the staff badge static bool HandleGMChatCommand(ChatHandler* handler, char const* args) { if (!*args) { WorldSession* session = handler->GetSession(); if (!AccountMgr::IsPlayerAccount(session->GetSecurity()) && session->GetPlayer()->isGMChat()) session->SendNotification(LANG_GM_CHAT_ON); else session->SendNotification(LANG_GM_CHAT_OFF); return true; } std::string param = (char*)args; if (param == "on") { handler->GetSession()->GetPlayer()->SetGMChat(true); handler->GetSession()->SendNotification(LANG_GM_CHAT_ON); return true; } if (param == "off") { handler->GetSession()->GetPlayer()->SetGMChat(false); handler->GetSession()->SendNotification(LANG_GM_CHAT_OFF); return true; } handler->SendSysMessage(LANG_USE_BOL); handler->SetSentErrorMessage(true); return false; }
static bool HandleLogCommand(ChatHandler* handler, const char* args) { WorldSession * Session = handler->GetSession(); Player* player = Session->GetPlayer(); uint32 RLimit = 10; if((char*)args) RLimit = atoi((char*)args); if(RLimit == 0 || RLimit > 100) RLimit = 10; QueryResult result = WorldDatabase.PQuery("SELECT * FROM `anti-farm log` LIMIT %u", RLimit); if(!result) { Session->SendNotification("There are no records"); return false; } Field * fields = NULL; do{ fields = result->Fetch(); uint32 ID = fields[0].GetUInt32(); std::string Character = fields[1].GetString(); std::string Account = fields[2].GetString(); uint32 Warning = fields[3].GetUInt32(); char msg[250]; snprintf(msg, 250, "ID : %u Character : %s Account : %s Warning Level : %u \n" , ID, Character.c_str(), Account.c_str(), Warning); handler->PSendSysMessage (msg); handler->SetSentErrorMessage (true); } while(result->NextRow()); return true; }
static bool HandleDeleteAllCommand(ChatHandler* handler, const char* args) { WorldSession * Session = handler->GetSession(); Player* player = Session->GetPlayer(); WorldDatabase.Execute("DELETE FROM `anti-farm log`"); QueryResult result = WorldDatabase.Query("SELECT `ID` FROM `anti-farm log`"); if(result) { Session->SendNotification("Deletion failed"); return false; } else { Session->SendAreaTriggerMessage("Deletion successful!"); return true; } return true; }
static bool HandleDeleteIDCommand(ChatHandler* handler, const char* args) { if(!*args) return false; WorldSession * Session = handler->GetSession(); Player* player = Session->GetPlayer(); uint32 ID = atoi((char*)args); QueryResult result = WorldDatabase.PQuery("SELECT * FROM `anti-farm log` WHERE `ID` = %u", ID); if(!result) { char msg [250]; snprintf(msg, 250, "Log with Log ID : %u doesn't exist", ID); Session->SendNotification(msg); return false; } WorldDatabase.PExecute("DELETE FROM `anti-farm log` WHERE `ID` = %u", ID); Session->SendAreaTriggerMessage("Deletion of Log ID : %u Successful!", ID); return true; }
static bool HandleLogCommand(ChatHandler* handler, const char* args) { WorldSession * Session = handler->GetSession(); Player* player = Session->GetPlayer(); uint32 RLimit = 10; if((char*)args) RLimit = atoi((char*)args); if(RLimit == 0 || RLimit > 100) RLimit = 10; QueryResult result = WorldDatabase.PQuery("SELECT * FROM `anti-farm log` LIMIT %u", RLimit); if(!result) { Session->SendNotification("There are no records"); return false; } Field * fields = NULL; do{ uint32 ID = (*result)[0].GetUInt32(); uint32 guid = (*result)[1].GetUInt32(); uint32 Warning = (*result)[2].GetUInt32(); QueryResult nameResult = CharacterDatabase.PQuery("SELECT name FROM characters WHERE guid = %u", guid); if (nameResult) { const char * name = (*nameResult)[0].GetCString(); char msg[250]; snprintf(msg,250, "ID: %u Character: %s Warning Level: %u\n", ID, name, Warning); handler->PSendSysMessage(msg); handler->SetSentErrorMessage(true); } else { char msg[250]; snprintf(msg, 250, "ID: %u Character: %u Warning Level: %u \n" , ID, guid, Warning); handler->PSendSysMessage (msg); handler->SetSentErrorMessage (true); } } while(result->NextRow()); return true; }
bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) { player->PlayerTalkClass->ClearMenus(); WorldSession* session = player->GetSession(); switch(sender) { case EQUIPMENT_SLOT_END: // Show items you can use ShowTransmogItems(player, creature, action); break; case EQUIPMENT_SLOT_END+1: // Main menu OnGossipHello(player, creature); break; case EQUIPMENT_SLOT_END+2: // Remove Transmogrifications { bool removed = false; SQLTransaction trans = CharacterDatabase.BeginTransaction(); for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot) { if (Item* newItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot)) { if (!sT->GetFakeEntry(newItem->GetGUID())) continue; sT->DeleteFakeEntry(player, slot, newItem, &trans); removed = true; } } if (removed) { session->SendAreaTriggerMessage(GTS(LANG_ERR_UNTRANSMOG_OK)); CharacterDatabase.CommitTransaction(trans); } else session->SendNotification(LANG_ERR_UNTRANSMOG_NO_TRANSMOGS); OnGossipHello(player, creature); } break; case EQUIPMENT_SLOT_END+3: // Remove Transmogrification from single item { if (Item* newItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, action)) { if (sT->GetFakeEntry(newItem->GetGUID())) { sT->DeleteFakeEntry(player, action, newItem); session->SendAreaTriggerMessage(GTS(LANG_ERR_UNTRANSMOG_OK)); } else session->SendNotification(LANG_ERR_UNTRANSMOG_NO_TRANSMOGS); } OnGossipSelect(player, creature, EQUIPMENT_SLOT_END, action); } break; #ifdef PRESETS case EQUIPMENT_SLOT_END+4: // Presets menu { if (!sT->GetEnableSets()) { OnGossipHello(player, creature); return true; } if (sT->GetEnableSetInfo()) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_MONEY_BAG, "|TInterface/ICONS/INV_Misc_Book_11:30:30:-18:0|tHow sets work", EQUIPMENT_SLOT_END+10, 0); for (Transmogrification::presetIdMap::const_iterator it = sT->presetByName[player->GetGUID()].begin(); it != sT->presetByName[player->GetGUID()].end(); ++it) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_MONEY_BAG, "|TInterface/ICONS/INV_Misc_Statue_02:30:30:-18:0|t"+it->second, EQUIPMENT_SLOT_END+6, it->first); if (sT->presetByName[player->GetGUID()].size() < sT->GetMaxSets()) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_MONEY_BAG, "|TInterface/GuildBankFrame/UI-GuildBankFrame-NewTab:30:30:-18:0|tSave set", EQUIPMENT_SLOT_END+8, 0); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_MONEY_BAG, "|TInterface/ICONS/Ability_Spy:30:30:-18:0|tBack..", EQUIPMENT_SLOT_END+1, 0); player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); } break; case EQUIPMENT_SLOT_END+5: // Use preset { if (!sT->GetEnableSets()) { OnGossipHello(player, creature); return true; } // action = presetID for (Transmogrification::slotMap::const_iterator it = sT->presetById[player->GetGUID()][action].begin(); it != sT->presetById[player->GetGUID()][action].end(); ++it) { if (Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, it->first)) sT->PresetTransmog(player, item, it->second, it->first); } OnGossipSelect(player, creature, EQUIPMENT_SLOT_END+6, action); } break; case EQUIPMENT_SLOT_END+6: // view preset { if (!sT->GetEnableSets()) { OnGossipHello(player, creature); return true; } // action = presetID for (Transmogrification::slotMap::const_iterator it = sT->presetById[player->GetGUID()][action].begin(); it != sT->presetById[player->GetGUID()][action].end(); ++it) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_MONEY_BAG, sT->GetItemIcon(it->second, 30, 30, -18, 0)+sT->GetItemLink(it->second, session), sender, action); player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_MONEY_BAG, "|TInterface/ICONS/INV_Misc_Statue_02:30:30:-18:0|tUse set", EQUIPMENT_SLOT_END+5, action, "Using this set for transmogrify will bind transmogrified items to you and make them non-refundable and non-tradeable.\nDo you wish to continue?\n\n"+sT->presetByName[player->GetGUID()][action], 0, false); player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_MONEY_BAG, "|TInterface/PaperDollInfoFrame/UI-GearManager-LeaveItem-Opaque:30:30:-18:0|tDelete set", EQUIPMENT_SLOT_END+7, action, "Are you sure you want to delete "+sT->presetByName[player->GetGUID()][action]+"?", 0, false); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_MONEY_BAG, "|TInterface/ICONS/Ability_Spy:30:30:-18:0|tBack..", EQUIPMENT_SLOT_END+4, 0); player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); } break; case EQUIPMENT_SLOT_END+7: // Delete preset { if (!sT->GetEnableSets()) { OnGossipHello(player, creature); return true; } // action = presetID CharacterDatabase.PExecute("DELETE FROM `custom_transmogrification_sets` WHERE Owner = %u AND PresetID = %u", player->GetGUIDLow(), action); sT->presetById[player->GetGUID()][action].clear(); sT->presetById[player->GetGUID()].erase(action); sT->presetByName[player->GetGUID()].erase(action); OnGossipSelect(player, creature, EQUIPMENT_SLOT_END+4, 0); } break; case EQUIPMENT_SLOT_END+8: // Save preset { if (!sT->GetEnableSets() || sT->presetByName[player->GetGUID()].size() >= sT->GetMaxSets()) { OnGossipHello(player, creature); return true; } uint32 cost = 0; bool canSave = false; for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot) { if (!sT->GetSlotName(slot, session)) continue; if (Item* newItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot)) { uint32 entry = sT->GetFakeEntry(newItem->GetGUID()); if (!entry) continue; const ItemTemplate* temp = sObjectMgr->GetItemTemplate(entry); if (!temp) continue; if (!sT->SuitableForTransmogrification(player, temp)) // no need to check? continue; cost += sT->GetSpecialPrice(temp); canSave = true; player->ADD_GOSSIP_ITEM(GOSSIP_ICON_MONEY_BAG, sT->GetItemIcon(entry, 30, 30, -18, 0)+sT->GetItemLink(entry, session), EQUIPMENT_SLOT_END+8, 0); } } if (canSave) player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_MONEY_BAG, "|TInterface/GuildBankFrame/UI-GuildBankFrame-NewTab:30:30:-18:0|tSave set", 0, 0, "Insert set name", cost*sT->GetSetCostModifier()+sT->GetSetCopperCost(), true); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_MONEY_BAG, "|TInterface/PaperDollInfoFrame/UI-GearManager-Undo:30:30:-18:0|tUpdate menu", sender, action); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_MONEY_BAG, "|TInterface/ICONS/Ability_Spy:30:30:-18:0|tBack..", EQUIPMENT_SLOT_END+4, 0); player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); } break; case EQUIPMENT_SLOT_END+10: // Set info { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_MONEY_BAG, "|TInterface/ICONS/Ability_Spy:30:30:-18:0|tBack..", EQUIPMENT_SLOT_END+4, 0); player->SEND_GOSSIP_MENU(sT->GetSetNpcText(), creature->GetGUID()); } break; #endif case EQUIPMENT_SLOT_END+9: // Transmog info { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_MONEY_BAG, "|TInterface/ICONS/Ability_Spy:30:30:-18:0|tBack..", EQUIPMENT_SLOT_END+1, 0); player->SEND_GOSSIP_MENU(sT->GetTransmogNpcText(), creature->GetGUID()); } break; default: // Transmogrify { if (!sender && !action) { OnGossipHello(player, creature); return true; } // sender = slot, action = display TransmogTrinityStrings res = sT->Transmogrify(player, MAKE_NEW_GUID(action, 0, HIGHGUID_ITEM), sender); if (res == LANG_ERR_TRANSMOG_OK) session->SendAreaTriggerMessage(GTS(LANG_ERR_TRANSMOG_OK)); else session->SendNotification(res); // OnGossipSelect(player, creature, EQUIPMENT_SLOT_END, sender); // ShowTransmogItems(player, creature, sender); player->CLOSE_GOSSIP_MENU(); // Wait for SetMoney to get fixed, issue #10053 } break; } return true; }
bool OnGossipSelect(Player* Player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) { WorldSession* ws = Player->GetSession(); switch (uiAction) { case ACTION_TITLE_PRIVATE: { if (GetTotalKill(Player) >= 10) Player->SetTitle(sCharTitlesStore.LookupEntry(1)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_CORPORAL: { if (GetTotalKill(Player) >= 50) Player->SetTitle(sCharTitlesStore.LookupEntry(2)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_SERGEANT: { if (GetTotalKill(Player) >= 100) Player->SetTitle(sCharTitlesStore.LookupEntry(3)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_MASTER_SERGEANT: { if (GetTotalKill(Player) >= 200) Player->SetTitle(sCharTitlesStore.LookupEntry(4)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_SERGEANT_MAJOR: { if (GetTotalKill(Player) >= 400) Player->SetTitle(sCharTitlesStore.LookupEntry(5)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_KNIGHT: { if (GetTotalKill(Player) >= 500) Player->SetTitle(sCharTitlesStore.LookupEntry(6)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_KNIGHT_LIEUTENANT: { if (GetTotalKill(Player) >= 600) Player->SetTitle(sCharTitlesStore.LookupEntry(7)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_KNIGHT_CAPTAIN: { if (GetTotalKill(Player) >= 800) Player->SetTitle(sCharTitlesStore.LookupEntry(8)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_KNIGHT_CHAMPION: { if (GetTotalKill(Player) >= 1000) Player->SetTitle(sCharTitlesStore.LookupEntry(9)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_LIEUTENANT_COMMANDER: { if (GetTotalKill(Player) >= 1500) Player->SetTitle(sCharTitlesStore.LookupEntry(10)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_COMMANDER: { if (GetTotalKill(Player) >= 2500) Player->SetTitle(sCharTitlesStore.LookupEntry(11)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_MARSHAL: { if (GetTotalKill(Player) >= 4000) Player->SetTitle(sCharTitlesStore.LookupEntry(12)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_FIELD_MARSHAL: { if (GetTotalKill(Player) >= 4500) Player->SetTitle(sCharTitlesStore.LookupEntry(13)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_GRAND_MARSHAL: { if (GetTotalKill(Player) >= 5500) Player->SetTitle(sCharTitlesStore.LookupEntry(14)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_SCOUT: { if (GetTotalKill(Player) >= 10) Player->SetTitle(sCharTitlesStore.LookupEntry(15)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_GRUNT: { if (GetTotalKill(Player) >= 50) Player->SetTitle(sCharTitlesStore.LookupEntry(16)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_SERGEANT_H: { if (GetTotalKill(Player) >= 100) Player->SetTitle(sCharTitlesStore.LookupEntry(17)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_SENIOR_SERGEANT: { if (GetTotalKill(Player) >= 200) Player->SetTitle(sCharTitlesStore.LookupEntry(18)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_FIRST_SERGEANT: { if (GetTotalKill(Player) >= 400) Player->SetTitle(sCharTitlesStore.LookupEntry(19)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_STONE_GUARD: { if (GetTotalKill(Player) >= 500) Player->SetTitle(sCharTitlesStore.LookupEntry(20)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_BLOOD_GUARD: { if (GetTotalKill(Player) >= 600) Player->SetTitle(sCharTitlesStore.LookupEntry(21)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_LEGIONNAIRE: { if (GetTotalKill(Player) >= 800) Player->SetTitle(sCharTitlesStore.LookupEntry(22)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_CENTURION: { if (GetTotalKill(Player) >= 1000) Player->SetTitle(sCharTitlesStore.LookupEntry(23)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_CHAMPION: { if (GetTotalKill(Player) >= 1500) Player->SetTitle(sCharTitlesStore.LookupEntry(24)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_LIEUTENANT_GENERAL: { if (GetTotalKill(Player) >= 2500) Player->SetTitle(sCharTitlesStore.LookupEntry(25)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_GENERAL: { if (GetTotalKill(Player) >= 4000) Player->SetTitle(sCharTitlesStore.LookupEntry(26)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_WARLORD: { if (GetTotalKill(Player) >= 4500) Player->SetTitle(sCharTitlesStore.LookupEntry(27)); else ws->SendNotification("You dont have enough kills"); } break; case ACTION_TITLE_HIGH_WARLORD: { if (GetTotalKill(Player) >= 5500) Player->SetTitle(sCharTitlesStore.LookupEntry(28)); else ws->SendNotification("You dont have enough kills"); } break; Player->PlayerTalkClass->SendCloseGossip(); } return true; }
bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 uiAction) { WorldSession* session = player->GetSession(); player->PlayerTalkClass->ClearMenus(); switch(sender) { case EQUIPMENT_SLOT_END: // Show items you can use { if (Item* oldItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, uiAction)) { uint32 lowGUID = player->GetGUIDLow(); _items[lowGUID].clear(); uint32 limit = 0; uint32 price = 0; switch (sTransmogrification->GetRequireGold()) { case 1: { price = (unsigned int)(GetFakePrice(oldItem)*sTransmogrification->GetGoldModifier()); } break; case 2: { price = (unsigned int)sTransmogrification->GetGoldCost(); } break; } char tokenCost[250] = "\n"; if(sTransmogrification->GetRequireToken()) snprintf(tokenCost, 250, "\n\n%u x %s", sTransmogrification->GetTokenAmount(), GetItemName(sObjectMgr->GetItemTemplate(sTransmogrification->GetTokenEntry()), session).c_str()); for (uint8 i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; i++) { if (limit > 30) break; if (Item* newItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i)) { uint32 display = newItem->GetTemplate()->DisplayInfoID; if (player->SuitableForTransmogrification(oldItem, newItem) == ERR_FAKE_OK) { if (_items[lowGUID].find(display) == _items[lowGUID].end()) { limit++; _items[lowGUID][display] = newItem; player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, GetItemName(newItem->GetTemplate(), session), uiAction, display, session->GetTrinityString(LANG_POPUP_TRANSMOGRIFY)+GetItemName(newItem->GetTemplate(), session)+tokenCost, price, false); } } } } for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++) { if (Bag* bag = player->GetBagByPos(i)) { for (uint32 j = 0; j < bag->GetBagSize(); j++) { if (limit > 30) break; if (Item* newItem = player->GetItemByPos(i, j)) { uint32 display = newItem->GetTemplate()->DisplayInfoID; if (player->SuitableForTransmogrification(oldItem, newItem) == ERR_FAKE_OK) { if (_items[lowGUID].find(display) == _items[lowGUID].end()) { limit++; _items[lowGUID][display] = newItem; player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, GetItemName(newItem->GetTemplate(), session), uiAction, display, session->GetTrinityString(LANG_POPUP_TRANSMOGRIFY)+GetItemName(newItem->GetTemplate(), session)+tokenCost, price, false); } } } } } } char removeOnePopup[250]; snprintf(removeOnePopup, 250, session->GetTrinityString(LANG_POPUP_REMOVE_ONE), GetSlotName(uiAction, session)); player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, session->GetTrinityString(LANG_OPTION_REMOVE_ONE), EQUIPMENT_SLOT_END+3, uiAction, removeOnePopup, 0, false); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, session->GetTrinityString(LANG_OPTION_BACK), EQUIPMENT_SLOT_END+1, 0); player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); } else OnGossipHello(player, creature); } break; case EQUIPMENT_SLOT_END+1: // Back { OnGossipHello(player, creature); } break; case EQUIPMENT_SLOT_END+2: // Remove Transmogrifications { bool removed = false; for (uint8 Slot = EQUIPMENT_SLOT_START; Slot < EQUIPMENT_SLOT_END; Slot++) { if (Item* newItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, Slot)) { if (newItem->DeleteFakeEntry() && !removed) removed = true; } } if (removed) { session->SendAreaTriggerMessage(session->GetTrinityString(LANG_REM_TRANSMOGRIFICATIONS_ITEMS)); player->PlayDirectSound(3337); } else session->SendNotification(session->GetTrinityString(LANG_ERR_NO_TRANSMOGRIFICATIONS)); OnGossipHello(player, creature); } break; case EQUIPMENT_SLOT_END+3: // Remove Transmogrification from single item { if (Item* newItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, uiAction)) { if (newItem->DeleteFakeEntry()) { session->SendAreaTriggerMessage(session->GetTrinityString(LANG_REM_TRANSMOGRIFICATION_ITEM), GetSlotName(uiAction, session)); player->PlayDirectSound(3337); } else session->SendNotification(session->GetTrinityString(LANG_ERR_NO_TRANSMOGRIFICATION), GetSlotName(uiAction, session)); } OnGossipSelect(player, creature, EQUIPMENT_SLOT_END, uiAction); } break; default: // Transmogrify { uint32 lowGUID = player->GetGUIDLow(); if(!sTransmogrification->GetRequireToken() || player->GetItemCount(sTransmogrification->GetTokenEntry()) >= sTransmogrification->GetTokenAmount()) { if (Item* oldItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, sender)) { if (_items[lowGUID].find(uiAction) != _items[lowGUID].end() && _items[lowGUID][uiAction]->IsInWorld()) { Item* newItem = _items[lowGUID][uiAction]; if (newItem->GetOwnerGUID() == player->GetGUIDLow() && (newItem->IsInBag() || newItem->GetBagSlot() == INVENTORY_SLOT_BAG_0) && player->SuitableForTransmogrification(oldItem, newItem) == ERR_FAKE_OK) { switch(sTransmogrification->GetRequireGold()) { case 1: { player->ModifyMoney(-1*(uint32)(GetFakePrice(oldItem)*sTransmogrification->GetGoldModifier())); } break; case 2: { player->ModifyMoney(-1*(unsigned int)sTransmogrification->GetGoldCost()); } break; } if(sTransmogrification->GetRequireToken()) player->DestroyItemCount(sTransmogrification->GetTokenEntry(), sTransmogrification->GetTokenAmount(), true); oldItem->SetFakeEntry(newItem->GetEntry()); newItem->SetNotRefundable(player); newItem->SetBinding(true); player->PlayDirectSound(3337); session->SendAreaTriggerMessage(session->GetTrinityString(LANG_ITEM_TRANSMOGRIFIED), GetSlotName(sender, session)); } else session->SendNotification(session->GetTrinityString(LANG_ERR_NO_ITEM_SUITABLE)); } else session->SendNotification(session->GetTrinityString(LANG_ERR_NO_ITEM_EXISTS)); } else session->SendNotification(session->GetTrinityString(LANG_ERR_EQUIP_SLOT_EMPTY)); } else session->SendNotification(session->GetTrinityString(LANG_ERR_NO_TOKEN), GetItemName(sObjectMgr->GetItemTemplate(sTransmogrification->GetTokenEntry()), session).c_str()); _items[lowGUID].clear(); OnGossipSelect(player, creature, EQUIPMENT_SLOT_END, sender); } break; } return true; }
bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) { WorldSession* session = player->GetSession(); player->PlayerTalkClass->ClearMenus(); switch(sender) { case SENDER_SELECT_VENDOR: // action = slot { Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, action); if (!item) { if (const char* slotname = getSlotName(action)) session->SendNotification("No item equipped in %s slot", slotname); OnGossipHello(player, creature); return true; } const ItemTemplate * itemTemplate = item->GetTemplate(); optionData* oM = &optionMap[(itemTemplate->Class == ITEM_CLASS_WEAPON ? MAX_ITEM_SUBCLASS_WEAPON : 0)+itemTemplate->SubClass][getCorrectInvType(itemTemplate->InventoryType)]; if (!oM->size()) { if (const char* slotname = getSlotName(action)) session->SendNotification("No transmogrifications available for %s", slotname); OnGossipHello(player, creature); return true; } player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, (std::string)"Update selected; "+getItemName(itemTemplate, session), sender, action); for(optionData::iterator it = oM->begin(); it != oM->end(); ++it) { if (!TransmogDisplayVendorMgr::AllowedQuality(it->first)) // skip not allowed qualities continue; for(uint32 count = 0; count*MAX_VENDOR_ITEMS < it->second.size(); ++count) { std::ostringstream ss; ss << getQualityName(it->first); if (count) ss << " [" << count << "]"; player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, ss.str().c_str(), it->first, count*MAX_VENDOR_ITEMS); } } if (player->PlayerTalkClass->GetGossipMenu().GetMenuItemCount() <= 1) { if (const char* slotname = getSlotName(action)) session->SendNotification("No transmogrifications available for %s", slotname); player->PlayerTalkClass->ClearMenus(); OnGossipHello(player, creature); return true; } selDataStruct temp = {action, 0, 0}; // slot, offset, quality selData[player->GetGUIDLow()] = temp; player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, "Back..", SENDER_BACK, 0); player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); } break; case SENDER_BACK: // Back { OnGossipHello(player, creature); } break; case SENDER_REMOVE_ALL: // Remove TransmogDisplayVendorMgrs { bool removed = false; for (uint8 Slot = EQUIPMENT_SLOT_START; Slot < EQUIPMENT_SLOT_END; Slot++) { if (Item* newItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, Slot)) { if (TransmogDisplayVendorMgr::DeleteFakeEntry(newItem) && !removed) removed = true; } } if (removed) { session->SendAreaTriggerMessage("Transmogrifications removed from equipped items"); player->PlayDirectSound(3337); } else session->SendNotification("You have no transmogrified items equipped"); OnGossipSelect(player, creature, SENDER_REMOVE_MENU, 0); } break; case SENDER_REMOVE_ONE: // Remove TransmogDisplayVendorMgr from single item { const char* slotname = getSlotName(action); if (Item* newItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, action)) { if (TransmogDisplayVendorMgr::DeleteFakeEntry(newItem)) { if (slotname) session->SendAreaTriggerMessage("%s transmogrification removed", slotname); player->PlayDirectSound(3337); } else if (slotname) session->SendNotification("No transmogrification on %s slot", slotname); } else if (slotname) session->SendNotification("No item equipped in %s slot", slotname); OnGossipSelect(player, creature, SENDER_REMOVE_MENU, 0); } break; case SENDER_REMOVE_MENU: { for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; slot++) { const char* slotname = getSlotName(slot); if (!slotname) continue; std::ostringstream ss; ss << "Remove transmogrification from " << slotname << "?"; player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, (std::string)"Remove from "+slotname, SENDER_REMOVE_ONE, slot, ss.str().c_str(), 0, false); } player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "Remove all transmogrifications", SENDER_REMOVE_ALL, 0, "Are you sure you want to remove all transmogrifications?", 0, false); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, "Back..", SENDER_BACK, 0); player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); } break; default: // Show items you can use { if (sender >= MAX_ITEM_QUALITY) // sender = quality, action = iterator return false; // cheat if (selData.find(player->GetGUIDLow()) == selData.end()) return false; // cheat if (selData[player->GetGUIDLow()].offset != 0 || selData[player->GetGUIDLow()].quality != 0) return false; // cheat (something is off) selData[player->GetGUIDLow()].offset = action; selData[player->GetGUIDLow()].quality = sender; uint32 slot = selData[player->GetGUIDLow()].slot; // slot if (Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot)) { if (!TransmogDisplayVendorMgr::AllowedQuality(item->GetTemplate()->Quality)) { session->SendNotification("Equipped item has wrong quality"); OnGossipSelect(player, creature, SENDER_SELECT_VENDOR, slot); return true; } optionDataList oM = optionMap[(item->GetTemplate()->Class == ITEM_CLASS_WEAPON ? MAX_ITEM_SUBCLASS_WEAPON : 0)+item->GetTemplate()->SubClass][getCorrectInvType(item->GetTemplate()->InventoryType)][sender]; uint32 itemCount = (oM.size()-action); if (itemCount > MAX_VENDOR_ITEMS) itemCount = MAX_VENDOR_ITEMS; if (!itemCount) { session->SendAreaTriggerMessage("No items found"); OnGossipSelect(player, creature, SENDER_SELECT_VENDOR, slot); return true; } player->CLOSE_GOSSIP_MENU(); TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: Sent SMSG_LIST_INVENTORY"); Creature* vendor = player->GetNPCIfCanInteractWith(creature->GetGUID(), UNIT_NPC_FLAG_VENDOR); if (!vendor) { TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: SendListInventory - Unit (GUID: %u) not found or you can not interact with him.", creature->GetGUIDLow()); player->SendSellError(SELL_ERR_CANT_FIND_VENDOR, NULL, 0, 0); return true; } if (player->HasUnitState(UNIT_STATE_DIED)) player->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); if (vendor->HasUnitState(UNIT_STATE_MOVING)) vendor->StopMoving(); uint8 count = 0; WorldPacket data(SMSG_LIST_INVENTORY, 8 + 1 + itemCount * 8 * 4); data << uint64(creature->GetGUID()); size_t countPos = data.wpos(); data << uint8(count); bool added = false; optionDataList::iterator it = oM.begin(); std::advance(it, action); for (; it != oM.end() && count < itemCount; ++it, ++count) { if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(*it)) { data << uint32(count + 1); data << uint32(itemTemplate->ItemId); data << uint32(itemTemplate->DisplayInfoID); data << int32(0xFFFFFFFF); data << uint32(0); data << uint32(itemTemplate->MaxDurability); data << uint32(itemTemplate->BuyCount); data << uint32(0); added = true; } } if (!added) { data << uint8(0); session->SendPacket(&data); } else { data.put<uint8>(countPos, count); session->SendPacket(&data); } } else { session->SendNotification("No item equipped"); OnGossipSelect(player, creature, SENDER_SELECT_VENDOR, slot); return true; } } break; } return true; }
void TransmogDisplayVendorMgr::HandleTransmogrify(Player* player, Creature* creature, uint32 vendorslot, uint32 itemEntry) { selDataType::iterator data = selData.find(player->GetGUIDLow()); if (data == selData.end()) return; // cheat, no slot selected const char* slotname = getSlotName(data->second.slot); if (!slotname) return; WorldSession* session = player->GetSession(); Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, data->second.slot); if (!item) { session->SendNotification("Equipment slot is empty"); return; } if (item->GetOwnerGUID() != player->GetGUID()) return; ItemTemplate const * srcTemplate = sObjectMgr->GetItemTemplate(itemEntry); ItemTemplate const * tarTemplate = item->GetTemplate(); optionDataList oM = optionMap[(tarTemplate->Class == ITEM_CLASS_WEAPON ? MAX_ITEM_SUBCLASS_WEAPON : 0)+tarTemplate->SubClass][getCorrectInvType(tarTemplate->InventoryType)][data->second.quality]; optionDataList::iterator it = oM.begin(); std::advance(it, data->second.offset + vendorslot); if (it == oM.end() || (*it) != itemEntry) { session->SendNotification("Items do not match"); return; // either cheat or changed items (not found in correct place in transmog vendor view) } if (!TransmogDisplayVendorMgr::CanTransmogrify(tarTemplate, srcTemplate)) { session->SendNotification("Items do not match"); return; } if (uint32 fakeEntry = GetFakeEntry(item->GetGUIDLow())) { if (const ItemTemplate* fakeItemTemplate = sObjectMgr->GetItemTemplate(fakeEntry)) { if (fakeItemTemplate->DisplayInfoID == srcTemplate->DisplayInfoID) { session->SendAreaTriggerMessage("%s already transmogrified with %s", slotname, getItemName(tarTemplate, session).c_str()); return; } } } if (TransmogDisplayVendorMgr::RequireToken && player->GetItemCount(TransmogDisplayVendorMgr::TokenEntry) < TransmogDisplayVendorMgr::TokenAmount) { session->SendNotification("You don't have enough %ss", getItemName(sObjectMgr->GetItemTemplate(TransmogDisplayVendorMgr::TokenEntry), session).c_str()); return; } int32 price = 0; if (TransmogDisplayVendorMgr::RequireGold) price = getFakePrice(tarTemplate); if (player->HasEnoughMoney(price)) player->ModifyMoney(-price); else { session->SendNotification("You don't have enough money"); return; } if (TransmogDisplayVendorMgr::RequireToken) player->DestroyItemCount(TransmogDisplayVendorMgr::TokenEntry, TransmogDisplayVendorMgr::TokenAmount, true); TransmogDisplayVendorMgr::SetFakeEntry(item, itemEntry); player->PlayDirectSound(3337); session->SendAreaTriggerMessage("%s transmogrified", slotname); }