コード例 #1
0
        public override void Pulse()
        {
            try
            {
                crashFix();

                //Release spirit override
                while (MeCheck && !Me.IsAlive && Me.IsInInstance)
                {
                    DiedInInstance = true;
                    List <WoWPlayer> rezzerList = Me.PartyMembers.FindAll(player =>
                                                                          (player.Class == WoWClass.Shaman ||
                                                                           player.Class == WoWClass.Paladin ||
                                                                           player.Class == WoWClass.Priest ||
                                                                           player.Class == WoWClass.Druid) &&
                                                                          player.IsAlive &&
                                                                          player.Distance < 60);

                    if (rezzerList.Count == 0)
                    {
                        Log("No rezzers around. Releasing corpse");
                        Lua.DoString("RepopMe()", "lfg.lua");
                        //Crash fix
                        while (MeCheck)
                        {
                            Thread.Sleep(100);
                        }
                        crashFix();
                        break;
                    }

                    Lua.DoString("AcceptResurrect()", "lfg.lua");
                    Thread.Sleep(100);
                }

                //Retrieve corpse override
                while (MeCheck && Me.Auras.ContainsKey("Ghost") && DiedInInstance)
                {
                    tickCount = Environment.TickCount;
                    while (MeCheck)
                    {
                        safeMoveTo(Me.CorpsePoint);
                        Thread.Sleep(100);
                        if (Environment.TickCount - tickCount > 120000)
                        {
                            warningSound();
                            Log("Corpse run failed !");
                            return;
                        }
                        crashFix();
                    }
                }

                //Changing profile
                if (MeCheck && Me.IsInInstance && Logic.Profiles.ProfileManager.XmlLocation != emptyProfile)
                {
                    Log("Entered to the dungeon. Loading emtpy profile");
                    LevelbotSettings.Instance.LastUsedPath = Logic.Profiles.ProfileManager.XmlLocation;
                    Logic.Profiles.ProfileManager.LoadNew(emptyProfile, false);
                }
                else if (MeCheck && !Me.IsInInstance && Logic.Profiles.ProfileManager.XmlLocation == emptyProfile)
                {
                    Log("Loading previous profile");
                    Logic.Profiles.ProfileManager.LoadNew(LevelbotSettings.Instance.LastUsedPath, true);
                }

                //Variable checks
                if (MeCheck && !Me.IsInInstance)
                {
                    if (UseMountWasOn)
                    {
                        LevelbotSettings.Instance.UseMount = true;
                    }
                    if (LootWasOn)
                    {
                        LevelbotSettings.Instance.LootMobs = true;
                    }

                    RaFHelper.SetLeader(Me);
                    LastTarget = null;
                    tank       = null;
                    _tank      = null;
                }
                else
                {
                    if (LevelbotSettings.Instance.UseMount)
                    {
                        UseMountWasOn = true;
                    }
                    else
                    {
                        UseMountWasOn = false;
                    }

                    if (LevelbotSettings.Instance.LootMobs)
                    {
                        LootWasOn = true;
                    }
                    else
                    {
                        LootWasOn = false;
                    }

                    LevelbotSettings.Instance.UseMount = false;
                    LevelbotSettings.Instance.LootMobs = false;
                    Queued = false;
                }

                if (MeCheck && Me.IsAlive)
                {
                    DiedInInstance = false;
                }
                //

                //Get current LFG mode
                List <string> GetLFGMode = Lua.LuaGetReturnValue("return select(1, select(1, GetLFGMode()))", "lfg.lua");
                List <string> SubModeLUA = Lua.LuaGetReturnValue("return select(2, select(1, GetLFGMode()))", "lfg.lua");

                if (GetLFGMode != null)
                {
                    LFGStatus = GetLFGMode[0];
                }
                else
                {
                    LFGStatus   = null;
                    Queued      = false;
                    roleChecked = false;
                }

                if (SubModeLUA != null)
                {
                    SubMode = SubModeLUA[0];
                }
                else
                {
                    SubMode = null;
                }

                //Dungeon over detection
                if (MeCheck && Me.PartyMembers.Count < 4 && Me.IsInInstance && LFGStatus == "lfgparty")
                {
                    if (!partyTimer.IsRunning)
                    {
                        partyTimer.Start();
                    }

                    if (partyTimer.ElapsedMilliseconds >= 60000)
                    {
                        ShouldLeave = true;
                    }
                }
                else if (partyTimer.IsRunning)
                {
                    partyTimer.Reset();
                    ShouldLeave = false;
                }
                //Not in queue
                if (MeCheck && LFGStatus == null && !Queued && !Me.Auras.ContainsKey("Dungeon Deserter") && !Me.Auras.ContainsKey("Dungeon Cooldown"))
                {
                    roleChecked = false;
                    if ((MeCheck && Me.IsInParty && Me.IsGroupLeader) || !Me.IsInParty)
                    {
                        Queued = true;
                        Log("Queueing up for random dungeon");
                        Lua.DoString("LFDQueueFrame_Join()");
                        Thread.Sleep(2000);
                        return;
                    }
                }

                //Dungeon finished
                else if (LFGStatus == "abandonedInDungeon" || ShouldLeave)
                {
                    roleChecked = false;
                    Log("Dungeon run is over. Waiting 5 seconds before teleporting out.");
                    Thread.Sleep(5000);
                    if (MeCheck && Me.IsInParty)
                    {
                        Lua.DoString("LeaveParty()");
                    }
                    else
                    {
                        Lua.DoString("LFGTeleport(true)");
                    }

                    while (MeCheck)
                    {
                        Thread.Sleep(100);
                    }

                    crashFix();
                    return;
                }

                //Dungeon invite up
                else if (MeCheck && LFGStatus == "proposal" && SubMode == "unaccepted" && !Me.Combat)
                {
                    roleChecked = false;
                    Log("Waiting for 5 seconds before accepting dungeon invite");
                    Thread.Sleep(5000);
                    Log("Accepting dungeon invite");
                    Lua.DoString("AcceptProposal()");
                    Thread.Sleep(2000);

                    while (MeCheck)
                    {
                        SubModeLUA = Lua.LuaGetReturnValue("return select(2, select(1, GetLFGMode()))", "lfg.lua");

                        if (SubModeLUA != null)
                        {
                            SubMode = SubModeLUA[0];
                        }

                        if (SubMode != null && SubMode == "empowered")
                        {
                            break;
                        }

                        Thread.Sleep(100);
                    }
                    crashFix();
                    return;
                }

                //Leader queued for lfd
                else if (MeCheck && LFGStatus == "rolecheck" && !Me.Combat && !roleChecked)
                {
                    roleChecked = true;
                    Log("Waiting for 5 seconds before accepting role check");
                    Thread.Sleep(5000);
                    Log("Role Check is in progress");
                    Lua.DoString("LFDRoleCheckPopupAcceptButton:Click()");
                    Thread.Sleep(2000);
                    return;
                }

                //In dungeon and running
                else if (MeCheck && LFGStatus == "lfgparty" && Me.IsInInstance)
                {
                    roleChecked = false;
                    if (MeCheck && Me.PartyMembers.Count > 0 && Me.IsGroupLeader)
                    {
                        Log("You are the dungeon guide. Switching it to someone else");
                        Lua.DoString("PromoteToLeader('party1')");
                        return;
                    }

                    // Tank Assign
                    if (MeCheck && Me.IsInParty && Me.IsInInstance)
                    {
                        string partyMember = Lua.LuaGetReturnValue("if select(1, UnitGroupRolesAssigned(\"party1\")) then return 1 elseif select(1, UnitGroupRolesAssigned(\"party2\")) then return 2 elseif select(1, UnitGroupRolesAssigned(\"party3\")) then return 3 elseif select(1, UnitGroupRolesAssigned(\"party4\")) then return 4 else return 0 end",
                                                                   "lfg.lua")[0];

                        switch (partyMember)
                        {
                        case "1":
                            _tank = Me.PartyMember1;
                            break;

                        case "2":
                            _tank = Me.PartyMember2;
                            break;

                        case "3":
                            _tank = Me.PartyMember3;
                            break;

                        case "4":
                            _tank = Me.PartyMember4;
                            break;

                        default:
                            _tank = null;
                            break;
                        }

                        if (tank != _tank)
                        {
                            if (_tank == null)
                            {
                                //To make sure we are following someone after corpse run etc.
                                WoWPlayer randomMember = Me.PartyMembers.Find(player => player.IsAlive && player.Distance < 100);

                                if (randomMember != null && tank != randomMember)
                                {
                                    tank = randomMember;
                                    RaFHelper.SetLeader(tank);
                                    soundPlayed = false;
                                    Log("There is no tank in party. Following random party member");
                                }
                                else
                                {
                                    Log("There is nobody to follow. You need to move manually !");
                                    warningSound();
                                    return;
                                }
                            }
                            else
                            {
                                tank = _tank;
                                RaFHelper.SetLeader(tank);
                                Log("Tank is set to: {0} with MaxHP: {1}", tank.Class, tank.MaxHealth);
                            }
                        }
                    }

                    //Target best target and execute pull sequence
                    Dictionary <WoWUnit, int>           targetList = new Dictionary <WoWUnit, int>();
                    List <KeyValuePair <WoWUnit, int> > sortedList = new List <KeyValuePair <WoWUnit, int> >();

                    foreach (WoWPlayer player in Me.PartyMembers)
                    {
                        if (player.CurrentTarget != null && !player.CurrentTarget.IsFriendly && player.CurrentTarget.IsTargetingMyPartyMember && player.CurrentTarget.HealthPercent < 100)
                        {
                            if (targetList.Count > 0 && targetList.ContainsKey(player.CurrentTarget))
                            {
                                foreach (KeyValuePair <WoWUnit, int> pair in targetList)
                                {
                                    if (pair.Key == player.CurrentTarget)
                                    {
                                        targetCount = pair.Value + 1;
                                        targetList.Remove(player.CurrentTarget);
                                        targetList.Add(player.CurrentTarget, targetCount);
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                targetList.Add(player.CurrentTarget, 1);
                            }
                        }
                    }

                    if (targetList.Count > 0)
                    {
                        sortedList = new List <KeyValuePair <WoWUnit, int> >(targetList);
                    }


                    if (sortedList.Count > 1)
                    {
                        sortedList.Sort(delegate(KeyValuePair <WoWUnit, int> firstPair, KeyValuePair <WoWUnit, int> nextPair)
                                        { return(nextPair.Value.CompareTo(firstPair.Value)); });
                    }

                    if (sortedList.Count > 0 && LastTarget != sortedList[0].Key)
                    {
                        LastTarget = sortedList[0].Key;
                        LastTarget.Target();
                        Thread.Sleep(100);


                        while (MeCheck && Me.CurrentTarget != null && Me.CurrentTarget.IsAlive && (!Me.CurrentTarget.InLineOfSight || Me.CurrentTarget.Distance > 30))
                        {
                            safeMoveTo(Me.CurrentTarget);
                        }

                        SequenceManager.CallSequenceExecutor(Sequence.Pull);
                    }

                    // Following tank
                    if (MeCheck && tank != null && tank.IsValid && tank.IsAlive)
                    {
                        if (tank.Distance > 15 && !Me.Combat && !Me.IsResting)
                        {
                            safeMoveTo(tank, 15.0f);
                        }
                        else if (!tank.InLineOfSight && !Me.Combat && !Me.IsResting)
                        {
                            safeMoveTo(tank);
                        }
                        else if (Me.Combat && tank.Distance > 35 && !Me.IsCasting)
                        {
                            safeMoveTo(tank, 30.0f);
                        }
                    }
                }
            }
            catch (System.Threading.ThreadAbortException) { throw; }
            catch (Exception c)
            {
                Log("An Exception occured. Check debug log for details.");
                dLog("{0}", c);
            }
        }