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
Не знаю, насколько это полезно и нужно, но вдруг кому пригодится.
Сам код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 | 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 = 0x 30303030 $SizeBuffer2 = 0x 30303030 $SizeBuffer3 = 0 $AddrBuffer1 = 0x 30303030 $AddrBuffer2 = 0x 30303030 $AddrBuffer2 = 0 $ESI = 0x 969110 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) = 0xA 49960 &0( 0@ ,1i) += @GetParam 0572: run_asm_inject true end if 00E1: player 0 pressed_key 11 then 0@ = - 429863 &0( 0@ ,1i) = 0xA 49960 &0( 0@ ,1i) += @Store 0572: run_asm_inject true end end end :GetParam hex // GerParam: 60 // PUSHAD 33C 0 // XOR EAX,EAX B 8 30303030 // MOV EAX,30303030 A 3 609AA 400 // MOV DWORD PTR DS:[A49A60],EAX A 3 649AA 400 // MOV DWORD PTR DS:[A49A64],EAX A 3 6C9AA 400 // MOV DWORD PTR DS:[A49A6C],EAX A 3 709AA 400 // MOV DWORD PTR DS:[A49A70],EAX 33C 0 // XOR EAX,EAX 33C 9 // XOR ECX,ECX B 9 07000000 // MOV ECX,7 B 4 00 // MOV AH,0 8B 35 849AA 400 // MOV ESI,DWORD PTR DS:[A49A84] // begin: 8A 06 // /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 609AA 400 // |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: C 705 7C9AA 400 01000000 // |MOV DWORD PTR DS:[A49A7C],1 EB 20 // |JMP _rout // _wrW: C 705 7C9AA 400 02000000 // |MOV DWORD PTR DS:[A49A7C],2 EB 14 // |JMP _rout // _wrD: C 705 7C9AA 400 04000000 // |MOV DWORD PTR DS:[A49A7C],4 EB 08 // |JMP _rout // _addr: 8881 6C9AA 400 // |MOV BYTE PTR DS:[ECX+A49A6C],AL EB 00 // |JMP _rout // _rout: 46 // |INC ESI 49 // |DEC ECX EB 9F // |JMP _begin // _next: FEC 4 // |INC AH 46 // |INC ESI B 9 07000000 // |MOV ECX,7 EB 95 // \JMP _begin // _finish: 68 609AA 400 // PUSH 0A49A60 E 8 1C 000000 // CALL Hex2Dword A 3 789AA 400 // MOV DWORD PTR DS:[A49A78],EAX 68 6C9AA 400 // PUSH 0A49A6C E 8 0D 000000 // CALL Hex2Dword A 3 809AA 400 // MOV DWORD PTR DS:[A49A80],EAX 83C 4 08 // ADD ESP,8 61 // POPAD C 3 // RETN 90 // NOP 90 // NOP 90 // NOP // Hex2Dword proc 8B 5424 04 // MOV EDX,DWORD PTR SS:[ESP+4] 33C 0 // XOR EAX,EAX 33C 9 // XOR ECX,ECX // _label1: F 602 FF // /TEST BYTE PTR DS:[EDX],0FF 8A0A // |MOV CL,BYTE PTR DS:[EDX] 74 1F // |JE _label4 80E 9 61 // |SUB CL,61 78 0A // |JS _label3 // _label2: C1E 0 04 // |SHL EAX,4 42 // |INC EDX 8D 4401 0A // |LEA EAX,DWORD PTR DS:[ECX+EAX+A] EB EA // |JMP _label1 // _label3: 80C 1 20 // |ADD CL,20 79 F 1 // |JNS _label2 80C 1 11 // |ADD CL,11 C1E 0 04 // |SHL EAX,4 42 // |INC EDX 03C 1 // |ADD EAX,ECX EB DA // \JMP _label1 // _label4: C 3 // RETN // Hex2Dword EndP // end GetParam end :Store hex // Store: 60 // PUSHAD 33C 0 // XOR EAX,EAX 33C 9 // XOR ECX,ECX A 1 7C9AA 400 // MOV EAX,DWORD PTR DS:[A49A7C] 83F 8 01 // CMP EAX,1 74 0C // JE _byte 83F 8 02 // CMP EAX,2 74 18 // JE _word 83F 8 04 // CMP EAX,4 74 26 // JE _dword EB 33 // JMP _end // _byte: 33C 0 // XOR EAX,EAX A 0 789AA 400 // MOV AL,BYTE PTR DS:[A49A78] 8B0D 809AA 400 // MOV ECX,DWORD PTR DS:[A49A80] 8801 // MOV BYTE PTR DS:[ECX],AL EB 22 // JMP _end // _word: 33C 0 // XOR EAX,EAX 66 A 1 789AA 400 // MOV AX,WORD PTR DS:[A49A78] 8B0D 809AA 400 // MOV ECX,DWORD PTR DS:[A49A80] 66 8901 // MOV WORD PTR DS:[ECX],AX EB 0F // JMP _end // _dword: 33C 0 // XOR EAX,EAX A 1 789AA 400 // MOV EAX,DWORD PTR DS:[A49A78] 8B0D 809AA 400 // MOV ECX,DWORD PTR DS:[A49A80] 8901 // MOV DWORD PTR DS:[ECX],EAX // _end: 61 // POPAD C 3 // RETN // end Store End |
h..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
1 | $PLAYER_CHAR .SetClothes( "GARAGELEG" , "GARAGETR" , Special) |
это костюм, который дарит CJ'ю одна из его девушек (кажется, Мишель). Насчет робы идея интересная, кто б еще текстуры нарисовал...
Offline
кто б еще текстуры нарисовал...
Я попробую.
Offline
2Seemann:
читаем адрес по локальной переменной (значение в первом столбце) и если возвращает 255, то нажата кнопка из второго столбца, если 16711680 (0xFF0000), то из правого.
Cool! Будем тестировать. :-)
Сначала ты надежда и гордость,
Потом о спину ломают аршин. (c)БГ
Offline
Pages: 1