Advertisement
Guest User

Untitled

a guest
Aug 29th, 2012
349
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.66 KB | None | 0 0
  1. ///////////////////////////////
  2. //**** Created By EroniX ****//
  3. ///////////////////////////////
  4. //
  5. // #Files: - TransmogHandler.cpp
  6. //
  7. // - TransmogEngine.cpp
  8. // - TransmogEngine.h
  9. //
  10. // - TransmogMgr.cpp
  11. // - TransmogMgr.h
  12. //
  13. //
  14. // #Core Mods: - Player.cpp:
  15. // - #include "TransmogEngine.h"
  16. // - EquipItem:
  17. // - TransmogEngine::SetTransmogDisplay(this, slot);
  18. //
  19. // - RemoveItem:
  20. // - TransmogEngine::RemoveTransmog(this, slot);
  21. //
  22. // - Player.h:
  23. // - uint32 selectedSlotID;
  24. // - Loot* selectedInterface;
  25. //
  26. // - LootHandler.cpp:
  27. // - #include "TransmogEngine.h"
  28. // - HandleAutostoreLootItemOpcode:
  29. // if(TransmogEngine::IsActiveInterface(lguid) && player)
  30. // {
  31. // if(Creature* creature = player->GetMap()->GetCreature(lguid))
  32. // TransmogEngine::HandleInterfaceSelect(player, creature, player->selectedInterface, lootSlot);
  33. //
  34. // return;
  35. // }
  36. //
  37. // - HandleLootReleaseOpcode:
  38. // if(Player* player = GetPlayer())
  39. // if(TransmogEngine::IsActiveInterface(guid))
  40. // {
  41. // if(Creature* creature = GetPlayer()->GetMap()->GetCreature(guid))
  42. // TransmogEngine::SendInterfaceClose(player, guid);
  43. //
  44. // return;
  45. // }
  46.  
  47. #include "TransmogEngine.h"
  48. #include "TransmogMgr.h"
  49. #include "ObjectDefines.h"
  50. #include "ObjectMgr.h"
  51.  
  52. //////////////////////////////////////////////////////////////
  53. //******************* Interface Helpers ********************//
  54. //////////////////////////////////////////////////////////////
  55.  
  56. void TransmogEngine::AddInterfacePreparation(Player* player, Creature* creature, Loot* loot, uint8 slotID)
  57. {
  58. if(!player || !creature)
  59. return;
  60.  
  61. player->SetLootGUID(creature->GetGUID());
  62.  
  63. loot->loot_type = LOOT_PICKPOCKETING;
  64. loot->AddLooter(player->GetGUID());
  65.  
  66. player->selectedSlotID = slotID;
  67. player->selectedInterface = loot;
  68. }
  69.  
  70. void TransmogEngine::RemoveInterfacePreparation(Player* player)
  71. {
  72. if(!player)
  73. return;
  74.  
  75. player->SetLootGUID(0);
  76. player->selectedSlotID = 0;
  77. player->selectedInterface = NULL;
  78. }
  79.  
  80. void TransmogEngine::SendInterfaceClose(Player* player, uint64 creatureGUID)
  81. {
  82. if(player)
  83. {
  84. player->SendLootRelease(creatureGUID);
  85. TransmogEngine::RemoveInterfacePreparation(player);
  86. }
  87. }
  88.  
  89. void TransmogEngine::SendInterfaceOpen(Player* player, Creature* creature, Loot* loot)
  90. {
  91. if(!player)
  92. return;
  93.  
  94. WorldPacket data(SMSG_LOOT_RESPONSE, (9+50));
  95. data << uint64(creature->GetGUID());
  96. data << uint8(LOOT_PICKPOCKETING);
  97. data << LootView(*loot, player, OWNER_PERMISSION);
  98.  
  99. player->SendDirectMessage(&data);
  100. }
  101.  
  102. //////////////////////////////////////////////////////////////
  103. //********************** Checkers **************************//
  104. //////////////////////////////////////////////////////////////
  105.  
  106. bool TransmogEngine::IsInList(uint32 value, uint32 subClassTwoHand[4], uint8 length)
  107. {
  108. for(uint8 i = 0; i < length; i++)
  109. if(value == subClassTwoHand[i])
  110. return true;
  111.  
  112. return false;
  113. }
  114.  
  115. bool TransmogEngine::IsInList(Loot* loot, LootStoreItem storeitem)
  116. {
  117. if(!loot)
  118. return false;
  119.  
  120. for (std::vector<LootItem>::iterator i = loot->items.begin(); i != loot->items.end(); ++i)
  121. {
  122. LootItem itemsElement = *i;
  123. if(itemsElement.itemid == storeitem.itemid)
  124. return true;
  125. }
  126.  
  127. return false;
  128. }
  129.  
  130. bool TransmogEngine::IsActiveInterface(uint64 creatureGUID)
  131. {
  132. if(!IS_CREATURE_GUID(creatureGUID))
  133. return false;
  134.  
  135. if(Creature* creature = ObjectAccessor::FindUnit(creatureGUID)->ToCreature())
  136. return (creature->GetEntry() == ENTRY);
  137.  
  138. return false;
  139. }
  140.  
  141. //////////////////////////////////////////////////////////////
  142. //********************* Set Display ************************//
  143. //////////////////////////////////////////////////////////////
  144.  
  145. bool TransmogEngine::RemoveAllTransmogDisplay(Player* player)
  146. {
  147. if(!player)
  148. return false;
  149.  
  150. for(uint8 i = 0; i < TransmogableItemsCount; i++)
  151. TransmogEngine::RemoveTransmogDisplay(player, itemSlotTypes[i]);
  152.  
  153. return true;
  154. }
  155.  
  156. bool TransmogEngine::RemoveTransmogDisplay(Player* player, uint32 slotID)
  157. {
  158. if(!player)
  159. return false;
  160.  
  161. if(Item* item = player->GetItemByPos(BAG, slotID))
  162. {
  163. TransmogEngine::TransmogDisplay(player, slotID, item->GetEntry());
  164. return true;
  165. }
  166.  
  167. return false;
  168. }
  169.  
  170. bool TransmogEngine::SetTransmogDisplay(Player* player, uint32 slotID)
  171. {
  172. if(!player)
  173. return false;
  174.  
  175. if(Item* item = player->GetItemByPos(BAG, slotID))
  176. {
  177. uint32 itemEntry = TransmogMgr::GetEntry(item->GetGUIDLow());
  178. if(itemEntry == PROBLEM)
  179. return false;
  180.  
  181. TransmogDisplay(player, slotID, itemEntry);
  182. return true;
  183. }
  184.  
  185. return false;
  186. }
  187.  
  188. bool TransmogEngine::SetAllTransmogDisplay(Player* player)
  189. {
  190. if(!player)
  191. return false;
  192.  
  193. for(uint8 i = 0; i < TransmogableItemsCount; i++)
  194. SetTransmogDisplay(player, itemSlotTypes[i]);
  195.  
  196. return true;
  197. }
  198.  
  199. bool TransmogEngine::TransmogDisplay(Player* player, int32 slotID, int32 itemENTRY)
  200. {
  201. if(!player)
  202. return false;
  203.  
  204. player->SetUInt32Value(GetVisualId(slotID), itemENTRY);
  205. return true;
  206. }
  207.  
  208. //////////////////////////////////////////////////////////////
  209. //*********************** Set DB ***************************//
  210. //////////////////////////////////////////////////////////////
  211.  
  212. void TransmogEngine::RemoveAllTransmogDB(uint32 playerGUID)
  213. {
  214. CharacterDatabase.PExecute
  215. (
  216. "DELETE FROM character_transmog WHERE player_guid = %u", playerGUID
  217. );
  218. }
  219. void TransmogEngine::RemoveTransmogDB(uint32 itemGUID)
  220. {
  221. CharacterDatabase.PExecute
  222. (
  223. "DELETE FROM character_transmog WHERE item_guid = %u", itemGUID
  224. );
  225. }
  226.  
  227. void TransmogEngine::ReplaceTransmogDB(uint32 playerGUID, uint32 itemGUID, uint32 itemENTRY)
  228. {
  229. CharacterDatabase.PExecute
  230. (
  231. "REPLACE INTO character_transmog VALUES (%u, %u, %u)", playerGUID, itemGUID, itemENTRY
  232. );
  233. }
  234.  
  235. //////////////////////////////////////////////////////////////
  236. //******************** Interface ***************************//
  237. //////////////////////////////////////////////////////////////
  238.  
  239. void TransmogEngine::HandleInterfaceSelect(Player* player, Creature* creature, Loot* loot, uint8 lootSLOT)
  240. {
  241. if(!player || !creature || !loot)
  242. return;
  243.  
  244. QuestItem* qItem = NULL; QuestItem* ffaItem = NULL; QuestItem* condItem = NULL;
  245.  
  246. LootItem* lootITEM = loot->LootItemInSlot(lootSLOT, player, &qItem, &ffaItem, &condItem);
  247. if(!lootITEM)
  248. {
  249. creature->MonsterWhisper("You don't have any items at the slot that you selected", player->GetGUID(), true);
  250. TransmogEngine::SendInterfaceClose(player, player->GetLootGUID());
  251. TransmogEngine::GossipHelloMainMenu(player, creature);
  252. return;
  253. }
  254.  
  255. uint32 itemENTRY = lootITEM->itemid;
  256. const ItemTemplate* itemTemplate = sObjectMgr->GetItemTemplate(itemENTRY);
  257.  
  258. uint32 slotID = player->selectedSlotID;
  259. if(slotID > EQUIPMENT_SLOT_END)
  260. {
  261. TransmogEngine::SendInterfaceClose(player, player->GetLootGUID());
  262. player->PlayerTalkClass->SendCloseGossip();
  263. return;
  264. }
  265.  
  266. Item* item = player->GetItemByPos(BAG, slotID);
  267. if(!item)
  268. {
  269. creature->MonsterWhisper("You should equip an item before use this feature", player->GetGUID(), true);
  270. TransmogEngine::SendInterfaceClose(player, player->GetLootGUID());
  271. TransmogEngine::GossipHelloMainMenu(player, creature);
  272. return;
  273. }
  274.  
  275. if(!TransmogEngine::CheckItem(player, item, itemTemplate))
  276. {
  277. creature->MonsterWhisper("Your item is not compatible with the selected item", player->GetGUID(), true);
  278. TransmogEngine::SendInterfaceClose(player, player->GetLootGUID());
  279. TransmogEngine::GossipHelloMainMenu(player, creature);
  280. return;
  281. }
  282.  
  283. creature->MonsterWhisper("Transmogrification has been added succesfully", player->GetGUID(), true);
  284. TransmogEngine::SetTransmogItem(player, itemENTRY, slotID);
  285. TransmogEngine::GossipHelloMainMenu(player, creature);
  286. }
  287.  
  288. Loot* TransmogEngine::CreateInterface(Player* player, Item* oldItem)
  289. {
  290. uint32 addedCount = 0;
  291.  
  292. Loot* loot = new Loot();
  293. loot->clear();
  294. loot->items.reserve(MAX_NR_LOOT_ITEMS);
  295.  
  296. if(!player || !oldItem)
  297. return loot;
  298.  
  299. bool isFirst = false;
  300. for (uint8 i = INVENTORY_SLOT_BAG_START; (i < INVENTORY_SLOT_BAG_END) || (isFirst = (i == INVENTORY_SLOT_BAG_END)); i++)
  301. {
  302. Bag* bag = player->GetBagByPos(i);
  303. if(!bag && !isFirst) // If we don't have bag and that's not the first
  304. continue;
  305.  
  306. for (uint32 j = isFirst ? INVENTORY_SLOT_ITEM_START : 0; isFirst ? (j < INVENTORY_SLOT_ITEM_END) : (j < bag->GetBagSize()); j++)
  307. {
  308. if ((addedCount + 1) >= MAX_NR_LOOT_ITEMS)
  309. return loot;
  310.  
  311. Item* newItem = player->GetItemByPos(isFirst ? INVENTORY_SLOT_BAG_0 : i, j);
  312. if(!newItem)
  313. continue;
  314.  
  315. const ItemTemplate* newItemTemplate = newItem->GetTemplate();
  316. if(!newItemTemplate)
  317. continue;
  318.  
  319. if (!TransmogEngine::CheckItem(player, oldItem, newItemTemplate))
  320. continue;
  321.  
  322. LootStoreItem storeItem = LootStoreItem(newItem->GetEntry(), 100.0f, LOOT_MODE_DEFAULT, 0, 1, 1);
  323. if(!IsInList(loot, storeItem))
  324. {
  325. loot->items.push_back(LootItem(storeItem));
  326. addedCount++;
  327. }
  328. }
  329. }
  330.  
  331. return loot;
  332. }
  333.  
  334. //////////////////////////////////////////////////////////////
  335. //******************** Transmog Helpers ********************//
  336. //////////////////////////////////////////////////////////////
  337.  
  338. void TransmogEngine::SetTransmogItem(Player* player, uint32 itemENTRY, uint32 slotID)
  339. {
  340. if(!player)
  341. return;
  342.  
  343. if(Item* item = player->GetItemByPos(BAG, slotID))
  344. {
  345. uint32 playerGUID = player->GetGUIDLow();
  346. uint32 itemGUID = item->GetGUIDLow();
  347.  
  348. TransmogMgr::UpdateTransmog(playerGUID, itemGUID, itemENTRY);
  349. TransmogEngine::ReplaceTransmogDB(playerGUID, itemGUID, itemENTRY);
  350. TransmogEngine::TransmogDisplay(player, slotID, itemENTRY);
  351.  
  352. player->CastSpell(player, VANISH_VISUAL, true);
  353. }
  354. }
  355.  
  356. void TransmogEngine::RemoveTransmog(Player* player, uint32 slotID)
  357. {
  358. if(!player)
  359. return;
  360.  
  361. if(Item* item = player->GetItemByPos(BAG, slotID))
  362. {
  363. uint32 itemGUID = item->GetGUIDLow();
  364.  
  365. TransmogMgr::RemoveTransmogItem(itemGUID);
  366. TransmogEngine::RemoveTransmogDB(itemGUID);
  367. TransmogEngine::RemoveTransmogDisplay(player, slotID);
  368.  
  369. player->CastSpell(player, VANISH_VISUAL, true);
  370. }
  371. }
  372.  
  373. void TransmogEngine::RemoveAllTransmog(Player* player)
  374. {
  375. if(!player)
  376. return;
  377.  
  378. for(int32 i = 0; i < TransmogableItemsCount; i++)
  379. {
  380. uint32 slotID = itemSlotTypes[i];
  381.  
  382. if(Item* item = player->GetItemByPos(BAG, slotID))
  383. {
  384. uint32 playerGUID = player->GetGUIDLow();
  385.  
  386. TransmogMgr::RemoveTransmogPlayer(playerGUID);
  387. TransmogEngine::RemoveAllTransmogDB(playerGUID);
  388. TransmogEngine::RemoveAllTransmogDisplay(player);
  389.  
  390. player->CastSpell(player, VANISH_VISUAL, true);
  391. }
  392. }
  393. }
  394.  
  395. //////////////////////////////////////////////////////////////
  396. //******************** Handler Helpers ********************//
  397. //////////////////////////////////////////////////////////////
  398.  
  399. void TransmogEngine::GossipHelloMainMenu(Player* player, Creature* creature)
  400. {
  401. player->PlayerTalkClass->ClearMenus();
  402. uint32 playerGUID = player->GetGUIDLow();
  403.  
  404. for(int32 i = 0; i < TransmogableItemsCount; i++)
  405. {
  406. uint32 slotID = itemSlotTypes[i];
  407.  
  408. Item* item = player->GetItemByPos(BAG, slotID);
  409. if(!item)
  410. continue;
  411.  
  412. const ItemTemplate* itemTemplate = item->GetTemplate();
  413. if(!itemTemplate)
  414. continue;
  415.  
  416. std::string slotName = CreateColorString(COLOR_DARK_GREY, GetSlotName(slotID) + "\n");
  417. std::string itemName = CreateColorString(COLOR_GREY, item->GetTemplate()->Name1);
  418.  
  419. if(TransmogMgr::IsTransmogedItem(item->GetGUIDLow()))
  420. player->ADD_GOSSIP_ITEM(5, "[Remove]: " + slotName + itemName, GOSSIP_SENDER_MAIN, slotID);
  421. else
  422. player->ADD_GOSSIP_ITEM(5, "[Create]: " + slotName + itemName, GOSSIP_SENDER_MAIN, slotID);
  423. }
  424.  
  425. uint32 transmogsCount = TransmogMgr::GetTransmogsCount(playerGUID);
  426.  
  427. std::string removeOutPut = CreateColorString(COLOR_GREY, GetString(transmogsCount) + CreateColorString(COLOR_DARK_GREY, " Items"));
  428. std::string learnOutPut = CreateColorString(COLOR_DARK_GREY, "...");
  429.  
  430. player->ADD_GOSSIP_ITEM(5, "[Remove All]: " + removeOutPut, GOSSIP_SENDER_MAIN, MENU_TEXT + 0);
  431. player->ADD_GOSSIP_ITEM(5, "Learn More" + learnOutPut, GOSSIP_SENDER_MAIN, MENU_TEXT + 3);
  432.  
  433. player->SEND_GOSSIP_MENU(TEXT_MAIN, creature->GetGUID());
  434. }
  435.  
  436. std::string TransmogEngine::GetSlotName(uint32 slotID)
  437. {
  438. switch(slotID)
  439. {
  440. case HEAD: return "Head";
  441. case SHOULDERS: return "Shoulders";
  442. case CHEST: return "Chest";
  443. case WAIST: return "Waist";
  444. case LEGS: return "Legs";
  445. case FEET: return "Feet";
  446. case WRIST: return "Wrist";
  447. case HANDS: return "Hands";
  448. case BACK: return "Back";
  449. case MAIN_HAND: return "MainHand";
  450. case OFF_HAND: return "OffHand";
  451. default: return "Ranged";
  452. }
  453. }
  454.  
  455. //////////////////////////////////////////////////////////////
  456. //*********************** Helpers **************************//
  457. //////////////////////////////////////////////////////////////
  458.  
  459. std::string TransmogEngine::CreateColorString(uint32 color, std::string text)
  460. {
  461. std::stringstream ss;
  462. ss << "|cff";
  463. ss << colorCodes[color - 1];
  464. ss << text;
  465. ss << "|r";
  466.  
  467. return ss.str();
  468. }
  469.  
  470. std::string TransmogEngine::GetString(int32 value)
  471. {
  472. std::stringstream ss;
  473. std::string s;
  474. ss << value;
  475. s = ss.str();
  476.  
  477. return s;
  478. }
  479.  
  480. bool TransmogEngine::CheckItem(Player* itemOwner, Item* oldItem, const ItemTemplate* newItemTemplate)
  481. {
  482. if(!itemOwner || !oldItem || !newItemTemplate)
  483. return false;
  484.  
  485. const ItemTemplate* oldItemTemplate = oldItem->GetTemplate();
  486. if(!oldItemTemplate)
  487. return false;
  488.  
  489. uint32 oldItemGUID = oldItem->GetGUIDLow();
  490. const ItemTemplate* fakeItemTemplate = NULL;
  491.  
  492. bool isTransmoged = TransmogMgr::IsTransmogedItem(oldItemGUID);
  493. if(isTransmoged)
  494. fakeItemTemplate = sObjectMgr->GetItemTemplate(TransmogMgr::GetEntry(oldItemGUID));
  495.  
  496. uint32 newClass = newItemTemplate->Class;
  497. uint32 oldClass = oldItemTemplate->Class;
  498.  
  499. uint32 newSubClass = newItemTemplate->SubClass;
  500. uint32 oldSubClass = oldItemTemplate->SubClass;
  501.  
  502. uint32 newInventoryType = newItemTemplate->InventoryType;
  503. uint32 oldInventoryType = oldItemTemplate->InventoryType;
  504.  
  505. if(oldItemTemplate->DisplayInfoID == newItemTemplate->DisplayInfoID)
  506. return false;
  507.  
  508. if(isTransmoged)
  509. if(newItemTemplate->DisplayInfoID == fakeItemTemplate->DisplayInfoID)
  510. return false;
  511.  
  512. if (newClass != oldClass)
  513. return false;
  514.  
  515. if(newInventoryType == INVTYPE_RELIC || oldInventoryType == INVTYPE_RELIC)
  516. return false;
  517.  
  518. if (newClass == ITEM_CLASS_ARMOR)
  519. if(newSubClass == oldSubClass && newInventoryType == oldInventoryType)
  520. return true;
  521.  
  522. if (newClass == ITEM_CLASS_WEAPON)
  523. {
  524. uint32 subClassTwoHand[4] =
  525. { ITEM_SUBCLASS_WEAPON_AXE2, ITEM_SUBCLASS_WEAPON_MACE2, ITEM_SUBCLASS_WEAPON_SWORD2, ITEM_SUBCLASS_WEAPON_POLEARM };
  526.  
  527. if(TransmogEngine::IsInList(newSubClass, subClassTwoHand, 4) && TransmogEngine::IsInList(oldSubClass, subClassTwoHand, 4))
  528. return true;
  529.  
  530. uint32 subClassOneHand[4] =
  531. { ITEM_SUBCLASS_WEAPON_AXE, ITEM_SUBCLASS_WEAPON_MACE, ITEM_SUBCLASS_WEAPON_SWORD, ITEM_SUBCLASS_WEAPON_DAGGER };
  532.  
  533. if(TransmogEngine::IsInList(newSubClass, subClassOneHand, 4) && TransmogEngine::IsInList(oldSubClass, subClassOneHand, 4))
  534. return true;
  535.  
  536. uint32 subClassRanged[4] =
  537. { ITEM_SUBCLASS_WEAPON_BOW, ITEM_SUBCLASS_WEAPON_GUN, ITEM_SUBCLASS_WEAPON_CROSSBOW, 0 };
  538.  
  539. if(TransmogEngine::IsInList(newSubClass, subClassRanged, 3) && TransmogEngine::IsInList(oldSubClass, subClassRanged, 3))
  540. return true;
  541.  
  542. if(newSubClass == oldSubClass)
  543. if(newSubClass == ITEM_SUBCLASS_WEAPON_WAND || newSubClass == ITEM_SUBCLASS_WEAPON_THROWN || ITEM_SUBCLASS_WEAPON_STAFF)
  544. return true;
  545. }
  546.  
  547. return false;
  548. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement