What's new
  • Visit Rebornbuddy
  • Visit Panda Profiles
  • Visit LLamamMagic
  • Visit Resources
  • Visit Downloads
  • Visit Portal

Gatherer Base

2face

New Member
Joined
Feb 1, 2014
Messages
27
Reaction score
3
[Plugin] [Example] Gatherer Base

Hi guys,

i wrote some small gatherer Base, right now it's more like assisting you in finding trees and iron veins, because i need to find a proper way to navigate around obstacles. (@Out is it possible to generate those paths for GPS on the fly or do i need to create a DB file? i didnt figure out yet)
Bare in mind that this is my first attempt at creating a plugin for ArcheBuddy. It also has some functions not used yet or some debug infos. It's not a finished plugin yet.

To make this work, the client needs to be english. Just turn it on and run around. It will scan the area for DoodadObjects(like clickable nodes) and check if they have the skill "Chop Tree" or "Mine Ore". If thats the case then the bot will approach it and use the skill.
It will run into any obstacle because there is no proper pathing around them yet. It's really just a simple base, and there are probably alot better ways to find nodes to gather, instead of checking for skills. (Like phaseId and stuff)
I couldn't test it much, because i had connection issues and was in queue most of the time. I still hope it will help some people. I will update it with better pathing and also a combat routine tomorrow.
Feel free to join me to create a stable open source gather base.

v1 - walk to target
Code:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using ArcheBuddy.Bot.Classes;

namespace Gatherer{
    public class Gatherer : Core
    {
        public static string GetPluginAuthor()
        {
            return "2face";
        }

        public static string GetPluginVersion()
        {
            return "1.0.0.0";
        }

        public static string GetPluginDescription()
        {
            return "Gather Plugin";
        }  

        public List<DoodadObject> doodList = new List<DoodadObject>(); 
        public List<String> gatherTypes = new List<String>(); 
        public bool isRunning = false;   
        public Thread mainThread;
        //Call on plugin start
        public void PluginRun()
        {     
            Log("Done1");  
            //printDoods();
            //Log("dooddist " + getClosestDood().dist(me));
            //moveToDood(getClosestDood());        
            gatherTypes.Add("Chop Tree");   
            gatherTypes.Add("Mine Ore");
            //printDoods();     
            isRunning  = true;   
                
            Start();    
            Log("Nope");

        }         
        
        public void Start(){   
            while(isRunning){
                Thread.Sleep(500);
                try{
                    DoodadObject dood = getClosestDood();   
                    if(dood != null){
                        Log("name " + dood.name ); 
                        moveToDood(dood);   
                    } 
                    Log("Check");
                }catch(Exception e){
                    Log(e.ToString());
                }   
            }


        }
        
        public void getDoodType(DoodadObject dood){      
            printDoodInfo(dood);
            Log("doodtype: " + dood.phaseId);
        }
        
        public void printDoodInfo(DoodadObject dood){
            Log("name: " + dood.name + " dist: " + dood.dist(me));
        }
        
        public void moveToDood(DoodadObject dood){
            if(dood == null) return;
            Log("Move To: " + dood.name + " dist: " + me.dist(dood));
            //printDoodInfo(dood);
            while(dood.dist(me) >= 3){
                ComeTo(dood, 2);
                Thread.Sleep(50);
            }
            useDoodad(dood);
        }
        
        public Skill getDoodadSkill(DoodadObject dood){   
            Skill skill = null; 
            if(dood != null){
                foreach(var obj in dood.getUseSkills()){
                    skill = obj;    
                }
            }
            return skill;
        }
        
        public void useDoodad(DoodadObject dood){    
            if(dood != null){   
                Skill skill = getDoodadSkill(dood);    
                if(skill != null){
                    Log(skill.name + " " + dood.name);
                    while(dood != null && dood.dist(me) <= 3){
                        if(UseDoodadSkill(skill.id, dood, true, 0) == true){ 
                            Log("Gathered: " + dood.name);    
                            dood.Dispose();
                            dood = null;
                        }
                        Thread.Sleep(50);
                    }   
                } 
            }
        }
        
        public String hasGatherType(DoodadObject dood){
            Skill skill = getDoodadSkill(dood);       
            return "";
        }
        
        public DoodadObject getClosestDood(){
            DoodadObject dood = null;
            double dist = 9999999999;
            
            doodList    = getDoodads();
            Skill skill = null;
            if(doodList.Count > 0){
                //printDoods();
                foreach(var obj in doodList){
                    skill = getDoodadSkill(obj);
                    if(skill != null ){  
                        if(skill.name == "Chop Tree" || skill.name == "Mine Ore"){
                            if(me.dist(obj) < dist && obj.growthTime <= 0 && obj.uniqOwnerId == 0){
                                dood = obj;
                                dist = me.dist(obj);
                            }        
                        }
                    }

                } 
            }
  
            Log("TEST");   
            if(dood != null){    
                return dood;
            }
            return null;
        }

        public void printDoods(){
            updateDoodads(); 
            Skill skill  = null;    
            String sName = "";
            foreach(var obj in doodList){
                Log("---");                                        
                skill = getDoodadSkill(obj);  
                if(skill != null){
                    sName = skill.name;  
                }else{
                    sName = "";              
                }
                
                Log(obj.name + " Time: " + obj.growthTime + " skill: " + sName);
                Log("Type: " + obj.type + "dist: " + me.dist(obj));    
                Log("ownerId: " + obj.uniqOwnerId); 
            }
        }

        public void updateDoodads(){
            doodList = getDoodads();
        }
        //Call on plugin stop
        public void PluginStop()
        {
        }
    }
}

//UPDATE
v2 Here we go: as requested with map markers instead of walking to target - you can just use the walk system by setting useMarker to false again and it will do the same as before.
This version will scan for trees and iron veins which can be gathered and dont belong to someone and mark them on the map. If it finds something closer it will reset the marker to that target. If you want to mark everything and not just objects that dont belong to anyone then you have to remove the check for ownerId in the getClosestDoodad() function. (Could be used to find hidden farms then)
Feel free to post more suggestions:
Code:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using ArcheBuddy.Bot.Classes;

namespace Gatherer{
    public class Gatherer : Core
    {
        public static string GetPluginAuthor()
        {
            return "2face";
        }

        public static string GetPluginVersion()
        {
            return "1.0.0.0";
        }

        public static string GetPluginDescription()
        {
            return "Gather Plugin";
        }  

        public List<DoodadObject> doodList = new List<DoodadObject>(); 
        public List<String> gatherTypes = new List<String>(); 
        public bool isRunning = false;       
        public bool useMarker = true;   
        public bool isMarkerActive = false;   
        public DoodadObject foundDood = null;
        public Thread mainThread;
        //Call on plugin start
        public void PluginRun()
        {     
            Log("Run");  
            //printDoods();
            //Log("dooddist " + getClosestDood().dist(me));
            //moveToDood(getClosestDood());        
            gatherTypes.Add("Chop Tree");   
            gatherTypes.Add("Mine Ore");
            //printDoods();     
            isRunning  = true;   
                
            Start();    


        }         
        
        public void Start(){   
            while(isRunning){
                Thread.Sleep(1000);
                try{
                    DoodadObject dood = getClosestDood();   
                    if(dood != null){                           
                        if(useMarker){  
                            markerRoutine(dood);      
                        }else{ 
                           Log("name " + dood.name );
                           moveToDood(dood);             
                        }
                          
                    } 
                   }catch(Exception){
                    //Log(e.ToString());  
                    isMarkerActive = false;
                }   
            }

        }    
        
        public void markerRoutine(DoodadObject dood){    
           if(dood == null){
                isMarkerActive = false;
                Log("target removed");
                return;
           }
           if(isMarkerActive){
               if(dood != null && me.dist(dood) <= 5){
                    isMarkerActive = false;   
                    Log("reached " + dood.name);
               }else if(dood != null && dood.objId != foundDood.objId){ 
                    Log("closer target found");
                    isMarkerActive = false;  
               } 
           }else if(dood != null && me.dist(dood) > 5 ){    
              isMarkerActive = true;
              SetMapPos(dood.X, dood.Y, dood.Z);   
              Log("marker set on " + dood.name + " dist: " + me.dist(dood));  
              foundDood = dood;
           }
        }
        
        public void getDoodType(DoodadObject dood){      
            printDoodInfo(dood);
            Log("doodtype: " + dood.phaseId);
        }
        
        public void printDoodInfo(DoodadObject dood){
            Log("name: " + dood.name + " dist: " + dood.dist(me));
        }
        
        public void moveToDood(DoodadObject dood){
            if(dood == null) return;
            Log("Move To: " + dood.name + " dist: " + me.dist(dood));
            //printDoodInfo(dood);
            while(dood.dist(me) >= 3){
                ComeTo(dood, 2);
                Thread.Sleep(50);
            }
            useDoodad(dood);
        }
        
        public Skill getDoodadSkill(DoodadObject dood){   
            Skill skill = null; 
            if(dood != null){
                foreach(var obj in dood.getUseSkills()){
                    skill = obj;    
                }
            }
            return skill;
        }
        
        public void useDoodad(DoodadObject dood){    
            if(dood != null){   
                Skill skill = getDoodadSkill(dood);    
                if(skill != null){
                    Log(skill.name + " " + dood.name);
                    while(dood != null && dood.dist(me) <= 3){
                        if(UseDoodadSkill(skill.id, dood, true, 0) == true){ 
                            Log("Gathered: " + dood.name);    
                            dood.Dispose();
                            dood = null;
                        }
                        Thread.Sleep(50);
                    }   
                } 
            }
        }
        
        public String hasGatherType(DoodadObject dood){
            Skill skill = getDoodadSkill(dood);       
            return "";
        }
        
        public DoodadObject getClosestDood(){
            DoodadObject dood = null;
            double dist = 9999999999;
            
            doodList    = getDoodads();
            Skill skill = null;
            if(doodList.Count > 0){
                //printDoods();
                foreach(var obj in doodList){
                    skill = getDoodadSkill(obj);
                    if(skill != null ){  
                        if(skill.name == "Chop Tree" || skill.name == "Mine Ore"){ 
                            if(me.dist(obj) < dist && obj.growthTime <= 0 && obj.uniqOwnerId == 0){    
                                dood = obj;
                                dist = me.dist(obj);
                            }        
                        }
                    }

                } 
            }   
            if(dood != null){    
                return dood;
            }
            return null;
        }

        public void printDoods(){
            updateDoodads(); 
            Skill skill  = null;    
            String sName = "";
            foreach(var obj in doodList){
                Log("---");                                        
                skill = getDoodadSkill(obj);  
                if(skill != null){
                    sName = skill.name;  
                }else{
                    sName = "";              
                }
                
                Log(obj.name + " Time: " + obj.growthTime + " skill: " + sName);
                Log("Type: " + obj.type + "dist: " + me.dist(obj));    
                Log("ownerId: " + obj.uniqOwnerId); 
            }
        }

        public void updateDoodads(){
            doodList = getDoodads();
        }
        //Call on plugin stop
        public void PluginStop()
        {
        }
    }
}

v3 - added hasNearbyPlayers to prevent ninja looting - thanks to Karls for contributing
Code:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using ArcheBuddy.Bot.Classes;

namespace Gatherer{
    public class Gatherer : Core
    {
        public static string GetPluginAuthor()
        {
            return "2face";
        }

        public static string GetPluginVersion()
        {
            return "1.0.0.0";
        }

        public static string GetPluginDescription()
        {
            return "Gather Plugin";
        }  

        public List<DoodadObject> doodList = new List<DoodadObject>(); 
        public List<String> gatherTypes = new List<String>(); 
        public bool isRunning = false;       
        public bool useMarker = true;   
        public bool isMarkerActive = false;   
        public DoodadObject foundDood = null;
        public Thread mainThread;
        //Call on plugin start
        public void PluginRun()
        {     
            Log("Run");  
            //printDoods();
            //Log("dooddist " + getClosestDood().dist(me));
            //moveToDood(getClosestDood());        
            gatherTypes.Add("Chop Tree");   
            gatherTypes.Add("Mine Ore");
            //printDoods();     
            isRunning  = true;   
                
            Start();    


        }         
        
        public void Start(){   
            while(isRunning){
                Thread.Sleep(1000);
                try{
                    DoodadObject dood = getClosestDood();   
                    if(dood != null){                           
                        if(useMarker){  
                            markerRoutine(dood);      
                        }else{ 
                           Log("name " + dood.name );
                           moveToDood(dood);             
                        }
                          
                    } 
                   }catch(Exception){
                    //Log(e.ToString());  
                    isMarkerActive = false;
                }   
            }

        }    
        
        public void markerRoutine(DoodadObject dood){    
           if(dood == null){
                isMarkerActive = false;
                Log("target removed");
                return;
           }
           if(isMarkerActive){
               if(dood != null && me.dist(dood) <= 5){
                    isMarkerActive = false;   
                    Log("reached " + dood.name);
               }else if(dood != null && dood.objId != foundDood.objId){ 
                    Log("closer target found");
                    isMarkerActive = false;  
               } 
           }else if(dood != null && me.dist(dood) > 5 ){    
              isMarkerActive = true;
              SetMapPos(dood.X, dood.Y, dood.Z);   
              Log("marker set on " + dood.name + " dist: " + me.dist(dood));  
              foundDood = dood;
           }
        }
        
        public void getDoodType(DoodadObject dood){      
            printDoodInfo(dood);
            Log("doodtype: " + dood.phaseId);
        }
        
        public void printDoodInfo(DoodadObject dood){
            Log("name: " + dood.name + " dist: " + dood.dist(me));
        }
        
        public void moveToDood(DoodadObject dood){
            if(dood == null) return;
            Log("Move To: " + dood.name + " dist: " + me.dist(dood));
            //printDoodInfo(dood);
            while(dood.dist(me) >= 3){
                ComeTo(dood, 2);
                Thread.Sleep(50);
				if(hasNearbyPlayers(dood)) return;
            }
            useDoodad(dood);
        }
        
        public Skill getDoodadSkill(DoodadObject dood){   
            Skill skill = null; 
            if(dood != null){
                foreach(var obj in dood.getUseSkills()){
                    skill = obj;    
                }
            }
            return skill;
        }
        
        public void useDoodad(DoodadObject dood){    
            if(dood != null){   
                Skill skill = getDoodadSkill(dood);    
                if(skill != null){
                    Log(skill.name + " " + dood.name);
                    while(dood != null && dood.dist(me) <= 3 && !hasNearbyPlayers(dood)){
                        if(UseDoodadSkill(skill.id, dood, true, 0) == true){ 
                            Log("Gathered: " + dood.name);    
                            dood.Dispose();
                            dood = null;
                        }
                        Thread.Sleep(50);
                    }   
                } 
            }
        }
        
        public String hasGatherType(DoodadObject dood){
            Skill skill = getDoodadSkill(dood);       
            return "";
        }
        
        public DoodadObject getClosestDood(){
            DoodadObject dood = null;
            double dist = 9999999999;
            
            doodList    = getDoodads();
            Skill skill = null;
            if(doodList.Count > 0){
                //printDoods();
                foreach(var obj in doodList){
                    skill = getDoodadSkill(obj);
                    if(skill != null ){  
                        if(skill.name == "Chop Tree" || skill.name == "Mine Ore"){ 
                            if(me.dist(obj) < dist && obj.growthTime <= 0 && obj.uniqOwnerId == 0 
								&& !hasNearbyPlayers(obj)){    
                                dood = obj;
                                dist = me.dist(obj);
                            }        
                        }
                    }

                } 
            }   
            if(dood != null){    
                return dood;
            }
            return null;
        }
		
	public bool hasNearbyPlayers(DoodadObject node)
        {
            foreach (var obj in getCreatures())
            {  
                if(obj.type == BotTypes.Player && node.dist(obj) <= 4)
                {
                    Log(obj.name + " is too close to " + node.name);
                    return true;
                }
            }
            
            return false;
        }

        public void printDoods(){
            updateDoodads(); 
            Skill skill  = null;    
            String sName = "";
            foreach(var obj in doodList){
                Log("---");                                        
                skill = getDoodadSkill(obj);  
                if(skill != null){
                    sName = skill.name;  
                }else{
                    sName = "";              
                }
                
                Log(obj.name + " Time: " + obj.growthTime + " skill: " + sName);
                Log("Type: " + obj.type + "dist: " + me.dist(obj));    
                Log("ownerId: " + obj.uniqOwnerId); 
            }
        }

        public void updateDoodads(){
            doodList = getDoodads();
        }
        //Call on plugin stop
        public void PluginStop()
        {
        }
    }
}
 
Last edited:
OMG this queue thing is killing me too. i am making a simple lazy rider and its making debugging the code impossible. Need to test one thing before posting it here, waited 1 hour, got disconnected instantly dont know why ... now says server busy try later guessing another 2 hours wait.
 
Last edited:
Is it possible to work with a overlay? Something like a arrow which aims on the tree?
 
Hm, not sure if archebuddy allows you to hook the 3D Scene - maybe Out can tell us more about.
What we could do is add a GUI window just like the AutoExp Plugin, which tells you which direction to go. Or even better we could use the marker. I think i saw the function for this. Hold on, i will reply in a few. Need someone to test it though, since im still at work.
 
allows you to hook the 3D Scene - maybe Out can tell us more about.
AB can not do this. Better ask bossland, can you display something like that.
 
I have updated the first post with a newer version. It will now mark targets on the map instead of walking there. You can still use the version before by setting useMarker to false. Feel free to suggest more features or to improve it.
 
I've been working on something similar, to farm nodes & mobs in a an area but it's quite not release ready yet, the balance between mining/combat is not satisfying atm.
 
We can work on something together if you want. The biggest issue i have currently is making it roam properly around to gather nodes, since the navigation system is not great. If you have some ideas we maybe can create some good gathering plugin.
 
The only improvment I have over a basic combat routine or your code atm is detecting when another player is near a node to skip it (looking like I'm attempting to ninja-mine usually gets me insulted). It could be improved to check if they're actually casting a gathering skill (to not skip a node just because someone is running over it at the wrong moment or just decided to afk there)

For the rest I haven't gotten around to write some code to scan the path between player and node to avoid rushing in a group of mobs that will kill the bot. I also haven't checked the API enough to figure how to keep re-evaluating priorities while moving around (to at least start fighting if the bot runs through mobs to get to a node, rather than train everything there).

And for navigation, I haven't started thinking about it, I just kept it running in areas where I had low chance of getting stuck (and keeping a distant eye on the game client to be able to take over when it started running into an wall)

Code:
public Double DistanceBetween(Creature player, DoodadObject node)
        {
            return DistanceBetween(player.X, player.Y, player.Z, node.X, node.Y, node.Z);
        }
        public Double DistanceBetween(Double x1, Double y1, Double z1, Double x2, Double y2, Double z2)
        {
            Double deltaX = x2 - x1;
            Double deltaY = y2 - y1;
            Double deltaZ = z2 - z1;
            
            return Math.Sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ);
        }
        
        public bool HasNearbyPlayers(DoodadObject node)
        {
            foreach (var obj in getCreatures())
            {  
                if(obj.type == BotTypes.Player && DistanceBetween(obj, node) <= 4)
                {
                    Log(obj.name + " is too close to " + node.name);
                    return true;
                }
            }
            
            return false;
        }
 
Hey man,

thanks for contributing! Will add it to the main post.
 
Thanks, no link ? can't dl? how use? :/
 
Last edited:
1. Go in the ArcheBuddy plugin editor
2. Create a new file
3. Copy/paste the code from first post in it
4. Save it in a subdirectory of the Plugins folder, like Plugins\Gatherer\Gatherer.cs
5. Press "Compile" button, it's now in your plugin manager, ready to be started
 
yeah v2 & v3 isn't working...can someone improvise something :P

version 2/3 should work(atleast they do for me) as in the thread stated it will just mark the ores on the map(the blue marker) if someonething is nearby. You can turn it off by setting the variable useMarker to false.
 
version 2/3 should work(atleast they do for me) as in the thread stated it will just mark the ores on the map(the blue marker) if someonething is nearby. You can turn it off by setting the variable useMarker to false.


Will it mark it with just single marker or a few?
 
Love it, thank you. I agree that only V1 works. I was curious if possible to add a feature to sprint when headed to a node?
 
Love it, thank you. I agree that only V1 works. I was curious if possible to add a feature to sprint when headed to a node?


Code:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using ArcheBuddy.Bot.Classes;

namespace Gatherer{
    public class Gatherer : Core
    {
        public static string GetPluginAuthor()
        {
            return "2face";
        }

        public static string GetPluginVersion()
        {
            return "1.0.0.0";
        }

        public static string GetPluginDescription()
        {
            return "Gather Plugin";
        }  

        public List<DoodadObject> doodList = new List<DoodadObject>(); 
        public List<String> gatherTypes = new List<String>(); 
        public bool isRunning = false;   
        public Thread mainThread;
        //Call on plugin start
        public void PluginRun()
        {     
            Log("Done1");  
            //printDoods();
            //Log("dooddist " + getClosestDood().dist(me));
            //moveToDood(getClosestDood());        
            gatherTypes.Add("Chop Tree");   
            gatherTypes.Add("Mine Ore");
            //printDoods();     
            isRunning  = true;   
                
            Start();    
            Log("Nope");

        }         
        
        public void Start(){   
            while(isRunning){
                Thread.Sleep(500);
                try{
                    DoodadObject dood = getClosestDood();   
                    if(dood != null){
                        Log("name " + dood.name ); 
                        UseSkill("Dash");
                        moveToDood(dood);   
                    } 
                    Log("Check");
                }catch(Exception e){
                    Log(e.ToString());
                }   
            }


        }
        
        public void getDoodType(DoodadObject dood){      
            printDoodInfo(dood);
            Log("doodtype: " + dood.phaseId);
        }
        
        public void printDoodInfo(DoodadObject dood){
            Log("name: " + dood.name + " dist: " + dood.dist(me));
        }
        
        public void moveToDood(DoodadObject dood){
            if(dood == null) return;
            Log("Move To: " + dood.name + " dist: " + me.dist(dood));
            //printDoodInfo(dood);
            while(dood.dist(me) >= 3){   
                ComeTo(dood, 2);
                Thread.Sleep(50);
            }
            useDoodad(dood);
        }
        
        public Skill getDoodadSkill(DoodadObject dood){   
            Skill skill = null; 
            if(dood != null){
                foreach(var obj in dood.getUseSkills()){
                    skill = obj;    
                }
            }
            return skill;
        }
        
        public void useDoodad(DoodadObject dood){    
            if(dood != null){   
                Skill skill = getDoodadSkill(dood);    
                if(skill != null){
                    Log(skill.name + " " + dood.name);
                    while(dood != null && dood.dist(me) <= 3){
                        if(UseDoodadSkill(skill.id, dood, true, 0) == true){ 
                            Log("Gathered: " + dood.name);    
                            dood.Dispose();
                            dood = null;
                        }
                        Thread.Sleep(50);
                    }   
                } 
            }
        }
        
        public String hasGatherType(DoodadObject dood){
            Skill skill = getDoodadSkill(dood);       
            return "";
        }
        
        public DoodadObject getClosestDood(){
            DoodadObject dood = null;
            double dist = 9999999999;
            
            doodList    = getDoodads();
            Skill skill = null;
            if(doodList.Count > 0){
                //printDoods();
                foreach(var obj in doodList){
                    skill = getDoodadSkill(obj);
                    if(skill != null ){  
                        if(skill.name == "Chop Tree" || skill.name == "Mine Ore"){
                            if(me.dist(obj) < dist && obj.growthTime <= 0 && obj.uniqOwnerId == 0){
                                dood = obj;
                                dist = me.dist(obj);
                            }        
                        }
                    }

                } 
            }
  
            Log("TEST");   
            if(dood != null){    
                return dood;
            }
            return null;
        }

        public void printDoods(){
            updateDoodads(); 
            Skill skill  = null;    
            String sName = "";
            foreach(var obj in doodList){
                Log("---");                                        
                skill = getDoodadSkill(obj);  
                if(skill != null){
                    sName = skill.name;  
                }else{
                    sName = "";              
                }
                
                Log(obj.name + " Time: " + obj.growthTime + " skill: " + sName);
                Log("Type: " + obj.type + "dist: " + me.dist(obj));    
                Log("ownerId: " + obj.uniqOwnerId); 
            }
        }

        public void updateDoodads(){
            doodList = getDoodads();
        }
        //Call on plugin stop
        public void PluginStop()
        {
        }
    }
}


Added sprint skill to use when going to node mate, works for me so try it.
 
Back
Top