Likes: 0
Results 1 to 1 of 1
Thread: Guild House fix for TC Cataclysm
-
16-01-15, 02:33 AM #1
Guild House fix for TC Cataclysm
Register to remove this adCredits :
Synth
QQrofl,
and updated by Xaver
Fix Line:
if (!object->Create(guidLow, objectInfo->entry, map, pPlayer->GetPhaseMgr().GetPhaseMaskForSpawn(), x, y, z, o, 0.0f, 0.0f, 0.0f, 0.0f, 0, GO_STATE_READY))
Code:/*######################-> [[Guild Housing ]] <-######################### **************************! DEV: QQRofl Rewrite&Release:Me(Azteco) !**************************** #######################################################################*/ #include "ScriptPCH.h" #include <cstring> #include "GuildMgr.h" #include "ObjectMgr.h" #include <Player.h> #include "PhaseMgr.h" const uint32 GUILD_TOKEN = 37711; bool requiresGUpdate = true; std::vector<uint64> GuildHouses; char string[200]; enum Objects { OBJECT_TABLE = 180698, OBJECT_TORCH = 187988, OBJECT_MAILBOX = 142094, OBJECT_CRATE = 183992, OBJECT_A_FLAG = 187342, OBJECT_H_FLAG = 192688, OBJECT_CHAIR = 10201, OBJECT_FIREPIT = 1967, OBJECT_GUILDVAULT = 187390, OBJECT_BARBER_CHAIR = 191817, OBJECT_CRANBERRY_BUSH = 195199, }; void SpawnObject(Player * pPlayer, uint32 objectId) { const GameObjectTemplate* objectInfo = sObjectMgr->GetGameObjectTemplate(objectId); float x = float(pPlayer->GetPositionX()); float y = float(pPlayer->GetPositionY()); float z = float(pPlayer->GetPositionZ()); float o = float(pPlayer->GetOrientation()); Map* map = pPlayer->GetMap(); GameObject* object = new GameObject; uint32 guidLow = sObjectMgr->GenerateLowGuid(HIGHGUID_GAMEOBJECT); if (!object->Create(guidLow, objectInfo->entry, map, pPlayer->GetPhaseMgr().GetPhaseMaskForSpawn(), x, y, z, o, 0.0f, 0.0f, 0.0f, 0.0f, 0, GO_STATE_READY)) { delete object; return; } object->SetRespawnTime(1); object->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), pPlayer->GetPhaseMgr().GetPhaseMaskForSpawn()); if (!object->LoadGameObjectFromDB(guidLow, map)) { delete object; return; } sObjectMgr->AddGameobjectToGrid(guidLow, sObjectMgr->GetGOData(guidLow)); WorldDatabase.PExecute("INSERT INTO guildhouse_objects VALUES('%u', '%u')", pPlayer->GetGuildId(), guidLow); } uint32 getGuildAreaId(Player * pPlayer) { QueryResult Result = WorldDatabase.PQuery("SELECT area FROM guildhouses WHERE guildId='%u'", pPlayer->GetGuildId()); if (Result) { Field * pField = Result->Fetch(); return pField[0].GetUInt32(); } return -1; } bool isInGuildArea(Player * pPlayer) { for (int i = 0; i < 21; i++) { if (pPlayer->GetAreaId() == getGuildAreaId(pPlayer)) return true; } return false; } bool isGuildHouseOwner(Player * pPlayer) { if (GuildHouses.empty() || requiresGUpdate == true) { if (requiresGUpdate == true) { GuildHouses.clear(); requiresGUpdate = false; } QueryResult Result = WorldDatabase.PQuery("SELECT guildId FROM guildhouses WHERE guildId != '0'"); if (Result) { Field * pFields = Result->Fetch(); int i = 0; do { GuildHouses.push_back(pFields[0].GetUInt64()); i++; } while (Result->NextRow()); return isGuildHouseOwner(pPlayer); } else { return false; } } else { for (std::vector<uint64>::iterator itr = GuildHouses.begin(); itr != GuildHouses.end(); itr++) { if (*itr != pPlayer->GetGuildId()) continue; else return true; } return false; } } bool isPlayerGuildLeader(Player *player) { return (player->GetRank() == 0) && (player->GetGuildId() != 0); } bool GuildOwnsHouse(Player * pPlayer) { QueryResult pResult = WorldDatabase.PQuery("SELECT * FROM guildhouses WHERE guildId='%u'", pPlayer->GetGuildId()); if (!pResult) return false; else return true; } void CleanUpObjects(Player * pPlayer, uint32 guildId) { QueryResult ObjectSpawns = WorldDatabase.PQuery("SELECT `guid` FROM `guildhouse_objects` WHERE `guildId` = '%u'", guildId); if (ObjectSpawns) { do { Field * pField = ObjectSpawns->Fetch(); uint32 Object_GUID = pField[0].GetUInt32(); GameObject* object = NULL; ChatHandler handler = ChatHandler(pPlayer->GetSession()); if (GameObjectData const* gameObjectData = sObjectMgr->GetGOData(Object_GUID)) object = handler.GetObjectGlobalyWithGuidOrNearWithDbGuid(Object_GUID, gameObjectData->id); if (!object) continue; object->SetRespawnTime(0); object->Delete(); object->DeleteFromDB(); WorldDatabase.PExecute("DELETE FROM `guildhouse_objects` WHERE guid='%u'", Object_GUID); } while (ObjectSpawns->NextRow()); } } void SellGuildHouse(Player * pPlayer, Creature * pCreature) { if (isInGuildArea(pPlayer)) { WorldDatabase.PExecute("UPDATE `guildhouses` SET `guildId`='0' WHERE `guildId`='%u'", pPlayer->GetGuildId()); CleanUpObjects(pPlayer, pPlayer->GetGuildId()); pCreature->MonsterSay("Ihr Gilden Haus wurde Verkauft!", LANG_UNIVERSAL, pPlayer->GetGUID()); pPlayer->PlayerTalkClass->SendCloseGossip(); requiresGUpdate = true; pPlayer->TeleportTo(530, -1861.239990f, 5437.810059f, -10.463400f, 1.353830f); // generally the mall } else { pPlayer->GetSession()->SendNotification("Gilden Haus Verkauft!"); } } void PurchaseGuildHouse(Player * pPlayer, Creature * pCreature, uint32 &Id) { if (pPlayer->HasItemCount(GUILD_TOKEN, 1)) { WorldDatabase.PExecute("UPDATE `guildhouses` SET `guildId`='%u' WHERE `id`='%u'", pPlayer->GetGuildId(), Id); pCreature->MonsterSay("Sie sind nun besitzer eines Gilden Hauses Viel erfolg!", LANG_UNIVERSAL, pPlayer->GetGUID()); pPlayer->DestroyItemCount(GUILD_TOKEN, 1, true); requiresGUpdate = true; } else { pCreature->MonsterSay("Sie haben nicht den Gilden-Token um ein Gilden Haus zu kaufen!", LANG_UNIVERSAL, pPlayer->GetGUID()); } pPlayer->PlayerTalkClass->SendCloseGossip(); } void TeleportToHouse(Player * pPlayer) { if (pPlayer->isInCombat()) return; QueryResult result = WorldDatabase.PQuery("SELECT `x`, `y`, `z`, `map` FROM `guildhouses` WHERE `guildId` = '%u'", pPlayer->GetGuildId()); if (result) { Field *fields = result->Fetch(); float x = fields[0].GetFloat(); float y = fields[1].GetFloat(); float z = fields[2].GetFloat(); uint32 map = fields[3].GetUInt32(); pPlayer->TeleportTo(map, x, y, z, pPlayer->GetOrientation()); } } class GuildHouse_NPC : public CreatureScript { public: GuildHouse_NPC() : CreatureScript("GuildHouse"){} void ShowHouseListings(Player * pPlayer, Creature * pCreature, unsigned int start = 0) { pPlayer->PlayerTalkClass->ClearMenus(); QueryResult pResult = WorldDatabase.PQuery("SELECT id, comment FROM guildhouses WHERE guildId='0'"); uint32 houses = pResult->GetRowCount(); int offset = 0; Field * pField = pResult->Fetch(); bool ranOnce = false; for (unsigned int i = start; i < houses; i++) { if (start != 0 && ranOnce == false) { for (int x = 0; x < start; x++) { pResult->NextRow(); } ranOnce = true; } if (offset != 10) { pPlayer->ADD_GOSSIP_ITEM(6, pField[1].GetString(), GOSSIP_SENDER_MAIN, pField[0].GetUInt32()); offset++; pResult->NextRow(); } else { if ((startid + 12) > houses) { /*pPlayer->ADD_GOSSIP_ITEM(7, "-------------END--------------", GOSSIP_SENDER_MAIN, 41);*/ } else { pPlayer->ADD_GOSSIP_ITEM(7, "Weiter...", GOSSIP_SENDER_MAIN, 4353); startid = start + offset; i = houses + 10; } } } pPlayer->PlayerTalkClass->SendGossipMenu(2, pCreature->GetGUID()); } bool OnGossipHello(Player * pPlayer, Creature * pCreature) { startid = 0; if (pPlayer->GetGuildId() == 0) { pPlayer->GetSession()->SendNotification("Sie sollten schon in einer Gilde sein!"); return false; } else if (!GuildOwnsHouse(pPlayer) && !isPlayerGuildLeader(pPlayer)) { pPlayer->GetSession()->SendNotification("Ihre Gilde besizt kein Gilden Haus!"); return false; } /*pPlayer->ADD_GOSSIP_ITEM(4, "Guild Housing System:", GOSSIP_SENDER_MAIN, 41); pPlayer->ADD_GOSSIP_ITEM(4, "----------------------------------------------", GOSSIP_SENDER_MAIN, 41);*/ if (isPlayerGuildLeader(pPlayer)) { if (!GuildOwnsHouse(pPlayer)) pPlayer->ADD_GOSSIP_ITEM(6, "Gilden Haus Kaufen", GOSSIP_SENDER_MAIN, 38); else pPlayer->ADD_GOSSIP_ITEM_EXTENDED(6, "Gilden Haus Verkaufen", GOSSIP_SENDER_MAIN, 39, "Sind sie sicher das sie ihr Gilden Haus verkaufen wollen ??", 0, false); } if (GuildOwnsHouse(pPlayer)) pPlayer->ADD_GOSSIP_ITEM(7, "Tele zum Gilden Haus", GOSSIP_SENDER_MAIN, 40); pPlayer->PlayerTalkClass->SendGossipMenu(2, pCreature->GetGUID()); return true; } bool OnGossipSelect(Player * pPlayer, Creature * pCreature, uint32 /*uiSender*/, uint32 uiAction) { pPlayer->PlayerTalkClass->ClearMenus(); switch (uiAction) { case 38: ShowHouseListings(pPlayer, pCreature); break; case 39: SellGuildHouse(pPlayer, pCreature); WorldDatabase.PExecute("UPDATE `guildhouses` SET `guildId`='0' WHERE `guildId`='%u'", pPlayer->GetGuildId()); pPlayer->PlayerTalkClass->SendCloseGossip(); break; case 40: TeleportToHouse(pPlayer); break; case 41: OnGossipHello(pPlayer, pCreature); break; case 4353: ShowHouseListings(pPlayer, pCreature, startid); break; default: if (uiAction < 38 && uiAction > 0) PurchaseGuildHouse(pPlayer, pCreature, uiAction); break; } return true; } private: uint32 startid; }; class Table_Token : public ItemScript { public: Table_Token() : ItemScript("Table Token"){} bool OnUse(Player* pPlayer, Item* pItem, SpellCastTargets const& /*targets*/) { if (!pPlayer) return false; if (!pItem) return false; if (!isPlayerGuildLeader(pPlayer) || !isGuildHouseOwner(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie brauchen ein Gilden Haus um dies zu tuhn!"); return false; }; if (!isInGuildArea(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie befinden sich nicht in ihrer Gilden Area!"); return false; } SpawnObject(pPlayer, OBJECT_TABLE); pPlayer->DestroyItemCount(pItem->GetEntry(), 1, true); return true; } }; class Torch_Token : public ItemScript { public: Torch_Token() : ItemScript("Torch Token"){} bool OnUse(Player* pPlayer, Item* pItem, SpellCastTargets const& /*targets*/) { if (!pPlayer) return false; if (!pItem) return false; if (!isPlayerGuildLeader(pPlayer) || !isGuildHouseOwner(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie brauchen ein Gilden Haus um dies zu tuhn!"); return false; }; if (!isInGuildArea(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie befinden sich nicht in ihrer Gilden Area!"); return false; } SpawnObject(pPlayer, OBJECT_TORCH); pPlayer->DestroyItemCount(pItem->GetEntry(), 1, true); return true; } }; class Mailbox_Token : public ItemScript { public: Mailbox_Token() : ItemScript("Mailbox Token"){} bool OnUse(Player* pPlayer, Item* pItem, SpellCastTargets const& /*targets*/) { if (!pPlayer) return false; if (!pItem) return false; if (!isPlayerGuildLeader(pPlayer) || !isGuildHouseOwner(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie brauchen ein Gilden Haus um dies zu tuhn!"); return false; }; if (!isInGuildArea(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie befinden sich nicht in ihrer Gilden Area!"); return false; } SpawnObject(pPlayer, OBJECT_MAILBOX); pPlayer->DestroyItemCount(pItem->GetEntry(), 1, true); return true; } }; class Crate_Token : public ItemScript { public: Crate_Token() : ItemScript("Crate Token"){} bool OnUse(Player* pPlayer, Item* pItem, SpellCastTargets const& /*targets*/) { if (!pPlayer) return false; if (!pItem) return false; if (!isPlayerGuildLeader(pPlayer) || !isGuildHouseOwner(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie brauchen ein Gilden Haus um dies zu tuhn!"); return false; }; if (!isInGuildArea(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie befinden sich nicht in ihrer Gilden Area!"); return false; } SpawnObject(pPlayer, OBJECT_CRATE); pPlayer->DestroyItemCount(pItem->GetEntry(), 1, true); return true; } }; class A_Flag_Token : public ItemScript { public: A_Flag_Token() : ItemScript("A_Flag Token"){} bool OnUse(Player* pPlayer, Item* pItem, SpellCastTargets const& /*targets*/) { if (!pPlayer) return false; if (!pItem) return false; if (!isPlayerGuildLeader(pPlayer) || !isGuildHouseOwner(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie brauchen ein Gilden Haus um dies zu tuhn!"); return false; }; if (!isInGuildArea(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie befinden sich nicht in ihrer Gilden Area!"); return false; } SpawnObject(pPlayer, OBJECT_A_FLAG); pPlayer->DestroyItemCount(pItem->GetEntry(), 1, true); return true; } }; class H_Flag_Token : public ItemScript { public: H_Flag_Token() : ItemScript("H_Flag Token"){} bool OnUse(Player* pPlayer, Item* pItem, SpellCastTargets const& /*targets*/) { if (!pPlayer) return false; if (!pItem) return false; if (!isPlayerGuildLeader(pPlayer) || !isGuildHouseOwner(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie brauchen ein Gilden Haus um dies zu tuhn!"); return false; }; if (!isInGuildArea(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie befinden sich nicht in ihrer Gilden Area!"); return false; } SpawnObject(pPlayer, OBJECT_H_FLAG); pPlayer->DestroyItemCount(pItem->GetEntry(), 1, true); return true; } }; class Chair_Token : public ItemScript { public: Chair_Token() : ItemScript("Chair Token"){} bool OnUse(Player* pPlayer, Item* pItem, SpellCastTargets const& /*targets*/) { if (!pPlayer) return false; if (!pItem) return false; if (!isPlayerGuildLeader(pPlayer) || !isGuildHouseOwner(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie brauchen ein Gilden Haus um dies zu tuhn!"); return false; }; if (!isInGuildArea(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie befinden sich nicht in ihrer Gilden Area!"); return false; } SpawnObject(pPlayer, OBJECT_CHAIR); pPlayer->DestroyItemCount(pItem->GetEntry(), 1, true); return true; } }; class Firepit_Token : public ItemScript { public: Firepit_Token() : ItemScript("Firepit Token"){} bool OnUse(Player* pPlayer, Item* pItem, SpellCastTargets const& /*targets*/) { if (!pPlayer) return false; if (!pItem) return false; if (!isPlayerGuildLeader(pPlayer) || !isGuildHouseOwner(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie brauchen ein Gilden Haus um dies zu tuhn!"); return false; }; if (!isInGuildArea(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie befinden sich nicht in ihrer Gilden Area!"); return false; } SpawnObject(pPlayer, OBJECT_FIREPIT); pPlayer->DestroyItemCount(pItem->GetEntry(), 1, true); return true; } }; class Vault_Token : public ItemScript { public: Vault_Token() : ItemScript("Vault Token"){} bool OnUse(Player* pPlayer, Item* pItem, SpellCastTargets const& /*targets*/) { if (!pPlayer) return false; if (!pItem) return false; if (!isPlayerGuildLeader(pPlayer) || !isGuildHouseOwner(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie brauchen ein Gilden Haus um dies zu tuhn!"); return false; }; if (!isInGuildArea(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie befinden sich nicht in ihrer Gilden Area!"); return false; } SpawnObject(pPlayer, OBJECT_GUILDVAULT); pPlayer->DestroyItemCount(pItem->GetEntry(), 1, true); return true; } }; class Barber_Token : public ItemScript { public: Barber_Token() : ItemScript("Barber Token"){} bool OnUse(Player* pPlayer, Item* pItem, SpellCastTargets const& /*targets*/) { if (!pPlayer) return false; if (!pItem) return false; if (!isPlayerGuildLeader(pPlayer) || !isGuildHouseOwner(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie brauchen ein Gilden Haus um dies zu tuhn!"); return false; }; if (!isInGuildArea(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie befinden sich nicht in ihrer Gilden Area!"); return false; } SpawnObject(pPlayer, OBJECT_BARBER_CHAIR); pPlayer->DestroyItemCount(pItem->GetEntry(), 1, true); return true; } }; class Cranberry_Token : public ItemScript { public: Cranberry_Token() : ItemScript("Cranberry Token"){} bool OnUse(Player* pPlayer, Item* pItem, SpellCastTargets const& /*targets*/) { if (!pPlayer) return false; if (!pItem) return false; if (!isPlayerGuildLeader(pPlayer) || !isGuildHouseOwner(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie brauchen ein Gilden Haus um dies zu tuhn!"); return false; }; if (!isInGuildArea(pPlayer)) { pPlayer->GetSession()->SendNotification("Sie befinden sich nicht in ihrer Gilden Area!"); return false; } SpawnObject(pPlayer, OBJECT_CRANBERRY_BUSH); pPlayer->DestroyItemCount(pItem->GetEntry(), 1, true); return true; } }; //token vendor class Guild_Token_Vendor : public CreatureScript { public: Guild_Token_Vendor() : CreatureScript("Token Vendor"){} bool OnGossipHello(Player * pPlayer, Creature * pCreature) { if (!isPlayerGuildLeader(pPlayer)) { pPlayer->GetSession()->SendNotification("Nur der Gilden Meister kann dies tuhn!"); pPlayer->PlayerTalkClass->SendCloseGossip(); return false; } if (isGuildHouseOwner(pPlayer)) { pPlayer->PlayerTalkClass->ClearMenus(); pPlayer->ADD_GOSSIP_ITEM(4, "Willkommen beim IKEA Shop, Viel erfolg beim einkaufen!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); pPlayer->ADD_GOSSIP_ITEM(3, "Beenden.", GOSSIP_SENDER_MAIN, 2); pPlayer->PlayerTalkClass->SendGossipMenu(2, pCreature->GetGUID()); //return true; } else { pPlayer->GetSession()->SendNotification("Nur der Gilden Meister kann dies tuhn!"); return false; } return true; } bool OnGossipSelect(Player * pPlayer, Creature * pCreature, uint32 /*uiSender*/, uint32 uiAction) { switch (uiAction) { case GOSSIP_ACTION_TRADE: pPlayer->GetSession()->SendListInventory(pCreature->GetGUID()); break; case 2: pPlayer->PlayerTalkClass->SendCloseGossip(); break; } return true; } }; void AddSC_GuildHouse() { new GuildHouse_NPC(); new Table_Token(); new Torch_Token(); new Mailbox_Token(); new Crate_Token(); new A_Flag_Token(); new H_Flag_Token(); new Chair_Token(); new Firepit_Token(); new Vault_Token(); new Barber_Token(); new Guild_Token_Vendor(); new Cranberry_Token(); }
› See More: Guild House fix for TC Cataclysm