thanks for looking over it again ^^ here it is:
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using Thor.Helper;
using Thor.WoWObjects;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace Thor
{
public static class ObjectManager
{
#region private stuff
private static readonly EnumObjectsCallbackDelegate Callback;
private static readonly IntPtr CallbackPtr;
private static readonly ClntObjMgrGetObjectPtrDelegate ClntObjMgrGetObjectPtrWoW;
private static readonly EnumVisibleObjectsDelegate EnumObjs;
private static readonly ClntObjMgrGetActivePlayerDelegate GetActivePlayerDelegate;
private static readonly Dictionary<ulong, WoWObject> RealObjects = new Dictionary<ulong, WoWObject>();
#endregion
internal static ActivePlayer Me { get; private set; }
internal static List<WoWObject> ObjectList { get { return RealObjects.Values.Where(o => o.IsValid).ToList(); } }
static ObjectManager()
{
Me = new ActivePlayer(IntPtr.Zero);
Callback = EnumObjectsCallbackHandler;
CallbackPtr = Marshal.GetFunctionPointerForDelegate(Callback);
GetActivePlayerDelegate = Thor_Main.m.RegisterDelegate<ClntObjMgrGetActivePlayerDelegate>((uint)Offsets.ClntObjMgrGetActivePlayer);
EnumObjs = Thor_Main.m.RegisterDelegate<EnumVisibleObjectsDelegate>((uint)Offsets.EnumVisibleObjects);
ClntObjMgrGetObjectPtrWoW = Thor_Main.m.RegisterDelegate<ClntObjMgrGetObjectPtrDelegate>((uint)Offsets.ClntObjMgrObjectPtr);
}
internal static ulong ActivePlayer
{ get { return GetActivePlayerDelegate(); } }
public static bool IsInWorld
{ get { return ActivePlayer != 0; } }
public static void Pulse()
{
if (Me == IntPtr.Zero)
{
Me = ClntObjMgrGetActivePlayerWow();
ObjectList.Add(Me);
}
foreach (WoWObject o in RealObjects.Values)
{ o.UpdateObjectPointer(IntPtr.Zero); }
EnumObjs(CallbackPtr, 0);
if (Thor_Main._frameCounter % 10 == 0)
{ RemoveInvalidEntries(); }
}
private static void RemoveInvalidEntries()
{
IEnumerable<KeyValuePair<ulong, WoWObject>> r = from o in RealObjects where !o.Value.IsValid select o;
foreach (var pair in r)
{
RealObjects.Remove(pair.Key);
}
}
private static int EnumObjectsCallbackHandler(ulong guid, int filter)
{
IntPtr objPtr = InternalGetObjectByGuid(guid);
if (!RealObjects.ContainsKey(guid))
{
var tmp = new WoWObject(objPtr);
switch (tmp.Type)
{
case ObjectType.Item:
tmp = new Item(objPtr);
break;
case ObjectType.Container:
tmp = new Container(objPtr);
break;
case ObjectType.Unit:
tmp = new Unit(objPtr);
break;
case ObjectType.Player:
tmp = new Player(objPtr);
break;
case ObjectType.GameObject:
tmp = new GameObject(objPtr);
break;
case ObjectType.Corpse:
tmp = new Corpse(objPtr);
break;
default:
return 1;
}
RealObjects.Add(guid, tmp);
}
else if (RealObjects[guid] != objPtr)
{ RealObjects[guid].UpdateObjectPointer(objPtr); }
return 1;
}
internal static WoWObject GetObjectByGuid(ulong guid)
{
WoWObject ret;
RealObjects.TryGetValue(guid, out ret);
return ret ?? new WoWObject(IntPtr.Zero);
}
internal static IntPtr InternalGetObjectByGuid(ulong guid)
{ return ClntObjMgrGetObjectPtrWoW(guid, -1); }
internal static ActivePlayer ClntObjMgrGetActivePlayerWow()
{ return new ActivePlayer(GetObjectByGuid(GetActivePlayerDelegate())); }
#region delegates
#region Nested type: ClntObjMgrGetActivePlayerDelegate
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate ulong ClntObjMgrGetActivePlayerDelegate();
#endregion
#region Nested type: ClntObjMgrGetObjectPtrDelegate
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate IntPtr ClntObjMgrGetObjectPtrDelegate(ulong guid, int filter);
#endregion
#region Nested type: EnumObjectsCallback
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int EnumObjectsCallbackDelegate(ulong guid, int filter);
#endregion
#region Nested type: EnumVisibleObjectsDelegate
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int EnumVisibleObjectsDelegate(IntPtr callback, int filter);
#endregion
#endregion
}
}