Advertisement
Guest User

Reforging Script

a guest
Jul 17th, 2013
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 22.75 KB | None | 0 0
  1. diff --git a/sql/updates/characters/item_instance.sql b/sql/updates/characters/item_instance.sql
  2. new file mode 100644
  3. index 0000000..a33ddc4
  4. --- /dev/null
  5. +++ b/sql/updates/characters/item_instance.sql
  6. @@ -0,0 +1,2 @@
  7. +ALTER TABLE `item_instance`
  8. +ADD COLUMN `displayId` mediumint(8) unsigned NOT NULL DEFAULT '0' AFTER `itemEntry`;
  9. diff --git a/sql/updates/world/reforging.sql b/sql/updates/world/reforging.sql
  10. new file mode 100644
  11. index 0000000..0f2843c
  12. --- /dev/null
  13. +++ b/sql/updates/world/reforging.sql
  14. @@ -0,0 +1,9 @@
  15. +DELETE FROM `creature_template` WHERE `entry` IN (60002, 60003);
  16. +INSERT INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid1`, `modelid2`, `modelid3`, `modelid4`, `name`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `exp`, `faction_A`, `faction_H`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `mindmg`, `maxdmg`, `dmgschool`, `attackpower`, `dmg_multiplier`, `baseattacktime`, `rangeattacktime`, `unit_class`, `unit_flags`, `dynamicflags`, `family`, `trainer_type`, `trainer_spell`, `trainer_class`, `trainer_race`, `minrangedmg`, `maxrangedmg`, `rangedattackpower`, `type`, `type_flags`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `spell5`, `spell6`, `spell7`, `spell8`, `PetSpellDataId`, `VehicleId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `HoverHeight`, `Health_mod`, `Mana_mod`, `Armor_mod`, `RacialLeader`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `movementId`, `RegenHealth`, `equipment_id`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`, `WDBVerified`) VALUES
  17. +(60002, 0, 0, 0, 0, 0, 23238, 0, 0, 0, 'Ридл', 'мастер перековки', 'Trainer', 0, 80, 80, 2, 35, 35, 1, 1, 1.14286, 1, 0, 300, 900, 0, 900, 1, 1500, 0, 8, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 0, 1, 1, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 2147483647, 0, 'npc_reforging', 1),
  18. +(60003, 0, 0, 0, 0, 0, 29535, 0, 0, 0, 'Эрудор', 'мастер перековки', 'Trainer', 0, 80, 80, 2, 35, 35, 1, 1, 1.14286, 1, 0, 300, 900, 0, 900, 1, 1500, 0, 8, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 0, 1, 1, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 2147483647, 0, 'npc_reforging', 1);
  19. +
  20. +DELETE FROM `npc_text` WHERE `ID` > 54999 AND `ID` < 55007;
  21. +INSERT INTO `npc_text` (`ID`, `text0_0`) VALUES
  22. +(55000, 'Выбирай. Что перековать?'),
  23. +(55001, 'С помощью этого сервиса вы сможете изменить внешний вид некоторых элементов экипировки на другой.\r\n\r\nСмена внешнего вида ограничена типом предмета (шлем на шлем, одноручный топор на одноручный топор и т.д). То есть, например, вы не можете изменить внешний вид топора на меч, или двуручного меча на одноручный.\r\n\r\nДля того, что бы изменить внешний вид предмета, вам нужно выбрать из списка часть экипировки которую хотите изменить и согласиться со стоимостью перековки. Затем вам предложат ввести номер предмета. Номер предмета можно узнать на сайте old.wowhead.com в разделе предметы, или с помощью аддона atlasloot, включив в настройках отображение номера предмета под его описанием. Внешний вид выбранного элемента экипировки изменится на внешний вид выбранного вами предмета.');
  24. diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
  25. index 209fdae..10caca0 100755
  26. --- a/src/server/game/Entities/Item/Item.cpp
  27. +++ b/src/server/game/Entities/Item/Item.cpp
  28. @@ -276,6 +276,7 @@ bool Item::Create(uint32 guidlow, uint32 itemid, Player const* owner)
  29.  
  30.      SetUInt32Value(ITEM_FIELD_DURATION, itemProto->Duration);
  31.      SetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME, 0);
  32. +    SetUInt32Value(ITEM_FIELD_DISPLAY_ID, 0);
  33.      return true;
  34. }
  35.  
  36. @@ -321,6 +322,10 @@ void Item::SaveToDB(SQLTransaction& trans)
  37.              uint8 index = 0;
  38.              PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(uState == ITEM_NEW ? CHAR_REP_ITEM_INSTANCE : CHAR_UPD_ITEM_INSTANCE);
  39.              stmt->setUInt32(  index, GetEntry());
  40. +
  41. +            if (uState == ITEM_CHANGED)
  42. +                stmt->setUInt32(++index, GetUInt32Value(ITEM_FIELD_DISPLAY_ID));
  43. +
  44.              stmt->setUInt32(++index, GUID_LOPART(GetOwnerGUID()));
  45.              stmt->setUInt32(++index, GUID_LOPART(GetUInt64Value(ITEM_FIELD_CREATOR)));
  46.              stmt->setUInt32(++index, GUID_LOPART(GetUInt64Value(ITEM_FIELD_GIFTCREATOR)));
  47. diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h
  48. index a5f9ed5..ae0eddd 100755
  49. --- a/src/server/game/Entities/Item/Item.h
  50. +++ b/src/server/game/Entities/Item/Item.h
  51. @@ -221,6 +221,9 @@ class Item : public Object
  52.          void SetOwnerGUID(uint64 guid) { SetUInt64Value(ITEM_FIELD_OWNER, guid); }
  53.          Player* GetOwner()const;
  54.  
  55. +        uint32 GetItemDisplayId() const { return GetUInt32Value(ITEM_FIELD_DISPLAY_ID); }
  56. +        void SetItemDisplayId(uint32 displayId) { SetUInt32Value(ITEM_FIELD_DISPLAY_ID, displayId); }
  57. +
  58.          void SetBinding(bool val) { ApplyModFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_SOULBOUND, val); }
  59.          bool IsSoulBound() const { return HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_SOULBOUND); }
  60.          bool IsBoundAccountWide() const { return (GetTemplate()->Flags & ITEM_PROTO_FLAG_BIND_TO_ACCOUNT) != 0; }
  61. diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h
  62. index 825bda9..af033bc 100755
  63. --- a/src/server/game/Entities/Object/Updates/UpdateFields.h
  64. +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h
  65. @@ -70,7 +70,7 @@ enum EItemFields
  66.      ITEM_FIELD_DURABILITY                     = OBJECT_END + 0x0036, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER
  67.      ITEM_FIELD_MAXDURABILITY                  = OBJECT_END + 0x0037, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER
  68.      ITEM_FIELD_CREATE_PLAYED_TIME             = OBJECT_END + 0x0038, // Size: 1, Type: INT, Flags: PUBLIC
  69. -    ITEM_FIELD_PAD                            = OBJECT_END + 0x0039, // Size: 1, Type: INT, Flags: NONE
  70. +    ITEM_FIELD_DISPLAY_ID                     = OBJECT_END + 0x0039, // Size: 1, Type: INT, Flags: PUBLIC
  71.      ITEM_END                                  = OBJECT_END + 0x003A,
  72. };
  73.  
  74. diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
  75. index 5e227e4..f51f482 100755
  76. --- a/src/server/game/Entities/Player/Player.cpp
  77. +++ b/src/server/game/Entities/Player/Player.cpp
  78. @@ -12486,7 +12486,11 @@ void Player::SetVisibleItemSlot(uint8 slot, Item* pItem)
  79. {
  80.      if (pItem)
  81.      {
  82. -        SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENTRYID + (slot * 2), pItem->GetEntry());
  83. +        if (pItem->GetItemDisplayId() == 0)
  84. +            SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENTRYID + (slot * 2), pItem->GetEntry());
  85. +        else
  86. +            SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENTRYID + (slot * 2), pItem->GetItemDisplayId());
  87. +
  88.          SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (slot * 2), 0, pItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT));
  89.          SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (slot * 2), 1, pItem->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT));
  90.      }
  91. @@ -17746,12 +17750,15 @@ Item* Player::_LoadItem(SQLTransaction& trans, uint32 zoneId, uint32 timeDiff, F
  92.      Item* item = NULL;
  93.      uint32 itemGuid  = fields[13].GetUInt32();
  94.      uint32 itemEntry = fields[14].GetUInt32();
  95. +    uint32 displayId = fields[15].GetUInt32();
  96.      if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemEntry))
  97.      {
  98.          bool remove = false;
  99.          item = NewItemOrBag(proto);
  100.          if (item->LoadFromDB(itemGuid, GetGUID(), fields, itemEntry))
  101.          {
  102. +            item->SetUInt32Value(ITEM_FIELD_DISPLAY_ID, displayId);
  103. +
  104.              // Do not allow to have item limited to another map/zone in alive state
  105.              if (isAlive() && item->IsLimitedToAnotherMapOrZone(GetMapId(), zoneId))
  106.              {
  107. diff --git a/src/server/scripts/Custom/npc_reforging.cpp b/src/server/scripts/Custom/npc_reforging.cpp
  108. new file mode 100644
  109. index 0000000..6e2e709
  110. --- /dev/null
  111. +++ b/src/server/scripts/Custom/npc_reforging.cpp
  112. @@ -0,0 +1,201 @@
  113. +#include "ScriptPCH.h"
  114. +
  115. +class npc_reforging : public CreatureScript
  116. +{
  117. +public:
  118. +    npc_reforging() : CreatureScript("npc_reforging")
  119. +    {
  120. +    }
  121. +
  122. +    bool isEquiped(Player* player, uint8 slot, uint8 &count)
  123. +    {
  124. +        Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
  125. +        if (!item)
  126. +            return false;
  127. +        if ((slot == EQUIPMENT_SLOT_RANGED || slot == EQUIPMENT_SLOT_OFFHAND || slot == EQUIPMENT_SLOT_MAINHAND) && !requiredItem(slot, item))
  128. +            return false;
  129. +
  130. +        ++count;
  131. +
  132. +        return true;
  133. +    }
  134. +
  135. +    bool requiredItem(uint8 slot, Item* item)
  136. +    {
  137. +        ItemTemplate const* pProto = item->GetTemplate();
  138. +
  139. +        if (slot == EQUIPMENT_SLOT_RANGED)
  140. +            if (pProto->Class == 2 && (pProto->SubClass == 2 || pProto->SubClass == 3 || pProto->SubClass == 18 || pProto->SubClass == 19))
  141. +                return true;
  142. +        if (slot == EQUIPMENT_SLOT_OFFHAND)
  143. +            if ((pProto->Class == 2 && (pProto->SubClass == 0 || pProto->SubClass == 4 || pProto->SubClass == 7 || pProto->SubClass == 13 || pProto->SubClass == 15)) || (pProto->Class == 4 && pProto->SubClass == 6))
  144. +                return true;
  145. +        if (slot == EQUIPMENT_SLOT_MAINHAND)
  146. +            if (pProto->Class == 2 && (pProto->SubClass == 0 || pProto->SubClass == 1 || pProto->SubClass == 4 || pProto->SubClass == 5 || pProto->SubClass == 6 || pProto->SubClass == 7 || pProto->SubClass == 8 || pProto->SubClass == 10 || pProto->SubClass == 13 || pProto->SubClass == 15))
  147. +                return true;
  148. +
  149. +        return false;
  150. +    }
  151. +
  152. +    uint32 getCost(uint8 slot)
  153. +    {
  154. +        if (slot == EQUIPMENT_SLOT_RANGED || slot == EQUIPMENT_SLOT_OFFHAND || slot == EQUIPMENT_SLOT_MAINHAND)
  155. +            return 20000000;
  156. +        if (slot == EQUIPMENT_SLOT_WRISTS || slot == EQUIPMENT_SLOT_WAIST)
  157. +            return 5000000;
  158. +
  159. +        return 10000000;
  160. +    }
  161. +
  162. +    void reforge(Player* player, Creature* creature, uint8 slot, const char* code)
  163. +    {
  164. +        player->CLOSE_GOSSIP_MENU();
  165. +
  166. +        if (!player->HasEnoughMoney(getCost(slot)))
  167. +            return;
  168. +
  169. +        Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
  170. +
  171. +        if (!item || ((slot == EQUIPMENT_SLOT_RANGED || slot == EQUIPMENT_SLOT_OFFHAND || slot == EQUIPMENT_SLOT_MAINHAND) && !requiredItem(slot, item)))
  172. +        {
  173. +            ChatHandler(player).PSendSysMessage("|cfff4b25eМастер перековки шепчет:|r |cfffcedbbМы ведь договаривались на другой предмет!? Если передумал, то давай с начала.|r");
  174. +            return;
  175. +        }
  176. +
  177. +        uint32 entry = 0;
  178. +        if (code)
  179. +            sscanf(code, "%i", &entry);
  180. +
  181. +        ItemTemplate const* mItem = item->GetTemplate();
  182. +        ItemTemplate const* wItem = sObjectMgr->GetItemTemplate(entry);
  183. +        if (!mItem || !wItem)
  184. +        {
  185. +            ChatHandler(player).PSendSysMessage("|cfff4b25eМастер перековки шепчет:|r |cfffcedbbЯ не нашёл предмета с таким номером. Попробуйте ещё раз.|r");
  186. +            return;
  187. +        }
  188. +
  189. +        if (mItem->Class == wItem->Class && mItem->SubClass == wItem->SubClass)
  190. +        {
  191. +            item->SetItemDisplayId(entry);
  192. +            player->SetVisibleItemSlot(slot, item);
  193. +            player->ModifyMoney(-int32(getCost(slot)));
  194. +            player->CastSpell(player, 44688, true);
  195. +        }
  196. +        else
  197. +        {
  198. +            ChatHandler(player).PSendSysMessage("|cfff4b25eМастер перековки шепчет:|r |cfffcedbbПрочтите информацию о перековке ещё раз. Видимо вы что-то не так поняли.|r");
  199. +            return;
  200. +        }
  201. +    }
  202. +
  203. +    bool OnGossipHello(Player* player, Creature* creature)
  204. +    {
  205. +        uint8 count = 0;
  206. +
  207. +        player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, "Информация о перековке", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+14);
  208. +
  209. +        if (isEquiped(player, EQUIPMENT_SLOT_HEAD, count))
  210. +            player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "Голова", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2, "Стоимость перековки:", 10000000, true);
  211. +        if (isEquiped(player, EQUIPMENT_SLOT_SHOULDERS, count))
  212. +            player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "Плечо", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3, "Стоимость перековки:", 10000000, true);
  213. +        if (isEquiped(player, EQUIPMENT_SLOT_BACK, count))
  214. +            player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "Спина", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4, "Стоимость перековки:", 10000000, true);
  215. +        if (isEquiped(player, EQUIPMENT_SLOT_CHEST, count))
  216. +            player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "Грудь", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5, "Стоимость перековки:", 10000000, true);
  217. +        if (isEquiped(player, EQUIPMENT_SLOT_WRISTS, count))
  218. +            player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "Запястья", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6, "Стоимость перековки:", 5000000, true);
  219. +        if (isEquiped(player, EQUIPMENT_SLOT_HANDS, count))
  220. +            player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "Кисти рук", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+7, "Стоимость перековки:", 10000000, true);
  221. +        if (isEquiped(player, EQUIPMENT_SLOT_WAIST, count))
  222. +            player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "Пояс", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+8, "Стоимость перековки:", 5000000, true);
  223. +        if (isEquiped(player, EQUIPMENT_SLOT_LEGS, count))
  224. +            player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "Ноги", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+9, "Стоимость перековки:", 10000000, true);
  225. +        if (isEquiped(player, EQUIPMENT_SLOT_FEET, count))
  226. +            player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "Ступни", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+10, "Стоимость перековки:", 10000000, true);
  227. +        if (isEquiped(player, EQUIPMENT_SLOT_MAINHAND, count))
  228. +            player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "Правая рука", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+11, "Стоимость перековки:", 20000000, true);
  229. +        if (isEquiped(player, EQUIPMENT_SLOT_OFFHAND, count))
  230. +            player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "Левая рука", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+12, "Стоимость перековки:", 20000000, true);
  231. +        if (isEquiped(player, EQUIPMENT_SLOT_RANGED, count))
  232. +            player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "Левая рука", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+13, "Стоимость перековки:", 20000000, true);
  233. +
  234. +        if (count > 0)
  235. +            player->SEND_GOSSIP_MENU(55000, creature->GetGUID());
  236. +        else
  237. +            ChatHandler(player).PSendSysMessage("|cfff4b25eМастер перековки шепчет:|r |cfffcedbbИз всех одетых на вас предметов я ни один не смогу перековать. Приходите позже, когда раздобудете других вещей.|r");
  238. +
  239. +        return true;
  240. +    }
  241. +
  242. +    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)
  243. +    {
  244. +        player->PlayerTalkClass->ClearMenus();
  245. +
  246. +        if (sender != GOSSIP_SENDER_MAIN)
  247. +            return false;
  248. +
  249. +        switch (action)
  250. +        {
  251. +            case GOSSIP_ACTION_INFO_DEF+14:
  252. +                player->SEND_GOSSIP_MENU(55001, creature->GetGUID());
  253. +                break;
  254. +        }
  255. +
  256. +        return true;
  257. +    }
  258. +
  259. +    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, const char* code)
  260. +    {
  261. +        player->PlayerTalkClass->ClearMenus();
  262. +
  263. +        if (sender != GOSSIP_SENDER_MAIN)
  264. +            return false;
  265. +
  266. +        switch (action)
  267. +        {
  268. +            case GOSSIP_ACTION_INFO_DEF+2:
  269. +                reforge(player, creature, EQUIPMENT_SLOT_HEAD, code);
  270. +                break;
  271. +            case GOSSIP_ACTION_INFO_DEF+3:
  272. +                reforge(player, creature, EQUIPMENT_SLOT_SHOULDERS, code);
  273. +                break;
  274. +            case GOSSIP_ACTION_INFO_DEF+4:
  275. +                reforge(player, creature, EQUIPMENT_SLOT_BACK, code);
  276. +                break;
  277. +            case GOSSIP_ACTION_INFO_DEF+5:
  278. +                reforge(player, creature, EQUIPMENT_SLOT_CHEST, code);
  279. +                break;
  280. +            case GOSSIP_ACTION_INFO_DEF+6:
  281. +                reforge(player, creature, EQUIPMENT_SLOT_WRISTS, code);
  282. +                break;
  283. +            case GOSSIP_ACTION_INFO_DEF+7:
  284. +                reforge(player, creature, EQUIPMENT_SLOT_HANDS, code);
  285. +                break;
  286. +            case GOSSIP_ACTION_INFO_DEF+8:
  287. +                reforge(player, creature, EQUIPMENT_SLOT_WAIST, code);
  288. +                break;
  289. +            case GOSSIP_ACTION_INFO_DEF+9:
  290. +                reforge(player, creature, EQUIPMENT_SLOT_LEGS, code);
  291. +                break;
  292. +            case GOSSIP_ACTION_INFO_DEF+10:
  293. +                reforge(player, creature, EQUIPMENT_SLOT_FEET, code);
  294. +                break;
  295. +            case GOSSIP_ACTION_INFO_DEF+11:
  296. +                reforge(player, creature, EQUIPMENT_SLOT_MAINHAND, code);
  297. +                break;
  298. +            case GOSSIP_ACTION_INFO_DEF+12:
  299. +                reforge(player, creature, EQUIPMENT_SLOT_OFFHAND, code);
  300. +                break;
  301. +            case GOSSIP_ACTION_INFO_DEF+13:
  302. +                reforge(player, creature, EQUIPMENT_SLOT_RANGED, code);
  303. +                break;
  304. +        }
  305. +
  306. +        return true;
  307. +    }
  308. +};
  309. +
  310. +void AddSC_npc_reforging()
  311. +{
  312. +    new npc_reforging;
  313. +}
  314. diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
  315. index c7a283c..c31f733 100644
  316. --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
  317. +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
  318. @@ -82,7 +82,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
  319.      PREPARE_STATEMENT(CHAR_INS_CHARACTER_SEASONALQUESTSTATUS, "INSERT INTO character_queststatus_seasonal (guid, quest, event) VALUES (?, ?, ?)", CONNECTION_ASYNC)
  320.      PREPARE_STATEMENT(CHAR_SEL_CHARACTER_REPUTATION, "SELECT faction, standing, flags FROM character_reputation WHERE guid = ?", CONNECTION_ASYNC)
  321.      PREPARE_STATEMENT(CHAR_SEL_CHARACTER_INVENTORY, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, bag, slot, "
  322. -    "item, itemEntry FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot", CONNECTION_ASYNC)
  323. +    "item, itemEntry, displayId FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot", CONNECTION_ASYNC)
  324.      PREPARE_STATEMENT(CHAR_SEL_CHARACTER_ACTIONS, "SELECT a.button, a.action, a.type FROM character_action as a, characters as c WHERE a.guid = c.guid AND a.spec = c.activespec AND a.guid = ? ORDER BY button", CONNECTION_ASYNC)
  325.      PREPARE_STATEMENT(CHAR_SEL_CHARACTER_MAILCOUNT, "SELECT COUNT(id) FROM mail WHERE receiver = ? AND (checked & 1) = 0 AND deliver_time <= ?", CONNECTION_ASYNC)
  326.      PREPARE_STATEMENT(CHAR_SEL_CHARACTER_MAILDATE, "SELECT MIN(deliver_time) FROM mail WHERE receiver = ? AND (checked & 1) = 0", CONNECTION_ASYNC)
  327. @@ -131,8 +131,8 @@ void CharacterDatabaseConnection::DoPrepareStatements()
  328.      PREPARE_STATEMENT(CHAR_DEL_ITEM_BOP_TRADE, "DELETE FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1", CONNECTION_ASYNC)
  329.      PREPARE_STATEMENT(CHAR_INS_ITEM_BOP_TRADE, "INSERT INTO item_soulbound_trade_data VALUES (?, ?)", CONNECTION_ASYNC)
  330.      PREPARE_STATEMENT(CHAR_REP_INVENTORY_ITEM, "REPLACE INTO character_inventory (guid, bag, slot, item) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC)
  331. -    PREPARE_STATEMENT(CHAR_REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
  332. -    PREPARE_STATEMENT(CHAR_UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomPropertyId = ?, durability = ?, playedTime = ?, text = ? WHERE guid = ?", CONNECTION_ASYNC)
  333. +    PREPARE_STATEMENT(CHAR_REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, displayId, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, guid) VALUES (?, 0, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
  334. +    PREPARE_STATEMENT(CHAR_UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, displayId = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomPropertyId = ?, durability = ?, playedTime = ?, text = ? WHERE guid = ?", CONNECTION_ASYNC)
  335.      PREPARE_STATEMENT(CHAR_UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ? WHERE guid = ?", CONNECTION_ASYNC)
  336.      PREPARE_STATEMENT(CHAR_DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?", CONNECTION_ASYNC)
  337.      PREPARE_STATEMENT(CHAR_UPD_GIFT_OWNER, "UPDATE character_gifts SET guid = ? WHERE item_guid = ?", CONNECTION_ASYNC)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement