You are not logged in.
Pages: 1
Это еще незаконченная версия, но все-таки решил выложить:
Что это:
Скрипт позволяет менять значения в памяти во время игры.
Как это работает:
Общий вид команды выглядит следующим образом:
<~>ADDR<ПРОБЕЛ>SIZE<ПРОБЕЛ>VALUE<TAB><Y>, где
ADDR – адрес;
SIZE – тип значения;
VALUE – значение.
ADDR и VALUE вводятся в шестнадцатеричном виде.
SIZE может принимать следующие значения B (BYTE – 1 байт), W (WORD – 2 байта), D (DWORD – 4 байта).
После нажатия на клавишу <TAB>, появится панелька с веденными данными (правда в десятичном виде), если все нормально жмете <Y>. Если что-то ведено неправильно придется начинать все заново.
Пример:
Во время игры набираем:
<~>B7CE50<ПРОБЕЛ>D<ПРОБЕЛ>3E8<TAB>
Смотрим на панельку:
12045904
4
1000
Нажимаем <Y>, прибавляется $1000
Не знаю, насколько это полезно и нужно, но вдруг кому пригодится.
Сам код:
create_thread @ADDR
// ----------
:ADDR
thread 'ADDR'
alloc($SizeBuffer1, 0x40) // 0A49A60h
alloc($SizeBuffer2, 0x41) // ~ + 4h
alloc($SizeBuffer3, 0x42) // ~ + 8h
alloc($AddrBuffer1, 0x43) // 0A49A6Ch
alloc($AddrBuffer2, 0x44) // ~ + 4h
alloc($AddrBuffer3, 0x45) // ~ + 8h
alloc($Value, 0x46) // 0A49A78h
alloc($Size, 0x47) // 0A49A7Ch
alloc($Address, 0x48) // 0A49A80h
alloc($ESI, 0x49) // 0A49A84h
$SizeBuffer1 = 0x30303030
$SizeBuffer2 = 0x30303030
$SizeBuffer3 = 0
$AddrBuffer1 = 0x30303030
$AddrBuffer2 = 0x30303030
$AddrBuffer2 = 0
$ESI = 0x969110
while true
wait 0
if
Player.Defined($PLAYER_CHAR)
then
03F0: toggle_text_draw 1
038E: draw_box position 0.0 0.0 width 170.0 height 60.0 color 150 15 85 alpha 150
045A: draw_text_1number 0.0 0.0 GXT 'NUMBER' number $Address // ~1~
045A: draw_text_1number 0.0 8.0 GXT 'NUMBER' number $Size // ~1~
045A: draw_text_1number 0.0 16.0 GXT 'NUMBER' number $Value // ~1~
if
00E1: player 0 pressed_key 4
then
0@ = -429863
&0(0@,1i) = 0xA49960
&0(0@,1i) += @GetParam
0572: run_asm_inject true
end
if
00E1: player 0 pressed_key 11
then
0@ = -429863
&0(0@,1i) = 0xA49960
&0(0@,1i) += @Store
0572: run_asm_inject true
end
end
end
:GetParam
hex
// GerParam:
60 // PUSHAD
33C0 // XOR EAX,EAX
B8 30303030 // MOV EAX,30303030
A3 609AA400 // MOV DWORD PTR DS:[A49A60],EAX
A3 649AA400 // MOV DWORD PTR DS:[A49A64],EAX
A3 6C9AA400 // MOV DWORD PTR DS:[A49A6C],EAX
A3 709AA400 // MOV DWORD PTR DS:[A49A70],EAX
33C0 // XOR EAX,EAX
33C9 // XOR ECX,ECX
B9 07000000 // MOV ECX,7
B4 00 // MOV AH,0
8B35 849AA400 // MOV ESI,DWORD PTR DS:[A49A84]
// begin:
8A06 // /MOV AL,BYTE PTR DS:[ESI]
3C 60 // |CMP AL,60
74 65 // |JE _finish
3C 20 // |CMP AL,20
74 57 // |JE _next
80FC 00 // |CMP AH,0
74 0C // |JE _value
80FC 01 // |CMP AH,1
74 0F // |JE _size
80FC 02 // |CMP AH,2
74 3C // |JE _addr
EB 50 // |JMP _finish
// _value:
8881 609AA400 // |MOV BYTE PTR DS:[ECX+A49A60],AL
EB 3A // |JMP _rout
// _size:
3C 42 // |CMP AL,42
74 0A // |JE _wrB
3C 57 // |CMP AL,57
74 12 // |JE _wrW
3C 44 // |CMP AL,44
74 1A // |JE _wrD
EB 3A // |JMP _finish
// _wrB:
C705 7C9AA400 01000000 // |MOV DWORD PTR DS:[A49A7C],1
EB 20 // |JMP _rout
// _wrW:
C705 7C9AA400 02000000 // |MOV DWORD PTR DS:[A49A7C],2
EB 14 // |JMP _rout
// _wrD:
C705 7C9AA400 04000000 // |MOV DWORD PTR DS:[A49A7C],4
EB 08 // |JMP _rout
// _addr:
8881 6C9AA400 // |MOV BYTE PTR DS:[ECX+A49A6C],AL
EB 00 // |JMP _rout
// _rout:
46 // |INC ESI
49 // |DEC ECX
EB 9F // |JMP _begin
// _next:
FEC4 // |INC AH
46 // |INC ESI
B9 07000000 // |MOV ECX,7
EB 95 // \JMP _begin
// _finish:
68 609AA400 // PUSH 0A49A60
E8 1C000000 // CALL Hex2Dword
A3 789AA400 // MOV DWORD PTR DS:[A49A78],EAX
68 6C9AA400 // PUSH 0A49A6C
E8 0D000000 // CALL Hex2Dword
A3 809AA400 // MOV DWORD PTR DS:[A49A80],EAX
83C4 08 // ADD ESP,8
61 // POPAD
C3 // RETN
90 // NOP
90 // NOP
90 // NOP
// Hex2Dword proc
8B5424 04 // MOV EDX,DWORD PTR SS:[ESP+4]
33C0 // XOR EAX,EAX
33C9 // XOR ECX,ECX
// _label1:
F602 FF // /TEST BYTE PTR DS:[EDX],0FF
8A0A // |MOV CL,BYTE PTR DS:[EDX]
74 1F // |JE _label4
80E9 61 // |SUB CL,61
78 0A // |JS _label3
// _label2:
C1E0 04 // |SHL EAX,4
42 // |INC EDX
8D4401 0A // |LEA EAX,DWORD PTR DS:[ECX+EAX+A]
EB EA // |JMP _label1
// _label3:
80C1 20 // |ADD CL,20
79 F1 // |JNS _label2
80C1 11 // |ADD CL,11
C1E0 04 // |SHL EAX,4
42 // |INC EDX
03C1 // |ADD EAX,ECX
EB DA // \JMP _label1
// _label4:
C3 // RETN
// Hex2Dword EndP
// end GetParam
end
:Store
hex
// Store:
60 // PUSHAD
33C0 // XOR EAX,EAX
33C9 // XOR ECX,ECX
A1 7C9AA400 // MOV EAX,DWORD PTR DS:[A49A7C]
83F8 01 // CMP EAX,1
74 0C // JE _byte
83F8 02 // CMP EAX,2
74 18 // JE _word
83F8 04 // CMP EAX,4
74 26 // JE _dword
EB 33 // JMP _end
// _byte:
33C0 // XOR EAX,EAX
A0 789AA400 // MOV AL,BYTE PTR DS:[A49A78]
8B0D 809AA400 // MOV ECX,DWORD PTR DS:[A49A80]
8801 // MOV BYTE PTR DS:[ECX],AL
EB 22 // JMP _end
// _word:
33C0 // XOR EAX,EAX
66 A1 789AA400 // MOV AX,WORD PTR DS:[A49A78]
8B0D 809AA400 // MOV ECX,DWORD PTR DS:[A49A80]
66 8901 // MOV WORD PTR DS:[ECX],AX
EB 0F // JMP _end
// _dword:
33C0 // XOR EAX,EAX
A1 789AA400 // MOV EAX,DWORD PTR DS:[A49A78]
8B0D 809AA400 // MOV ECX,DWORD PTR DS:[A49A80]
8901 // MOV DWORD PTR DS:[ECX],EAX
// _end:
61 // POPAD
C3 // RETN
// end Store
Endh..p://foolroot.nm.ru/sb_forum/devmode.0.1.rar
Внимание!!! Подстановка левых значений и адресов может привести к зависанию игры.
Offline
вроде работает
только без отображения текста на экране во время набора очень сложно. Я что-то подобное хотел с консолью замутить да руки не дошли.
Кстати, если будет нужно, вот адреса для нажатий функциональных клавиш:
http://sannybuilder.com/dev/keycodes.txt обновил, сначала старую версию залил
читаем адрес по локальной переменной (значение в первом столбце) и если возвращает 255, то нажата кнопка из второго столбца, если 16711680 (0xFF0000), то из правого.
По идее нужно выделять только один байт, но можно и так проверять.
бум тестировать 
Last edited by Seemann (09-02-2007 10:56)
Offline
Протестировал:
1) если арестовывают, игра виснет, точнее не виснет, а ... , короче не знаю как это описать.
2) если погиб работает нормально, но появляешься без одежды.
Короче х.з. из-за чего, Player.Defined использую.
Last edited by Sanchez (09-02-2007 11:02)
Offline
кстати, взгляни на это
http://freespace.virgin.net/drunk.tank/SA_Mem.zip
аналог того, что ты сделал - можно просматривать память во время игры, видеть текущий адрес, менять значения и т.д. Реализовано через длл.
если погиб работает нормально, но появляешься без одежды
ну это видимо фича игры, там просто одежда такая - специальная - она убирается после смерти
. к твоему моду это отношение не имеет
Last edited by Seemann (09-02-2007 11:11)
Offline
аналог того, что ты сделал - можно просматривать память во время игры, видеть текущий адрес, менять значения и т.д. Реализовано через длл.
Посмотрю. Тоже хотел так делать, потом решил через скрипт.
ну это видимо фича игры, там просто одежда такая - специальная - она убирается после смерти . к твоему моду это отношение не имеет
Понятно.
Offline
... одежда такая - специальная - она убирается после смерти...
Извините, что не в тему.
А что это за одежда такая?
Может герою робу сшить, чтобы он из тюрьмы в ней выходил? Интересно было бы.
Last edited by svetka (09-02-2007 11:28)
Offline
$PLAYER_CHAR.SetClothes("GARAGELEG", "GARAGETR", Special)это костюм, который дарит CJ'ю одна из его девушек (кажется, Мишель). Насчет робы идея интересная, кто б еще текстуры нарисовал... 
Offline
кто б еще текстуры нарисовал...
Я попробую. 
Offline
2Seemann:
читаем адрес по локальной переменной (значение в первом столбце) и если возвращает 255, то нажата кнопка из второго столбца, если 16711680 (0xFF0000), то из правого.
Cool! Будем тестировать. :-)
Сначала ты надежда и гордость,
Потом о спину ломают аршин. (c)БГ
Offline
Pages: 1