Jump to content

Fight classe heal wrotation


lirty

Recommended Posts

Salut voila je reprend le bot depuis peu avec wrotation pour faire du donjon et j'aurais besoin d'aide pour créer un fight classe heal pour mon paladin ainsi que quelque petite questions sur le fonctionnement du module wrotation. J'ai créer un fight classe pour la spécialisation tank il marche super bien mais quand a la spé heal impossible de la faire fonctionner il ne ce passe rien a chaque fois que je lance la rotation j'ai essayer plusieurs paramètres et conditions mais toujours rien le plus frustrant dans tout sa c'est que je n'arrive pas a comprendre le fonctionnement de ce type de rotation pour heal. Je ne comprend pas si il faut target un allié pour que le bot heal ou si il gère les targets automatiquement je ne sait pas trop qu'elle condition et paramètre utiliser pour un fight classe heal en donjon avec wrotation. si quelqu'un aurait une une explication a me donner pour me mieux comprendre ou un petit exemple de fight classe basic pour un heal en donjon je prend.

Sinon , je voulais savoir aussi si wrotation etais utilisable en arene cotée et raid ?

Voila merci d'avance pour vos réponses.

Link to comment
Share on other sites

toujours pas de réponses :/ ? j'ai un peux avancer j'ai réussie a faire marcher quelque sort mais pas comme je veux le bot ne heal pas mes compagnon dans le groupe mais lui seul quand je target un ennemi je ne comprend pas j'ai vraiment besoin d'aide ^^

Link to comment
Share on other sites

using System.Configuration;
using System.IO;
using System.Linq;
using System.Threading;
using System.Xml;
using robotManager;
using robotManager.FiniteStateMachine;
using robotManager.Helpful;
using wManager.Wow.Class;
using wManager.Wow.Helpers;
using wManager.Wow.ObjectManager;
using wManager.Wow.Bot.States;
using Timer = robotManager.Helpful.Timer;
using wManager.Wow.Enums;
using MemoryRobot;

public class Main : ICustomClass
{
    public float Range { get { return 40; } }

    private RestoDruid _RestoDruid;

    public void Initialize()
    {
        _RestoDruid = new RestoDruid();
        _RestoDruid.Pulse();
    }

    public void Dispose()
    {
        if (_RestoDruid != null)
        {
            _RestoDruid.Stop();
        }
    }

    public void ShowConfiguration()
    {
        MessageBox.Show("No Configuration for this Routine");
    }
}

public class RestoDruid
{
    private bool _isLaunched;
    public bool IsLaunched
    {
        get { return _isLaunched; }
        set { _isLaunched = value; }
    }
    
    public void Pulse()
    {
        _isLaunched = true;
        var thread = new Thread(RoutineThread) { Name = "RestoDruid_FightClass" };
        thread.Start();
    }

    public void Stop()
    {
        _isLaunched = false;
        Logging.WriteFight("Stop 'RestoDruid'");
    }

    void RoutineThread()
    {
        Logging.WriteFight("'RestoDruid' Started");
        while (_isLaunched)
        {
            Routine();

            Thread.Sleep(10); // Temps d'attante pour éviter d'utiliser trop le processeurs
        }
        Logging.WriteFight("'RestoDruid' Stopped");
    }

    public uint Healthstone = 5512;
    public uint AncientRejuvenationPotion = 127836;
	public uint AncientManaPotion = 188303;

    void Routine()
    {
        if (ObjectManager.Me.IsMounted) return;
        if (ObjectManager.Me.IsCast) return;
		
		if (ObjectManager.Me.HealthPercent <= 45 && needToUseItem(Healthstone)) return;
        if (ObjectManager.Me.ManaPercentage <= 30 && needToUseItem(AncientManaPotion)) return;
        
		if (needWildGrowth()) return;
		if (needHealingTouch()) return;
		return;
    }

    private Spell _healingTouch;
	
	public RestoDruid()
    {
        _healingTouch = new Spell("Healing Touch");
        Logging.WriteFight("'RestoDruid' by Pasterke loaded");
    }
	
	public bool needHealingTouch()
    {
        if (!CanUseSpell(_healingTouch)) return false;
        if (getPartyMembers().Count() > 0)
        {
            try
            {
                var t = getPartyMembers().Where(p => p.IsAlive
                   && p.GetDistance <= 40
                   && !TraceLine.TraceLineGo(p.Position)
                   && p.HealthPercent <= RestoSettings.CurrentSetting.HealingTouch)
				   .OrderBy(p => p.HealthPercent).FirstOrDefault();

                if (t != null && !ObjectManager.Me.GetMove)
                {
                    SpellManager.CastSpellByNameOn(_healingTouch.Name, t.Name);
                    Logging.WriteFight(_healingTouch.Name + " on " + t.Name);
                    return true;
                }
            }
            catch (Exception e) { Logging.WriteDebug(e.Message); }
        }
        return false;
    }
	public bool needWildGrowth()
    {
        if (!CanUseSpell(_wildGrowth)) return false;

        if (getPartyMembers().Count() > 0)
        {
            try
            {
                WoWUnit unit = new WoWUnit(0);

                var t = getPartyMembers().Where(p => p.IsAlive
                   && p.GetDistance <= 40
                   && !TraceLine.TraceLineGo(p.Position)
                   && p.HealthPercent <= RestoSettings.CurrentSetting.WildGrowth).OrderBy(p => p.HealthPercent).ToList();

                if (t.Count() > 0)
                {
                    int count = 0;
                    int tel = 0;

                    Vector3 mainPos = t.FirstOrDefault().Position;
                    unit = new WoWUnit(t.FirstOrDefault().GetBaseAddress);

                    //Logging.WriteFight(unit.Name);

                    count = t.Count(p => p.IsAlive
                       && p.Position.DistanceTo(mainPos) <= 30
                       && p.HealthPercent <= RestoSettings.CurrentSetting.WildGrowth);

                    //Logging.WriteFight("count players(t): " + count + " aantal leden: " + getPartyMembers().Count());

                    if (getPartyMembers().Count() > 5) { tel = 5; } else { tel = 3; }

                    //Logging.WriteFight("tel variable: " + tel);

                    if (count >= tel && !ObjectManager.Me.GetMove)
                    {
                        SpellManager.CastSpellByNameOn(_wildGrowth.Name, unit.Name);
                        Logging.WriteFight("Casting: " + _wildGrowth.Name + " on: " + unit.Name);
                        return true;
                    }
                }
            }
            catch (Exception e) { Logging.WriteDebug(e.Message); }
        }
        return false;
    }
	
	bool CanUseSpell(Spell spell)
    {
        try
        {
            if (!spell.KnownSpell) return false;
            if (SpellManager.GetSpellCooldownTimeLeft(spell.Name) > 0) { return false; }

            return true;
        }
        catch (Exception e) { Logging.WriteDebug(e.Message); }
        return false;
    }
	
	public bool debuffExists(string debuff)
    {
        return (ObjectManager.Me.Guid == ObjectManager.Target.BuffCastedBy(debuff));
    }

    public bool MeIsInParty { get { return getPartyMembers().Count() > 0 ? true : false; } }
	
	public bool myBuffExists(string buff, WoWUnit unit)
    {
        return unit.BuffCastedByAll(buff).Contains(ObjectManager.Me.Guid);
    }

    public bool hasMyHot(WoWUnit unit)
    {
        return unit.BuffCastedByAll("Regrowth").Contains(ObjectManager.Me.Guid)
            || unit.BuffCastedByAll("Rejuvenation").Contains(ObjectManager.Me.Guid)
            || unit.BuffCastedByAll("Wild Growth").Contains(ObjectManager.Me.Guid);
    }
	
	public IEnumerable<WoWUnit> getPartyMembers()
    {
        var units = new List<WoWUnit>();
        var partyMembers = Party.GetPartyGUIDHomeAndInstance();
        if (partyMembers.Any())
        {
            foreach (Int128 u in partyMembers)
            {
                var un = new WoWUnit(ObjectManager.GetObjectByGuid(u).GetBaseAddress);

                units.Add(un);
            }
            units.Add(ObjectManager.Me);
        }
        return units;
    }
	public string GetTankPlayerName()
    {
        if (Usefuls.MapZoneName == "Proving Grounds") return "Oto the Protector";

        var lua = new[]
        {
            "partyTank = \"\";",
                      "for groupindex = 1,MAX_PARTY_MEMBERS do",
                      "	if (UnitInParty(\"party\" .. groupindex)) then",
                      "		local role = UnitGroupRolesAssigned(\"party\" .. groupindex);",
                      "		if role == \"TANK\" then",
                      "			local name, realm = UnitName(\"party\" .. groupindex);",
                      "			partyTank = name;",
                      "			return;",
                      "		end",
                      "	end",
                      "end",
        };
        return Lua.LuaDoString(lua, "partyTank");
    }

    public bool needToUseItem(uint itemEntry)
    {
        if (!ItemsManager.HasItemById(itemEntry)) return false;
        if (Bag.GetContainerItemCooldown((int)itemEntry) > 0) return false;
        try
        {
            Lua.LuaDoString("local name = GetItemInfo(" + itemEntry + "); RunMacroText('/use ' .. name);");
        }
        catch (Exception e)
        {
            Logging.WriteDebug("Use Item => " + e.Message);
        }
        return true;
    }

    public WoWUnit GetPartyTank()
    {
        if (getPartyMembers().Count() > 0)
        {
            try
            {
                var p = new WoWUnit(0);
                var playerName = GetTankPlayerName();
                if (!string.IsNullOrWhiteSpace(playerName))
                {
                    playerName = playerName.ToLower().Trim();
                    var party = getPartyMembers();

                    foreach (var woWPlayer in party)
                    {
                        if (woWPlayer.Name.ToLower() == playerName)
                        {
                            return p = new WoWUnit(woWPlayer.GetBaseAddress);
                        }
                    }
                }
            }
            catch (Exception e) { Logging.WriteDebug(e.Message); }
        }
        return null;
    }
}

Example comment coder une routine avec C#.

Link to comment
Share on other sites

Quote

 

Merci a toi pour cette config mais je ne suis pas très familier avec le langage c# et la programmation en général :D je penser plus a un fichier xml ^^ sinon pour etre plus clair dans mes problème et vu que je n'est jamais vu fonctionner une rotation en heal je ne sait pas trop comment sa se passe. Deja mon plus gros probleme c'est quand je lance ma rotation rien ne ce passe le bot ne heal personne. Si je target un ennemie pendant un combat la il va commencer a ce heal mais que lui pas les membres du groupe.Faut-il target un player en donjon pour que le bot heal ou il gere automatiquement les target ? j'ai essayer plusieur condition heal percent, target distance , target , in combat mais rien i fait.

Link to comment
Share on other sites

On 16/10/2016 at 5:11 PM, lirty said:

Merci a toi pour cette config mais je ne suis pas très familier avec le langage c# et la programmation en général :D je penser plus a un fichier xml ^^ sinon pour etre plus clair dans mes problème et vu que je n'est jamais vu fonctionner une rotation en heal je ne sait pas trop comment sa se passe. Deja mon plus gros probleme c'est quand je lance ma rotation rien ne ce passe le bot ne heal personne. Si je target un ennemie pendant un combat la il va commencer a ce heal mais que lui pas les membres du groupe.Faut-il target un player en donjon pour que le bot heal ou il gere automatiquement les target ? j'ai essayer plusieur condition heal percent, target distance , target , in combat mais rien i fait.

Il me semble que les profils heal se programme en C# et ne peuvent pas être crée avec l'outil de creation de fightclass proposé par wrobot

Link to comment
Share on other sites

En attendant tu peux partir de ça, il faut enlever les sorts obsolètes et les changer les paramètres dans le setings du fight class (dans l'interface WRobot) ( vais vérifier que ça fonctionne encore en lfr)

 

Link to comment
Share on other sites

Salut merci pour le lien je l'avais justement télécharger ce matin pour voir un peux est c'est très très complet merci a sont auteur c'est le genre de fight classe que je pourrais jamais faire sa :p en tout cas c'est propre et riche on en apprend. Enfin bon je me suis pas décourager depuis ce matin je me suis pencher dessus (j'ai pas vue le temps passer bientôt 6h que je suis dessus) et je commence a mieux comprendre j'arrive a décoder la majorité des ligne etc.. j'ai quelque problème de compréhension par contre avec les boucles et conditions pour configurer les sorts j'ai essayer de comparer plusieurs fightclass coder en c# mais j'ai l'impression que tout le monde ne code pas de la même façons sa me perturbe :d.

Je te remercie d'avance AudreyH pour le fightclass que tu va poster ce soir il va beaucoup m'aider je pense ^^.

 

ps : le fightclass basic de Droidz pour Hpal :

 

Link to comment
Share on other sites

Oui c'est le premier sur lequel j'ai bossé avec Droidz :)

Mais je trouve que celui de Cinda est bien pensé, pas très optimisé en temps mais il donne la façon de faire et est très suffisant

Il y a même un framework qui date de début d'année qui est sympa

Je modifie juste celui de Cinda pour qu'il fasse autre chose que du FoL :)

 

Link to comment
Share on other sites

Salut AudreyH merci a toi j'ai tester et sa marche nickel je vais essayer de l'améliorer. et par contre personne ma repondu mais est ce que wrotation marche en arène cotée :D ?

Link to comment
Share on other sites

On 22.10.2016 at 9:49 PM, AudreyH said:

179k on Ursoc LFR

BestofFaith and Beacon doesnt work because of the gettank function, don't have time this WE to find out

[Cindarella]-Holy Pala Beta Legion by AudreyH.cs

Capture.PNG

Capture2.PNG

Capture3.PNG

Is there a reason why you create a new player object?
Line 792:

var u = members.First();
WoWPlayer healTarget = new WoWPlayer(u.GetBaseAddress);

Why not just:
 

WoWPlayer healTarget =  members.First();

Sorry for offtopic :ph34r:

Link to comment
Share on other sites

Pour l'arene oui, cela reste une rotation comme une autre, par contre ca necessite d'optimiser ca aux ptits oignons, pour entre autre prendre en compte les talents d'honneurs

IMod: good point, but it was not my intention to correct the code, just show how to add spells and make it run

WoWPlayer healTarget =  members.First();

Tu peux modifier le code comme écrit ci-dessus

Link to comment
Share on other sites

5 hours ago, AudreyH said:

Pour l'arene oui, cela reste une rotation comme une autre, par contre ca necessite d'optimiser ca aux ptits oignons, pour entre autre prendre en compte les talents d'honneurs

IMod: good point, but it was not my intention to correct the code, just show how to add spells and make it run


WoWPlayer healTarget =  members.First();

Tu peux modifier le code comme écrit ci-dessus

Yeah i saw it, the code is kinda messi :wub: no offense.
What part doesn't work maybe i can help you out.

Link to comment
Share on other sites

No offense :) it's not my code, i took the example form Cinda because it's very simple to understand, and modify it to run on legion

I have my own rotation, but i'm not 100% happy with it, even i do high heal with it (I'm on MM)

It's the tank part, i should take mine but between raid, expedition and reroll ... i'm a bit busy in game ;)

Link to comment
Share on other sites

  • 2 months later...

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...