GTA Vice City > Скриптинг
CLEO: Скрипт Ходьбы
Saint:
есть такой вот код
{$CLEO .cs}
//-------------MAIN---------------
0000: NOP
10@ = 8 // integer values
10@ *= 2 // integer values (never used in VC or GTA 3)
10@ += 8240304 // integer values // 7DBCB0 CPad pads[2]
11@ = 9 // integer values
11@ *= 2 // integer values (never used in VC or GTA 3)
11@ += 8240304 // integer values
12@ = 10 // integer values
12@ *= 2 // integer values (never used in VC or GTA 3)
12@ += 8240304 // integer values
13@ = 11 // integer values
13@ *= 2 // integer values (never used in VC or GTA 3)
13@ += 8240304 // integer values
15@ = Actor.EmulateFromPlayer(0)
:NONAME_98
wait 0
05E0: 0@ = read_memory 5600778 size 4 virtual_protect 0 // 55760A
if and
80E0: not player 0 driving
Player.Controllable(0)
0@ == 6850112 // integer values // 688640 float fMinHeight dd -100.0
00E1: player 0 pressed_button 6 // Key Target
else_jump @NONAME_169
05DF: write_memory 5600778 size 4 value 10541348 virtual_protect 1 // 55760A // A0D929
:NONAME_169
if and
0@ == 10541348 // integer values // A0D924 .bss:00A0D924 ?? ?? ?? ?? flt_A0D924 dd ?
80E1: not player 0 pressed_button 6 // Key Target
else_jump @NONAME_212
05DF: write_memory 5600778 size 4 value 6850112 virtual_protect 1 // 55760A flt_A0D924 // 688640 float fMinHeight dd -100.0
:NONAME_212
05E0: 5@ = read_memory 8801382 size 1 virtual_protect 1 // 864C66 ActiveKeyState
if and
80E0: not player 0 driving
Player.Controllable(0)
5@ == 255 // integer values
else_jump @NONAME_367
if
00E1: player 0 pressed_button 8 // W
else_jump @NONAME_283
05DF: write_memory 10@ size 2 value 85 virtual_protect 0
:NONAME_283
if
00E1: player 0 pressed_button 9 // S
else_jump @NONAME_311
05DF: write_memory 11@ size 2 value 85 virtual_protect 0
:NONAME_311
if
00E1: player 0 pressed_button 10 // A
else_jump @NONAME_339
05DF: write_memory 12@ size 2 value 85 virtual_protect 0
:NONAME_339
if
00E1: player 0 pressed_button 11 // D
else_jump @NONAME_367
05DF: write_memory 13@ size 2 value 85 virtual_protect 0
:NONAME_367
jump @NONAME_98
может кто помочь объяснить как он работает и преобразовать его код С++
xanser:
Адрес 0x7DBCB0 содержит состояния нажатий игровых клавиш. Если описать в виде класса, то будет как-то так:
--- Код: C++ ---class CPad {public: /*0x000*/ WORD Button0; /*0x002*/ WORD Button1; /*0x004*/ BYTE TurretHorizontal; /*0x005*/ BYTE TurretHorizontal_isLeft; /*0x006*/ BYTE TurretVertical; /*0x007*/ BYTE TurretVertical_isDown; /*0x008*/ WORD Action_NextRadio; /*0x00A*/ WORD PrevWeapon_LookLeft; /*0x00C*/ WORD Aim_HandBrake; /*0x00E*/ WORD NextWeapon_LookRight; /*0x010*/ WORD Forward; /*0x012*/ WORD Backward; /*0x014*/ WORD Left; /*0x016*/ WORD Right; /*0x018*/ WORD UsedToExitCertainModes; /*0x01A*/ WORD ChangeCameraView; /*0x01C*/ WORD Jump_BrakeReverse; /*0x01E*/ WORD EnterExitVehicle; /*0x020*/ WORD Sprint_Gas; /*0x022*/ WORD Fire; /*0x024*/ WORD Crouch_Horn; /*0x026*/ WORD LookBehind_Submission; /*0x028*/ WORD Button20; /*0x02A*/}; auto GameKeys = (CPad *)0x7DBCB0;
Дальше проверяется, нажата ли каждая кнопка Forward, Backward, Left, Right. Нажатие дает значение 255 в переменные 10@, 11@, 12@, 13@. Но что удивительно, если снизить значение до 85 как в скрипте, то скорость анимации и ее влияние снизятся, что преобразует бег в подобие ходьбы (не путать с настоящей анимацией хотьбы). Я предпочитаю значение 170.
Еще в скрипте присутствует какая-то замена адресов, возможно что-то связанное с прицелом на правую кнопку, активирующую хотьбу, в это я не вникал. Мой код, аналогичный этому выглядит так:
--- Код: C++ ---static void WalkProcess() { if (Mouse->Right) { WalkSpeed = min(255, max(170, WalkSpeed - 1)); if (GameKeys->Forward) Patch((DWORD)&GameKeys->Forward, (BYTE)WalkSpeed); if (GameKeys->Backward) Patch((DWORD)&GameKeys->Backward, (BYTE)WalkSpeed); if (GameKeys->Left) Patch((DWORD)&GameKeys->Left, (BYTE)WalkSpeed); if (GameKeys->Right) Patch((DWORD)&GameKeys->Right, (BYTE)WalkSpeed); } else WalkSpeed = 255;}
Здесь плавное снижение бега 255 до хотьбы 170 при нажатии на правую кнопку, чтобы анимация не дернулась. Прицел я не проверяю, когда игрок целится, он и так не может ни бежать, ни ходить.
По мышке:
--- Код: C++ ---struct CMouseState { BYTE Left; BYTE Right; BYTE Middle; BYTE WheelUp; BYTE WheelDown; char _[3]; float X; float Y;}; auto Mouse = (CMouseState *)0x7DD860;
Saint:
Ну вообщет чтобы игрок ходил надо удерживать Левый Альт + W
но альт я так и не нашел в коде поэтому и не пойму нифига
ещё да в скрипте можно целиться на правую кнопку мышки
Saint:
про уменьшение значений - это может быть из PS2 т.к. там управление на аналогах и типо можно сильно нажать или чуть чуть
update: большое спасибо за помощь, разобрался что к чему =)
xanser:
Уточнение: кроме игровых кнопок газ/тормоз/стрельба... присутствуют и прямые клавиатурные A,B,С...Alt, Shift..., даже Ж,Э,Ю,Ъ. Вот мое описание:
--- Код: C++ ---struct CKeyState { WORD F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12; // 0-11 (12) WORD _13_44[32]; // 12-43 (32) WORD Space, _46, _47, _48, _49, _50, _51, Quote, _53, _54, _55, _56, Less, Minus, More, Point; // 44-59 (16) WORD Key0, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9; // 60-69 (10) WORD _71, DoublePoint, _73, Plus, _75, _76, _77; // 70-76 (7) WORD A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z; // 77-102 (26) WORD LBrace, Slash, RBrace, _107, _108, Wave; // 103-108 (6) WORD _110_196[87], RusЁ, _198_237[40], RusБ, _239_242[4], RusЖ, _244_257[14], RusХ, _259_262[4], RusЪ, _264, _265, RusЭ, RusЮ, _268; // 109-267 (159) WORD Esc, Insert, Del, Home, End, PgUp, PgDown, Up, Down, Left, Right, Scroll, Pause, NumLock, Div, Mul, Sub, Add, Enter, Decimal; // 268-287 (20) WORD Num1, Num2, Num3, Num4, Num5, Num6, Num7, Num8, Num9, Num0; // 288-297 (10) WORD Back, Tab, CapsLock, Extenter, LShift, RShift, Shift, LCtrl, RCtrl, LAlt, RAlt, LWin, RWin, Apps; // 298-311 (14)};auto Keys = (CKeyState *)0x864A00;
Таким образом, в скрипте присутствует Alt по адресу: 0x864A00 + 0x266 = 0x864C66. Можно обращаться так:
--- Код: C++ ---static bool _KeyPressed(DWORD key) { return (*(WORD *)key == 0xFF);#define KeyPressed(a) _KeyPressed((DWORD)&Keys->a)}//...if (KeyPressed(LAlt)) {} // нажат Altif (KeyPressed(W)) {} // нажата Wif (KeyPressed(RusЪ)) {} // нажат твердый знак в русской раскладке
Навигация
Перейти к полной версии