GTA Vice City > Скриптинг

CLEO: Скрипт Ходьбы

(1/2) > >>

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Ъ)) {} // нажат твердый знак в русской раскладке 

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии