Hey Zac,
Sorry for the delay. I was trying to reproduce your code on another process when I saw the issue.
In fact, the getter directly returns the content of the pointer and using the same approach, the setter tries to write your integer at the address of the content of the pointer. Your code writes the integer one step too far.
In order to fix that case, you should remove the last offset in your array and add it in the Write method.
Your class becomes:
public class LolMemory2 : IDisposable
{
private readonly MemorySharp _mem;
private readonly int[] _offsets;
public LolMemory2()
{
_mem = new MemorySharp(ApplicationFinder.FromProcessName("LolClient").First());
_offsets = new[] { 0x168, 0x9c, 0x6c, 0x3f0 };
}
public string Value
{
get
{
var ptr = _mem["Adobe AIR.dll"].Read<IntPtr>(0x012FA3D4);
foreach (var offset in _offsets)
{
ptr = _mem[ptr + offset, false].Read<IntPtr>();
}
return _mem[ptr].ReadString(0x2a0);
}
set
{
var ptr = _mem["Adobe AIR.dll"].Read<IntPtr>(0x012FA3D4);
foreach (var offset in _offsets)
{
ptr = _mem[ptr + offset, false].Read<IntPtr>();
}
_mem[ptr].Write(0x2a0, value);
}
}
public void Dispose()
{
_mem.Dispose();
}
}
I edited the getter according the array edition. Let me know if it's alright for you.
Edit: Any donation is greatly appreciated ! You can donate on PayPal here if you like my work. Thanks 
Best,
ZenLulz
Edited by ZenLulz, 26 April 2014 - 04:59 PM.
Donation link