Перейти к содержимому


Фотография

Интересный скрипт миссии "BusMod" by rooft0p, разбор полётов.

скрипт миссии

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 99

#41 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 22 April 2015 - 06:01

Что-то не получается. Если использовать встроенный в хук Vector3 или Vector2, то выдаёт нули, а если свою структуру, так вообще даёт ошибку...



#42 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 22 April 2015 - 15:10

Так ничего с vector3 в нативках и не получилось. Посмотрел исходники GTA4.Net ScriptHook v1.7.1.7b by HazardX, там автор такие функции тоже избегает - все закомментированы.

 

Взялся за модели и тут тоже некоторые непонятки.

    Private Function GetCarModel(ByVal vehHandle As Integer) As Integer
        If vehHandle = 0 Then Return Nothing
        Dim pVehModel As New Native.Pointer(GetType(Integer))
        Native.Function.Call("GET_CAR_MODEL", vehHandle, pVehModel)
	    Return pVehModel.Value
    End Function

Всё как бы работает, но GET_CAR_MODEL выдаёт некоторые номера с минусом:

 

ANNIHILATOR     837858166

BUS                    -713569950

SCHAFTER        -322343873

 

 

Встроенные хуковскиекоманды выдают следующее:

GTA.Game.Console.Print(Player.Character.CurrentVehicle.Model.ToString)

BUS: "0xD577C962", ANNIHILATOR: "0x31F0B376"

 

GTA.Game.Console.Print(Player.Character.CurrentVehicle.Model.Hash.ToString)

BUS: "-713569950"   'ANNIHILATOR: "837858166"    'SCHAFTER: "-322343873"

 

 

Вот как указано на List_of_models_hashes#Vehicles

'Model name       Hash decimal        Hash hexadecimal

ANNIHILATOR     837858166           0x31F0B376

BUS                    3581397346         0xD577C962

SCHAFTER        3972623423         0xECC96C3F


Сообщение отредактировал vorotkov: 22 April 2015 - 15:14


#43 Chipsman

Chipsman

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 786 сообщений
  • Пол:Не определился


Отправлено 22 April 2015 - 18:57

потому что в одном случае используется Int32 (там где минус), а во втором UInt32.

(байты те же, но интерпретация разная)



#44 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 23 April 2015 - 03:10

Я тоже об этом подумал, только ведь запрос в GTA IV с указанием беззнаковых типов не работает, как с этим бороться?



#45 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 26 April 2015 - 07:10

Столкнулся с таким, по сути базовым вопросом, на который до этого как-то не обращал внимания, т.к. в тестах оперировал только игроком и его авто.

А как получить хэндл (номер объекта в текущей игровой сессии, тип Integer) окружающих пэдов и транспортных средств? Т.е. получить не сборный класс параметров и функций As Ped и As Vehicle в хуке, а именно просто номер объекта, по которому собственно и идёт потом оперирование с ним в игре.

Для игрока это функция GET_PLAYER_CHAR, а вот для иных объектов я такового не нашёл...

Есть только перекрёстные опросы:

GET_CAR_CHAR_IS_USING

GET_DRIVER_OF_CAR

GET_CHAR_IN_CAR_PASSENGER_SEAT


Сообщение отредактировал vorotkov: 26 April 2015 - 07:49


#46 НикИТОС

НикИТОС

    Активный участник

  • Пользователи
  • PipPipPip
  • 127 сообщений
  • Пол:Мужчина


Отправлено 26 April 2015 - 07:33

Столкнулся с таким, по сути базовым вопросом, на который до этого как-то не обращал внимания, т.к. в тестах оперировал только игроком и его авто.
А как получить хэндл (номер объекта в текущей игровой сессии, тип Integer) окружающих пэдов и транспортных средств? Т.е. получить не сборный класс параметров и функций As Ped и As Vehicle в хуке, а именно просто номер объекта, по которому собственно и идёт потом оперирование с ним в игре.
Для игрока это функция GET_PLAYER_CHAR, а вот для иных объектов я такового не нашёл...

Не совсем понимаю, что тебе нужно. По сути типы Ped и Vehicle являются целочисленными переменными, просто названы так, чтобы нам было легче их воспринимать. То есть, за этими типами и кроются хэндлы. GET_CLOSEST_CHAR, например, на выходе даёт то же самое, что и GET_PLAYER_CHAR. И GET_DRIVER_OF_CAR выдаёт то же.

Существуют разные представления одних и тех же данных. В данном случае даже представление одно, всё решает typedef. Пример с нейтивами выше применим к GTA IV SCOCL, можно его же изменить так, чтобы вместо Ped везде было PlayerID. Поэтому смотри не в энциклопедию, где частные случаи перемешаны с общими, а в свой хук. Тогда не прогадаешь.

В ScriptingOrig.h видно, что вышеперечисленные нейтивы имеют результатом один тип Ped. Там же видно, чем на самом деле он является (typedef int Ped;).

Сообщение отредактировал НикИТОС: 26 April 2015 - 08:05


#47 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 26 April 2015 - 08:42

Я смотрел исходники хука, да видел, что Ped и Vehicle имеют тип int, но так и не понял, как практически из переменной As Ped и As Vehicle получить значение As Integer? Если не сложно, напиши пж-та пример для дурака, напр. как вывести на экран int значения переменной As Ped или As Vehicle?

Dim ped1 As Ped = World.CreatePed(Player.Character.Position.Around(2.0F))
ped1.NoLongerNeeded()
Game.DisplayText("Ped Created!")
Game.Console.Print(ped1.ToString)

Результат в консоли: "GTA.Ped"

Насколько я понял, Ped и Vehicle это не просто переменная типа int, это два класса, описывающие работу с объектами в игре, по крайней мере в хуке от Aru и нет.хуке от HazardX.


Сообщение отредактировал vorotkov: 26 April 2015 - 08:52


#48 НикИТОС

НикИТОС

    Активный участник

  • Пользователи
  • PipPipPip
  • 127 сообщений
  • Пол:Мужчина


Отправлено 26 April 2015 - 08:56

Я смотрел исходники хука, да видел, что Ped и Vehicle имеют тип int, но так и не понял, как практически из переменной As Ped и As Vehicle получить значение As Integer? Если не сложно, напиши пж-та пример для дурака, напр. как вывести на экран int значения переменной As Ped или As Vehicle?

Dim ped1 As Ped = World.CreatePed(Player.Character.Position.Around(2.0F))
ped1.NoLongerNeeded()
Game.DisplayText("Ped Created!")
Game.Console.Print(ped1.ToString)
Результат в консоли: "GTA.Ped"

Странно, должно работать. Попробуй PRINT_WITH_NUMBER_NOW ("NUMBER", ped1, 1000, 1).

Насколько я понял, Ped и Vehicle это не просто переменная типа int, это два класса, описывающие работу с объектами в игре, по крайней мере в хуке от Aru и нет.хуке от HazardX.

По-моему, там есть и типы, и классы с такими названиями.

#49 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 26 April 2015 - 09:14

Dim ped1 As Ped = World.CreatePed(Player.Character.Position.Around(2.0F), Gender.Female)
ped1.NoLongerNeeded()
Native.Function.Call("PRINT_WITH_NUMBER_NOW", "NUMBER", ped1, 2000, 1)

Да, так выдаёт ID пэдов.

А как присвоить переменной типа int значение ID от объекта типа Ped?

...
Dim ped2 As Integer = ped1   'Невозможно преобразовать значение типа "GTA.Ped" в "Integer".

Ещё один аргумент в пользу того, что As Ped и As Vehicle не просто переменная типа integer, это наличие возможности проводить проверку на существование объекта:

If Exists(ped1)

Для переменной типа Integer это не возможно, т.к. ноль для неё это тоже значение и соотв-но проверка всегда будет давать положительный результат.


Сообщение отредактировал vorotkov: 26 April 2015 - 09:25


#50 НикИТОС

НикИТОС

    Активный участник

  • Пользователи
  • PipPipPip
  • 127 сообщений
  • Пол:Мужчина


Отправлено 26 April 2015 - 09:15

А как присвоить переменной типа int значение ID от объекта типа Ped?

Возможно, приведением типов. А тебе зачем?

#51 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 26 April 2015 - 09:36

В своих тестах нативных функций я стараюсь приводить всё к максимально элементарному виду для лучшего понимания механизмов работы, но иногда, когда что-то не работает или работает не так, как надо, для "разбора полётов", включаю в конструкции встроенные хуковские переменные. И т.к. свой набор функций для работы с нейтивами я построил на работе с типами Integer, согласовать As Ped и As Vehicle с ними не получается.

 

 

А как присвоить переменной типа int значение ID от объекта типа Ped?

Возможно, приведением типов. А тебе зачем?

 

Ну вот а как привести казалось бы целочисленную переменную As Ped к таковой же As Integer? :)


Сообщение отредактировал vorotkov: 26 April 2015 - 09:45


#52 НикИТОС

НикИТОС

    Активный участник

  • Пользователи
  • PipPipPip
  • 127 сообщений
  • Пол:Мужчина


Отправлено 26 April 2015 - 10:40

Попробуй метод GetHashCode класса Ped и сравни результат с полученным при помощи нейтива.

#53 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 26 April 2015 - 16:12

Попробуй метод GetHashCode класса Ped и сравни результат с полученным при помощи нейтива.

Точно, выдаёт ID пэда! Спасибо!



#54 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 27 April 2015 - 18:45

НикИТОС, а ты не пробовал играться со светофорами в игре? Возвращаясь к моду "BusMod" by rooft0p, там есть фиксация проезда на красный свет светофора. Я вот думал это сделано через IS_CAR_STOPPED_AT_TRAFFIC_LIGHTS, но вот попробовал эту функцию и что-то мне кажется, что не через неё это сделано.

Просто сев в машину она выдаёт на светофорах всегда "False". Авто НПС при этом, останавливаясь на светофоре, выдают "True". Если "позаимствовать" такое авто прямо на светофоре, когда оно в состоянии "True", то и мы останавливаясь на этом светофоре будем получать "True" + на светофорах по этому же направлению (но не стабильно), на перпендикулярном направлении только "False".

Такое ощущение, что на т/с должен ещё вешаться какой-то индикатор.

Может быть есть возможность считывать сигнал светофора?



#55 НикИТОС

НикИТОС

    Активный участник

  • Пользователи
  • PipPipPip
  • 127 сообщений
  • Пол:Мужчина


Отправлено 28 April 2015 - 14:42

НикИТОС, а ты не пробовал играться со светофорами в игре? Возвращаясь к моду "BusMod" by rooft0p, там есть фиксация проезда на красный свет светофора. Я вот думал это сделано через IS_CAR_STOPPED_AT_TRAFFIC_LIGHTS, но вот попробовал эту функцию и что-то мне кажется, что не через неё это сделано.
Просто сев в машину она выдаёт на светофорах всегда "False". Авто НПС при этом, останавливаясь на светофоре, выдают "True". Если "позаимствовать" такое авто прямо на светофоре, когда оно в состоянии "True", то и мы останавливаясь на этом светофоре будем получать "True" + на светофорах по этому же направлению (но не стабильно), на перпендикулярном направлении только "False".
Такое ощущение, что на т/с должен ещё вешаться какой-то индикатор.
Может быть есть возможность считывать сигнал светофора?

Возможность есть, через игровую память. Но я не думаю, что rooft0p туда лазил. Попробуй HAS_CAR_STOPPED_BECAUSE_OF_LIGHT.

#56 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 30 April 2015 - 11:46

 

НикИТОС, а ты не пробовал играться со светофорами в игре? Возвращаясь к моду "BusMod" by rooft0p, там есть фиксация проезда на красный свет светофора. Я вот думал это сделано через IS_CAR_STOPPED_AT_TRAFFIC_LIGHTS, но вот попробовал эту функцию и что-то мне кажется, что не через неё это сделано.
Просто сев в машину она выдаёт на светофорах всегда "False". Авто НПС при этом, останавливаясь на светофоре, выдают "True". Если "позаимствовать" такое авто прямо на светофоре, когда оно в состоянии "True", то и мы останавливаясь на этом светофоре будем получать "True" + на светофорах по этому же направлению (но не стабильно), на перпендикулярном направлении только "False".
Такое ощущение, что на т/с должен ещё вешаться какой-то индикатор.
Может быть есть возможность считывать сигнал светофора?

Возможность есть, через игровую память. Но я не думаю, что rooft0p туда лазил. Попробуй HAS_CAR_STOPPED_BECAUSE_OF_LIGHT.

 

Попробовал HAS_CAR_STOPPED_BECAUSE_OF_LIGHT:

    Private Function HasCarStoppedBecauseOfLight(ByVal vehHandle As Integer) As Boolean
        If vehHandle = 0 Then Return Nothing
        Return Native.Function.Call(Of Boolean)("HAS_CAR_STOPPED_BECAUSE_OF_LIGHT", vehHandle)
    End Function

Результаты теста примерно как у IS_CAR_STOPPED_AT_TRAFFIC_LIGHTS - работает только на т/с у НПС, но "заимствование" т/с в момент его "True" не даёт результата, в отличии от предыдущей функции.

Похоже всё-таки для них нужен какой-то доп. маркер на т/с или водителя.

Видимо эта функция работает в паре с "IS_CAR_STOPPED_AT_TRAFFIC_LIGHTS" для определения проехало ли т/с на запрещающий сигнал светофора путём сравнения результата их действия.



#57 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 02 May 2015 - 05:10

Возможность есть, через игровую память.

Если припарки не помогают, то пойдём хирургическим путём :D

Можно какие-нибудь примеры методов работы (нахождение/считывание/запись)?



#58 НикИТОС

НикИТОС

    Активный участник

  • Пользователи
  • PipPipPip
  • 127 сообщений
  • Пол:Мужчина


Отправлено 02 May 2015 - 21:33

Собственно, расположение светофоров записано в NOD-файлах, где также хранятся пути автомобилей и лодок. Нейтив HAS_CAR_STOPPED_BECAUSE_OF_LIGHT в оригинальных скриптах я не нашёл, IS_CAR_STOPPED_AT_TRAFFIC_LIGHTS нашёл только в скрипте такси. Я думаю, что его действие не распространяется на автомобиль игрока, потому что игрок движется не по узлам путей, а произвольно, а нейтив как раз проверяет, на каком узле находится автомобиль, и каков флаг этого узла.

 

Искать адрес, по которому пишется состояние светофора тебе придётся с помощью IDA и этой базы (такой же для Grand Theft Auto IV 1.0.7.0, к сожалению, нет). Вот что я думаю по поводу направления поисков:

1. Надо найти в базе нейтив IS_CAR_STOPPED_AT_TRAFFIC_LIGHTS и посмотреть, какой код за ним стоит;

2. Также стоит поискать место, где в игровую память грузятся NOD-файлы, и проследить, куда затем следует флаг узла пути;

3. Ещё может быть полезным информация о том, что светофоры могут обозначаться игрой как «entity with special attribute» или «objects with special attribute»;

4. И напоследок, стоит посмотреть на модель светофора и изучить её на предмет подозрительных дамми и всего такого. В случае провала пытаться искать в базе хотя бы имя модели светофора.

 

Вот где-то на пересечении этих четырёх путей и лежит заветный адресок.

 

UPD: декомпилировал мод, который ты копаешь, и нашёл там GET_TIME_SINCE_PLAYER_RAN_LIGHT.


Сообщение отредактировал НикИТОС: 03 May 2015 - 13:54


#59 vorotkov

vorotkov

    Активный участник

  • Пользователи
  • PipPipPip
  • 63 сообщений

Отправлено 04 May 2015 - 15:56

Большое спасибо! Буду копать :)

 

UPD: декомпилировал мод, который ты копаешь, и нашёл там GET_TIME_SINCE_PLAYER_RAN_LIGHT.

 

А как декомпилировать? Хотя бы примерную схему для понимания процесса. И можно скинуть файл этого мода, а то я не зная о таких возможностях, но желая исправить найденные в моде баги, не дающие нормально играть, уже практически дописал его римейк, дело встало только на динамической загрузке массивов из файлов для выбора маршрута (вернее в лени писать посимвольный перебор файлов для отделения значений, вроде как для себя мне это и не очень то нужно) и не найденной до этого момента функции регистрации проезда на запрещающий сигнал светофора :)



#60 НикИТОС

НикИТОС

    Активный участник

  • Пользователи
  • PipPipPip
  • 127 сообщений
  • Пол:Мужчина


Отправлено 04 May 2015 - 16:13

А как декомпилировать?

Я использую старый добрый дизассемблер IDA. Благо, что байт-код, используемый виртуальной машиной .NET Framework, содержит много метаданных, что позволяет восстановить исходный код с точностью до названий функций.

И можно скинуть файл этого мода, а то я не зная о таких возможностях, но желая исправить найденные в моде баги, не дающие нормально играть, уже практически дописал его римейк, дело встало только на динамической загрузке массивов из файлов для выбора маршрута (вернее в лени писать посимвольный перебор файлов для отделения значений, вроде как для себя мне это и не очень то нужно) и не найденной до этого момента функции регистрации проезда на запрещающий сигнал светофора :)

Не пойму, о чём ты. Ты же сам скидывал ссылку на этот мод в первом сообщении темы.




Количество пользователей, читающих эту тему: 3

0 пользователей, 3 гостей, 0 анонимных