Автор Тема: CLEO: Скрипт Ходьбы  (Прочитано 102 раз)

Оффлайн Saint

  • Призрак
  • Сообщений: 22
  • Репутация: +0/-0
  • Saint Games
    • saint36rus
    • Просмотр профиля
CLEO: Скрипт Ходьбы
« : Август 19, 2018, 11:15:36 pm »
есть такой вот код


{$CLEO .cs}

//-------------MAIN---------------
0000NOP 
10
@ = // integer values 
10@ *= // integer values (never used in VC or GTA 3) 
10@ += 8240304 // integer values // 7DBCB0   CPad pads[2]
11@ = // integer values 
11@ *= // integer values (never used in VC or GTA 3) 
11@ += 8240304 // integer values 
12@ = 10 // integer values 
12@ *= // integer values (never used in VC or GTA 3) 
12@ += 8240304 // integer values 
13@ = 11 // integer values 
13@ *= // 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 10size 2 value 85 virtual_protect 0 

:NONAME_283
if 
00E1:   player 0 pressed_button 9 // S
else_jump @NONAME_311 
05DF
write_memory 11size 2 value 85 virtual_protect 0 

:NONAME_311
if 
00E1:   player 0 pressed_button 10  // A
else_jump @NONAME_339 
05DF
write_memory 12size 2 value 85 virtual_protect 0 

:NONAME_339
if 
00E1:   player 0 pressed_button 11  // D
else_jump @NONAME_367 
05DF
write_memory 13size 2 value 85 virtual_protect 0 

:NONAME_367
jump 
@NONAME_98 



может кто помочь объяснить как он работает и преобразовать его код С++

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 500
  • Репутация: +43/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: CLEO: Скрипт Ходьбы
« Ответ #1 : Август 23, 2018, 11:14:53 am »
Адрес 0x7DBCB0 содержит состояния нажатий игровых клавиш. Если описать в виде класса, то будет как-то так:
Код: C++
  1. class CPad {
  2. public:
  3.         /*0x000*/       WORD Button0;
  4.         /*0x002*/       WORD Button1;
  5.         /*0x004*/       BYTE TurretHorizontal;
  6.         /*0x005*/       BYTE TurretHorizontal_isLeft;
  7.         /*0x006*/       BYTE TurretVertical;
  8.         /*0x007*/       BYTE TurretVertical_isDown;
  9.         /*0x008*/       WORD Action_NextRadio;
  10.         /*0x00A*/       WORD PrevWeapon_LookLeft;
  11.         /*0x00C*/       WORD Aim_HandBrake;
  12.         /*0x00E*/       WORD NextWeapon_LookRight;
  13.         /*0x010*/       WORD Forward;
  14.         /*0x012*/       WORD Backward;
  15.         /*0x014*/       WORD Left;
  16.         /*0x016*/       WORD Right;
  17.         /*0x018*/       WORD UsedToExitCertainModes;
  18.         /*0x01A*/       WORD ChangeCameraView;
  19.         /*0x01C*/       WORD Jump_BrakeReverse;
  20.         /*0x01E*/       WORD EnterExitVehicle;
  21.         /*0x020*/       WORD Sprint_Gas;
  22.         /*0x022*/       WORD Fire;
  23.         /*0x024*/       WORD Crouch_Horn;
  24.         /*0x026*/       WORD LookBehind_Submission;
  25.         /*0x028*/       WORD Button20;
  26.         /*0x02A*/
  27. };
  28.  
  29. auto GameKeys = (CPad *)0x7DBCB0;

Дальше проверяется, нажата ли каждая кнопка Forward, Backward, Left, Right. Нажатие дает значение 255 в переменные 10@, 11@, 12@, 13@. Но что удивительно, если снизить значение до 85 как в скрипте, то скорость анимации и ее влияние снизятся, что преобразует бег в подобие ходьбы (не путать с настоящей анимацией хотьбы). Я предпочитаю значение 170.
Еще в скрипте присутствует какая-то замена адресов, возможно что-то связанное с прицелом на правую кнопку, активирующую хотьбу, в это я не вникал. Мой код, аналогичный этому выглядит так:

Код: C++
  1. static void WalkProcess() {
  2.         if (Mouse->Right) {
  3.                 WalkSpeed = min(255, max(170, WalkSpeed - 1));
  4.                 if (GameKeys->Forward)  Patch((DWORD)&GameKeys->Forward, (BYTE)WalkSpeed);
  5.                 if (GameKeys->Backward) Patch((DWORD)&GameKeys->Backward, (BYTE)WalkSpeed);
  6.                 if (GameKeys->Left)     Patch((DWORD)&GameKeys->Left, (BYTE)WalkSpeed);
  7.                 if (GameKeys->Right)    Patch((DWORD)&GameKeys->Right, (BYTE)WalkSpeed);
  8.         }
  9.                 else
  10.                         WalkSpeed = 255;
  11. }

Здесь плавное снижение бега 255 до хотьбы 170 при нажатии на правую кнопку, чтобы анимация не дернулась. Прицел я не проверяю, когда игрок целится, он и так не может ни бежать, ни ходить.
По мышке:

Код: C++
  1. struct CMouseState {
  2.         BYTE    Left;
  3.         BYTE    Right;
  4.         BYTE    Middle;
  5.         BYTE    WheelUp;
  6.         BYTE    WheelDown;
  7.         char    _[3];
  8.         float   X;
  9.         float   Y;
  10. };
  11.  
  12. auto Mouse = (CMouseState *)0x7DD860;

Оффлайн Saint

  • Призрак
  • Сообщений: 22
  • Репутация: +0/-0
  • Saint Games
    • saint36rus
    • Просмотр профиля
Re: CLEO: Скрипт Ходьбы
« Ответ #2 : Август 24, 2018, 08:37:28 pm »
Ну вообщет чтобы игрок ходил надо удерживать Левый Альт + W
но альт я так и не нашел в коде поэтому и не пойму нифига
ещё да в скрипте можно целиться на правую кнопку мышки

Оффлайн Saint

  • Призрак
  • Сообщений: 22
  • Репутация: +0/-0
  • Saint Games
    • saint36rus
    • Просмотр профиля
Re: CLEO: Скрипт Ходьбы
« Ответ #3 : Август 24, 2018, 08:41:31 pm »
про уменьшение значений - это может быть из PS2 т.к. там управление на аналогах и типо можно сильно нажать или чуть чуть

update: большое спасибо за помощь, разобрался что к чему =)
« Последнее редактирование: Август 24, 2018, 09:43:05 pm от Saint »

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 500
  • Репутация: +43/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: CLEO: Скрипт Ходьбы
« Ответ #4 : Август 25, 2018, 08:20:19 am »
Уточнение: кроме игровых кнопок газ/тормоз/стрельба... присутствуют и прямые клавиатурные A,B,С...Alt, Shift..., даже Ж,Э,Ю,Ъ. Вот мое описание:
Код: C++
  1. struct CKeyState {
  2.         WORD F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12; // 0-11 (12)
  3.         WORD _13_44[32]; // 12-43 (32)
  4.         WORD Space, _46, _47, _48, _49, _50, _51, Quote, _53, _54, _55, _56, Less, Minus, More, Point; // 44-59 (16)
  5.         WORD Key0, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9; // 60-69 (10)
  6.         WORD _71, DoublePoint, _73, Plus, _75, _76, _77; // 70-76 (7)
  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)
  8.         WORD LBrace, Slash, RBrace, _107, _108, Wave; // 103-108 (6)
  9.         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)
  10.         WORD Esc, Insert, Del, Home, End, PgUp, PgDown, Up, Down, Left, Right, Scroll, Pause, NumLock, Div, Mul, Sub, Add, Enter, Decimal; // 268-287 (20)
  11.         WORD Num1, Num2, Num3, Num4, Num5, Num6, Num7, Num8, Num9, Num0; // 288-297 (10)
  12.         WORD Back, Tab, CapsLock, Extenter, LShift, RShift, Shift, LCtrl, RCtrl, LAlt, RAlt, LWin, RWin, Apps; // 298-311 (14)
  13. };
  14. auto Keys = (CKeyState *)0x864A00;
  15.  

Таким образом, в скрипте присутствует Alt по адресу: 0x864A00 + 0x266 = 0x864C66. Можно обращаться так:

Код: C++
  1. static bool _KeyPressed(DWORD key) {
  2.         return (*(WORD *)key == 0xFF);
  3. #define KeyPressed(a) _KeyPressed((DWORD)&Keys->a)
  4. }
  5. //...
  6. if (KeyPressed(LAlt)) {} // нажат Alt
  7. if (KeyPressed(W)) {} // нажата W
  8. if (KeyPressed(RusЪ)) {} // нажат твердый знак в русской раскладке
  9.  

Оффлайн Saint

  • Призрак
  • Сообщений: 22
  • Репутация: +0/-0
  • Saint Games
    • saint36rus
    • Просмотр профиля
Re: CLEO: Скрипт Ходьбы
« Ответ #5 : Август 25, 2018, 03:58:38 pm »
ещё раз спасибо, очень полезная информация =) сам бы наверное долго разбирался.