Releasing some more code C#,
some code is messy, but hey it works.
any thoughts and words are appreciated.
dont mind the console.writeline,
my heal bot is console. as i didn't need a GUI.
cooldowns.cs
Code:
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Linq;
using System.Text;
using ConsoleDruidHeals.Managers;
namespace ConsoleDruidHeals.WoWFunctions
{
public static class Cooldowns
{
/// <summary>
/// Returns Is spell on global cooldown
/// </summary>
/// <returns>Bool, Yes = on cooldown</returns>
public static bool IsGCD()
{
ulong CurrentTime = ProcessManager.WoWProcess.ReadUInt64((uint)Addresses.CoolDown.PerformanceCounter);
uint ObjectList = ProcessManager.WoWProcess.ReadUInt((uint)Addresses.CoolDown.GlobalCooldown + 0x8);
try
{
while (ObjectList != 0)
{
uint StartTime = ProcessManager.WoWProcess.ReadUInt(ObjectList + 0x10);
uint GlobalTime = ProcessManager.WoWProcess.ReadUInt(ObjectList + 0x2C);
// Check spell on GCD
if ((ulong)(StartTime + GlobalTime) > CurrentTime)
{
// Some reason bugs out hard. so if global under 10 secs lets just say we found
// Cheat way but works ?
if (GlobalTime < 10000 && GlobalTime != 0)
{
return true;
}
}
ObjectList = ProcessManager.WoWProcess.ReadUInt(ObjectList + 4);
}
}
catch (Exception)
{
return false;
}
return false;
}
public static bool SpellReady(int SpellID)
{
ulong CurrentTime = ProcessManager.WoWProcess.ReadUInt64((uint)Addresses.CoolDown.PerformanceCounter);
uint ObjectList = ProcessManager.WoWProcess.ReadUInt((uint)Addresses.CoolDown.GlobalCooldown + 0x8);
try
{
while (ObjectList != 0)
{
try
{
uint ListSpellID = ProcessManager.WoWProcess.ReadUInt(ObjectList + 8);
uint StartTime = ProcessManager.WoWProcess.ReadUInt(ObjectList + 0x10);
uint GlobalTime = ProcessManager.WoWProcess.ReadUInt(ObjectList + 0x2C);
uint GlobalCooldown = ProcessManager.WoWProcess.ReadUInt(ObjectList + 0x14) + ProcessManager.WoWProcess.ReadUInt(ObjectList + 0x20);
// Hax fix ****ing heaps annoying and gay
if (GlobalTime > 100000) GlobalTime = 0;
if (ListSpellID == SpellID)
{
// Check spell on GCD
if ((ulong)(StartTime + Math.Max(GlobalCooldown, GlobalTime)) > CurrentTime)
{
return false;
}
}
}
catch (Exception)
{
}
ObjectList = ProcessManager.WoWProcess.ReadUInt(ObjectList + 4);
}
}
catch (Exception)
{
return true;
}
return true;
}
}
}
my UnitAura,
im sure there is better ways of doing this, but this works fine for me
UnitAura.cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ConsoleDruidHeals.Managers;
using ConsoleDruidHeals.Offsets;
using ConsoleDruidHeals.WoWObjects;
using System.Runtime.InteropServices;
namespace ConsoleDruidHeals.WoWFunctions
{
public static class UnitAura
{
/// <summary>
/// Returns If player has buff
/// </summary>
/// <param name="SpellID"></param>
/// <param name="PlayerBase"></param>
/// <returns></returns>
public static bool HasBuff(int SpellID, uint PlayerBase)
{
try
{
int Count = ProcessManager.WoWProcess.ReadInt(PlayerBase + (uint)Addresses.UnitBaseGetUnitAura.AURA_COUNT_1);
uint Table = PlayerBase + (uint)Addresses.UnitBaseGetUnitAura.AURA_TABLE_1;
if (Count == -1)
{
Count = ProcessManager.WoWProcess.ReadInt(PlayerBase + (uint)Addresses.UnitBaseGetUnitAura.AURA_COUNT_2);
Table = ProcessManager.WoWProcess.ReadUInt(PlayerBase + (uint)Addresses.UnitBaseGetUnitAura.AURA_TABLE_2);
}
uint SpellIndexID;
ulong SpellOwnerGUID;
// Loop threw all our buffs
for (int Index = 0; Index < Count - 1; Index++)
{
SpellIndexID = GetSpellID(Index, Table);
SpellOwnerGUID = GetSpellOwnerGUID(Index, Table);
// If its not us, and not our spell go next
if (WoWMe.GUID != SpellOwnerGUID) continue;
if (SpellIndexID != SpellID) continue;
// return true we found him!
return true;
}
// nup no good didnt find him false
return false;
}
catch (Exception e)
{
Console.WriteLine("TargetSite: {0}\nSource: {1}\nMessage:{2}", e.TargetSite, e.Source, e.Message);
return false;
}
}
/// <summary>
/// Returns Number of stacks SpellID has
/// </summary>
/// <param name="SpellID"></param>
/// <param name="PlayerBase"></param>
/// <returns></returns>
public static int Stacks(int SpellID, uint PlayerBase)
{
try
{
int Count = ProcessManager.WoWProcess.ReadInt(PlayerBase + (uint)Addresses.UnitBaseGetUnitAura.AURA_COUNT_1);
uint Table = PlayerBase + (uint)Addresses.UnitBaseGetUnitAura.AURA_TABLE_1;
if (Count == -1)
{
Count = ProcessManager.WoWProcess.ReadInt(PlayerBase + (uint)Addresses.UnitBaseGetUnitAura.AURA_COUNT_2);
Table = ProcessManager.WoWProcess.ReadUInt(PlayerBase + (uint)Addresses.UnitBaseGetUnitAura.AURA_TABLE_2);
}
uint SpellIndexID;
ulong SpellOwnerGUID;
// Loop threw all our buffs
for (int Index = 0; Index < Count - 1; Index++)
{
SpellIndexID = GetSpellID(Index, Table);
SpellOwnerGUID = GetSpellOwnerGUID(Index, Table);
// If its not us, and not our spell go next
if (WoWMe.GUID != SpellOwnerGUID) continue;
if (SpellIndexID != SpellID) continue;
return GetStacks(Index, Table);
}
return 0;
}
catch (Exception e)
{
Console.WriteLine("TargetSite: {0}\nSource: {1}\nMessage:{2}", e.TargetSite, e.Source, e.Message);
return 0;
}
}
/// <summary>
/// Returns Number of stacks SpellID has
/// </summary>
/// <param name="SpellID"></param>
/// <param name="PlayerBase"></param>
/// <returns></returns>
public static int TimeLeft(int SpellID, uint PlayerBase)
{
try
{
int Count = ProcessManager.WoWProcess.ReadInt(PlayerBase + (uint)Addresses.UnitBaseGetUnitAura.AURA_COUNT_1);
uint Table = PlayerBase + (uint)Addresses.UnitBaseGetUnitAura.AURA_TABLE_1;
if (Count == -1)
{
Count = ProcessManager.WoWProcess.ReadInt(PlayerBase + (uint)Addresses.UnitBaseGetUnitAura.AURA_COUNT_2);
Table = ProcessManager.WoWProcess.ReadUInt(PlayerBase + (uint)Addresses.UnitBaseGetUnitAura.AURA_TABLE_2);
}
uint SpellIndexID;
ulong SpellOwnerGUID;
// Loop threw all our buffs
for (int Index = 0; Index < Count - 1; Index++)
{
SpellIndexID = GetSpellID(Index, Table);
SpellOwnerGUID = GetSpellOwnerGUID(Index, Table);
// If its not us, and not our spell go next
if (WoWMe.GUID != SpellOwnerGUID) continue;
if (SpellIndexID != SpellID) continue;
return (int)GetTimeLeft(Index, Table);
}
return 0;
}
catch (Exception e)
{
Console.WriteLine("TargetSite: {0}\nSource: {1}\nMessage:{2}", e.TargetSite, e.Source, e.Message);
return 0;
}
}
// Shouldnt need to touch anything below here
// this is where all the magic happens :p
#region MemoryReads
private static uint GetSpellID(int Index, uint Table)
{
try
{
return ProcessManager.WoWProcess.ReadUInt(
Table + (uint)((uint)Addresses.UnitBaseGetUnitAura.AURA_SPELL_SIZE * Index)
+ (int)Addresses.UnitBaseGetUnitAura.AURA_SPELL_ID);
}
catch (Exception e)
{
Console.WriteLine("TargetSite: {0}\nSource: {1}\nMessage:{2}", e.TargetSite, e.Source, e.Message);
return 0;
}
}
private static int GetStacks(int Index, uint Table)
{
try
{
byte[] Flags;
Flags = ProcessManager.WoWProcess.ReadBytes(
Table + (uint)((uint)Addresses.UnitBaseGetUnitAura.AURA_SPELL_SIZE * Index)
+ (uint)Addresses.UnitBaseGetUnitAura.AURA_SPELL_FLAGS, 3);
return (int)Flags[2];
}
catch (Exception e)
{
Console.WriteLine("TargetSite: {0}\nSource: {1}\nMessage:{2}", e.TargetSite, e.Source, e.Message);
return 0;
}
}
private static ulong GetSpellOwnerGUID(int Index, uint Table)
{
try
{
return ProcessManager.WoWProcess.ReadUInt64(
Table + (uint)((int)Addresses.UnitBaseGetUnitAura.AURA_SPELL_SIZE * Index));
}
catch (Exception e)
{
Console.WriteLine("TargetSite: {0}\nSource: {1}\nMessage:{2}", e.TargetSite, e.Source, e.Message);
return 0;
}
}
private static uint GetTimeLeft(int Index, uint Table)
{
try
{
ulong CurrentTime = ProcessManager.WoWProcess.ReadUInt64((uint)Addresses.CoolDown.PerformanceCounter);
uint EndTime = ProcessManager.WoWProcess.ReadUInt((uint)Table + (uint)Addresses.UnitBaseGetUnitAura.AURA_SPELL_SIZE * (uint)Index + (uint)Addresses.UnitBaseGetUnitAura.AURA_SPELL_ENDTIME);
return (uint)(EndTime - CurrentTime);
}
catch (Exception e)
{
Console.WriteLine("TargetSite: {0}\nSource: {1}\nMessage:{2}", e.TargetSite, e.Source, e.Message);
return 0;
}
}
#endregion
}
}