void ProcessTeleport_TeleportMaster(Player *player, Creature *Creature, uint32 action){ QueryResult* pResult = SD2Database.PQuery("SELECT ID,Cost,MapID,Xpos,Ypos,Zpos,Rpos,Name FROM teleportmaster_locations ORDER BY id"); if(pResult){ do{ Field* pFields = pResult->Fetch(); // Make sure this row is the teleport location we want if(pFields[0].GetInt32() == action){ if(player->GetMoney() < pFields[1].GetUInt32()){ std::stringstream ss; ss << "You do not have enough money to teleport here. You need " << CopperToGold(pFields[1].GetUInt32()) <<"."; Creature->MonsterWhisper(ss.str().c_str(), player->GetGUID()); } else{ // Player has enough money! Do the teleport! std::stringstream ss; ss << "You spent " << CopperToGold(pFields[1].GetUInt32()) <<" on your teleport to " << pFields[7].GetCppString() << "."; Creature->MonsterWhisper(ss.str().c_str(), player->GetGUID()); player->ModifyMoney(-pFields[1].GetInt32()); player->CLOSE_GOSSIP_MENU(); player->TeleportTo(pFields[2].GetInt32(),pFields[3].GetFloat(),pFields[4].GetFloat(),pFields[5].GetFloat(),pFields[6].GetFloat()); } } }while(pResult->NextRow()); return; } }
void ProcessMenu_custom_npc_teleportmaster(Player *player, Creature *Creature, uint32 action, uint32 MoreLess, uint32 GroupID) { if(DEBUG_TELE) error_log("TeleportMaster: Running ProcessMenu - Action: \"%i\" MoreLess: \"%i\" GroupID: \"%i\"",action,MoreLess,GroupID); //Initialize int32 ItemCount = 0; int32 locations = 0; int32 throttle = 0; QueryResult* pResult; if(action==100000) action=0; if(action<=1000) throttle = 1000; if(action<=100) throttle = 100; if(GroupID>0) throttle = 1000; // Query the DB if( action<=1000 ) { pResult = SD2Database.PQuery("SELECT CategoryID,CategoryName,SubCatGroupID,SubCatName FROM teleportmaster_categories WHERE CategoryID >= \"%i\" AND CategoryID <= \"%i\" ORDER BY CategoryID", action, throttle); //Not a SubCat, list out locations if( pResult->Fetch()[2].GetInt32()==0 && (action>100 || (action<=100 && action>0 && MoreLess==0)) ) { pResult = SD2Database.PQuery("SELECT ID,CategoryID,Name,faction,ReqLevel,GuildID,Cost FROM teleportmaster_locations WHERE CategoryID = \"%i\" ORDER BY ID", action); locations = 1; } else if(action<=1000 && action>1) { if(MoreLess>0 || action<=100) { if(action<=100) pResult = SD2Database.PQuery("SELECT CategoryID,CategoryName,SubCatGroupID,SubCatName FROM teleportmaster_categories WHERE CategoryID >= \"%i\" AND CategoryID <= \"%i\" ORDER BY CategoryID", action, throttle); else { QueryResult* pResultGroup = SD2Database.PQuery("SELECT CategoryID,CategoryName,SubCatGroupID,SubCatName FROM teleportmaster_categories WHERE CategoryID = \"%i\"", action); if(pResultGroup) { GroupID = pResultGroup->Fetch()[2].GetInt32(); pResult = SD2Database.PQuery("SELECT CategoryID,CategoryName,SubCatGroupID,SubCatName FROM teleportmaster_categories WHERE CategoryID >= \"%i\" AND SubCatGroupID = \"%i\" ORDER BY CategoryID", action, GroupID); } } } else { //List what is INSIDE this sub-group pResult = SD2Database.PQuery("SELECT ID,CategoryID,Name,faction,ReqLevel,GuildID,Cost FROM teleportmaster_locations WHERE CategoryID = \"%i\" ORDER BY ID", action); locations = 1; } } } if(action>1000) { if(MoreLess>0) { QueryResult* pResultGroup = SD2Database.PQuery("SELECT ID,CategoryID FROM teleportmaster_locations WHERE ID = \"%i\"", action); if(pResultGroup) { GroupID = pResultGroup->Fetch()[1].GetInt32(); pResult = SD2Database.PQuery("SELECT ID,CategoryID,Name,faction,ReqLevel,GuildID,Cost FROM teleportmaster_locations WHERE CategoryID = \"%i\" AND ID>= \"%i\" ORDER BY ID", GroupID, action); locations = 1; } } else { ProcessTeleport_custom_npc_teleportmaster( player, Creature, action); return; } } // Make sure the result is valid, add menu items if(pResult) { if(DEBUG_TELE) error_log("TeleportMaster: ProcessMenu queried the DB and got results, processing results..."); do { Field* pFields = pResult->Fetch(); if(ItemCount==10) { //Count is 10! We need a 'more' button! if(DEBUG_TELE) error_log("TeleportMaster: 10 Items on menu, adding 'more' button: \"%i\"", pFields[0].GetInt32() + 200000); player->ADD_GOSSIP_ITEM( 4, "More ->", GOSSIP_SENDER_MAIN, pFields[0].GetInt32() + 200000); ItemCount++; } else { std::stringstream CatName; //MainCat Items if(action<101 && !locations && GroupID==0) { CatName<<pFields[1].GetCppString()<<" ->"; player->ADD_GOSSIP_ITEM( 5, CatName.str().c_str(), GOSSIP_SENDER_MAIN, pFields[0].GetInt32()); ItemCount++; } //SubCat Items if(action<1001 && GroupID>0 && pFields[0].GetInt32()>100 && pFields[2].GetInt32()==GroupID && !locations) { CatName<<pFields[3].GetCppString()<<" ->"; player->ADD_GOSSIP_ITEM( 5, CatName.str().c_str(), GOSSIP_SENDER_MAIN, pFields[0].GetInt32()); ItemCount++; } //Locations or Root SubCats if(locations) { if(GroupID==0 || action>1000 || (action<=1000 && MoreLess==0) ) { if( (pFields[3].GetInt32()==2 && player->GetTeam()==ALLIANCE) || (pFields[3].GetInt32()==1 && player->GetTeam()==HORDE) || (player->getLevel()<pFields[4].GetUInt32()) || (pFields[5].GetInt32()>0 && player->GetGuildId() != pFields[5].GetInt32()) ) { //FAIL!! Do nothing... } else { std::stringstream menuItem; menuItem << pFields[2].GetCppString() << " - " << CopperToGold(pFields[6].GetInt32()); player->ADD_GOSSIP_ITEM( 2, menuItem.str().c_str(), GOSSIP_SENDER_MAIN, pFields[0].GetInt32()); ItemCount++; } } else { CatName<<pFields[1].GetCppString()<<" ->"; player->ADD_GOSSIP_ITEM( 5, CatName.str().c_str(), GOSSIP_SENDER_MAIN, pFields[0].GetInt32()); ItemCount++; } } } } while(pResult->NextRow() && ItemCount<11); } //scan teleportmaster_locations for locations matching this groupID and add them if ItemCount<10 if( GroupID>0 && !locations && ItemCount<10 ) { pResult = SD2Database.PQuery("SELECT ID,CategoryID,faction,ReqLevel,GuildID,Name,cost FROM teleportmaster_locations WHERE CategoryID = \"%i\" ORDER BY ID",action); if(pResult) { if(DEBUG_TELE) error_log("TeleportMaster: Adding additional locations to a SubCat"); do { Field* pFields = pResult->Fetch(); if(ItemCount==10) { //Count is 10! We need a 'more' button! if(DEBUG_TELE) error_log("TeleportMaster: 10 Items on menu, adding 'more' button: \"%i\"", pFields[0].GetInt32() + 200000); player->ADD_GOSSIP_ITEM( 4, "More ->", GOSSIP_SENDER_MAIN, pFields[0].GetInt32() + 200000); ItemCount++; } if( (pFields[2].GetInt32()==2 && player->GetTeam()==ALLIANCE) || (pFields[2].GetInt32()==1 && player->GetTeam()==HORDE) || (player->getLevel()<pFields[3].GetUInt32()) || (pFields[4].GetInt32()>0 && player->GetGuildId() != pFields[4].GetInt32()) ) { //FAIL!! Do nothing... } else { std::stringstream menuItem; menuItem << pFields[5].GetCppString() << " - " << CopperToGold(pFields[6].GetInt32()); player->ADD_GOSSIP_ITEM( 2, menuItem.str().c_str(), GOSSIP_SENDER_MAIN, pFields[0].GetInt32()); ItemCount++; } } while(pResult->NextRow() && ItemCount<11); } } //Add 'Prev' and 'Main Menu' buttons as needed if(DEBUG_TELE) error_log("TeleportMaster: Adding 'Prev' and 'Main Menu' buttons for action: \"%i\" GroupId:\"%i\"",action,GroupID); if(MoreLess>0 || locations) { if(action<2) { if(MoreLess==0) player->ADD_GOSSIP_ITEM( 4, "<- Main Menu", GOSSIP_SENDER_MAIN, 100000 ); } else { int32 prevAction=0; QueryResult* pResultPrev; if(action>=1000) pResultPrev = SD2Database.PQuery("SELECT ID,CategoryID,faction,ReqLevel,GuildID FROM teleportmaster_locations WHERE CategoryID = \"%i\" AND ID <= \"%i\" ORDER BY ID DESC",GroupID,action); if(action>=100 && action<1000) pResultPrev = SD2Database.PQuery("SELECT CategoryID,SubCatGroupID FROM teleportmaster_categories WHERE SubCatGroupID = \"%i\" AND CategoryID <= \"%i\" ORDER BY CategoryID DESC",GroupID,action); if(action>1 && action<100) pResultPrev = SD2Database.PQuery("SELECT CategoryID,SubCatGroupID FROM teleportmaster_categories WHERE CategoryID <= \"%i\" ORDER BY CategoryID DESC",action); // Make sure the result is valid if(pResultPrev) { int32 count=0; //Count backwards starting at our last item and only count valid locations do { Field* pFields = pResultPrev->Fetch(); if(action>1000) { if( (pFields[2].GetInt32()==2 && player->GetTeam()==ALLIANCE) || (pFields[2].GetInt32()==1 && player->GetTeam()==HORDE) || (player->getLevel()<pFields[3].GetUInt32()) || (pFields[4].GetInt32()>0 && player->GetGuildId() != pFields[4].GetInt32()) ) { //FAIL!! Do nothing... } else count++; } else count++; if(count==11) prevAction = pFields[0].GetInt32(); } while(pResultPrev->NextRow()); } if(prevAction>0) { player->ADD_GOSSIP_ITEM( 4, "<- Prev", GOSSIP_SENDER_MAIN, prevAction + 400000 ); if(DEBUG_TELE) error_log("TeleportMaster: Prev1: \"%i\"", prevAction + 400000); } player->ADD_GOSSIP_ITEM( 4, "<- Main Menu", GOSSIP_SENDER_MAIN, 100000 ); } } else if(action<=1000 && action>0 && MoreLess==0) { if( GroupID==0 || (action<100 && GroupID>0) ) player->ADD_GOSSIP_ITEM( 4, "<- Main Menu", GOSSIP_SENDER_MAIN, 100000 ); } player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,Creature->GetGUID()); return; }