Jump to content

srazdokunebil

WRobot user
  • Posts

    20
  • Joined

  • Last visited

Posts posted by srazdokunebil

  1. I am developing a WRobot plugin that assists in making granular edits to Vector3 paths while in-game.  Right now I can add nodes, delete nodes, reposition existing nodes, and display the complete Vector3 path overlay in the client using Radar3D.DrawLine() and Radar3D.DrawCircle():

    image.thumb.png.5abce5bb447c8f677c683bef233a4796.png

     

    I would like to draw my path to the WRobot map the same way that the Gatherer Profile Editor does.

    image.thumb.png.31722333ec92ac9914085ee9db8c2f30.png

    Is this possible to do from within a plugin?

  2. Salut Droidz!

    A little better!  I've reinstalled with the WRobot installer from the main page and reconfigured it.  Now the behavior goes:

    1. Launch Relogger
    2. Start relogger profile
    3. WoW client authenticates and logs into game with the correct character
    4. WRobot quester profile starts after 10 seconds
    5. WoW client /camps back to character screen
    6. WoW client logs back into the game with the correct character
    7. WRobot quester profile pathing causes character to summon mount
    8. WoW client begins a 2nd /camp countdown, but does not exit game when it reaches zero
    9. WRobot quester profile proceeds to completion through the 2nd /camp
    10. WoW client and WRobot both exit and Relogger loops to 3. after a 30m wait timer
  3. Relogger was working fine up to 11/5--  This happened after applying the lastest update.  When Wrobot is used in tandem with Relogger, the wow client now automatically camps upon login.  It doesn't camp out immediately: the client simply sits down and displays a countdown from 20 to 0.  WRobot itself is fine.  This behavior is happening solely avec Relogger.

    I've restored an unpatched wrobot installation backup from last week, and it is working again.

    Client: 1.12.1 (5875)

     

     

  4. ..parsing AssistLeader() in FightAssist.cs from PartyHelper:

    public static void AssistLeader()
    {
      WoWPlayer leader = ObjectManager.GetObjectWoWPlayer().FirstOrDefault(p => p.Name == PartyFollow.LeaderName);
      if (leader == null || leader.Target == 0 || ObjectManager.Me.Target == leader.Target || leader.TargetObject.IsDead ||
          leader.TargetObject.Reaction >= Reaction.Friendly || !leader.TargetObject.IsAttackable || !IsCloseEnoughToLeader() || Me.HaveBuff("Food") || Me.HaveBuff("Drink")
          || wManagerSetting.IsBlackListed(leader.Target) || Logging.Status == "Regeneration")
      {
        return;
      }
    
      Fight.StopFight();
      ObjectManager.Me.Target = leader.Target;
      Fight.StartFight(leader.Target, false);
    }

    I simply transcribed the Fight.StopFight() and Fight.StartFight() functions into FightEvents_OnFightLoop_Taunt():

        public static void FightEvents_OnFightLoop_Taunt(WoWUnit unit, CancelEventArgs cancelable)
        {
            // If running Grinder, Gatherer or Automaton, switch to targets that are targeting partymembers
            if ((OffensiveWarrior.productCategory == "Grinder"
                 || OffensiveWarrior.productCategory == "Automaton"
                 || OffensiveWarrior.productCategory == "Gatherer"))
            {
                unit = Methods.GetHighPriorityUnit(8); // returns WOWUnit GUID of closest unit attacking a partymember
    
                // if a mob is attacking a partymember and we haven't switched targets in the last 5sec
                if (unit != null && unit.Guid > 0UL && Methods._lastTargetSwitch.AddSeconds(8) < DateTime.Now)
                {
                    Methods.LuaPrint("FightEvents_OnFightLoop_Taunt switching target to: " + unit.Guid);
                    Fight.StopFight();
                    ObjectManager.Me.Target = unit.Guid;
                    Fight.StartFight(unit.Guid, false);
                    Methods._lastTargetSwitch = DateTime.Now;
                }
            }
        }

    This works flawlessly.  Thank you Matenia!

  5. I have put together a few vanilla fightclasses which are working well with the Party and WRotation addons.  I've stitched them in C# using Matenia's framework and a patchwork of other code gleaned from this site.

    I have a tank class, a healing class and a dps class.  They are configured thusly:

    tank - uses Grinder product to follow a path, pick targets and murder things.
    healer - uses Party product to follow and heal tank
    dps - uses Party product to follow and assist tank

    While using the Grinder product, I need to give the tank the ability to switch from its current target to taunt units that are attacking/targeting partymembers in mid-fight.  Currently the behavior is

    1. Acquire target
    2. Kill target
    3. Attack & kill remaining adds
    4. Goto 1.

    When I am manually driving the tank using WRotation, I can manually pick targets at will.  I am able to switch from my current target to another without any constraints.  The healer follows and heals, the dps follows and assists.  The tank even rushes to assist partymembers AFTER the current target dies thanks to the Party product.

    The problem is that when I use the Grinder product, I am unable to get my tank fightclass to switch targets DURING the fight to taunt adds off the others.  I am currently attempting this from the fightclass .DLL.

    I have a series of functions inside the TANK FIGHTCLASS to ascertain if there are targets that need to be taunted off partymembers.

    public static void CMD_Priotarg()
    {
    	WoWUnit target = GetHighPriorityUnit(25); // Returns GUID of 1st mob within 25 yds that is targeting a partymember
    	if (target != null && target.Guid >= 0UL && target.IsAlive && target.GetDistance <= 25)
    	{
    		LuaPrint(target.Name + " is attacking a partymember.  Switching!");
    		CombatUtil.TargetUnit(target);
    		MovementManager.Face(target);
    	}
    }

       
    If there's a mob that is targeting party members and needs to be taunted off them, GetHighPriorityUnit() spits out the mob's WoWUnit GUID and I use Matenia's CombatUtil.TargetUnit() function to switch to it.  I have the CMD_Priotarg() function bound to a hotkey defined by the fightclass.  It is currently working with WRotation.

    I followed these two threads for guidance.

    https://wrobot.eu/forums/topic/7658-prioritize-low-hp-targets/

    https://wrobot.eu/forums/topic/7681-left-click-unit/

    This does not work if I am using the Grinder product.  The issue is that Grinder owns the targeting.  I've put the function above in a subroutine that ticks alongside the rotation in Matenia's framework.  When it is triggered and GetHighPriorityUnit() returns a valid WoWUnit GUID, the tank will switch targets to that mob's GUID for a second, then immediately snap back to the original target.

    So I found this thread

    "OK, that probably means that I should be doing this via a fightloop event," I thought.

    That thread referenced a few event driven fightloop code examples that are much more elegant than my CMD_Priotarg() example.  But they all yield the same unwanted behavior.  WRobot still acquires the new target and immediately switches back to the original target:

    public void Initialize()
    {
      try
      {
        ...
          FightEvents.OnFightLoop += new FightEvents.FightTargetHandler(Methods.FightEvents_OnFightLoop_Taunt);
        ...
        }
    }
    
    ...
    
    private static void FightEvents_OnFightLoop_Taunt(WoWUnit unit, CancelEventArgs cancelable)
    {
      // If running Grinder, Gatherer or Automaton, switch to targets that are targeting partymembers
      if ((OffensiveWarrior.productCategory == "Grinder" 
           || OffensiveWarrior.productCategory == "Automaton"
           || OffensiveWarrior.productCategory == "Gatherer") && woWPlayer.IsPartyMember)
      {
        unit = Methods.GetHighPriorityUnit(8); // gets all units attacking you
    
        // if a mob is attacking a partymember and we haven't switched targets in the last 5sec
        if (unit != null && unit.Guid > 0UL && Methods.LastTargetSwitch.AddSeconds(5) < DateTime.Now) 
        {
          Methods.LuaPrint("FightEvents_OnFightLoop: switchTarget");
    
          CombatUtil.TargetUnit(attacker);
          Methods.LastTargetSwitch = DateTime.Now;
        }
      }
    }

    This results in the same snap back targeting behavior while running Grinder.  Works fine when using the WRotation product.

    TL;DR:
    I can reliably get a fightclass to switch targets after combat has been initiated when using the WRotation product.  Can the same be done with the Grinder product?  If not, is a workaround possible?

  6. From what I understand, the code:

    wManager.Wow.Helpers.RunCodeExtension.RunScript(robotManager.Helpful.RunCode.CodeType.CSharp, @"robotManager.Helpful.Var.SetVar(""ManageMovementWRotation"", WRotation.Bot.WRotationSetting.CurrentSetting.ManageMovement);", "", out errorsCSharp)

    ..creates variable ManageMovementWRotation, and assigns it the value of WRotation.Bot.WRotationSetting.CurrentSetting.ManageMovement.  How does this change the value of WRotation.Bot.WRotationSetting.CurrentSetting.ManageMovement while wrobot is running?

  7. Thanks for chiming in!  I am aware that the wrobot application winform switch element 'Manage Character Movement' shouldn't toggle in response to the state of WRotation.Bot.WRotationSetting.CurrentSetting.ManageMovement being toggled,  not unless wrobot is stopped and started again.

    I'm not 100% clear on what of Droidz's suggestion does, in particular:

    wManager.Wow.Helpers.RunCodeExtension.RunScript(robotManager.Helpful.RunCode.CodeType.CSharp, @"robotManager.Helpful.Var.SetVar(""ManageMovementWRotation"", WRotation.Bot.WRotationSetting.CurrentSetting.ManageMovement);", "", out errorsCSharp))

    Does this create variable ManageMovementWRotation that becomes an alias of WRotation.Bot.WRotationSetting.CurrentSetting.ManageMovement?  Toggling the ManageMovementWRotation variable in turn toggles the WRotation setting?  I'm a bit confused as I don't have a clear understanding of what wManager.Wow.Helpers.RunCodeExtension.RunScript is doing.

  8. Thank you, I really appreciate your help!  I am integrating this inside of Matenia's 1.12.1 fightclass framework for a melee class.  I've declared your function ManageMovement(), and executed it inside the Initialize() subroutine, which executes its contents once at the beginning as you suggest.  Am I correct in inferring that your code is meant to toggle the value of WRotation.Bot.WRotationSetting.CurrentSetting.ManageMovement when boolean variable ManageMovementWRotation is toggled? 

    This does not seem to work--  I am, however, able to access the correct boolean value of WRotation.Bot.WRotationSetting.CurrentSetting.ManageMovement according to the setting in WRotation -> Product Settings -> Manage Character Movement.  I'm just not able to toggle it while wRotation is running.

  9. I'm trying to add a toggle to my fightclass to enable/disable character movement with a hotkey.  I'm looking to enable/disable WRotation ->Product Settings ->Manage Character Movement while the rotation is running?  If this is possible, which is the C# variable that this setting maps to?  I wasn't able to find a definitive answer in the WRobot API or the forums.

    I'm using this in the context of PQR/WRotation where a melee player might occasionally toggle this setting on to "stick" to mobs.

     

  10. Is it possible to obtain the time left for a debuff applied to a mob using Lua code (or other means) in vanilla 1.12.1?

    I've found some conflicting information for UnitDebuff()

    I am aware that the C# WRobot function BuffTimeLeft() is explicitly not supported in the 1.12.1 version.  However;  since the client displays debuff countdown timers on the debuff icons, that info is definitely encapsulated in the client.    Does any one have a method to extract it?

     

     

  11. On 5/28/2019 at 4:28 PM, Ordush said:

    There are workarounds to cast spells using "id" by using GetSpellInfo()
    https://wowwiki.fandom.com/wiki/API_GetSpellInfo?oldid=1291791

    Using this you can use CastSpellByName(GetSpellInfo(551)) replace 551 with any spell ID
    HOWEVER CastSpellByName only has an "on self" argument, which means you can either cast it on yourself or on your target. It's useful for stuff like selfbuffing, dispelling, decursing etc. since you won't need to relieve your target.
     

    It Works!

    Unfortunately, none of those LUA functions worked from the 1.12.1 client.  Several functions including GetSpellInfo(), invoked in the game client from a /script macro (not from the c# scrript) returns a LUA error complaining that the function doesn't exist.  Maybe it's me making a mistake, or I have a Frankenstein copy of 1.12.1.  Who knows.

    I was, however, able to get CastSpellByName() to play ball:

    public static void SetMouseoverUnit(WoWUnit unit)
    {
        wManager.Wow.Memory.WowMemory.Memory.WriteUInt64(
            (uint)wManager.Wow.Memory.WowMemory.Memory.MainModuleAddress + 0x74E2C8, unit.Guid);
    }
    
    public static void CastOn(WoWUnit unit, Spell spell)
    {
        float i = spell.CastTime;
        i = i * 1000 + 1500;
        int myint = Convert.ToInt32(i);
        
        Logging.WriteDebug("Casting " + spell.Name + " on " + unit.Name + " ..Cast time == " + i + " Type = " + myint);
    
        SetMouseoverUnit(unit);
        //WORKED: string cast = (@"TargetUnit(""mouseover""); CastSpellByName(""Flash Heal""); TargetLastTarget();");
        string cast1 = (@"TargetUnit(""mouseover""); CastSpellByName(""");
        string cast2 = (@"""); TargetLastTarget();");
        Lua.LuaDoString(cast1 + spell.Name + cast2);
        
        Thread.Sleep(myint);
    }

    The bad:

    • Yep, this code is ugly.  But it gets the job done. *shrug*
    • wRobot's cs parser version doesn't do '@' verbatim strings, and I'm not yet inclined to make a whole .csproj of this thing, so please excuse the string fuckery at the bottom.
    • I've found *no* c# or LUA method that could derive whether I am casting.  I've gone through the forums, pored over code and determined that, while using 1.12.1 + wRobot:
      • ObjectManager.Me.IsCast always returns false
      • every possible LUA function capable of determining my casting state returns an error
      • ..so that why I'm using a Thread.Sleep here.

    The Good:

    • It works, casting heals on myself and partymembers without switching targets.
    • The mouseover workaround was pointed out by reapler & Matenia in the following thread.

    Thank you so much for your help!

     

     

     

  12. I'm amending a holy priest healBot fightclass profile for vanilla 1.12.1, and I'm stuck.  As it stands now, I am able to run the code as an non-compiled .cs fightclass.  I've even added a rudimentary decurse engine.  However, I am irritated that the bot needs to use Interact.InteractGameObject to actively target myself and other players in order to cast heals and other beneficial spells.  My goal is to cast spells on partymembers without having to switch targets.

    I've searched the forums and found a few promising avenues:

    1) Focus frame method: [Holy - Paladin] The Holy Grail 17.06.22b
    Built for 3.3.5a/2.4.3.  Source link.  This healbot uses the focus frame to cast spells on the intended target.  Unfortunately, since I am building for 1.12.1 client, there is no focus.Guid functionality.  There are addons that provide /focus functionality, but AFAIK those are not addressable from wrobot.  Dead end for now.

    2) Execute LUA code: 5006-cast-spell-without-targeting
    User iMod points out that this is possible, but didn't specifically state whether he's tested this in 1.12.1.  I tried the following code snippet:

    (I altered the LUA string to not rely on string interpolation as in iMod's example, since I am running .cs source and not compiling to .DLL)

    if (target.Guid == ObjectManager.Me.Guid)
    {
        // Cast on self
        Lua.LuaDoString("CastSpellByID (2061, \"player\")");
    }

    That returned the following error in the wow console:

    ERROR: [string "Yofewupyo.lua"]:13: attempt to call global 'CastSpellByID' (a nil value)

    I get the same error in the wow console when using c# code instead, as Droidz suggests

    wManager.Wow.Helpers.SpellManager.CastSpellByIdLUA(2061, "player");

    I also got rid of all addons, still no joy:

    [string "esurut.lua"]:13: attempt to call global 'CastSellByID' (a nil value)

    Any idea why I'm getting this error?  Thanks for your time! ?

×
×
  • Create New...