Advertisement
Guest User

Ultimate Enchanting NPC Script - WoWBB.org

a guest
Feb 17th, 2015
310
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //    _      ______ _      _____  ___                
  2. //   | | /| / / __ \ | /| / / _ )/ _ ) ___  _______ _
  3. //   | |/ |/ / /_/ / |/ |/ / _  / _  |/ _ \/ __/ _ `/
  4. //   |__/|__/\____/|__/|__/____/____(_)___/_/  \_, /
  5. //                                            /___/  
  6. //   Script posted from WoWBB.org
  7.  
  8. #include "ScriptPCH.h"
  9.  
  10. class npc_enchantment : public CreatureScript
  11. {
  12.     public:
  13.         npc_enchantment() : CreatureScript("npc_enchantment") { }
  14.  
  15.     bool OnGossipHello(Player* player, Creature* creature)
  16.     {
  17.         player->ADD_GOSSIP_ITEM(0, "[Enchant Weapon]", GOSSIP_SENDER_MAIN, EQUIPMENT_SLOT_MAINHAND);
  18.         player->ADD_GOSSIP_ITEM(0, "[Enchant Off-Hand]", GOSSIP_SENDER_MAIN, EQUIPMENT_SLOT_OFFHAND);
  19.         player->ADD_GOSSIP_ITEM(0, "[Enchant Cloak]", GOSSIP_SENDER_MAIN, EQUIPMENT_SLOT_BACK);
  20.         player->ADD_GOSSIP_ITEM(0, "[Enchant Chest]", GOSSIP_SENDER_MAIN, EQUIPMENT_SLOT_CHEST);
  21.         player->ADD_GOSSIP_ITEM(0, "[Enchant Bracers]", GOSSIP_SENDER_MAIN, EQUIPMENT_SLOT_WRISTS);
  22.         player->ADD_GOSSIP_ITEM(0, "[Enchant Gloves]", GOSSIP_SENDER_MAIN, EQUIPMENT_SLOT_HANDS);
  23.         player->ADD_GOSSIP_ITEM(0, "[Enchant Feet]", GOSSIP_SENDER_MAIN, EQUIPMENT_SLOT_FEET);
  24.  
  25.         player->SEND_GOSSIP_MENU(1, creature->GetGUID());
  26.         return true;
  27.     }
  28.  
  29.     void Enchant(Player* player, uint8 equipSlot, uint32 enchantID)
  30.     {
  31.         Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipSlot);
  32.         if (!item)
  33.         {
  34.             player->CLOSE_GOSSIP_MENU();
  35.             return;
  36.         }
  37.  
  38.         // Must re-check that the currently equipped item is valid
  39.         uint32 i;
  40.         for (i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
  41.         {
  42.             SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i);
  43.             if (!spellInfo)
  44.                 continue;
  45.             if (spellInfo->Effects[0].Effect != SPELL_EFFECT_ENCHANT_ITEM)
  46.                 continue;
  47.             if (spellInfo->Effects[0].MiscValue != enchantID)
  48.                 continue;
  49.  
  50.             uint32 spellID = 0;
  51.             SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellInfo->Id);
  52.             for (SkillLineAbilityMap::const_iterator itr = bounds.first; itr != bounds.second; ++itr)
  53.             {
  54.                 // Not from the enchanting skill
  55.                 if (itr->second->skillId != 333 || itr->second->spellId != spellInfo->Id)
  56.                     continue;
  57.                 spellID = itr->second->id;
  58.                 break;
  59.             }
  60.             if (spellID == 0)
  61.                 continue;
  62.  
  63.             int32 invType = (int32)pow((float)2, (float)item->GetTemplate()->InventoryType);
  64.             int32 subClass = (int32)pow((float)2, (float)item->GetTemplate()->SubClass);
  65.             if (item->GetTemplate()->ItemLevel < spellInfo->BaseLevel)
  66.                 continue;
  67.             else if (spellInfo->EquippedItemClass != item->GetTemplate()->Class)
  68.                 continue;
  69.             else if (!(spellInfo->EquippedItemSubClassMask & subClass))
  70.                 continue;
  71.             else if (item->GetTemplate()->Class == ITEM_CLASS_ARMOR && item->GetTemplate()->SubClass != ITEM_SUBCLASS_ARMOR_SHIELD)
  72.             {
  73.                 if (!(spellInfo->EquippedItemInventoryTypeMask & invType))
  74.                     continue;
  75.                 else // Passed all checks
  76.                     break;
  77.             }
  78.             else
  79.                 break;
  80.            
  81.         }
  82.         if (i == sSpellMgr->GetSpellInfoStoreSize())
  83.         {
  84.             ChatHandler(player->GetSession()).PSendSysMessage("Failed to enchant item.");
  85.             return;
  86.         }
  87.  
  88.         player->ApplyEnchantment(item, PERM_ENCHANTMENT_SLOT, false);
  89.         item->SetEnchantment(PERM_ENCHANTMENT_SLOT, enchantID, 0, 0);
  90.         player->ApplyEnchantment(item, PERM_ENCHANTMENT_SLOT, true);
  91.  
  92.         std::string color = "|cff";
  93.         switch (item->GetTemplate()->Quality)
  94.         {
  95.             case 0: color += "9d9d9d"; break;
  96.             case 1: color += "ffffff"; break;
  97.             case 2: color += "1eff00"; break;
  98.             case 3: color += "0070dd"; break;
  99.             case 4: color += "a335ee"; break;
  100.             case 5: color += "ff8000"; break;
  101.         }
  102.         ChatHandler(player->GetSession()).PSendSysMessage("|cffFFFFFF[%s%s|cffFFFFFF] |cffFF0000succesfully enchanted!", color.c_str(), item->GetTemplate()->Name1.c_str());
  103.     }
  104.  
  105.     void ShowPage(Player* player, uint32 page, uint8 equipSlot)
  106.     {
  107.         Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipSlot);
  108.         if (!item)
  109.         {
  110.             player->CLOSE_GOSSIP_MENU();
  111.             return;
  112.         }
  113.  
  114.         ItemTemplate const* itemTemplate = item->GetTemplate();
  115.         if (!itemTemplate)
  116.         {
  117.             player->CLOSE_GOSSIP_MENU();
  118.             return;
  119.         }
  120.  
  121.         player->PlayerTalkClass->ClearMenus();
  122.         uint32 startPos = (page - 1) * 10;
  123.         uint32 currentPos = 0;
  124.  
  125.         uint32 i;
  126.         for (i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
  127.         {
  128.             SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i);
  129.             if (!spellInfo)
  130.                 continue;
  131.             if (spellInfo->Effects[0].Effect != SPELL_EFFECT_ENCHANT_ITEM)
  132.                 continue;
  133.             if (spellInfo->Id == 62257) // Ignore Titanguard
  134.                 continue;
  135.             if (itemTemplate->ItemLevel < spellInfo->BaseLevel)
  136.                 continue;
  137.             if (spellInfo->EquippedItemClass != itemTemplate->Class)
  138.                 continue;
  139.             int32 subClass = (int32)pow((float)2, (float)itemTemplate->SubClass);
  140.             if (!(spellInfo->EquippedItemSubClassMask & subClass))
  141.                 continue;
  142.             int32 invType = (int32)pow((float)2, (float)itemTemplate->InventoryType);
  143.             if (itemTemplate->Class == ITEM_CLASS_ARMOR && itemTemplate->SubClass != ITEM_SUBCLASS_ARMOR_SHIELD)
  144.                 if (!(spellInfo->EquippedItemInventoryTypeMask & invType))
  145.                     continue;
  146.  
  147.             uint32 spellID = 0;
  148.             SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellInfo->Id);
  149.             for (SkillLineAbilityMap::const_iterator itr = bounds.first; itr != bounds.second; ++itr)
  150.             {
  151.                 // Not from the enchanting skill
  152.                 if (itr->second->skillId != 333 || itr->second->spellId != spellInfo->Id)
  153.                     continue;
  154.                 spellID = itr->second->id;
  155.                 break;
  156.             }
  157.             if (spellID == 0)
  158.                 continue;
  159.             if (SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(spellInfo->Effects[0].MiscValue))
  160.             {
  161.                 if (enchant->requiredLevel > player->getLevel())
  162.                     continue;
  163.                 if (currentPos >= startPos)
  164.                     player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, enchant->description[0], equipSlot, enchant->ID);
  165.  
  166.                 currentPos++;
  167.                 // Stop looping once we are 10 positions ahead
  168.                 if (currentPos == startPos + 10)
  169.                     break;
  170.             }
  171.         }
  172.  
  173.         // Make sure there is actually another page
  174.         if (currentPos == startPos + 10 && i != sSpellMgr->GetSpellInfoStoreSize())
  175.             player->ADD_GOSSIP_ITEM(0, "Next Page", 100 + page + 1, equipSlot);  // Have to offset by 100 to ensure it gets pushed to the default case
  176.         player->ADD_GOSSIP_ITEM(0, "Back", 100 + page - 1, equipSlot);
  177.     }
  178.  
  179.     bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)
  180.     {
  181.         player->PlayerTalkClass->ClearMenus();
  182.         switch(sender)
  183.         {
  184.             case GOSSIP_SENDER_MAIN:
  185.                 ShowPage(player, 1, action);
  186.                 player->SEND_GOSSIP_MENU(1, creature->GetGUID());
  187.                 break;
  188.             default:
  189.                 if (sender < 100)
  190.                 {
  191.                     Enchant(player, sender, action);
  192.                     player->CLOSE_GOSSIP_MENU();
  193.                     break;
  194.                 }
  195.                 if (sender == 100)
  196.                     OnGossipHello(player, creature);
  197.                 else
  198.                 {
  199.                     ShowPage(player, sender - 100, action);
  200.                     player->SEND_GOSSIP_MENU(1, creature->GetGUID());
  201.                 }
  202.                 break;
  203.         }
  204.         return true;
  205.     }
  206. };
  207.  
  208. void AddSC_npc_enchantment()
  209. {
  210.     new npc_enchantment();
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement