Jump to content

Matenia

Elite user
  • Posts

    2226
  • Joined

  • Last visited

Posts posted by Matenia

  1. I actually think these threads are quite constructive, so I'm going to share some pathing code I use in HMP to hopefully help you out.

    You can specifically add OffMesh connections. In fact, you can add them to be used EVEN if WRobot can still find a path. You can also store functions in WRobot's internal Vars, which can be referenced using the C# string that offmesh connections are capable of using. So you could even call them from a quester profile, as long as you save the function in that Var map first.

    using System;
    using System.Collections.Generic;
    using System.Threading;
    using robotManager.Helpful;
    using wManager;
    using wManager.Wow.Class;
    using wManager.Wow.Enums;
    using wManager.Wow.Helpers;
    using wManager.Wow.ObjectManager;
    
    public class OffMeshes
    {
    	public static readonly string PathToKey = "HMPPathToFunction";
    	public static readonly string MoveForwardAndResetKey = "HMPMoveForwardAndReset";
    
    	public static bool PathTo(Vector3 position)
    	{
    		var path = PathFinder.FindPath(position);
    		foreach (var pos in path)
    		{
    			while (Conditions.InGameAndConnectedAndAliveAndProductStartedNotInPause && ObjectManager.Me.Position.DistanceTo2D(pos) > 1.5)
    			{
    				MovementManager.MoveTo(pos);
    				Thread.Sleep(500);
    			}
    		}
    
    		MovementManager.StopMove();
    		return position.DistanceTo2D(ObjectManager.Me.Position) <= 1.5f;
    	}
    
    	public static void MoveForwardAndReset(int ms = 15000)
    	{
    		var temp = wManagerSetting.CurrentSetting.CloseIfPlayerTeleported;
    		wManagerSetting.CurrentSetting.CloseIfPlayerTeleported = false;
    		Move.Forward(Move.MoveAction.PressKey, ms);
    		Thread.Sleep(ms);
    		wManagerSetting.CurrentSetting.CloseIfPlayerTeleported = temp;
    		if (ObjectManager.Me.GetMove)
    		{
    			MovementManager.StopMove();
    		}
    	}
    
    	public static void AddConnections()
    	{
    		// Setting functions to WRobot's internal map to re-use them later in Offmesh connections
    		Var.SetVar(PathToKey, new Action<Vector3>((x) => PathTo(x)));
    		Var.SetVar(MoveForwardAndResetKey, new Action(() => MoveForwardAndReset()));
    
    		PathFinder.OffMeshConnections.Add(new PathFinder.OffMeshConnection(new List<Vector3>
    		                                  {
    			                                  new Vector3(174.0891, 1185.221, 166.1563),
    			                                  new Vector3(196.5771, 1180.41, 167.9987),
    		                                  }, 1)
    		                                  {
    			                                  Type = PathFinder.OffMeshConnectionType.Unidirectional,
    			                                  Name = "Nijel's Point - Maxxton"
    		                                  });
    
    		PathFinder.OffMeshConnections.Add(new PathFinder.OffMeshConnection(new List<Vector3>
    		                                  {
    			                                  new Vector3(-68.50166, 1186.978, 90.78709),
    			                                  new Vector3(-12.31121, 1205.146, 109.4463),
    			                                  new Vector3(24.1873, 1218.461, 133.6504),
    			                                  new Vector3(63.54899, 1219.134, 154.2211),
    			                                  new Vector3(153.3421, 1216.366, 165.8533),
    			                                  new Vector3(176.0194, 1186.073, 166.0586),
    			                                  new Vector3(198.7642, 1180.339, 167.9988),
    		                                  }, 1)
    		                                  {
    			                                  Type = PathFinder.OffMeshConnectionType.Unidirectional,
    			                                  Name = "Nijel's Point - Maxxton 2",
    		                                  });
    
    		PathFinder.OffMeshConnections.Add(new PathFinder.OffMeshConnection(new List<Vector3>
    		                                  {
    			                                  new Vector3(100.9536, 1223.328, 161.6412),
    			                                  new Vector3(154.9091, 1209.382, 165.5027),
    			                                  new Vector3(173.1814, 1190.673, 166.1338),
    			                                  new Vector3(197.2656, 1180.434, 167.999),
    		                                  }, 1)
    		                                  {
    			                                  Type = PathFinder.OffMeshConnectionType.Unidirectional,
    			                                  Name = "Nijel's Point - Maxxton 3"
    		                                  });
    
    		PathFinder.OffMeshConnections.Add(new PathFinder.OffMeshConnection(new List<Vector3>
    		                                  {
    			                                  new Vector3(247.4097, 1253.189, 192.1647),
    			                                  new Vector3(255.671, 1254.537, 192.1407),
    		                                  }, 1)
    		                                  {
    			                                  Type = PathFinder.OffMeshConnectionType.Unidirectional,
    			                                  Name = "Nijel's Point - Innkeeper"
    		                                  });
    
    		PathFinder.OffMeshConnections.Add(new PathFinder.OffMeshConnection(new List<Vector3>
    		                                  {
    			                                  new Vector3(254.4657, 1214.722, 189.7014),
    			                                  new Vector3(248.5491, 1251.517, 192.1623),
    			                                  new Vector3(255.7968, 1253.575, 192.1399),
    		                                  }, 1)
    		                                  {
    			                                  Type = PathFinder.OffMeshConnectionType.Unidirectional,
    			                                  Name = "Nijel's Point - Innkeeper2"
    		                                  });
    
    
    		PathFinder.OffMeshConnections.Add(new PathFinder.OffMeshConnection(new List<Vector3>
    		                                  {
    			                                  new Vector3(247.4097, 1253.189, 192.1647),
    			                                  new Vector3(255.1739, 1256.671, 192.1407),
    		                                  }, 1)
    		                                  {
    			                                  Type = PathFinder.OffMeshConnectionType.Unidirectional,
    			                                  Name = "Nijel's Point - Janet Hommers"
    		                                  });
    
    		PathFinder.OffMeshConnections.Add(new PathFinder.OffMeshConnection(new List<Vector3>
    		                                  {
    			                                  new Vector3(-861.2993, -3758.589, 19.47886, "None"),
    			                                  new Vector3(-849.3063, -3742.703, 22.49161, "None"),
    			                                  new Vector3(-842.8103, -3734.129, 19.89155, "None"),
    			                                  new Vector3(-849.7686, -3735.616, 19.88754, "None"),
    			                                  new Vector3(-848.3646, -3731.851, 21.27056, "None"),
    			                                  new Vector3(-843.2056, -3727.342, 25.23064, "None"),
    			                                  new Vector3(-839.3514, -3726.285, 26.32008, "None")
    		                                  }, (int) ContinentId.Kalimdor)
    		                                  {
    			                                  Type = PathFinder.OffMeshConnectionType.Bidirectional,
    			                                  Name = "Ratchet - Gazlowe",
    			                                  TryToUseEvenIfCanFindPathSuccess = true
    		                                  });
    
    		PathFinder.OffMeshConnections.Add(new PathFinder.OffMeshConnection(new List<Vector3>
    		                                  {
    			                                  new Vector3(1155.042, 182.7223, 3.134686, "None"),
    			                                  new Vector3(1157.968, 184.0907, 5.895848, "None"),
    			                                  new Vector3(1157.852, 185.0874, 6.79552, "None"),
    			                                  new Vector3(1169.146, 188.5145, 17.70432, "None"),
    			                                  new Vector3(1176.177, 183.1431, 21.6543, "None"),
    			                                  new Vector3(1174.764, 180.1774, 21.44643, "None"),
    			                                  new Vector3(1170.609, 182.9803, 23.67873, "None"),
    			                                  new Vector3(1167.625, 185.7788, 27.12425, "None"),
    			                                  new Vector3(1165.26, 188.2767, 28.77732, "None"),
    			                                  new Vector3(1161.465, 183.8654, 29.03481, "None"),
    			                                  new Vector3(1164.393, 176.3627, 31.69842, "None")
    		                                  }, (int) ContinentId.Kalimdor)
    		                                  {
    			                                  Type = PathFinder.OffMeshConnectionType.Bidirectional,
    			                                  Name = "Stonetalon - Big machine",
    			                                  TryToUseEvenIfCanFindPathSuccess = true
    		                                  });
    
    		PathFinder.OffMeshConnections.Add(new PathFinder.OffMeshConnection(new List<Vector3>
    		                                  {
    			                                  new Vector3(-9009.081, 851.679, 105.893, "None"),
    			                                  new Vector3(-9017.271, 864.8356, 109.8218, "None"),
    			                                  new Vector3(-9014.967, 882.9603, 112.9219, "None"),
    			                                  new Vector3(-8999.138, 890.7767, 115.9936, "None"),
    			                                  new Vector3(-8982.68, 880.2233, 119.937, "None"),
    			                                  new Vector3(-8982.612, 866.5609, 123.3268, "None"),
    			                                  new Vector3(-8992.165, 860.2961, 126.6532, "None"),
    			                                  new Vector3(-9001.312, 864.4201, 129.772, "None"),
    			                                  new Vector3(-9013.052, 873.2303, 132.0581, "None"),
    			                                  new Vector3(-9007.667, 877.3668, 135.9138, "None"),
    			                                  new Vector3(-9003.198, 874.1686, 139.3298, "None"),
    			                                  new Vector3(-9004.052, 868.6579, 142.6572, "None"),
    			                                  new Vector3(-9009.047, 867.0392, 145.7849, "None"),
    			                                  new Vector3(-9013.107, 871.0745, 148.6166, "None"),
    			                                  new Vector3(-9016.262, 884.7032, 29.6207, "None")
    		                                  }, (int) ContinentId.Azeroth)
    		                                  {
    			                                  Type = PathFinder.OffMeshConnectionType.Bidirectional,
    			                                  Name = "SW Mage Tower",
    			                                  TryToUseEvenIfCanFindPathSuccess = true
    		                                  });
    	}
    }

     

    Here is an example of how to use Darnassus connections. It teaches WRobot that the portals and ships are just regular pathing connections.

    using System;
    using System.Collections.Generic;
    using robotManager.Helpful;
    using wManager;
    using wManager.Wow.Enums;
    using wManager.Wow.Helpers;
    
    namespace HumanMasterPlugin.Pathing
    {
    	public static class Darnassus
    	{
    		public static readonly string ToAuberdineKey = "HMPToAuberdine";
    		public static readonly string ToRuthEranKey = "HMPToRuthEran";
    		
    		private static readonly Ship _ship = Helper.RealWowVersion > 5875 ? DarnassusAuberdineBoatTBC.Ship : DarnassusAuberdineBoatVanilla.Ship;
    
    		public static void Start()
    		{
    			wManagerSetting.CurrentSetting.OffMeshConnectionsSearchDistance = 1000;
    			
    			//blacklist natural darnassus path
    			PathFinder.ReportBigDangerArea(new Vector3(9161.415, 1125.652, 1304.879), 100f);
    
    			Var.SetVar(ToRuthEranKey, new Action(ToRuthEran));
    			Var.SetVar(ToAuberdineKey, new Action(ToAuberdine));
    
    			var moveforwardAction = $@"c#: robotManager.Helpful.Var.GetVar<Action>(""{OffMeshes.MoveForwardAndResetKey}"")();";
    			var auberdineAction = $@"c#: robotManager.Helpful.Var.GetVar<Action>(""{ToAuberdineKey}"")();";
    			var ruthEranAction = $@"c#: robotManager.Helpful.Var.GetVar<Action>(""{ToRuthEranKey}"")();";
    			
    			PathFinder.OffMeshConnections.Add(new PathFinder.OffMeshConnection(new List<Vector3>
    			                                  {
    				                                  new Vector3(9946.901, 2556.688, 1316.229, "None"),
    				                                  new Vector3(9946.558, 2576.157, 1318.328, "None"),
    				                                  new Vector3(9946.107, 2594.624, 1316.194, "None"),
    				                                  new Vector3(9946.401, 2617.684, 1316.665, "None") {Action = moveforwardAction},
    				                                  new Vector3(8783.707, 966.4249, 30.20752, "None"),
    				                                  new Vector3(8774.904, 964.0229, 30.35609, "None"),
    				                                  new Vector3(8755.102, 952.9327, 26.45088, "None"),
    				                                  new Vector3(8726.162, 942.1434, 17.12174, "None"),
    			                                  }, (int) ContinentId.Kalimdor)
    			                                  {
    				                                  Type = PathFinder.OffMeshConnectionType.Unidirectional,
    				                                  Name = "Darnassus Portal Down",
    				                                  TryToUseEvenIfCanFindPathSuccess = true
    			                                  });
    			
    			PathFinder.OffMeshConnections.Add(new PathFinder.OffMeshConnection(new List<Vector3>
    			                                  {
    				                                  new Vector3(8672.928, 985.4261, 6.262514, "None"),
    				                                  new Vector3(8645.084, 997.5281, 4.820365, "None"),
    				                                  new Vector3(8615.801, 1007.996, 5.570138, "None"),
    				                                  new Vector3(8557.271, 1020.589, 5.375874, "None"),
    				                                  new Vector3(8554.27, 1021.136, 5.495627, "None") {Action = auberdineAction},
    				                                  new Vector3(6557.808, 774.058, 6.835019, "None"),
    				                                  new Vector3(6564.013, 773.3265, 6.590591, "None"),
    				                                  new Vector3(6551.588, 777.1901, 6.788247, "None")
    			                                  }, (int) ContinentId.Kalimdor)
    			                                  {
    				                                  Type = PathFinder.OffMeshConnectionType.Unidirectional,
    				                                  Name = "Rut'Theran to Auberdine",
    				                                  TryToUseEvenIfCanFindPathSuccess = true
    			                                  });
    
    			PathFinder.OffMeshConnections.Add(new PathFinder.OffMeshConnection(new List<Vector3>
    			                                  {
    				                                  new Vector3(9946.901, 2556.688, 1316.229, "None"),
    				                                  new Vector3(9946.558, 2576.157, 1318.328, "None"),
    				                                  new Vector3(9946.107, 2594.624, 1316.194, "None"),
    				                                  new Vector3(9946.401, 2617.684, 1316.665, "None") {Action = moveforwardAction},
    				                                  new Vector3(8783.707, 966.4249, 30.20752, "None"),
    				                                  new Vector3(8774.904, 964.0229, 30.35609, "None"),
    				                                  new Vector3(8755.102, 952.9327, 26.45088, "None"),
    				                                  new Vector3(8726.162, 942.1434, 17.12174, "None"),
    				                                  new Vector3(8554.27, 1021.136, 5.495627, "None") {Action = auberdineAction},
    				                                  new Vector3(6577.144, 767.6254, 5.65262, "None"),
    				                                  new Vector3(6564.013, 773.3265, 6.590591, "None"),
    				                                  new Vector3(6551.588, 777.1901, 6.788247, "None"),
    				                                  
    			                                  }, (int) ContinentId.Kalimdor)
    			                                  {
    				                                  Type = PathFinder.OffMeshConnectionType.Unidirectional,
    				                                  Name = "Darnassus Portal Down and Auberdine",
    				                                  TryToUseEvenIfCanFindPathSuccess = true
    			                                  });
    			
    			PathFinder.OffMeshConnections.Add(new PathFinder.OffMeshConnection(new List<Vector3>
    			                                  {
    				                                  new Vector3(8753.117, 948.64, 25.66852, "None"),
    				                                  new Vector3(8765.486, 956.6833, 29.10012, "None"),
    				                                  new Vector3(8772.359, 960.1454, 30.11599, "None"),
    				                                  new Vector3(8785.79, 966.983, 30.1999, "None")  {Action = moveforwardAction},
    				                                  new Vector3(9946.25, 2612.97, 1316.245, "None"),
    				                                  new Vector3(9946.107, 2594.624, 1316.194, "None"),
    				                                  new Vector3(9946.558, 2576.157, 1318.328, "None"),
    				                                  new Vector3(9946.901, 2556.688, 1316.229, "None"),
    			                                  }, (int) ContinentId.Kalimdor)
    			                                  {
    				                                  Type = PathFinder.OffMeshConnectionType.Unidirectional,
    				                                  Name = "Darnassus Portal Up",
    				                                  TryToUseEvenIfCanFindPathSuccess = true
    			                                  });
    			
    			PathFinder.OffMeshConnections.Add(new PathFinder.OffMeshConnection(new List<Vector3>
    			                                  {
    				                                  new Vector3(6572.557, 770.3295, 5.48198, "None"),
    				                                  new Vector3(6580.037, 767.1205, 5.766551, "None") {Action = ruthEranAction},
    				                                  new Vector3(8557.271, 1020.589, 5.375874, "None"),
    				                                  new Vector3(8765.486, 956.6833, 29.10012, "None"),
    				                                  new Vector3(8785.79, 966.983, 30.1999, "None") {Action = moveforwardAction},
    				                                  new Vector3(9946.25, 2612.97, 1316.245, "None"),
    				                                  new Vector3(9946.107, 2594.624, 1316.194, "None"),
    				                                  new Vector3(9946.558, 2576.157, 1318.328, "None"),
    				                                  new Vector3(9946.901, 2556.688, 1316.229, "None"),
    			                                  }, (int) ContinentId.Kalimdor)
    			                                  {
    				                                  Type = PathFinder.OffMeshConnectionType.Unidirectional,
    				                                  Name = "Auberdine to Rut'Theran and Darnassus Portal",
    				                                  TryToUseEvenIfCanFindPathSuccess = true
    			                                  });
    			
    			
    			PathFinder.OffMeshConnections.Add(new PathFinder.OffMeshConnection(new List<Vector3>
    			                                  {
    				                                  new Vector3(6572.557, 770.3295, 5.48198, "None"),
    				                                  new Vector3(6580.037, 767.1205, 5.766551, "None") {Action = ruthEranAction},
    				                                  new Vector3(8557.271, 1020.589, 5.375874, "None"),
    			                                  }, (int) ContinentId.Kalimdor)
    			                                  {
    				                                  Type = PathFinder.OffMeshConnectionType.Unidirectional,
    				                                  Name = "Auberdine to Rut'Theran",
    				                                  TryToUseEvenIfCanFindPathSuccess = true
    			                                  });
    		}
    
    		public static void ToAuberdine()
    		{
    			PluginLog.Log("Destination near Auberdine, take boat");
    			_ship.TravelToDestination();
    		}
    
    		public static void ToRuthEran()
    		{
    			PluginLog.Log("Destination near Darnassus, take boat");
    			_ship.TravelToDestination(true);
    		}
    	}
    }

    For the sake of at least protecting some of my "secrets" of several thousands of hours that went into HMP since 2016, I'm not going to share my ship implementations. They are simple enough that I think you could figure them out though.

    Back when I started, none of this was documented and I basically had to trial and error through a lot of it or build things from scratch. Thankfully @Droidz was very, very helpful and even added more Offmesh functionality for people to use more easily. 

     

    I hope this helps at least a few people in the future if they ever stumble upon this topic covering custom pathing, offmesh connections or Darnassus portals or ships. Of course, this can be adapted to add new elevators or similar portals too.

  2. Just wanted to chip in and say you absolutely shouldn't store NPCs in the database. Temporarily adding them (unless already available) is fine. But if you save them, you'll eventually give WRobot too much info that it doesn't need. It will go to the wrong NPCs/trainers just because they're closer in 2D space. 

    Back in the day before I wrote my own states and completely got rid of WRobot's states, I would intercept the ToTown state, clear the NPC DB and just inject my own based on 3D distance from a pre-select NPC list.
    WRobot will do a lot of dumb things if you give it free reign. Having a ton of NPCs available is just asking it to make the wrong choices. 

    Intercepting states and forcing selection is absolutely the way to go. I know people who wrote specific questers/grinders for their operations that would force inject a food vendor and repair for every level section and overwrite them with every "zone" change. Same for trainers, pretty much. 

  3. Ist weiterhin möglich. Du müsstest TRIAL als Key eingeben und dann + drücken um den Key hinzuzufügen bevor du ihn verwendest. Aber lass dir gesagt sein, wenn du gar kein Englisch sprichst bist du hier falsch. 
    Es läuft fast alles auf dem englischen Client, was die Community so erstellt, und um überhaupt irgendwas zu finden, musst du in den Foren eigentlich Englisch beherrschen.

  4. Just wanted to pop in and say for Vanilla it's really worth finding some of the older wiki entries regarding Tooltip handling in general. Tooltip handling in vanilla is very different from later expansions and honestly such a mess.

    I don't think you can just destroy tooltips. For example, as far as I know, you can not get ToolTips to be garbage collected by just setting them back to 'nil'.
    They will continue to exist and you're just dumping your memory full of new tooltips eventually. You absolutely need to reuse the tooltip and clear all lines as well as assigning a new owner.

    As far as I remember, in Vanilla you even need to manually delete some sub texts on the tooltip because it's such a rudimentary (buggy) implementation in 1.12. The old wiki entries should have more info.

     

    A code snippet from my own TBC+ code:

    List<int> containerSlot = Bag.GetItemContainerBagIdAndSlot(bagItem.Entry);
                    if (!containerSlot.IsNullOrEmpty())
                    {
                    
                        Lua.LuaDoString($@"
                        {TooltipName}:Hide();
                        {TooltipName}:SetOwner(UIParent, 'ANCHOR_NONE');
                        {TooltipName}:ClearLines();
                        {TooltipName}:SetBagItem({containerSlot[0]}, {containerSlot[1]});
                    ");
                        ParsedItem parsedBagItem = ItemParser.ParseCurrentTooltip(TooltipName);
                                        
    ...                                    

     

  5. Either your parameters aren't correct for 3.3.5a or the server isn't giving your client the correct info. Or even worse, your client is modified.

    local name, nameSubtext, text, texture, startTime, endTime, isTradeSkill, castID, notInterruptible = UnitCastingInfo(unit);

    This is taken from 3.3.5a interface files. notInterruptable probably returns nil, so you may have to double check what actually is returned.

    Here's the source:
    https://github.com/wowgaming/3.3.5-interface-files/blob/main/CastingBarFrame.lua

  6. Your Lua is wrong. The second local shouldn't be there. You're just creating a second local variable called name in that conditional block instead of overwriting the one outside of it.

    Instead of searching for a variable that will constantly be overwritten, just return what you need like so:

    private bool SpellIsInterruptible()
        {
            return Lua.LuaDoString<bool>(
                @"
                local name, _, _, _, _, _, _, notInterruptible = UnitCastingInfo(""target"");
                if not name then
                    name, _, _, _, _, _, notInterruptible = UnitChannelInfo(""target"");
                end
                if name then
                	return not notInterruptible;
                end
              
                return false;
                ");
        }

     

  7. I believe you can just let the state run that originally triggered your event handler (ToTown, most likely). It should know vendors in Moonglade, if your database is correctly filled.

    If you really needed to, you could just create an instance of ToTown and Training in your plugin and run those manually. The run method should be blocking and as long as you're in Moonglade, there shouldn't be anything interrupting the state so you don't need (much) extra logic to figure out if it was successfully run.

  8. It's probably your fightclass pausing to achieve something (like regen to summon pet). 
    Check the source code. If it doesn't pause anything - you're probably using the PC and hitting the shortcut to pause WRobot.

    It seems you're not using plugins and only Grinder, not even a Quester. So there's no code injections outside of your fightclass as far as I can tell.

  9. Try

    Lua.LuaDoString("TradeSkillCreateAllButton:Click()")

    If that doesn't work, the problem seems to be that Wrobot executes secure calls and the button won't won't work when doing so. There might be an extra argument that allows disabling secure call.
    Additionally, maybe the anti-cheat protection WRobot uses breaks some code.

  10. It's a common bug on some shitty private servers. Nothing that can be done and not related to WRobot.
    You can try and hope setting higher (500-1000ms) in advanced WRobot settings will alleviate it slightly, but this shit happened all the time, especially on vanilla servers.
    Best bet is to use the relogger and just hourly relog if your server has this issue constantly.

  11. They likely have you fingerprinted and some decent-ish detection when it comes to bot behavior.
    If you use WRotation and don't get banned, you're safe.

    But then you also know it's likely related to movement. Meaning you can try a few things like enabling/disabling smooth movement in WRobot, using Lua movement, keyboard movement (disabling CTM entirely), trying CTM with your game locked to 60 Hz via Rivatuner, etc.

    Considering my second character I used for testing (so it got stuck a lot, as I was refining my products) got to level 40 before getting banned, I'm fairly certain GMs just sit in starting areas while they answer tickets and ban some bots. Once you get past that, you're pretty safe and it's only player reports.

  12. Is this for Vanilla? For Vanilla clock to move to work, you need to be at 60Hz. You can use Rivatuner Statistics Server to limit your Wow.exe to 60 fps for the same effect.
    Otherwise the timestamps internal to the client are off and it won't work.

    Just iterate the list and within each step, use blocking code that only succeeds and jumps to the next step in the loop if ObjectManager.Pet.Position.DistanceTo(Vector3) < 3

  13. That's not what he said. He said meta info is cached. Buffs are still read from memory every time you make a call. 
    If you're making a fightclass and want it to be a efficient, create a state of truth for all units around you and make sure it doesn't change until after the iteration is over.
    That holds true for ids, distance, buffs, debuffs, whatever you need to make decisions in your rotation

  14. Vanilla is probably the worst expansion to work with, but it's also had a multitude of profiles released. There's fightclasses for every class (even free), tons of profiles, etc.

    A couple years ago, it had the most paid content and some of it is still up. Some of it has been released for free if the creators disappeared.

     

    However, if you're not willing to do anything yourself/barely set anything up besides loading an old profile that may not fully work anymore or isn't 100% compatible with your server, you're out of luck.

    https://wrobot.eu/files/category/164-plugins-vanilla/

    https://wrobot.eu/files/category/163-fight-classes-vanilla/

    https://wrobot.eu/files/category/166-grinder-vanilla/

    https://wrobot.eu/files/category/171-quester-vanilla/

    https://wrobot.eu/files/category/177-plugins-multiversion/

×
×
  • Create New...