MrCeeJ 11 Posted November 16, 2022 Share Posted November 16, 2022 (edited) So after grinding for a while in northrend you will probably have hundreds of these, if you actually want to turn them in yourself it can take a long time, so I wrote a little plugin to do it for you. You need the Damaged Necklaces and Gems in your inventory, and need to be near the Grand Master trainer in Dalaran in order to spam turn them in. To use the plugin just save it in your plugins folder, turn on WRotation and hit go. Some plugins can interfere with it (when they pause the bot) but it should be ok, you can always turn them off while running it. Finally here is the source code, feel free to give me suggestions to make it better, I just hacked away using the API until it worked, so I am sure there are better ways of doing things, so happy to take suggestions and improve it (which is really why I'm posting it here). The source is also attached for easy downloading. Have fun 🙂 using System; using robotManager.Helpful; using wManager.Wow.Helpers; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.IO; using System.Linq; using System.Reflection; using System.Threading; using robotManager.FiniteStateMachine; using robotManager.Products; using Timer = robotManager.Helpful.Timer; using wManager.Plugin; using wManager.Wow.Bot.States; using wManager.Wow.Enums; using wManager.Wow.ObjectManager; using wManager.Wow.Class; public class Main : wManager.Plugin.IPlugin { public void Initialize() { Logging.Write("JCTokenTurnIn: Started."); MakeAllTokens(); } private void MakeAllTokens(){ bool crafting = true; int count = 0; while(crafting) { if (HaveRepairedItem()) { TurnIn(); count++; } else if (HaveQuest()){ RepairItem(); } else if (HaveItems()) { AcceptQuest(); } else { crafting = false; } } Logging.Write("JCTokenTurnIn: Finished, tokens made: "+count); } private bool HaveRepairedItem() { return HaveItemId(43298); } private void TurnIn() { wManager.Wow.Bot.Tasks.GoToTask.ToPositionAndIntecractWithNpc(wManager.Wow.ObjectManager.ObjectManager.Me.Position, 28701); System.Threading.Thread.Sleep(128); Quest.SelectGossipActiveQuest(1); System.Threading.Thread.Sleep(128); Quest.CompleteQuest(); System.Threading.Thread.Sleep(256); } private bool HaveQuest() { return HaveItemId(43299); } private void RepairItem() { foreach (WoWItem item in Bag.GetBagItem()) { ItemInfo info = item.GetItemInfo; int ItemId = getId(info.ItemLink); if (ItemId == 43299) { List<int> bagAndSlot = Bag.GetItemContainerBagIdAndSlot(info.ItemName); Lua.LuaDoString("UseContainerItem(" + bagAndSlot[0] + "," + bagAndSlot[1] + ")"); System.Threading.Thread.Sleep(12500); return; } } } private bool HaveItems() { return HaveItemId(43297) && HaveItemId(36923); } private void AcceptQuest() { foreach (WoWItem item in Bag.GetBagItem()) { ItemInfo info = item.GetItemInfo; int ItemId = getId(info.ItemLink); if (ItemId == 43297) { List<int> bagAndSlot = Bag.GetItemContainerBagIdAndSlot(info.ItemName); Lua.LuaDoString("UseContainerItem(" + bagAndSlot[0] + "," + bagAndSlot[1] + ")"); Lua.LuaDoString("AcceptQuest()"); } } } private bool HaveItemId(int Id) { foreach (WoWItem item in Bag.GetBagItem()) { ItemInfo info = item.GetItemInfo; int ItemId = getId(info.ItemLink); if (ItemId == Id) { return true; } } return false; } private int getId(String itemLink){ String pattern = "Hitem:"; int index = itemLink.IndexOf(pattern); return Int32.Parse(itemLink.Substring(index+6).Split(':')[0]); } public void Settings() {} public void Dispose() { Logging.Write("JCTokenTurnIn: Stopped."); } } JCTokenTurnIn.cs Edited November 16, 2022 by MrCeeJ Added flair to title Talamin and Zer0 2 Link to comment https://wrobot.eu/forums/topic/14939-free-basic-plugin-for-handing-in-damaged-necklaces-for-jewelcrafter-tokens-wotlk-source-included/ Share on other sites More sharing options...
MrCeeJ 11 Posted November 17, 2022 Author Share Posted November 17, 2022 I have refactored it a little, to suit my preferred 'functional' style. Not sure if it is everyone's cup of tea so I'll leave the original, but I do enjoy being able to chain functions with simple boolean return values, and it makes it very easy to compose and modify things like dps rotations that can form very complex decision trees. I am curious what other devs think, it is full of side-effects and empty statements, which are normally considered smells as they can make the code hard to understand and work with, but since the purpose of the refactoring is to make it easier to understand and work with I don't think they are necessarily valid objections here. Finally, I am sorry the capitalisation is all over the place, coming from a Java / Python / Prolog background the .net capitalisation always confuses me.. using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.IO; using System.Linq; using System.Reflection; using System.Threading; using robotManager.Helpful; using robotManager.FiniteStateMachine; using robotManager.Products; using wManager.Plugin; using wManager.Wow.Helpers; using wManager.Wow.Bot.States; using wManager.Wow.Enums; using wManager.Wow.ObjectManager; using wManager.Wow.Class; public class Main : wManager.Plugin.IPlugin { public void Initialize() { Logging.Write("JCToken: Started."); int count = 0; while (TurnIn() || Repair() || GetQuest()){} Logging.Write("JCToken: Finished"); } private bool TurnIn() { return HaveRepairedItem() && CompleteQuest(); } private bool Repair() { return HaveQuest() && RepairItem(); } private bool GetQuest() { return HaveItems() && AcceptQuest(); } private bool HaveRepairedItem() { return HaveItemId(43298); } private void CompleteQuest() { wManager.Wow.Bot.Tasks.GoToTask.ToPositionAndIntecractWithNpc(ObjectManager.Me.Position, 28701); System.Threading.Thread.Sleep(128); Quest.SelectGossipActiveQuest(1); System.Threading.Thread.Sleep(128); Quest.CompleteQuest(); System.Threading.Thread.Sleep(256); return true; } private bool HaveQuest() { return HaveItemId(43299); } private bool RepairItem() { foreach (WoWItem item in Bag.GetBagItem()) { ItemInfo info = item.GetItemInfo; int itemId = GetId(info.ItemLink); if (itemId == 43299) { List<int> bagAndSlot = Bag.GetItemContainerBagIdAndSlot(info.ItemName); Lua.LuaDoString("UseContainerItem(" + bagAndSlot[0] + "," + bagAndSlot[1] + ")"); System.Threading.Thread.Sleep(12500); return true; } } return false; } private bool HaveItems() { return HaveItemId(43297) && HaveItemId(36923); } private bool AcceptQuest() { foreach (WoWItem item in Bag.GetBagItem()) { ItemInfo info = item.GetItemInfo; int itemId = GetId(info.ItemLink); if (itemId == 43297) { List<int> bagAndSlot = Bag.GetItemContainerBagIdAndSlot(info.ItemName); Lua.LuaDoString("UseContainerItem(" + bagAndSlot[0] + "," + bagAndSlot[1] + ")"); Lua.LuaDoString("AcceptQuest()"); return true; } } return false; } private bool HaveItemId(int Id) { foreach (WoWItem item in Bag.GetBagItem()) { ItemInfo info = item.GetItemInfo; int itemId = GetId(info.ItemLink); if (itemId == Id) { return true; } } return false; } private int GetId(String itemLink) { String pattern = "Hitem:"; int index = itemLink.IndexOf(pattern); return Int32.Parse(itemLink.Substring(index + 6).Split(':')[0]); } public void Settings(){} public void Dispose() { Logging.Write("JCToken: Stopped."); } } morrish and Talamin 2 Link to comment https://wrobot.eu/forums/topic/14939-free-basic-plugin-for-handing-in-damaged-necklaces-for-jewelcrafter-tokens-wotlk-source-included/#findComment-67225 Share on other sites More sharing options...
morrish 0 Posted October 13 Share Posted October 13 Mine didt work, but VS helped me. I am all new to this. This code here helped me. using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.IO; using System.Linq; using System.Reflection; using System.Threading; using robotManager.Helpful; using robotManager.FiniteStateMachine; using robotManager.Products; using wManager.Plugin; using wManager.Wow.Helpers; using wManager.Wow.Bot.States; using wManager.Wow.Enums; using wManager.Wow.ObjectManager; using wManager.Wow.Class; using System.Collections; using System.Runtime.Serialization; public class Main : wManager.Plugin.IPlugin { public void Initialize() { Logging.Write("JCToken: Started."); while (TurnIn() || Repair() || GetQuest()) { } Logging.Write("JCToken: Finished"); } private bool TurnIn() { return HaveRepairedItem() && CompleteQuest(); } private bool Repair() { return HaveQuest() && RepairItem(); } private bool GetQuest() { return HaveItems() && AcceptQuest(); } private bool HaveRepairedItem() { return HaveItemId(43298); } private bool CompleteQuest() { wManager.Wow.Bot.Tasks.GoToTask.ToPositionAndIntecractWithNpc(wManager.Wow.ObjectManager.ObjectManager.Me.Position, 28701); System.Threading.Thread.Sleep(1280); Quest.SelectGossipActiveQuest(1); System.Threading.Thread.Sleep(1280); Quest.CompleteQuest(); System.Threading.Thread.Sleep(2560); return true; } private bool HaveQuest() { return HaveItemId(43299); } private bool RepairItem() { foreach (WoWItem item in Bag.GetBagItem()) { ItemInfo info = item.GetItemInfo; int itemId = GetId(info.ItemLink); if (itemId == 43299) { List<int> bagAndSlot = Bag.GetItemContainerBagIdAndSlot(info.ItemName); Lua.LuaDoString("UseContainerItem(" + bagAndSlot[0] + "," + bagAndSlot[1] + ")"); System.Threading.Thread.Sleep(12500); return true; } } return false; } private bool HaveItems() { return HaveItemId(43297) && HaveItemId(36923); } private bool AcceptQuest() { foreach (WoWItem item in Bag.GetBagItem()) { ItemInfo info = item.GetItemInfo; int itemId = GetId(info.ItemLink); if (itemId == 43297) { List<int> bagAndSlot = Bag.GetItemContainerBagIdAndSlot(info.ItemName); Lua.LuaDoString("UseContainerItem(" + bagAndSlot[0] + "," + bagAndSlot[1] + ")"); Lua.LuaDoString("AcceptQuest()"); return true; } } return false; } private bool HaveItemId(int Id) { foreach (WoWItem item in Bag.GetBagItem()) { ItemInfo info = item.GetItemInfo; int itemId = GetId(info.ItemLink); if (itemId == Id) { return true; } } return false; } private int GetId(String itemLink) { String pattern = "Hitem:"; int index = itemLink.IndexOf(pattern); return Int32.Parse(itemLink.Substring(index + 6).Split(':')[0]); } public void Settings() { } public void Dispose() { Logging.Write("JCToken: Stopped."); } } Link to comment https://wrobot.eu/forums/topic/14939-free-basic-plugin-for-handing-in-damaged-necklaces-for-jewelcrafter-tokens-wotlk-source-included/#findComment-69698 Share on other sites More sharing options...
MrCeeJ 11 Posted November 1 Author Share Posted November 1 On 10/13/2024 at 6:34 PM, morrish said: Mine didt work, but VS helped me. I am all new to this. This code here helped me. using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.IO; using System.Linq; using System.Reflection; using System.Threading; using robotManager.Helpful; using robotManager.FiniteStateMachine; using robotManager.Products; using wManager.Plugin; using wManager.Wow.Helpers; using wManager.Wow.Bot.States; using wManager.Wow.Enums; using wManager.Wow.ObjectManager; using wManager.Wow.Class; using System.Collections; using System.Runtime.Serialization; public class Main : wManager.Plugin.IPlugin { public void Initialize() { Logging.Write("JCToken: Started."); while (TurnIn() || Repair() || GetQuest()) { } Logging.Write("JCToken: Finished"); } private bool TurnIn() { return HaveRepairedItem() && CompleteQuest(); } private bool Repair() { return HaveQuest() && RepairItem(); } private bool GetQuest() { return HaveItems() && AcceptQuest(); } private bool HaveRepairedItem() { return HaveItemId(43298); } private bool CompleteQuest() { wManager.Wow.Bot.Tasks.GoToTask.ToPositionAndIntecractWithNpc(wManager.Wow.ObjectManager.ObjectManager.Me.Position, 28701); System.Threading.Thread.Sleep(1280); Quest.SelectGossipActiveQuest(1); System.Threading.Thread.Sleep(1280); Quest.CompleteQuest(); System.Threading.Thread.Sleep(2560); return true; } private bool HaveQuest() { return HaveItemId(43299); } private bool RepairItem() { foreach (WoWItem item in Bag.GetBagItem()) { ItemInfo info = item.GetItemInfo; int itemId = GetId(info.ItemLink); if (itemId == 43299) { List<int> bagAndSlot = Bag.GetItemContainerBagIdAndSlot(info.ItemName); Lua.LuaDoString("UseContainerItem(" + bagAndSlot[0] + "," + bagAndSlot[1] + ")"); System.Threading.Thread.Sleep(12500); return true; } } return false; } private bool HaveItems() { return HaveItemId(43297) && HaveItemId(36923); } private bool AcceptQuest() { foreach (WoWItem item in Bag.GetBagItem()) { ItemInfo info = item.GetItemInfo; int itemId = GetId(info.ItemLink); if (itemId == 43297) { List<int> bagAndSlot = Bag.GetItemContainerBagIdAndSlot(info.ItemName); Lua.LuaDoString("UseContainerItem(" + bagAndSlot[0] + "," + bagAndSlot[1] + ")"); Lua.LuaDoString("AcceptQuest()"); return true; } } return false; } private bool HaveItemId(int Id) { foreach (WoWItem item in Bag.GetBagItem()) { ItemInfo info = item.GetItemInfo; int itemId = GetId(info.ItemLink); if (itemId == Id) { return true; } } return false; } private int GetId(String itemLink) { String pattern = "Hitem:"; int index = itemLink.IndexOf(pattern); return Int32.Parse(itemLink.Substring(index + 6).Split(':')[0]); } public void Settings() { } public void Dispose() { Logging.Write("JCToken: Stopped."); } } I see you removed the count value, that is fine as it wasn't used in this version (it was there for debugging). You also increased the waits. I am assuming it wasn't working as the code was running to fast, either the server or your connection was slower. I wan't able to test that and set the values for my setup, where the server is on my own local network and no-one else is on it so it is probably unreasonably fast. I could add a 'latency' value at the top of the file, and then use that to multiply all the waits, so for your case that would be set to 10 as you seem to have increased them all 10 fold. morrish 1 Link to comment https://wrobot.eu/forums/topic/14939-free-basic-plugin-for-handing-in-damaged-necklaces-for-jewelcrafter-tokens-wotlk-source-included/#findComment-69729 Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now