#2376 19-07-2010 13:24

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Один вопрос

У меня такого опкода вообще нету! :wow:
Это для клео 4? А для клео 3?

Offline

#2377 19-07-2010 14:29

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Один вопрос

Sw[ee]t wrote:

Опять вопрос по мультиплееру.
Можно-ли как-то оперировать другими игроками (при помощи памяти разумеется)?
То есть сменить им координаты / здоровье / интерьер и тому подобное.

как-то так

055E: set_player 1 max_health += 100 
01F5: 0@ = get_player_actor 2

Offline

#2378 19-07-2010 15:56

d88
Registered: 15-12-2009
Posts: 254
Website

Re: Один вопрос

Sw[ee]t wrote:

У меня такого опкода вообще нету! :wow:
Это для клео 4? А для клео 3?

Хм, и правда нет. Но наверное он аналогичен коду

0A96: $ActorStruct = actor $PLAYER_ACTOR struct

Этот точно для CLEO 3

Offline

#2379 20-07-2010 06:40

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Один вопрос

d88 wrote:
Sw[ee]t wrote:

У меня такого опкода вообще нету! :wow:
Это для клео 4? А для клео 3?

Хм, и правда нет. Но наверное он аналогичен коду

0A96: $ActorStruct = actor $PLAYER_ACTOR struct

Этот точно для CLEO 3

Ну ты читал что мне нужно? Превратить из указателя в хендл.
В любом случае, я нашёл альтернативное решение.

Вопросик опять: нашёл ф-цию 0x64F190 которая добавляет в машину пассажира. Можно-ли как то поддельно пихнуть игрока на пассажирское сидение (хотя бы на секунд пять) и тутже его оттуда убрать. Это мне опять для мп.

Offline

#2380 21-07-2010 02:00

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Один вопрос

В клео скрипте можно сделать проверку, что если запущена определённая миссия(именно определённая) то скрипт в этой миссии не срабатывал бы?

Offline

#2381 21-07-2010 08:10

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Один вопрос

Sergey81 wrote:

В клео скрипте можно сделать проверку, что если запущена определённая миссия(именно определённая) то скрипт в этой миссии не срабатывал бы?

Надо найти для интересующей тебя миссии соответствующую переменную (возможно не для всех миссий она есть) и потом делать проверку. Вот я когда-то использовал:
if or
  $ONMISSION_PARAMEDIC == 1
  $ONMISSION_FIREFIGHTER == 1
  $MISSION_VIGILANTE_PASSED == 1

Проверка на запущеность одной из миссий (медика, пожарника, полиции).

Offline

#2382 21-07-2010 08:14

Sanchez
Registered: 18-08-2006
Posts: 280

Re: Один вопрос

@Sergey81 -

0AAA: 0@ = thread 'INTRO1' pointer
if
    0@ > 0
then
    0@ += 0xC4
    0A8D: 0@ = read_memory 0@ size 1 virtual_protect 0
    if
        0@ > 0
    then
        //
    else
        //
    end
end

Last edited by Sanchez (21-07-2010 08:14)

Offline

#2383 21-07-2010 15:20

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Один вопрос

Sanchez wrote:

@Sergey81 -

0AAA: 0@ = thread 'INTRO1' pointer
if
    0@ > 0
then
    0@ += 0xC4
    0A8D: 0@ = read_memory 0@ size 1 virtual_protect 0
    if
        0@ > 0
    then
        //
    else
        //
    end
end

Я в скриптинге не особо, это куда прописывать? Миссия A Home in the Hills, клео Parachute_fast_performance. Там когда этот скрипт используется, вторая часть триад не приземляется и с-но миссия не проходима.
А аналогов этого скрипта я незнаю.

PS. Забыл совсем, ещё в лётной школе со скриптом при приземлении с парашютом ничего не происходит.

PS2. C этим вроде разобрался, прописал так -

:PARAMOD_11
wait 0 

0AAA: 0@ = thread 'DYOMSNF' pointer
if
    0@ > 0
then
    0@ += 0xC4
    0A8D: 0@ = read_memory 0@ size 1 virtual_protect 0
    if
        0@ > 0
    then
        jump @PARAMOD_11 
    end
end
...

DYOMSNF это из мишн пака, там тоже глюк с парашютом был, сейчас его нет.
Поищу названия миссий сейчас.

Last edited by Sergey81 (21-07-2010 17:27)

Offline

#2384 22-07-2010 09:17

d88
Registered: 15-12-2009
Posts: 254
Website

Re: Один вопрос

Создал актёров массивом

 var 
1@ : float = 393.2705
2@ : float = 2437.1357 
3@ : float = 15.0 
$act_for_array: array 14 of Actor 
end 
for $index_of_array = 1 to 14 
$act_for_array[$index_of_array] = Actor.Create(4,#SPECIAL02,1@,2@,3@) 
1@ += 1.0 
wait 250 
end

Вопросы:

1) Можно ли обойтись без глобальных переменных? Если я их меняю на локальные, выходит ошибка.
2) Как управлять всеми сразу? Например дать оружие всем одним кодом.
Или придётся поотдельности, типа так

01B2: give_actor $act_for_array[1] weapon 31 ammo 60
01B2: give_actor $act_for_array[2] weapon 31 ammo 60

Offline

#2385 22-07-2010 11:02

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Один вопрос

2) Как управлять всеми сразу? Например дать оружие всем одним кодом.
Или придётся поотдельности, типа так

Вроде можно обратиться просто к переменной, без указания индекса массива. Тогда применится ко всем акторам в массиве.

UPDATE:

По поводу моего вопроса с _vehicleAddPassenger
Я разобрал код (прокомментировал) но никак не пойму, за что отвечают аргументы arg_0 и arg_4.
Полный код:

.text:0064F190     ; =============== S U B R O U T I N E =======================================
.text:0064F190
.text:0064F190
.text:0064F190     _vehicleAddPassenger proc near          ; CODE XREF: _opcode_handler_18+B3Cp
.text:0064F190                                             ; _opcode_handler_04+75Cp
.text:0064F190                                             ; _opcode_handler_10+917p
.text:0064F190                                             ; _opcode_handler_14+190Bp ...
.text:0064F190
.text:0064F190     arg_0           = dword ptr  4 ; аргумент типа dword (4 байта)
.text:0064F190     arg_4           = dword ptr  8 ; аргумент типa dword (8 байт) (?)
.text:0064F190
.text:0064F190 000                 mov     edx, [esp+arg_0] ; пишем в edx адрес esp со смещением в 4 байта
.text:0064F194 000                 mov     cl, [edx+429h] ; пишем в cl адрес edx со смещением в 0x429 байт
.text:0064F19A 000                 or      eax, 0FFFFFFFFh ; либо в eax 0FFFFFFFFh либо false (?)
.text:0064F19D 000                 test    cl, 2 ; если cl равен 2 байта
.text:0064F1A0 000                 jz      short loc_64F1A8 ; если нет - идём на 64F1A8
.text:0064F1A2
.text:0064F1A2     loc_64F1A2:                             ; CODE XREF: _vehicleAddPassenger+48j
.text:0064F1A2 000                 mov     eax, 8 ; пишем в eax 8 байт
.text:0064F1A7 000                 retn ; возвращение на операнд-вызов
.text:0064F1A8     ; --------------------------------------------------------------------------------------------------------
.text:0064F1A8
.text:0064F1A8     loc_64F1A8:                             ; CODE XREF: _vehicleAddPassenger+10j
.text:0064F1A8 000                 mov     ecx, [esp+arg_4] ; пишем в ecx адрес esp со смещением в 8 байт
.text:0064F1AC 000                 sub     ecx, 0 ; вычитаем из ecx нолик
.text:0064F1AF 000                 jz      short loc_64F1BD ; если нет - идём на 64F1BD
.text:0064F1B1 000                 dec     ecx ; если да - уменьшаем ecx на единицу
.text:0064F1B2 000                 jz      short loc_64F1DA ; если опять нет - идём на 64F1DA
.text:0064F1B4 000                 dec     ecx ; уменьшаем ecx на единицу
.text:0064F1B5 000                 jnz     short locret_64F1DF ; если так - идём на 
.text:0064F1B7 000                 mov     eax, 9 ; пишем в eax циферку 9
.text:0064F1BC 000                 retn ; возврат
.text:0064F1BD     ; ---------------------------------------------------------------------------------------------------------
.text:0064F1BD
.text:0064F1BD     loc_64F1BD:                             ; CODE XREF: _vehicleAddPassenger+1Fj
.text:0064F1BD 000                 cmp     dword ptr [edx+590h], 9 ; сравниваем адрес edx (4 байта) со смещением в 0x590 байт с цифрой 9
.text:0064F1C4 000                 jz      short loc_64F1DA ; если нет - идём на 64F1DA
.text:0064F1C6 000                 mov     eax, [edx+384h] ; если да - пишем в eax адрес edx со смещением 0x384 байт
.text:0064F1CC 000                 mov     ecx, [eax+0CCh] ; пишем в ecx адрес eax со смещением в 0x0CC байт
.text:0064F1D2 000                 shr     ecx, 9 ; сдвиг всех битов регистра ecx на 9 разрядов вправо
.text:0064F1D5 000                 test    cl, 1 ; если cl равен одному
.text:0064F1D8 000                 jz      short loc_64F1A2 ; если нет - идём на 64F1A2
.text:0064F1DA
.text:0064F1DA     loc_64F1DA:                             ; CODE XREF: _vehicleAddPassenger+22j
.text:0064F1DA                                             ; _vehicleAddPassenger+34j
.text:0064F1DA 000                 mov     eax, 0Bh ; пишем в eax 0x0B
.text:0064F1DF
.text:0064F1DF     locret_64F1DF:                          ; CODE XREF: _vehicleAddPassenger+25j
.text:0064F1DF 000                 retn ; возврат
.text:0064F1DF     _vehicleAddPassenger endp

Offline

#2386 22-07-2010 11:56

Sanchez
Registered: 18-08-2006
Posts: 280

Re: Один вопрос

@Sw[ee]t -

arg_0    hVehicle= dword ptr  4
arg_4    nPassengerSeat= dword ptr  8

Offline

#2387 22-07-2010 12:09

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Один вопрос

Каким образом ты это узнал?

Offline

#2388 22-07-2010 12:13

Sanchez
Registered: 18-08-2006
Posts: 280

Re: Один вопрос

@Sw[ee]t - посмотри что ложиться в стек перед вызовом этой функции.

Offline

#2389 22-07-2010 12:22

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Один вопрос

Мне просто нужно сделать инжект в эту ф-цию, и "якобы" посадить на сидение игрока, не трогая его при этом. Это можно реализовать?

Offline

#2390 22-07-2010 14:56

d88
Registered: 15-12-2009
Posts: 254
Website

Re: Один вопрос

Sw[ee]t wrote:

2) Как управлять всеми сразу? Например дать оружие всем одним кодом.
Или придётся поотдельности, типа так

Вроде можно обратиться просто к переменной, без указания индекса массива. Тогда применится ко всем акторам в массиве.

Я сначала так и делал, но игра вылетает.

Offline

#2391 22-07-2010 17:07

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Один вопрос

@Sanchez - arg_0 => pVehicle (не хэндл, а указатель).
Вообще, начать нужно с того, что эта функция названа неправильно.

int getPassengerCodeFromNumber (CVehicle * pVehicle, int nPassenger) {
    if (pVehicle->_f429 & 2) 
        return 8;
    switch (nPassenger) {
    case 0:
        if (pVehicle->m_dwCarType != 9)  // not BIKE
            if (!(pVehicle->m_pHandling->m_dwModelFlags & 0x200))  // not TANDEM_SEATS
                return 8;
        // fall-through 
    case 1:
        return 11;
    case 2:
        return 9;
    default:
        return -1;
    }
}

Вся работа по добавлению пассажира, делается не в ней, а внутри CTaskSimpleCarSetPedInVehicle, CTaskComplexEnterCarAsPassenger и т.д. Эта функция только конвертирует номер пассажива в какое-то число (номер компонента сиденья?)

Offline

#2392 22-07-2010 21:40

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Один вопрос

thread 'REMOVEWPN' 

:REMOVEWPN_10
wait 500 
if 
   Player.Defined($PLAYER_CHAR)
else_jump @REMOVEWPN_10 
if 
0AB0:   key_pressed 8 
else_jump @REMOVEWPN_10 
0470: 1@ = actor $PLAYER_ACTOR current_weapon
0555: remove_weapon 1@ from_actor $PLAYER_ACTOR 
jump @REMOVEWPN_10
0A93: end_custom_thread

Такой код, как бы так выразиться, нормально написан? Т.е. работать то он работает, но не приведёт ли в процессе к вылетам или глюкам из-за отсутствия каких-нибудь доп. проверок или ещё чего-нибудь? smile

Offline

#2393 23-07-2010 05:00

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Один вопрос

@listener - блин, и столько работы зря. Я уж начал думать как туда всунуть своё чего-нибудь lol.
Спасибо что вовремя остановил!

Offline

#2394 23-07-2010 09:11

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Один вопрос

@Sw[ee]t - не за что wink

В новой базе/gta_dll будут расписаны все CTask (сейчас готово чуть меньше сотни). Возможно, тогда можно будет что-то сделать особо не напрягаясь.

Offline

#2395 25-07-2010 15:03

3Doomer
From: КаZан
Registered: 14-05-2008
Posts: 659
Website

Re: Один вопрос

Sergey81 wrote:
код

Такой код, как бы так выразиться, нормально написан? Т.е. работать то он работает, но не приведёт ли в процессе к вылетам или глюкам из-за отсутствия каких-нибудь доп. проверок или ещё чего-нибудь? smile

Не приведёт, но лучше использовать поменьше лейблов wink
Последний опкод не нужен, т.к. это бесконечный цикл.

thread 'REMOVEWPN' 
while true
   wait 500 
   while Player.Defined($PLAYER_CHAR)
      if 
         0AB0:   key_pressed 8 
      then
         0470: 1@ = actor $PLAYER_ACTOR current_weapon
         0555: remove_weapon 1@ from_actor $PLAYER_ACTOR 
      end
   end
end

ИМХО:
Частоту проверки нажатости кнопки лучше сделать побольше - интервал опроса снизить до 100 мсек.
И ещё, после

0555: remove_weapon 1@ from_actor $PLAYER_ACTOR

добавить проверку отпущенности кнопки:

while 0AB0:   key_pressed 8
   wait 100
end

Last edited by 3Doomer (25-07-2010 15:06)


GIMS developer

Offline

#2396 25-07-2010 16:43

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Один вопрос

3Doomer wrote:
thread 'REMOVEWPN' 
while true
   wait 500 
   while Player.Defined($PLAYER_CHAR)
      if 
         0AB0:   key_pressed 8 
      then
         0470: 1@ = actor $PLAYER_ACTOR current_weapon
         0555: remove_weapon 1@ from_actor $PLAYER_ACTOR 
      end
   end
end

У меня не заработало, зависон ещё до начала игры.

Offline

#2397 25-07-2010 17:38

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: Один вопрос

мдя, вообще-то thread имеет только 7 символов, поскольку это s - 8byte, и два цикла во втором нет ожидания wait


I know everything and nothing...

Offline

#2398 25-07-2010 20:35

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Один вопрос

mfisto wrote:

мдя, вообще-то thread имеет только 7 символов, поскольку это s - 8byte, и два цикла во втором нет ожидания wait

Ага, исправил, заработало, спс.

Offline

#2399 30-07-2010 18:17

BoPoH
From: Каушаны
Registered: 21-02-2009
Posts: 77

Re: Один вопрос

Возможно ли повернуть игрока в сторону нужных координат, не прерывая при этом анимацию, воспроизведённую скрипом???
Опкод 06BA и ему подобные прерывают анимацию...


userbar.png

Offline

#2400 31-07-2010 10:03

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Один вопрос

ATTENTION! CLEO3 ONLY!

Допустим, я делаю проверку на нажатие каких-либо клавиш, и если клавиша нажата, то записываю её в переменную (v0@ = "A"). Так вот, допустим нажато несколько клавиш, как можно все получившиеся результаты переменных, объединить и записать в одну единую переменную? Я знаю что на си и дельфи есть функции по объединению строк, но как можно это реализовать на скриптовом уровне. Быть может есть какая-то ф-ция которая этим занимается?

Offline

Board footer

Powered by FluxBB