Très franchement, je n'ai pas cherché :D. J'ai juste lu
cette page.
Et le script :
Language: lua
local CharacterPointer = 0x02097490
local pointer
local Vars = {}
Vars["Character"] = 0 --byte
Vars["X"] = 0 --DWord
Vars["Y"] = 0 --Dword
Vars["Z"] = 0 --Dword
Vars["modelAngle"] = 0 --Word
Vars["motionAngle"] = 0 --Word
Vars["speed"] = 0 --DWord
Vars["xVelocity"] = 0 --DWord // x and z derived from speed + direction
Vars["yVelocity"] = 0 --DWord // Always -32k on the ground
Vars["zVelocity"] = 0 --DWord
Vars["status"] = 0 --12Byte // Swimming, walking,....
Vars["BowserRevolutionSpeed"] = 0 --Word
Vars["BasementWaterLevel"] = 0 --DWord
Vars["RNG"] = 0 --DWord
Vars["cameraX"] = 0 --DWord
Vars["cameraX"] = 0 --DWord
Vars["cameraX"] = 0 --DWord
Vars["upDownAngle"] = 0 --Word
local VarsAddr = {}
VarsAddr["Character"] = 0x8
VarsAddr["X"] = 0x5C
VarsAddr["Y"] = 0x60
VarsAddr["Z"] = 0x64
VarsAddr["modelAngle"] = 0x8E
VarsAddr["motionAngle"] = 0x94
VarsAddr["speed"] = 0x98
VarsAddr["xVelocity"] = 0xA4
VarsAddr["yVelocity"] = 0xA8
VarsAddr["zVelocity"] = 0xAC
VarsAddr["status"] = 0x370
VarsAddr["BowserRevolutionSpeed"] = 0x0217B1D4
VarsAddr["BasementWaterLevel"] = 0x02176464
VarsAddr["RNG"] = 0x0209CDF0
VarsAddr["cameraX"] = 0x12C
VarsAddr["cameraX"] = 0x128
VarsAddr["cameraX"] = 0x124
VarsAddr["upDownAngle"] = 0x3A
dofile "../../../_Tools/Lua Libs/HexConversion.lua"
--[[
UI
]]
function Coord()
Vars["X"] = LibHex.ToFixedPoint(string.format("%X", memory.readdwordsigned(pointer + VarsAddr["X"])), 20)
Vars["Y"] = LibHex.ToFixedPoint(string.format("%X", memory.readdwordsigned(pointer + VarsAddr["Y"])), 20)
Vars["Z"] = LibHex.ToFixedPoint(string.format("%X", memory.readdwordsigned(pointer + VarsAddr["Z"])), 20)
Vars["modelAngle"] = memory.readword(pointer + VarsAddr["modelAngle"])
Vars["modelAngle"] = (Vars["modelAngle"] / 65535) * 360
Vars["motionAngle"] = memory.readword(pointer + VarsAddr["motionAngle"])
Vars["motionAngle"] = (Vars["motionAngle"] / 65535) * 360
Vars["speed"] = LibHex.ToFixedPoint(string.format("%X", memory.readdwordsigned(pointer + VarsAddr["speed"])), 20)
Vars["xVelocity"] = LibHex.ToFixedPoint(string.format("%X", memory.readdwordsigned(pointer + VarsAddr["xVelocity"])), 20)
Vars["yVelocity"] = LibHex.ToFixedPoint(string.format("%X", memory.readdwordsigned(pointer + VarsAddr["yVelocity"])), 20)
Vars["zVelocity"] = LibHex.ToFixedPoint(string.format("%X", memory.readdwordsigned(pointer + VarsAddr["zVelocity"])), 20)
gui.text(5, 25, string.format("X: %.2f Y: %.2f Z: %.2f", Vars["X"], Vars["Y"], Vars["Z"]))
gui.text(5, 35, string.format("Xv: %.2f Yv: %.2f Zv: %.2f", Vars["xVelocity"], Vars["yVelocity"], Vars["zVelocity"]))
gui.text(5, 55, string.format("Angle: %.2f mdlAngle: %.2f", Vars["motionAngle"], Vars["modelAngle"]))
gui.text(5, 75, string.format("Speed: %.2f", Vars["speed"]))
end
function RNG()
Vars["RNG"] = memory.readdword(VarsAddr["RNG"])
gui.text(100, 5, string.format("RNG: %d", Vars["RNG"]))
end
function UI()
pointer = memory.readdword(CharacterPointer)
Coord()
RNG()
end
gui.register(UI)
Donc en gros, tout ce qui est LibHex.
untruc c'est dans un fichier que je lis grâce à la fonction dofile. Ce sont des fonctions de conversions.
Dans la fonction UI, j'affecte la variable pointeur (stockée dans une adresse connue); ensuite dans Coord() je vais lire la valeur "speed" -par exemple- qui est toujours à pointeur + une valeur (dans point de vue programmation, j'ai envie de dire que le pointeur contient l'adresse de l'objet perso et que donc, il est logique toute les infos nécessaires soient côte à côte dans la mémoire).
Comment trouver ce pointeur? Hummm...
Si je reprends cet exemple: On est dans une zone X où on a notre vitesse. On change de zone et tout a changé en RAM mais...
On sait que si on appuie sur avant pendant 5 frames, notre vitesse sera de 8 (par exemple) il suffira de chercher cette valeur précise pour trouver la nouvelle adresse de la vitesse.
On va dire que pour la zone X, l'adresse de la vitesse est 0x100 et pour la zone Y 0x150.
Si il y a pointeur, il existe en RAM une adresse qui contient la valeur 0x100 (256 en décimal) quand on est dans la zone X et 0x150 (336 en décimal) quand on est dans la zone Y.
MAIS
La valeur speed n'est qu'une valeur; pas un objet. L'objet (parfois nommé head ou header) avoisine ces valeur (vers le bas) c'est peut-être 0x99 (dans la zone X) et donc il faudra chercher une adresse qui contient 0x99. Etc...
C'est comme ça que j'approcherais le problème pour ma part (en espérant que le jeu fonctionne ainsi).
PS: Pour ceux qui se demande pourquoi j'ai passé mon temps à créer un tableau avec mes variables, c'est parce que si je crée mes variables dans la fonction, mon PC pédale à mort dans la choucroute à cause des milliers de créations à la seconde (et bonjour le memory leak) je limite la casse en faisant comme ça. C'est beaucoup moins problématique quand on utilise: Language: lua
while true do
UI()
emu.frameadvance()
end
car la fonction n'est appelée QUE si on avance d'une frame.