Autor |
Beitrag |
WeBsPaCe
Beiträge: 2322
Erhaltene Danke: 1
FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
|
Verfasst: Di 28.12.04 16:42
@Karlson
Guck mal auf die Zeit... Ich hab direkt geantwortet und da isses doch wohl besser wenn er die Antwort teilweise zu den Fragen passend bekommt, als wenn ich einen Roman schreibe... oda??
_________________ Steht der Bauer im Gemüse, hat er später grüne Füße.
|
|
en!gma
Beiträge: 378
win xp
delphi 7.0
|
Verfasst: Di 28.12.04 16:49
naja is ja auch unwichtig...
aber jex hab ich auch den fehler gesehen...danke...
ich werd heute abend mal schaun was ich noch verbessern kann und das ganze tut ein wenig überarbeiten =)
|
|
WeBsPaCe
Beiträge: 2322
Erhaltene Danke: 1
FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
|
Verfasst: Di 28.12.04 17:18
Ich bin grad dabei die Zeit bei MineSweeper zu "freezen". Mein MineSweeper is von MS Win XP Pro Schülerversion (glaub aba net das es da Unterschiede gibbt..). Un die Zeit is da bei mir an Adresse 100579C. Bei euch auch???
Das mit dem einfrieren klappt eignlich auch, aber wat is mit "auftauen" ( ) Geht das auch??? Und ich hab eignlich noch net so ganz kapiert, was ich überhaupt mach...
Ich hol mal noch schnell den Quellcode vom Trainer und poste den dann noch...
Und das mit dem Speicher ist jeze glaub ich klar... Ich versuchs mal in meinen Worten zu sagn: Also, das Programm (bei mir MineSweeper, bei en!gma Starcraft...) bekommt einen Bereich im Speicher zugewiesen. Dieser variiert je nach dem was grad auf dem PC läuft, weil ja alle Programm nen Teil bekommen und nicht immer den selben... So, unser Spiel hat nun seinen Bereich und in diesem Bereich ist die Verteilung aber immer gleich... Variablen werden immer an folgende Stelle geschrieben: <<SPEICHERBEREICH DES SPIELS>> + <<BEKANNTER WERT>>. Der "bekannte Wert" bleibt immer gleich, der Speicherbereich variiert... Wir können jetzt aber in unserm Trainer den Speicherbereich des Spiel rausfinden und addieren den bekannten Wert dazu (Wir laufen zu unserer "Variablen" mit dem Inhalt z.B. die Zeit oder Ammo oder sonst wat..) und sind am Ziel. Dort verändern wir irgendwas (dat is dat wat ich noch nich kapiert hab, falls das hier richtig is, sonst raff ich gar nix.. ) und schon isses feddisch...
Stimmt das jeze so ungefähr???
_________________ Steht der Bauer im Gemüse, hat er später grüne Füße.
|
|
en!gma
Beiträge: 378
win xp
delphi 7.0
|
Verfasst: Di 28.12.04 18:07
jo so im groben isses richtig...
um das ganze mal gaaaaaaaaaaaaaanz grob im code zu erklären:
Quelltext 1: 2: 3: 4: 5:
| if linkeTaste.gedrueckt=True then begin Schiessen; MunnitionAbziehen; //zB in der Addresse 123456AB und hat den wert 1283 end; |
und unser ziel is nun das daraus zu machen ->
Quelltext 1: 2: 3: 4: 5:
| if linkeTaste.gedrueckt=True then begin Schiessen; macheNichts; //wir weisen 123456AB den wert 9090 zu (also 90 für nop wie im tut erklärt) end; |
so sieht also unser trainer anschliessend aus...wenn du ihn nun "unfreezen" willst
musst du einfach der addresse 123456AB wieder den wert 1283 zuweisen...
hoffe das is jex ein bischen verständlicher.
|
|
WeBsPaCe
Beiträge: 2322
Erhaltene Danke: 1
FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
|
Verfasst: Di 28.12.04 18:30
Jop, dat isses... Dann muss ich aber auch ersma den Wert wissen, der vorher drinne is.. also muss ich ihn auslesn... Also: Frage: Wie mach ich dat???
_________________ Steht der Bauer im Gemüse, hat er später grüne Füße.
|
|
en!gma
Beiträge: 378
win xp
delphi 7.0
|
Verfasst: Di 28.12.04 18:42
also du hast ja mit autohack deine addresse herausgefunden...
also in tsearch -> autohack...
und da hat er dir ja die addresse gezeigt die du verändern musst...
wenn du diese addresse oben anklickst, steht unten der wert dieser addresse...
und den musst du dir aufschreiben.
und die 9090 dann halt wieder durch 1283 ersetzen.
|
|
WeBsPaCe
Beiträge: 2322
Erhaltene Danke: 1
FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
|
Verfasst: Di 28.12.04 19:01
Zitat: | und die 9090 dann halt wieder durch 1283 ersetzen. |
Is diese 1283 jeze nur ein beliebiger Wert, den du aus Starcraft genommen hast, oder is dat wie die 90, die für nichts steht (ist dat ungefähr vergleichbar mit nil bei Delphi oder void bei C ???)... Und bei MineSweeper ändert sich die Zeit ja immer... also muss ich die Zeit vorher auslesn??? Also wenn der User bei 5 sek stoppt muss es ja nach dem unfreezen bei 6 weitergehn...
_________________ Steht der Bauer im Gemüse, hat er später grüne Füße.
|
|
Karlson
Beiträge: 2088
|
Verfasst: Di 28.12.04 19:20
WeBsPaCe hat folgendes geschrieben: | @Karlson
Guck mal auf die Zeit... Ich hab direkt geantwortet und da isses doch wohl besser wenn er die Antwort teilweise zu den Fragen passend bekommt, als wenn ich einen Roman schreibe... oda?? |
Nein ist es nicht
Aber ich denke mal ein Moderator wird dir das noch erklären.
|
|
en!gma
Beiträge: 378
win xp
delphi 7.0
|
Verfasst: Di 28.12.04 22:22
in meinem tutorial wird mehr erklärt, wie man verhindert dass in deinem beispiel die zeit weiterläuft.
also ersetzen wir sogesehen die "setze zeit+1 prozedur" durch ein einfaches "nil".
ja damit hast du recht also nil ist wie die 90...
also erstmal die 1283 war auch nur ein beispiel...
ums noch einmal zu erklären ;D :
addresse 123456AB wert 1283("setze zeit+1 prozedur")
daraus machen wir ->
addresse 123456AB wert 9090("nichts und nochnmal nichts prozedur ^^")
und so kannste auch ganz einfach anstatt den 9090 wieder 1283 einfügen und hast die alte prozedur
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 29.12.04 00:34
Titel: Re: spiele trainer erstellen
en!gma hat folgendes geschrieben: | normalerweise sind 1 byte 2 zahlen, 2 byte 4 zahlen, 3 byte 6 usw... |
So ein Quatsch. 126 bekomme ich auch in ein Byte rein. Es geht schlicht und ergreifend um den Wertebereich von Datentypen, hier insbesondere um ganzzahlige Datentypen.
Quelltext 1: 2: 3: 4: 5: 6: 7:
| Shortint –128..127 signed 8-bit Smallint –32768..32767 signed 16-bit Longint –2147483648..2147483647 signed 32-bit Int64 –2^63..2^63–1 signed 64-bit Byte 0..255 unsigned 8-bit Word 0..65535 unsigned 16-bit Longword 0..4294967295 unsigned 32-bit |
Ich kann auch meine 50 Mineralien Einheiten in ein LongInt packen. Und dann hast du nämlich ein zusätzliches Problem. Kennst du den Datentyp nämlich nicht, stimmt zwar deine Adresse, aber hast du ihn zu groß gewählt, überschreibst du den Speicher an den nachfolgenden Adressen. Und hast du ihn zu klein gewählt, hast du nachher Schrott im Spiel stehen.
|
|
Udontknow
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mi 29.12.04 11:36
Zitat: | So ein Quatsch. 126 bekomme ich auch in ein Byte rein. Es geht schlicht und ergreifend um den Wertebereich von Datentypen, hier insbesondere um ganzzahlige Datentypen. |
Ja, er hat es ungeschickt ausgedrückt. Er meinte einfach die hexadezimale Darstellung, die bei einem Byte in zwei Ziffern, bei einem Word in 4 Ziffern usw. möglich ist.
CU,
Udontknow
|
|
en!gma
Beiträge: 378
win xp
delphi 7.0
|
Verfasst: Mi 29.12.04 15:18
jo das stimmt wohl...da hab ich mich wirklich ein wenig ungeschickt ausgedrückt...
aber ich denke jeder der mehr als 1 woche mit delphi arbeitet weiss, dass zB 4 byte mehr als 8 zahlen sein können.
|
|
Heiko
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Mi 29.12.04 16:06
Gibt es eigentlich auch unsigned 64-bit Varaiablen (also Int64 ohne Vorzeichen)?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 29.12.04 21:56
en!gma hat folgendes geschrieben: |
aber ich denke jeder der mehr als 1 woche mit delphi arbeitet weiss, dass zB 4 byte mehr als 8 zahlen sein können. |
Das stimmt ja schon wieder nicht! Aus den Ziffern 0 bis 9 sind Zahlen zusammen gesetzt:
18 das ist eine Zahl bestehen aus den Ziffern 1 und 8.
Und ein Integer mit 4 Byte kann 4294967295 verschiedenen Werte annehmen. Und dann spricht man von einem Wertebereich. Ich will ja nicht kleinlich wirken, aber wenn man schon ein Tutorial schreibt, dann sollte man sich auch korrekt ausdrücken (können).
|
|
retnyg
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Mi 29.12.04 22:58
WeBsPaCe hat folgendes geschrieben: | Zitat: | und die 9090 dann halt wieder durch 1283 ersetzen. |
Is diese 1283 jeze nur ein beliebiger Wert, den du aus Starcraft genommen hast, oder is dat wie die 90, die für nichts steht (ist dat ungefähr vergleichbar mit nil bei Delphi oder void bei C ???)... Und bei MineSweeper ändert sich die Zeit ja immer... also muss ich die Zeit vorher auslesn??? Also wenn der User bei 5 sek stoppt muss es ja nach dem unfreezen bei 6 weitergehn...
|
es geht hier um maschinencode, also assembler. der wert 90h (h für hex) steht für den Befehl NOP, also No Operation.
üblicherweise steht an der zu überschreibenden speicherposition das commando JMP + eine Speicheradresse, welche die nun auszuführende Funktion beinhaltet.
Sollte aber nicht JMP drin stehen sondern z.b. ADD AX, 1 oder etwas anderes, ist der Befehl möglicherweise auch länger als 2 bytes.
Deswegen versteh ich auch nicht enigma's ableitung über die byte-länge bei zahlen, macht ja irgendwie keinen Sinn denn hier gehts um Assembleranweisungen - das macht nur anfangs Sinn um die Speicherposi der Zahl rauszufinden.
|
|
WeBsPaCe
Beiträge: 2322
Erhaltene Danke: 1
FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
|
Verfasst: Do 30.12.04 00:02
Ich glaub' so langsam kapier ich's...
Ich mach mal an meinem MineSweeper-Ding weiter...
_________________ Steht der Bauer im Gemüse, hat er später grüne Füße.
|
|
Karlson
Beiträge: 2088
|
Verfasst: Fr 31.12.04 18:04
Sehr schön, ich kannte zwar TSearch, aber dort nicht dieses "AutoHack"
Jetzt kann ich endlich versuchen meinen Trainer HL2 weiter zuschreiben...
Aber folgendes: Ich habe den Wert gesucht, der dafür verantwortlich ist, ob eine Waffe verfügbar ist. Habe ihn auch gefunden, habe jetzt auch den Pointer mit diesem Autohack gefunden. Aber wie kann ich den Wert mithilfe des Pointers überschreiben? Du tutst den Befehl ja mit NOP überschreiben, so dass der Befehl praktisch blockiert wird. Was muss ich den machen um den Wert von 0 in 1 zu ändern?
danke!
|
|
retnyg
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Sa 01.01.05 03:07
if wert = 0 then wert := 1;
|
|
Karlson
Beiträge: 2088
|
Verfasst: Sa 01.01.05 06:05
retnyg hat folgendes geschrieben: | if wert = 0 then wert := 1; |
bitte? Meinst du das jetzt ernst, oder soll das ein Sylvesterscherz sein
|
|
retnyg
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Sa 01.01.05 09:41
war schon so gemeint, schreib einfach mal den Wert $1 (statt $90) an die betreffende speicheradresse...
wie hast du die eigentlich ausfindig gemacht ? gibt ja sicher tausende Posititonen im Speicher die gerade auf 0 oder 1 stehen
|
|