Originally Posted by
TehCheat
I use cheat engine. I use some other stuff, as well. One thing to note, I really suck at reversing.
I've always struggled to find that flask offsets because the pointers change when you use a flask.
Something I thought of after I found it this go around, the pointer for a flask goes null when you take a flask off. So if you take your first flask off, search for 0x00000000, put your first flask back on and search for a value > 0, repeat that a few times, you should have the "FlaskInvBase". I haven't actually tried it yet, but I assume that's one of the the easiest ways to find it. To test if you're in the right spot, you could peak at the memory location of "FlaskInvBase" (not the value). You should have 5 pointers in a row, and when you remove a flask, the corresponding pointer should go null. If it doesn't, you're not in the right place.
ah ok sweet. What a mission :O
Edit:
Currently this is for beta only
Much progress:

Code:
namespace ..Removed....
{
public partial class Form1 : Form
{
private ProcessMemory Mem = new ProcessMemory("PathOfExile");
private Thread playerThread;
private Player _player = new Player();
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
private void button1_Click(object sender, EventArgs e)
{
}
private void getPlayerStats()
{
while (true)
{
try
{
if (Mem.CheckProcess())
{
Mem.StartProcess();
int playerBase = Mem.ReadInt(Mem.ImageAddress() + 0x0090C2B0); // steam 0x0090E2F8
int flaskBase = Mem.ReadInt(Mem.ImageAddress() + 0x008F6A88);
int PlayerStatBase = Mem.ReadInt(Mem.ReadInt(Mem.ReadInt(Mem.ReadInt(playerBase + 0x138) + 0x4A4) + 0x4) + 0xC);
int PlayerExpBase = Mem.ReadInt(Mem.ReadInt(Mem.ReadInt(Mem.ReadInt(playerBase + 0x138) + 0x2CC) + 0x54) + 0x308);
_player.CurrentHealth = Mem.ReadInt(PlayerStatBase + 0x54);
_player.MaxHealth = Mem.ReadInt(PlayerStatBase + 0x50);
_player.ReservedHealth_Flat = Mem.ReadInt(PlayerStatBase + 0x5C);
_player.ReservedHealth_Percent = Mem.ReadInt(PlayerStatBase + 0x60);
_player.CurrentMana = Mem.ReadInt(PlayerStatBase + 0x78);
_player.MaxMana = Mem.ReadInt(PlayerStatBase + 0x74);
_player.ReservedMana_Flat = Mem.ReadInt(PlayerStatBase + 0x80);
_player.ReservedMana_Percent = Mem.ReadInt(PlayerStatBase + 0x84);
_player.CurrentEnergyShield = Mem.ReadInt(PlayerStatBase + 0x9C);
_player.MaxEnergyShield = Mem.ReadInt(PlayerStatBase + 0x98);
_player.CurrentEXP = Mem.ReadInt(PlayerExpBase + 0x680);
_player.MaxEXP = Mem.ReadInt(PlayerExpBase + 0x684);
_player.CurrentLevel = Mem.ReadInt(PlayerExpBase + 0x688);
_player.HourEXP = Mem.ReadInt(PlayerExpBase + 0x690);
healthLabel.Text = _player.CurrentHealth.ToString() + " / " + _player.MaxHealth.ToString();
manaLabel.Text = _player.CurrentMana.ToString() + " / " + _player.MaxMana.ToString();
levelLabel.Text = _player.CurrentLevel.ToString();
expLabel.Text = _player.CurrentEXP.ToString() + " / " + _player.MaxEXP.ToString();
expHourLabel.Text = _player.HourEXP.ToString();
if (_player.HourEXP > 0)
{
double timeToLevelHours = (double)(_player.MaxEXP - _player.CurrentEXP) / (double)_player.HourEXP;
double timeToLevelMinutes = timeToLevelHours * 60;
double timeToLevelSeconds = timeToLevelMinutes * 60;
TimeSpan t = TimeSpan.FromSeconds(timeToLevelSeconds);
levelTimeLabel.Text = t.ToString(@"hh\:mm\:ss");
}
// Flask 1
int FlaskInvBase = Mem.ReadInt(Mem.ReadInt(Mem.ReadInt(Mem.ReadInt(Mem.ReadInt(flaskBase + 0x34) + 0x788) + 0x204) + 0x30) + 0x0);
int Flask1_Ptr = Mem.ReadInt(FlaskInvBase + 0x0);
int Flask1_Charge_Ptr = Mem.ReadInt(Mem.ReadInt(Mem.ReadInt(Mem.ReadInt(Mem.ReadInt(Flask1_Ptr + 0x4) + 0x1C) + 0x4) +0x4) +0xC);
int Flask1_TotalCharges = Mem.ReadInt(Mem.ReadInt(Flask1_Charge_Ptr + 0x8) + 0x8);
int Flask1_CurrentCharges = Mem.ReadInt(Flask1_Charge_Ptr + 0xC);
int Flask1_ChargesPerUse = Mem.ReadInt(Mem.ReadInt(Flask1_Charge_Ptr + 0x8) + 0xc);
int Flask1_Metadata = Mem.ReadInt(Mem.ReadInt(Flask1_Ptr + 0x0) + 0x8);
string Flask1_Type = Mem.ReadStringUnicode(Flask1_Metadata + 0x70, 70);
label9.Text = string.Format("Flask #1\r\n\r\n - Type: {0}\r\n - Current Charges: {1} out of {2}\r\n - Charges Per Use: {3}", Flask1_Type, Flask1_CurrentCharges, Flask1_TotalCharges, Flask1_ChargesPerUse);
}
}
catch { }
}
}
private void Form1_Load(object sender, EventArgs e)
{
try
{
playerThread = new Thread(new ThreadStart(getPlayerStats));
playerThread.Start();
}
catch { }
}
}
public class Player
{
private int currentHealth;
private int maxHealth;
private int reservedHealth_Flat;
private int reservedHealth_Percent;
private int currentMana;
private int maxMana;
private int reservedMana_Flat;
private int reservedMana_Percent;
private int currentEnergyShield;
private int maxEnergyShield;
private int currentEXP;
private int maxEXP;
private int hourEXP;
private int currentLevel;
#region Health
public int CurrentHealth
{
get
{
return currentHealth;
}
set
{
currentHealth = value;
}
}
public int MaxHealth
{
get
{
return maxHealth;
}
set
{
maxHealth = value;
}
}
public int ReservedHealth_Flat
{
get
{
return reservedHealth_Flat;
}
set
{
reservedHealth_Flat = value;
}
}
public int ReservedHealth_Percent
{
get
{
return reservedHealth_Percent;
}
set
{
reservedHealth_Percent = value;
}
}
#endregion
#region Mana
public int CurrentMana
{
get
{
return currentMana;
}
set
{
currentMana = value;
}
}
public int MaxMana
{
get
{
return maxMana;
}
set
{
maxMana = value;
}
}
public int ReservedMana_Flat
{
get
{
return reservedMana_Flat;
}
set
{
reservedMana_Flat = value;
}
}
public int ReservedMana_Percent
{
get
{
return reservedMana_Percent;
}
set
{
reservedMana_Percent = value;
}
}
#endregion
#region EnergyShield
public int CurrentEnergyShield
{
get
{
return currentEnergyShield;
}
set
{
currentEnergyShield = value;
}
}
public int MaxEnergyShield
{
get
{
return maxEnergyShield;
}
set
{
maxEnergyShield = value;
}
}
#endregion
#region Experience
public int CurrentEXP
{
get
{
return currentEXP;
}
set
{
currentEXP = value;
}
}
public int MaxEXP
{
get
{
return maxEXP;
}
set
{
maxEXP = value;
}
}
public int HourEXP
{
get
{
return hourEXP;
}
set
{
hourEXP = value;
}
}
#endregion
public int CurrentLevel
{
get
{
return currentLevel;
}
set
{
currentLevel = value;
}
}
}
}
Trying to track down flask mods atm. Once this is in a better place ill make a new topic. It will be completely open source as well.