Jo hab jetzt 6 Stunden lang auf meine Tasta eingehackt und lief auch alles glatt, nur die Hauptsache, wo ich anfangs dachte "kein Problem", läuft kurz um gar nicht
Und zwar gibts einmal Klasse A, die Luaengine, bei der uA Macrofunktionen registriert sind..
.. und Klasse B in der die Spieldaten gesammelt werden. Diese Klasse enthält Funktionen, die diese Daten zurückgeben. Diese Funktionen sind bei der Engine registriert, damit der User diese Spieldaten in seinem Script benutzen kann.
Das Problem ist, dass diese Funktionen beim Aufruf durch die Engine immer den festgelegten Standartwert von 0 zurückgeben.
Es gibt also 2 Arten von Variablen der Dataklasse (sozusagen). Die richtigen, mit denen auch die GUI arbeitet, die auch die richtigen Werte anzeigt und die falschen, mit denen die Engine hantiert.
Ich habe leider nicht die leiseste Ahnung, wo das Problem liegt.
Set Data:
Code:
GameData gd = new GameData();
public void _SetData()
{
Thread t = new Thread(new ThreadStart(SetData));
t.IsBackground = true;
t.Start();
}
public void SetData()
{
IntPtr handle = OpenProcess(0x0008 | 0x0010 | 0x0020, false, (uint)Id);
if (handle == null)
{
MessageBox.Show("Error when creating processhandle.", "Error!");
return;
}
UIntPtr SizeInt = (UIntPtr)sizeof(int);
UIntPtr SizeFloat = (UIntPtr)sizeof(float);
IntPtr bw;
bool success;
byte[] buffer = new byte[4];
while (true)
{
success = ReadProcessMemory(handle, PlayerXa, buffer, SizeFloat, out bw);
if (!success)
{
int error = Marshal.GetLastWin32Error();
MessageBox.Show("Error while getting GameData. Errorcode: " + error.ToString(), "Error!");
}
float PX = BitConverter.ToSingle(buffer, 0);
this.Playerx = PX;
gd.Playerx = PX;
MessageBox.Show(gd.Playerx.ToString());
/* hier lass ich mir mal den Wert anzeigen. Der Wert stimmt. */
buffer = new byte[4];
Thread.Sleep(150);
}
/* für das PropertyGrid */
public float PlayerPosX
{
get { return Playerx; }
set { }
}
Auszug der GameData class:
Code:
public float Playerx;
public float PlayerX()
{
return Playerx;
}
/* gibt den Wert von Playerx zurück. Playerx wird im SetData Thread durch den ausgelesenen Wert definiert.
*/
Code:
Lua pLuaVM = new Lua();
private Thread LuaThread;
public void Register()
{
GameData data = new GameData();
pLuaVM.RegisterFunction("PlayerX", data, data.GetType().GetMethod("PlayerX"));
}
/* diese Registerfunktion wird beim Start der Applikation aufgerufen */
/* über den Run-Button wird dann die Scriptexecution ausgelöst: */
public void Main()
{
LuaThread = new Thread(new ThreadStart(LuaRun));
LuaThread.IsBackground = true;
LuaThread.Start();
}
public void LuaRun()
{
try
{
this.running = 1; /*running flag wird auf normal laufend gesetzt*/
pLuaVM.DoString(this.script); /* Methode, die die LUAvm einen String abarbeiten lässt*/
}
catch (ThreadAbortException ex)
{
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message, "Error!");
}
}
Hlep plx, da ich nicht den geringsten Schimmer habe ..
Grüße






