You are not logged in.
У меня такого опкода вообще нету! :wow:
Это для клео 4? А для клео 3?
Offline
Опять вопрос по мультиплееру.
Можно-ли как-то оперировать другими игроками (при помощи памяти разумеется)?
То есть сменить им координаты / здоровье / интерьер и тому подобное.
как-то так
055E: set_player 1 max_health += 100 01F5: 0@ = get_player_actor 2
Offline
Sw[ee]t wrote:У меня такого опкода вообще нету! :wow:
Это для клео 4? А для клео 3?Хм, и правда нет. Но наверное он аналогичен коду
0A96: $ActorStruct = actor $PLAYER_ACTOR structЭтот точно для CLEO 3
Ну ты читал что мне нужно? Превратить из указателя в хендл.
В любом случае, я нашёл альтернативное решение.
Вопросик опять: нашёл ф-цию 0x64F190 которая добавляет в машину пассажира. Можно-ли как то поддельно пихнуть игрока на пассажирское сидение (хотя бы на секунд пять) и тутже его оттуда убрать. Это мне опять для мп.
Offline
В клео скрипте можно сделать проверку, что если запущена определённая миссия(именно определённая) то скрипт в этой миссии не срабатывал бы?
Offline
В клео скрипте можно сделать проверку, что если запущена определённая миссия(именно определённая) то скрипт в этой миссии не срабатывал бы?
Надо найти для интересующей тебя миссии соответствующую переменную (возможно не для всех миссий она есть) и потом делать проверку. Вот я когда-то использовал:
if or
$ONMISSION_PARAMEDIC == 1
$ONMISSION_FIREFIGHTER == 1
$MISSION_VIGILANTE_PASSED == 1
Проверка на запущеность одной из миссий (медика, пожарника, полиции).
Offline
@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
@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
Создал актёров массивом
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
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
@Sw[ee]t -
arg_0 hVehicle= dword ptr 4 arg_4 nPassengerSeat= dword ptr 8
Offline
Offline
@Sw[ee]t - посмотри что ложиться в стек перед вызовом этой функции.
Offline
Мне просто нужно сделать инжект в эту ф-цию, и "якобы" посадить на сидение игрока, не трогая его при этом. Это можно реализовать?
Offline
2) Как управлять всеми сразу? Например дать оружие всем одним кодом.
Или придётся поотдельности, типа такВроде можно обратиться просто к переменной, без указания индекса массива. Тогда применится ко всем акторам в массиве.
Я сначала так и делал, но игра вылетает.
Offline
@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
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
Такой код, как бы так выразиться, нормально написан? Т.е. работать то он работает, но не приведёт ли в процессе к вылетам или глюкам из-за отсутствия каких-нибудь доп. проверок или ещё чего-нибудь?
Offline
@listener - блин, и столько работы зря. Я уж начал думать как туда всунуть своё чего-нибудь .
Спасибо что вовремя остановил!
Offline
кодТакой код, как бы так выразиться, нормально написан? Т.е. работать то он работает, но не приведёт ли в процессе к вылетам или глюкам из-за отсутствия каких-нибудь доп. проверок или ещё чего-нибудь?
Не приведёт, но лучше использовать поменьше лейблов
Последний опкод не нужен, т.к. это бесконечный цикл.
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
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
мдя, вообще-то thread имеет только 7 символов, поскольку это s - 8byte, и два цикла во втором нет ожидания wait
Ага, исправил, заработало, спс.
Offline
Offline
ATTENTION! CLEO3 ONLY!
Допустим, я делаю проверку на нажатие каких-либо клавиш, и если клавиша нажата, то записываю её в переменную (v0@ = "A"). Так вот, допустим нажато несколько клавиш, как можно все получившиеся результаты переменных, объединить и записать в одну единую переменную? Я знаю что на си и дельфи есть функции по объединению строк, но как можно это реализовать на скриптовом уровне. Быть может есть какая-то ф-ция которая этим занимается?
Offline