Что-то не получается. Если использовать встроенный в хук Vector3 или Vector2, то выдаёт нули, а если свою структуру, так вообще даёт ошибку...
Интересный скрипт миссии "BusMod" by rooft0p, разбор полётов.
#41
Отправлено 22 April 2015 - 06:01
#42
Отправлено 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
Отправлено 22 April 2015 - 18:57
потому что в одном случае используется Int32 (там где минус), а во втором UInt32.
(байты те же, но интерпретация разная)
#44
Отправлено 23 April 2015 - 03:10
Я тоже об этом подумал, только ведь запрос в GTA IV с указанием беззнаковых типов не работает, как с этим бороться?
#45
Отправлено 26 April 2015 - 07:10
Столкнулся с таким, по сути базовым вопросом, на который до этого как-то не обращал внимания, т.к. в тестах оперировал только игроком и его авто.
А как получить хэндл (номер объекта в текущей игровой сессии, тип Integer) окружающих пэдов и транспортных средств? Т.е. получить не сборный класс параметров и функций As Ped и As Vehicle в хуке, а именно просто номер объекта, по которому собственно и идёт потом оперирование с ним в игре.
Для игрока это функция GET_PLAYER_CHAR, а вот для иных объектов я такового не нашёл...
Есть только перекрёстные опросы:
GET_CHAR_IN_CAR_PASSENGER_SEAT
Сообщение отредактировал vorotkov: 26 April 2015 - 07:49
#46
Отправлено 26 April 2015 - 07:33
Не совсем понимаю, что тебе нужно. По сути типы Ped и Vehicle являются целочисленными переменными, просто названы так, чтобы нам было легче их воспринимать. То есть, за этими типами и кроются хэндлы. GET_CLOSEST_CHAR, например, на выходе даёт то же самое, что и GET_PLAYER_CHAR. И GET_DRIVER_OF_CAR выдаёт то же.Столкнулся с таким, по сути базовым вопросом, на который до этого как-то не обращал внимания, т.к. в тестах оперировал только игроком и его авто.
А как получить хэндл (номер объекта в текущей игровой сессии, тип Integer) окружающих пэдов и транспортных средств? Т.е. получить не сборный класс параметров и функций As Ped и As Vehicle в хуке, а именно просто номер объекта, по которому собственно и идёт потом оперирование с ним в игре.
Для игрока это функция GET_PLAYER_CHAR, а вот для иных объектов я такового не нашёл...
Существуют разные представления одних и тех же данных. В данном случае даже представление одно, всё решает typedef. Пример с нейтивами выше применим к GTA IV SCOCL, можно его же изменить так, чтобы вместо Ped везде было PlayerID. Поэтому смотри не в энциклопедию, где частные случаи перемешаны с общими, а в свой хук. Тогда не прогадаешь.
В ScriptingOrig.h видно, что вышеперечисленные нейтивы имеют результатом один тип Ped. Там же видно, чем на самом деле он является (typedef int Ped;).
Сообщение отредактировал НикИТОС: 26 April 2015 - 08:05
#47
Отправлено 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
Отправлено 26 April 2015 - 08:56
Странно, должно работать. Попробуй PRINT_WITH_NUMBER_NOW ("NUMBER", ped1, 1000, 1).Я смотрел исходники хука, да видел, что 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.
#49
Отправлено 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
Отправлено 26 April 2015 - 09:15
Возможно, приведением типов. А тебе зачем?А как присвоить переменной типа int значение ID от объекта типа Ped?
#51
Отправлено 26 April 2015 - 09:36
В своих тестах нативных функций я стараюсь приводить всё к максимально элементарному виду для лучшего понимания механизмов работы, но иногда, когда что-то не работает или работает не так, как надо, для "разбора полётов", включаю в конструкции встроенные хуковские переменные. И т.к. свой набор функций для работы с нейтивами я построил на работе с типами Integer, согласовать As Ped и As Vehicle с ними не получается.
Возможно, приведением типов. А тебе зачем?А как присвоить переменной типа int значение ID от объекта типа Ped?
Ну вот а как привести казалось бы целочисленную переменную As Ped к таковой же As Integer?
Сообщение отредактировал vorotkov: 26 April 2015 - 09:45
#52
Отправлено 26 April 2015 - 10:40
#53
Отправлено 26 April 2015 - 16:12
Попробуй метод GetHashCode класса Ped и сравни результат с полученным при помощи нейтива.
Точно, выдаёт ID пэда! Спасибо!
#54
Отправлено 27 April 2015 - 18:45
НикИТОС, а ты не пробовал играться со светофорами в игре? Возвращаясь к моду "BusMod" by rooft0p, там есть фиксация проезда на красный свет светофора. Я вот думал это сделано через IS_CAR_STOPPED_AT_TRAFFIC_LIGHTS, но вот попробовал эту функцию и что-то мне кажется, что не через неё это сделано.
Просто сев в машину она выдаёт на светофорах всегда "False". Авто НПС при этом, останавливаясь на светофоре, выдают "True". Если "позаимствовать" такое авто прямо на светофоре, когда оно в состоянии "True", то и мы останавливаясь на этом светофоре будем получать "True" + на светофорах по этому же направлению (но не стабильно), на перпендикулярном направлении только "False".
Такое ощущение, что на т/с должен ещё вешаться какой-то индикатор.
Может быть есть возможность считывать сигнал светофора?
#55
Отправлено 28 April 2015 - 14:42
Возможность есть, через игровую память. Но я не думаю, что rooft0p туда лазил. Попробуй HAS_CAR_STOPPED_BECAUSE_OF_LIGHT.НикИТОС, а ты не пробовал играться со светофорами в игре? Возвращаясь к моду "BusMod" by rooft0p, там есть фиксация проезда на красный свет светофора. Я вот думал это сделано через IS_CAR_STOPPED_AT_TRAFFIC_LIGHTS, но вот попробовал эту функцию и что-то мне кажется, что не через неё это сделано.
Просто сев в машину она выдаёт на светофорах всегда "False". Авто НПС при этом, останавливаясь на светофоре, выдают "True". Если "позаимствовать" такое авто прямо на светофоре, когда оно в состоянии "True", то и мы останавливаясь на этом светофоре будем получать "True" + на светофорах по этому же направлению (но не стабильно), на перпендикулярном направлении только "False".
Такое ощущение, что на т/с должен ещё вешаться какой-то индикатор.
Может быть есть возможность считывать сигнал светофора?
#56
Отправлено 30 April 2015 - 11:46
Возможность есть, через игровую память. Но я не думаю, что rooft0p туда лазил. Попробуй HAS_CAR_STOPPED_BECAUSE_OF_LIGHT.НикИТОС, а ты не пробовал играться со светофорами в игре? Возвращаясь к моду "BusMod" by rooft0p, там есть фиксация проезда на красный свет светофора. Я вот думал это сделано через IS_CAR_STOPPED_AT_TRAFFIC_LIGHTS, но вот попробовал эту функцию и что-то мне кажется, что не через неё это сделано.
Просто сев в машину она выдаёт на светофорах всегда "False". Авто НПС при этом, останавливаясь на светофоре, выдают "True". Если "позаимствовать" такое авто прямо на светофоре, когда оно в состоянии "True", то и мы останавливаясь на этом светофоре будем получать "True" + на светофорах по этому же направлению (но не стабильно), на перпендикулярном направлении только "False".
Такое ощущение, что на т/с должен ещё вешаться какой-то индикатор.
Может быть есть возможность считывать сигнал светофора?
Попробовал 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
Отправлено 02 May 2015 - 05:10
Возможность есть, через игровую память.
Если припарки не помогают, то пойдём хирургическим путём
Можно какие-нибудь примеры методов работы (нахождение/считывание/запись)?
#58
Отправлено 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
Отправлено 04 May 2015 - 15:56
Большое спасибо! Буду копать
UPD: декомпилировал мод, который ты копаешь, и нашёл там GET_TIME_SINCE_PLAYER_RAN_LIGHT.
А как декомпилировать? Хотя бы примерную схему для понимания процесса. И можно скинуть файл этого мода, а то я не зная о таких возможностях, но желая исправить найденные в моде баги, не дающие нормально играть, уже практически дописал его римейк, дело встало только на динамической загрузке массивов из файлов для выбора маршрута (вернее в лени писать посимвольный перебор файлов для отделения значений, вроде как для себя мне это и не очень то нужно) и не найденной до этого момента функции регистрации проезда на запрещающий сигнал светофора
#60
Отправлено 04 May 2015 - 16:13
Я использую старый добрый дизассемблер IDA. Благо, что байт-код, используемый виртуальной машиной .NET Framework, содержит много метаданных, что позволяет восстановить исходный код с точностью до названий функций.А как декомпилировать?
Не пойму, о чём ты. Ты же сам скидывал ссылку на этот мод в первом сообщении темы.И можно скинуть файл этого мода, а то я не зная о таких возможностях, но желая исправить найденные в моде баги, не дающие нормально играть, уже практически дописал его римейк, дело встало только на динамической загрузке массивов из файлов для выбора маршрута (вернее в лени писать посимвольный перебор файлов для отделения значений, вроде как для себя мне это и не очень то нужно) и не найденной до этого момента функции регистрации проезда на запрещающий сигнал светофора
Количество пользователей, читающих эту тему: 2
0 пользователей, 2 гостей, 0 анонимных