Advertisement
Guest User

Player Housing NPC

a guest
Aug 17th, 2017
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 23.18 KB | None | 0 0
  1. /*
  2. House System v4.17
  3.  
  4. Made by Nathan
  5. Updated and edited by Loud21
  6.  
  7. */
  8.  
  9. #include "ScriptPCH.h"
  10. #include "ObjectMgr.h"
  11.  
  12. uint32 GetOwnerLandCount(uint32 playerguid)
  13. {
  14.     QueryResult result = CharacterDatabase.PQuery("SELECT * FROM player_house_taken WHERE player_guid = %u", playerguid);
  15.     uint32 house_count = 0;
  16.     if (result)
  17.         house_count = result->GetRowCount();
  18.  
  19.     return house_count;
  20. }
  21.  
  22.  
  23. enum eEnums
  24. {
  25.     SAY_NOT_INTERESTED = -1999922,
  26.     SAY_WRONG = -1999923,
  27.     SAY_CORRECT = -1999924,
  28.     PRICE_FOR_LAND = 15,
  29.     LAND_ITEM_ID = 351270,
  30.     HOUSE_TOKEN = 351290,
  31.  
  32.     PRICE_FOR_P1 = 15,
  33.     PRICE_FOR_P2 = 15,
  34.     PRICE_FOR_P3 = 15,
  35.     PRICE_FOR_P4 = 15,
  36.  
  37.     MAX_UPGRADES = 5, // If you want to allow your players to upgrade their land more than x times this is where you'd change the value
  38.     HOUSE_UPGRADE_PRICE = 30,
  39. };
  40.  
  41. int count = 0;
  42. int selection;
  43.  
  44. #define PACKAGE_1 "Profession Expansion"
  45. #define PACKAGE_2 "Comming Soon"
  46. #define PACKAGE_3 "Comming Soon"
  47. #define PACKAGE_4 "Comming Soon"
  48.  
  49.  
  50. bool buyLand(Player* player, Creature* creature, uint32 selection);
  51. bool isLandOwner(uint64 plrName);
  52. uint32 getGoBonus(uint64 plrName);
  53. uint32 getNPCBonus(uint64 plrName);
  54. bool updatePlayerPackage(uint32 AccID, uint32 package);
  55. bool hasPackage(uint32 AccID, uint32 package);
  56. uint32 getLandPrice(uint32 selection);
  57.  
  58. std::string UInt32ToString2(uint32 integer)
  59. {
  60.     std::stringstream out;
  61.     out << integer;
  62.     return out.str();
  63. }
  64.  
  65. uint32 Upgrades(uint64 player_guid)
  66. {
  67.     uint32 upgrades;
  68.     QueryResult result = CharacterDatabase.PQuery("SELECT upgrades FROM player_house_taken WHERE player_guid=%u", player_guid);
  69.     if (result)
  70.     {
  71.         upgrades = (*result)[0].GetUInt64();
  72.             if (upgrades < 0)
  73.                 upgrades = 0;
  74.     }
  75.     else {
  76.         return 0;
  77.     }
  78.     return upgrades;
  79. }
  80.  
  81.  
  82. class player_housing_npc : public CreatureScript
  83. {
  84. public:
  85.     player_housing_npc()
  86.         : CreatureScript("player_housing_npc")
  87.     {
  88.     }
  89.     bool OnGossipHello(Player* player, Creature* creature)
  90.     {
  91.         QueryResult result = CharacterDatabase.PQuery("SELECT id, zone_name, price FROM player_house_available");
  92.         if (result)
  93.         {
  94.             std::string item;
  95.             int idStr[150];
  96.             count = 1;
  97.             selection = 0;
  98.             player->PlayerTalkClass->ClearMenus();
  99.             do
  100.             {
  101.                 Field* fields = result->Fetch();
  102.                 idStr[count] = fields[0].GetInt64();
  103.                 item = fields[1].GetString();
  104.                 uint32 price = fields[2].GetUInt32();
  105.                 AddGossipItemFor(player, GOSSIP_ICON_TAXI, item + " Price: " + UInt32ToString2(price) + " Tokens", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + count);
  106.                 count++;
  107.             } while (result->NextRow());
  108.         }
  109.         else
  110.         {
  111.             ChatHandler(player->GetSession()).PSendSysMessage("No land is available at this time!");
  112.             player->PlayerTalkClass->SendCloseGossip();
  113.         }
  114.  
  115.         if (!player->HasItemCount(LAND_ITEM_ID, 1, true))
  116.         {
  117.             if (isLandOwner(player->GetSession()->GetGUIDLow()))
  118.             {
  119.                 AddGossipItemFor(player, GOSSIP_ICON_VENDOR, "Give me a replacement land item!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 777);
  120.             }
  121.         }
  122.         AddGossipItemFor(player, GOSSIP_ICON_VENDOR, "Purchase Tokens", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14);
  123.         AddGossipItemFor(player, GOSSIP_ICON_TAXI, "Not interested.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10000);
  124.         player->SaveRecallPosition();
  125.         player->PlayerTalkClass->SendGossipMenu(11110, creature->GetGUID());
  126.         return true;
  127.     }
  128.  
  129.     bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction)
  130.     {
  131.         if (uiAction == GOSSIP_ACTION_INFO_DEF + 901)
  132.         {
  133.             player->PlayerTalkClass->SendCloseGossip();
  134.             OnGossipHello(player, creature);
  135.         }
  136.  
  137.         if (uiAction == GOSSIP_ACTION_INFO_DEF + 10000)
  138.         {
  139.             player->PlayerTalkClass->SendCloseGossip();
  140.         }
  141.  
  142.         if (uiAction == GOSSIP_ACTION_INFO_DEF + 777)
  143.         {
  144.             ItemPosCountVec dest;
  145.             if (player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, LAND_ITEM_ID, 1) == EQUIP_ERR_OK)
  146.             {
  147.                 if (player->AddItem(LAND_ITEM_ID, 1))
  148.                 {
  149.                     ChatHandler(player->GetSession()).PSendSysMessage("Don't lose it this time!");
  150.                 }
  151.             }
  152.             else
  153.             {
  154.                 ChatHandler(player->GetSession()).PSendSysMessage("Bag is full or other issue!");
  155.             }
  156.         }
  157.  
  158.         if (uiAction == GOSSIP_ACTION_INFO_DEF + 14)
  159.         {
  160.             player->GetSession()->SendListInventory(creature->GetGUID());
  161.         }
  162.  
  163.         if (uiAction == GOSSIP_ACTION_INFO_DEF + 902)
  164.         {
  165.             QueryResult spawnresult;
  166.             spawnresult = CharacterDatabase.PQuery("SELECT map_id, spawn_x, spawn_y, spawn_z, spawn_o FROM player_house_available WHERE id=%u", selection);
  167.             if (spawnresult)
  168.             {
  169.                 Field* fields = spawnresult->Fetch();
  170.                 player->TeleportTo(fields[0].GetUInt32(), fields[1].GetFloat(), fields[2].GetFloat(), fields[3].GetFloat(), fields[4].GetFloat());
  171.                 return true;
  172.             }
  173.             else
  174.             {
  175.                 ChatHandler(player->GetSession()).PSendSysMessage("Could not locate your spawn! Please contact a GM!");
  176.             }
  177.         }
  178.  
  179.         for (int i = 1; i <= count; i++)
  180.         {
  181.             if (uiAction == GOSSIP_ACTION_INFO_DEF + i)
  182.             {
  183.                 selection = i;
  184.                 player->PlayerTalkClass->ClearMenus();
  185.                 AddGossipItemFor(player, GOSSIP_ICON_TAXI, "Preview (Teleport to location)", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 902);
  186.                 AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Go back to other loactions.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 901);
  187.                 player->PlayerTalkClass->SendGossipMenu(3, creature->GetGUID());
  188.             }
  189.         }
  190.         return true;
  191.     }
  192. };
  193.  
  194. class player_housing_npc_guide : public CreatureScript
  195. {
  196. public:
  197.     player_housing_npc_guide()
  198.         : CreatureScript("player_housing_npc_guide")
  199.     {
  200.     }
  201.  
  202.     bool OnGossipHello(Player* player, Creature* creature)
  203.     {
  204.         player->PlayerTalkClass->ClearMenus();
  205.         AddGossipItemFor(player, GOSSIP_ICON_VENDOR, "Buy this land!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
  206.         AddGossipItemFor(player, GOSSIP_ICON_TAXI, "Take me back!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
  207.         player->PlayerTalkClass->SendGossipMenu(4, creature->GetGUID());
  208.         return true;
  209.     }
  210.  
  211.     bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction)
  212.     {
  213.         player->PlayerTalkClass->SendCloseGossip();
  214.         if (uiAction == GOSSIP_ACTION_INFO_DEF + 1)
  215.         {
  216.             if (player->IsBeingTeleported() || player->IsInCombat())
  217.                 return false;
  218.  
  219.             player->Recall();
  220.             return true;
  221.         }
  222.  
  223.         if (uiAction == GOSSIP_ACTION_INFO_DEF + 2)
  224.         {
  225.             player->PlayerTalkClass->SendCloseGossip();
  226.             uint32 selection;
  227.             QueryResult result = CharacterDatabase.PQuery("SELECT id FROM player_house_available WHERE c_guid = '%u'", creature->GetSpawnId());
  228.             if (result)
  229.             {
  230.                 Field* fields = result->Fetch();
  231.                 selection = fields[0].GetInt32();
  232.                 if (GetOwnerLandCount(player->GetSession()->GetGUIDLow()) < 10)
  233.                 {
  234.                     buyLand(player, creature, selection);
  235.                 }
  236.                 else
  237.                 {
  238.                     ChatHandler(player->GetSession()).PSendSysMessage("You can not purchase anymore land!");
  239.                     player->PlayerTalkClass->SendCloseGossip();
  240.                 }
  241.             }
  242.             else
  243.             {
  244.                 ChatHandler(player->GetSession()).PSendSysMessage("Failed!");
  245.                 player->PlayerTalkClass->SendCloseGossip();
  246.             }
  247.         }
  248.  
  249.         return true;
  250.     }
  251.  
  252. };
  253.  
  254. class player_housing_packages : public CreatureScript
  255. {
  256. public:
  257.     player_housing_packages()
  258.         : CreatureScript("player_housing_packages")
  259.     {
  260.     }
  261.     int npcb, gob;
  262.     bool OnGossipHello(Player* player, Creature* creature)
  263.     {
  264.  
  265.         if (!isLandOwner(player->GetSession()->GetGUIDLow()))
  266.         {
  267.             ChatHandler(player->GetSession()).PSendSysMessage("You do not own any land!");
  268.             player->PlayerTalkClass->SendCloseGossip();
  269.             return false;
  270.         }
  271.  
  272.         char gprice[50];
  273.         char npcprice[50];
  274.  
  275.         npcb = getNPCBonus(player->GetSession()->GetGUIDLow());
  276.         if (npcb > 0)
  277.         {
  278.             if (npcb >= 200)
  279.                 npcb = 200;
  280.             else
  281.                 npcb = npcb + 10;
  282.         }
  283.         else
  284.         {
  285.             npcb = 10;
  286.         }
  287.  
  288.         gob = getGoBonus(player->GetSession()->GetGUIDLow());
  289.         if (gob > 0)
  290.         {
  291.             if (gob >= 200)
  292.                 gob = 200;
  293.             else
  294.                 gob = gob + 5;
  295.         }
  296.         else
  297.         {
  298.             gob = 10;
  299.         }
  300.         sprintf(npcprice, "Increase NPC Spawn Limit by 10!(%i Tokens)", npcb);
  301.         sprintf(gprice, "Increase Object Spawn Limit by 10!(%i Tokens)", gob);
  302.  
  303.         player->PlayerTalkClass->ClearMenus();
  304.         uint32 player_guid = player->GetSession()->GetGUIDLow();
  305.         if (!hasPackage(player_guid, 1) || !hasPackage(player_guid, 2) || !hasPackage(player_guid, 3) || !hasPackage(player_guid, 4))
  306.             AddGossipItemFor(player, GOSSIP_ICON_VENDOR, "Buy Expansions!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
  307.         AddGossipItemFor(player, GOSSIP_ICON_VENDOR, "Buy More Land!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
  308.         AddGossipItemFor(player, GOSSIP_ICON_VENDOR, npcprice, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
  309.         AddGossipItemFor(player, GOSSIP_ICON_VENDOR, gprice, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
  310.         player->PlayerTalkClass->SendGossipMenu(11111, creature->GetGUID());
  311.         return true;
  312.     }
  313.  
  314.     bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction)
  315.     {
  316.         uint32 player_guid = player->GetSession()->GetGUIDLow();
  317.         uint32 upgrades = Upgrades(player->GetSession()->GetGUIDLow());
  318.  
  319.         switch (uiAction)
  320.         {
  321.             //BUY PACKAGE
  322.         case GOSSIP_ACTION_INFO_DEF + 1:
  323.             player->PlayerTalkClass->ClearMenus();
  324.             if (!hasPackage(player_guid, 1))
  325.                 AddGossipItemFor(player, GOSSIP_ICON_VENDOR, PACKAGE_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10);
  326.             if (!hasPackage(player_guid, 2))
  327.                 AddGossipItemFor(player, GOSSIP_ICON_VENDOR, PACKAGE_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10000); //11
  328.             if (!hasPackage(player_guid, 3))
  329.                 AddGossipItemFor(player, GOSSIP_ICON_VENDOR, PACKAGE_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10000); //12
  330.             if (!hasPackage(player_guid, 4))
  331.                 AddGossipItemFor(player, GOSSIP_ICON_VENDOR, PACKAGE_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10000); //130
  332.             player->SaveRecallPosition();
  333.             player->PlayerTalkClass->SendGossipMenu(11111, creature->GetGUID());
  334.             break;
  335.             //BUY NPC PACKAGE
  336.         case GOSSIP_ACTION_INFO_DEF + 2:
  337.             player->PlayerTalkClass->ClearMenus();
  338.             AddGossipItemFor(player, 0, ("Increase the size of your land by 5 yards in each direction for %i house tokens.", HOUSE_UPGRADE_PRICE), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 20);
  339.             player->PlayerTalkClass->SendCloseGossip();
  340.             break;
  341.  
  342.             //+10 NPC SPAWN
  343.         case GOSSIP_ACTION_INFO_DEF + 3:
  344.             if (player->HasItemCount(HOUSE_TOKEN, npcb, true))
  345.             {
  346.                 player->DestroyItemCount(HOUSE_TOKEN, npcb, true);
  347.                 CharacterDatabase.PExecute("UPDATE player_house SET npcs_bonus = npcs_bonus + 10 WHERE player_guid=%u", player->GetSession()->GetGUIDLow());
  348.                 ChatHandler(player->GetSession()).PSendSysMessage("You can now add 10 more NPC's!");
  349.             }
  350.             else
  351.             {
  352.                 ChatHandler(player->GetSession()).PSendSysMessage("You do not have enough House Tokens to purchase this package!");
  353.             }
  354.             player->PlayerTalkClass->SendCloseGossip();
  355.             break;
  356.             //+10 GO SPAWN
  357.         case GOSSIP_ACTION_INFO_DEF + 4:
  358.             if (player->HasItemCount(HOUSE_TOKEN, gob, true))
  359.             {
  360.                 player->DestroyItemCount(HOUSE_TOKEN, gob, true);
  361.                 CharacterDatabase.PExecute("UPDATE player_house SET items_bonus = items_bonus + 10 WHERE player_guid=%u", player->GetSession()->GetGUIDLow());
  362.                 ChatHandler(player->GetSession()).PSendSysMessage("You can now add 10 more GameObjects!!");
  363.             }
  364.             else
  365.             {
  366.                 ChatHandler(player->GetSession()).PSendSysMessage("You do not have enough House Tokens to purchase this package!");
  367.             }
  368.             player->PlayerTalkClass->SendCloseGossip();
  369.             break;
  370.  
  371.         case GOSSIP_ACTION_INFO_DEF + 10:
  372.             player->PlayerTalkClass->ClearMenus();
  373.             AddGossipItemFor(player, GOSSIP_ICON_VENDOR, "Profession Expansion (15 Tokens)", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13);
  374.             AddGossipItemFor(player, GOSSIP_ICON_VENDOR, "Preview Package #1", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 16);
  375.             player->PlayerTalkClass->SendGossipMenu(11111, creature->GetGUID());
  376.             break;
  377.         case GOSSIP_ACTION_INFO_DEF + 11:
  378.             player->PlayerTalkClass->ClearMenus();
  379.             AddGossipItemFor(player, GOSSIP_ICON_VENDOR, "Comming Soon (15 Tokens)", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14);
  380.             AddGossipItemFor(player, GOSSIP_ICON_VENDOR, "Preview Package #2", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 17);
  381.             player->PlayerTalkClass->SendGossipMenu(11111, creature->GetGUID());
  382.             break;
  383.         case GOSSIP_ACTION_INFO_DEF + 12:
  384.             player->PlayerTalkClass->ClearMenus();
  385.             AddGossipItemFor(player, GOSSIP_ICON_VENDOR, "Comming Soon (15 Tokens)", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15);
  386.             AddGossipItemFor(player, GOSSIP_ICON_VENDOR, "Preview Package #3", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 18);
  387.             player->PlayerTalkClass->SendGossipMenu(11111, creature->GetGUID());
  388.             break;
  389.         case GOSSIP_ACTION_INFO_DEF + 130:
  390.             player->PlayerTalkClass->ClearMenus();
  391.             AddGossipItemFor(player, GOSSIP_ICON_VENDOR, "Comming Soon (15 Tokens)", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 150);
  392.             AddGossipItemFor(player, GOSSIP_ICON_VENDOR, "Preview Package #4", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 180);
  393.             player->PlayerTalkClass->SendGossipMenu(11111, creature->GetGUID());
  394.             break;
  395.  
  396.             //buy packages
  397.         case GOSSIP_ACTION_INFO_DEF + 13:
  398.             if (player->HasItemCount(HOUSE_TOKEN, 15, true))
  399.             {
  400.                 player->PlayerTalkClass->SendCloseGossip();
  401.                 player->DestroyItemCount(HOUSE_TOKEN, PRICE_FOR_P1, true);
  402.                 updatePlayerPackage(player->GetSession()->GetGUIDLow(), 1);
  403.                 ChatHandler(player->GetSession()).PSendSysMessage("Package #1 bought! A new option will show up on your Land Manager.");
  404.             }
  405.             else
  406.             {
  407.                 ChatHandler(player->GetSession()).PSendSysMessage("You do not have enough House Tokens to purchase this package!");
  408.             }
  409.             break;
  410.         case GOSSIP_ACTION_INFO_DEF + 14:
  411.             if (player->HasItemCount(HOUSE_TOKEN, 15, true))
  412.             {
  413.                 player->PlayerTalkClass->SendCloseGossip();
  414.                 player->DestroyItemCount(HOUSE_TOKEN, PRICE_FOR_P2, true);
  415.                 updatePlayerPackage(player->GetSession()->GetGUIDLow(), 2);
  416.                 ChatHandler(player->GetSession()).PSendSysMessage("Package #2 bought! A new option will show up on your Land Manager.");
  417.             }
  418.             else
  419.             {
  420.                 ChatHandler(player->GetSession()).PSendSysMessage("You do not have enough House Tokens to purchase this package!");
  421.             }
  422.             break;
  423.         case GOSSIP_ACTION_INFO_DEF + 15:
  424.             if (player->HasItemCount(HOUSE_TOKEN, 15, true))
  425.             {
  426.                 player->PlayerTalkClass->SendCloseGossip();
  427.                 player->DestroyItemCount(HOUSE_TOKEN, PRICE_FOR_P3, true);
  428.                 updatePlayerPackage(player->GetSession()->GetGUIDLow(), 3);
  429.                 ChatHandler(player->GetSession()).PSendSysMessage("Package #3 bought! A new option will show up on your Land Manager.");
  430.             }
  431.             else
  432.             {
  433.                 ChatHandler(player->GetSession()).PSendSysMessage("You do not have enough House Tokens to purchase this package!");
  434.             }
  435.             break;
  436.  
  437.         case GOSSIP_ACTION_INFO_DEF + 20:
  438.             if (isLandOwner(player->GetSession()->GetGUIDLow()))
  439.             {
  440.                 if (player->HasItemCount(HOUSE_TOKEN, 15, true))
  441.                 {
  442.                     if (upgrades <= MAX_UPGRADES)
  443.                     {
  444.                         CharacterDatabase.PExecute("UPDATE player_house_taken SET bottom_x=bottom_x+5 WHERE player_guid=%u", player->GetSession()->GetGUIDLow());
  445.                         CharacterDatabase.PExecute("UPDATE player_house_taken SET top_x=top_x+5 WHERE player_guid=%u", player->GetSession()->GetGUIDLow());
  446.                         CharacterDatabase.PExecute("UPDATE player_house_taken SET left_y=left_y+5 WHERE player_guid=%u", player->GetSession()->GetGUIDLow());
  447.                         CharacterDatabase.PExecute("UPDATE player_house_taken SET right_y=right_y+5 WHERE player_guid=%u", player->GetSession()->GetGUIDLow());
  448.                         player->DestroyItemCount(HOUSE_TOKEN, 15, TRUE);
  449.                     }
  450.                     else
  451.                       ChatHandler(player->GetSession()).PSendSysMessage("You have already upgraded your house %i times.", MAX_UPGRADES);
  452.                    
  453.                 }
  454.                 else
  455.                     ChatHandler(player->GetSession()).PSendSysMessage("You do not have enough House Tokens to upgrade the size of your housue.");  
  456.             }
  457.             ChatHandler(player->GetSession()).PSendSysMessage("You do not own a house.", MAX_UPGRADES);
  458.  
  459.             break;
  460.  
  461.         case GOSSIP_ACTION_INFO_DEF + 150:
  462.             if (player->HasItemCount(HOUSE_TOKEN, 15, true))
  463.             {
  464.                 player->PlayerTalkClass->SendCloseGossip();
  465.                 player->DestroyItemCount(HOUSE_TOKEN, PRICE_FOR_P4, true);
  466.                 updatePlayerPackage(player->GetSession()->GetGUIDLow(), 4);
  467.                 ChatHandler(player->GetSession()).PSendSysMessage("Package #4 bought! A new option will show up on your Land Manager.");
  468.             }
  469.             else
  470.             {
  471.                 ChatHandler(player->GetSession()).PSendSysMessage("You do not have enough House Tokens to purchase this package!");
  472.             }
  473.             break;
  474.  
  475.             //preview packages
  476.         case GOSSIP_ACTION_INFO_DEF + 16:
  477.             if (player->IsInCombat())
  478.                 return false;
  479.             player->TeleportTo(530, -1881.034668f, 5631.024902f, 127.382050f, 4.603881f);
  480.             break;
  481.         case GOSSIP_ACTION_INFO_DEF + 17:
  482.             if (player->IsInCombat())
  483.                 return false;
  484.             player->TeleportTo(530, -1729.365845f, 5612.726562f, 127.946556f, 4.764105f);
  485.             break;
  486.         case GOSSIP_ACTION_INFO_DEF + 18:
  487.             if (player->IsInCombat())
  488.                 return false;
  489.             player->TeleportTo(530, -2003.780518f, 5566.025391f, 53.307026f, 6.0363144f);
  490.             break;
  491.         case GOSSIP_ACTION_INFO_DEF + 180:
  492.             if (player->IsInCombat())
  493.                 return false;
  494.             player->TeleportTo(530, -2213.622070f, 5547.188477f, 112.163513f, 2.822561f);
  495.             break;
  496.         }
  497.  
  498.         return true;
  499.     }
  500. };
  501.  
  502. class player_housing_npc_package_guide : public CreatureScript
  503. {
  504. public:
  505.     player_housing_npc_package_guide()
  506.         : CreatureScript("player_housing_npc_package_guide")
  507.     {
  508.     }
  509.  
  510.     bool OnGossipHello(Player* player, Creature* creature)
  511.     {
  512.         player->PlayerTalkClass->ClearMenus();
  513.         AddGossipItemFor(player, GOSSIP_ICON_TAXI, "Take me back!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
  514.         player->PlayerTalkClass->SendGossipMenu(4, creature->GetGUID());
  515.         return true;
  516.     }
  517.  
  518.     bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction)
  519.     {
  520.         player->PlayerTalkClass->SendCloseGossip();
  521.         if (uiAction == GOSSIP_ACTION_INFO_DEF + 1)
  522.         {
  523.             if (player->IsBeingTeleported() || player->IsInCombat())
  524.                 return false;
  525.  
  526.             player->Recall();
  527.             return true;
  528.         }
  529.  
  530.         if (uiAction == GOSSIP_ACTION_INFO_DEF + 2)
  531.         {
  532.             player->PlayerTalkClass->SendCloseGossip();
  533.             QueryResult result = CharacterDatabase.PQuery("SELECT id FROM player_house_available WHERE c_guid = '%u'", creature->GetGUID().GetCounter());
  534.             if (result)
  535.             {
  536.                 Field* fields = result->Fetch();
  537.                 uint32 _selection = fields[0].GetInt32();
  538.                 if (GetOwnerLandCount(player->GetSession()->GetGUIDLow()) < 10)
  539.                 {
  540.                     buyLand(player, creature, _selection);
  541.                 }
  542.                 else
  543.                 {
  544.                     ChatHandler(player->GetSession()).PSendSysMessage("You can not own anymore land!");
  545.                 }
  546.             }
  547.             else
  548.             {
  549.                 ChatHandler(player->GetSession()).PSendSysMessage("Failed!");
  550.             }
  551.         }
  552.         return true;
  553.     }
  554.  
  555. };
  556.  
  557. uint32 getNPCBonus(uint64 plrName)
  558. {
  559.     uint32 npc = 0;
  560.     QueryResult result = CharacterDatabase.PQuery("SELECT npcs_bonus FROM player_house WHERE player_guid = %u", plrName);
  561.     if (result)
  562.         npc = (*result)[0].GetUInt32();
  563.     return npc;
  564. }
  565.  
  566. bool hasPackage(uint32 player_guid, uint32 package)
  567. {
  568.     QueryResult result = CharacterDatabase.PQuery("SELECT * FROM player_house WHERE package%u = 1 AND player_guid = %u", package, player_guid);
  569.     if (result)
  570.         return true;
  571.     return false;
  572. }
  573.  
  574. uint32 getGoBonus(uint64 plrName)
  575. {
  576.     uint32 npc = 0;
  577.     QueryResult result = CharacterDatabase.PQuery("SELECT items_bonus FROM player_house WHERE player_guid = %u", plrName);
  578.     if (result)
  579.         npc = (*result)[0].GetUInt32();
  580.     return npc;
  581. }
  582.  
  583. bool updatePlayerPackage(uint32 AccID, uint32 package)
  584. {
  585.     CharacterDatabase.PExecute("UPDATE player_house SET package%u=1 WHERE player_guid=%u", package, AccID);
  586.     return true;
  587. }
  588.  
  589. bool isLandOwner(uint64 name)
  590. {
  591.     QueryResult result = CharacterDatabase.PQuery("SELECT * FROM player_house_taken WHERE player_guid=%u", name);
  592.     if (result)
  593.         return true;
  594.     return false;
  595. }
  596.  
  597. uint32 getLandPrice(uint32 selection)
  598. {
  599.     uint32 PFL = 10;
  600.     QueryResult result = CharacterDatabase.PQuery("SELECT price FROM player_house_available WHERE id=%u", selection);
  601.     if (result)
  602.         PFL = (*result)[0].GetUInt32();
  603.     return PFL;
  604. }
  605.  
  606. bool buyLand(Player* player, Creature* creature, uint32 selection)
  607. {
  608.     if (!selection)
  609.         return false;
  610.  
  611.     uint32 _PFL = getLandPrice(selection);
  612.  
  613.     if (!creature)
  614.         return false;
  615.  
  616.     if (player->HasItemCount(HOUSE_TOKEN, _PFL, true))
  617.     {
  618.         player->DestroyItemCount(HOUSE_TOKEN, _PFL, true);
  619.         QueryResult a_result = CharacterDatabase.PQuery("SELECT zone_name, map_id, bottom_x, top_x, left_y, right_y, spawn_x, spawn_y, spawn_z, spawn_o, c_guid FROM player_house_available WHERE id = %u", selection);
  620.         if (a_result)
  621.         {
  622.             Field* fields = a_result->Fetch();
  623.             CharacterDatabase.PExecute("INSERT INTO player_house_taken (player_name, player_guid, zone_name, map_id, bottom_x, top_x, left_y, right_y, spawn_x, spawn_y, spawn_z, spawn_o) VALUES (\"%s\", %u, \"%s\", %u, %f, %f, %f, %f, %f, %f, %f, %f)", player->GetName(), player->GetSession()->GetGUIDLow(), fields[0].GetString().c_str(), fields[1].GetUInt32(), fields[2].GetFloat(), fields[3].GetFloat(), fields[4].GetFloat(), fields[5].GetFloat(), fields[6].GetFloat(), fields[7].GetFloat(), fields[8].GetFloat(), fields[9].GetFloat());
  624.  
  625.             if (!isLandOwner(player->GetSession()->GetGUIDLow()))
  626.                 CharacterDatabase.PExecute("INSERT INTO player_house SET player_guid = %u, player_name = \"%s\"", player->GetSession()->GetGUIDLow()), player->GetName();
  627.  
  628.             CharacterDatabase.PExecute("DELETE FROM player_house_available WHERE id = %u", selection);
  629.  
  630.             creature->CombatStop();
  631.             creature->DeleteFromDB();
  632.             creature->AddObjectToRemoveList();
  633.  
  634.             player->CastSpell(player, 55420, false);
  635.             if (!player->HasItemCount(LAND_ITEM_ID, 1, true))
  636.             {
  637.                 player->AddItem(LAND_ITEM_ID, 1);
  638.                 ChatHandler(player->GetSession()).PSendSysMessage("You now have your own land! You have been given a item to access all the custom features!");
  639.             }
  640.             else
  641.                 ChatHandler(player->GetSession()).PSendSysMessage("You now have your own land! Use your land item to access all the custom features!");
  642.  
  643.             return true;
  644.         }
  645.         else
  646.         {
  647.             ChatHandler(player->GetSession()).PSendSysMessage("Your information could not be inserted into the database! Your House Tokens have been refunded!");
  648.             player->AddItem(HOUSE_TOKEN, _PFL);
  649.         }
  650.  
  651.         ItemPosCountVec dest;
  652.         if (player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, LAND_ITEM_ID, 1) == EQUIP_ERR_OK)
  653.         {
  654.  
  655.             if (player->AddItem(LAND_ITEM_ID, 1))
  656.             {
  657.             }
  658.             else
  659.             {
  660.                 ChatHandler(player->GetSession()).PSendSysMessage("Your item to manage your land could not be given to you! Go to the Land Manager to get the House Controller.");
  661.                 return false;
  662.             }
  663.         }
  664.         else
  665.         {
  666.             ChatHandler(player->GetSession()).PSendSysMessage(497, LAND_ITEM_ID, 0);
  667.             ChatHandler(player->GetSession()).PSendSysMessage("You do not have enough room in your inventory! Go to the Land Manager to get the House Controller.");
  668.             return false;
  669.         }
  670.     }
  671.     else
  672.     {
  673.         ChatHandler(player->GetSession()).PSendSysMessage("You do not have enough House Tokens to buy any land, this land costs %u House Tokens.", _PFL);
  674.         return false;
  675.     }
  676.     return false;
  677. }
  678.  
  679. void AddSC_PlayerHousing()
  680. {
  681.     new player_housing_npc();
  682.     new player_housing_npc_guide();
  683.     new player_housing_packages();
  684.     new player_housing_npc_package_guide();
  685.  
  686. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement