Public feed #893202

Unnamed

public text v1 · immutable
Raw Edit
·published 2008-02-05 23:16 UTC
rendered paste body
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using LavishScriptAPI;
using ISXWoW;

namespace Predator
{
    class TargetObject
    {
        private int _Priority = 100;
        private WoWObject _WoWObject;

        public WoWObject WoWObject
        {
            get { return _WoWObject; }
        }

        public int Priority
        {
            get { return _Priority; }
        }

        public TargetObject(WoWObject WoWObject)
        {
            _WoWObject = WoWObject;
        }
    }

    class Environment : ThreadBase
    {
        public event GenericDelegate<WoWObjectType> OnTargetsUpdated;

        private object _EnvironmentLock = new object();
        private Dictionary<string, TargetObject> _TargetList = new Dictionary<string, TargetObject>();

        public Dictionary<string, TargetObject> TargetList
        {
            get
            {
                lock (_TargetList)
                {
                    return _TargetList;
                }
            }
        }

        private void UpdateTargets()
        {
            lock (_TargetList)
            {
                foreach (KeyValuePair<string, TargetObject> Pair in _TargetList)
                {
                }
            }
        }

        private bool ValidTarget(WoWObject _WoWObject)
        {
            WoWPlayer _Player;
            WoWUnit _Unit;

            switch (_WoWObject.Type)
            {
                case WoWObjectType.Player:
                    _Player = _WoWObject.GetPlayer();

                    if (!_Player.Attackable)
                    {
                        return false;
                    }

                    if (_Player.FactionGroup == Bot.Instance.WoW.Me.FactionGroup)
                    {
                        return false;
                    }

                    if (!_Player.Pvp)
                    {
                        return false;
                    }

                    break;
                case WoWObjectType.Unit:
                    _Unit = _WoWObject.GetUnit();

                    if (!_Unit.Attackable)
                    {
                        return false;
                    }

                    if (_Unit.Tapped)
                    {
                        return false;
                    }

                    if (_Unit.CreatureType == WoWCreatureType.Critter)
                    {
                        return false;
                    }
                    break;
            }

            return true;
        }

        public void WoWObjectAdded(object sender, LSEventArgs ea)
        {
            string ObjectGUID = ea.Args[0].Trim();
            WoWObject _WoWObject;

            _WoWObject = WoWObject.Get(ObjectGUID);

            switch (_WoWObject.Type)
            {
                case WoWObjectType.Unit:
                    if (ValidTarget(_WoWObject))
                    {
                        lock (_TargetList)
                        {
                            _TargetList.Add(ObjectGUID, (new TargetObject(_WoWObject)));
                        }
                        (new GenericEvent()).Fire<WoWObjectType>(OnTargetsUpdated,_WoWObject.Type);
                    }
                    break;
                case WoWObjectType.Player:
                    if (ValidTarget(_WoWObject))
                    {
                        lock (_TargetList)
                        {
                            _TargetList.Add(ObjectGUID, (new TargetObject(_WoWObject)));
                        }
                        (new GenericEvent()).Fire<WoWObjectType>(OnTargetsUpdated, _WoWObject.Type);
                    }
                    break;
                case WoWObjectType.Container:
                    break;
                case WoWObjectType.Item:
                    break;
            }
        }

        public void WoWObjectRemoved(object sender, LSEventArgs ea)
        {
            string ObjectGUID = ea.Args[0].Trim();

            lock (_TargetList)
            {
                if (_TargetList.ContainsKey(ObjectGUID))
                {
                    _TargetList.Remove(ObjectGUID);
                }
            }
            (new GenericEvent()).Fire<WoWObjectType>(OnTargetsUpdated, WoWObjectType.NULL);
        }

        public void Hook()
        {
            LavishScriptAPI.LavishScript.Events.AttachEventTarget("WoW:Object Added", WoWObjectAdded);
            LavishScriptAPI.LavishScript.Events.AttachEventTarget("WoW:Object Removed", WoWObjectRemoved);
        }

        public void Unhook()
        {
            LavishScriptAPI.LavishScript.Events.DetachEventTarget("WoW:Object Added", WoWObjectAdded);
            LavishScriptAPI.LavishScript.Events.DetachEventTarget("WoW:Object Removed", WoWObjectRemoved);
        }

        public override void Worker()
        {
            while (true)
            {
                Thread.Sleep(500);
                UpdateTargets();
            }
        }
    }
}