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


Фотография

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

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

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

#21 НикИТОС

НикИТОС

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

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


Отправлено 08 April 2015 - 15:43

Я хочу разобраться в основах скриптинга GTA, дабы понимать как всё работает, поэтому и ковыряюсь )

Тогда советую скачать GTA IV SCOCL, дабы приблизить процесс написания скриптов к стилю R*

Вот кстати столкнулся с ещё одной непонятностью:
В Net ScriptHook v1.7.1.7b by HazardX есть функция "Player.Character.Invincible" - неуязвимость персонажа.
Если повесить её на кнопку, то она прекрасно работает:
А вот если её поставить просто в запуск при загрузке скрипта, то она нефурычит...
Результат, как и описан выше. Как думаешь, в чём подвох?

Думаю, что задержки не хватает, и скрипт пытается сделать игрока неуязвимым ещё до его инициализации. Попробуй сделать десятисекундный обратный отсчёт перед Player.Character.Invincible = True. Вот и посмотришь, с какой секунды пойдёт отсчёт после старта игры и заодно узнаешь, в этом ли причина.

Кстати, раз уж нейтивами балуешься, советую для игрока всё-таки юзать SET_PLAYER_INVINCIBLE(pid, TRUE).

#22 vorotkov

vorotkov

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

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

Отправлено 09 April 2015 - 07:57

Тогда советую скачать GTA IV SCOCL, дабы приблизить процесс написания скриптов к стилю R*

Надо же, а я думал GTA IV SCOCL так и не появился в открытом доступе... Где-то читал, что Александр забросил его, так и не закончив. Приятно удивил :)

Но пока буду ковырять хук используя VB.NET, ибо Си знаю очень поверхностно, не более, чем прочитать и понять что делает программа, а т.к. ещё нет даже базового понимания как работает GTA, то вкупе с малознакомым синтаксисом это добавит только больше головной боли, чем пользы...

 

 


Вот кстати столкнулся с ещё одной непонятностью:
В Net ScriptHook v1.7.1.7b by HazardX есть функция "Player.Character.Invincible" - неуязвимость персонажа.
Если повесить её на кнопку, то она прекрасно работает:
А вот если её поставить просто в запуск при загрузке скрипта, то она нефурычит...
Результат, как и описан выше. Как думаешь, в чём подвох?

Думаю, что задержки не хватает, и скрипт пытается сделать игрока неуязвимым ещё до его инициализации. Попробуй сделать десятисекундный обратный отсчёт перед Player.Character.Invincible = True. Вот и посмотришь, с какой секунды пойдёт отсчёт после старта игры и заодно узнаешь, в этом ли причина.

 

Действительно, с таймером (As New GTA.Timer) заработало, но это уже получается чистое шаманство, а не программирование...

До этого пробовал задавать задержку через Wait(15000) и это не давало никакого эффекта, а таймер с отсчётом от 700мс активирует SET_PLAYER_INVINCIBLE...



#23 vorotkov

vorotkov

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

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

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

И очередной вопрос :)

GET_AMMO_IN_CLIP / SET_AMMO_IN_CLIP

Видимо я не правильно указываю хэндл оружия:

Dim pAIC As New Native.Pointer(GetType(Integer))
Native.Function.Call("GET_AMMO_IN_CLIP", Player.Character, 12, pAIC)   '12 = SMG_Uzi
Game.DisplayText("GET_AMMO_IN_CLIP = " & pAIC.ToString)
Native.Function.Call("SET_AMMO_IN_CLIP", Player, 12, 100)

Т.к. тип параметра #2 указан как integer, то я посчитал, что это ID оружия, но видимо это не так...


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


#24 НикИТОС

НикИТОС

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

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


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

Надо же, а я думал GTA IV SCOCL так и не появился в открытом доступе... Где-то читал, что Александр забросил его, так и не закончив. Приятно удивил :)

Видимо, ты перепутал с C4 listener'а.

Действительно, с таймером (As New GTA.Timer) заработало, но это уже получается чистое шаманство, а не программирование...
До этого пробовал задавать задержку через Wait(15000) и это не давало никакого эффекта, а таймер с отсчётом от 700мс активирует SET_PLAYER_INVINCIBLE...

Кто знает... Можешь попробовать:
1. вызывать нейтив WAIT, (по-моему задержка в хуке реализована в обход нейтива). А ещё лучше писать лог всего этого действа в файл, если сам хук этого не умеет.
2. добавить до задержки другую команду или разбить задержку на две с бесполезной командой между ними (вдруг задержка в начале скрипта игнорируется).

И очередной вопрос :)
GET_AMMO_IN_CLIP / SET_AMMO_IN_CLIP
Видимо я не правильно указываю хэндл оружия:

Dim pAIC As New Native.Pointer(GetType(Integer))
Native.Function.Call("GET_AMMO_IN_CLIP", Player.Character, 12, pAIC)   '12 = SMG_Uzi
Game.DisplayText("GET_AMMO_IN_CLIP = " & pAIC.ToString)
Native.Function.Call("SET_AMMO_IN_CLIP", Player, 12, 100)
Т.к. тип параметра #2 указан как integer, то я посчитал, что это ID оружия, но видимо это не так...

Как всегда, не помню деталей, могу только посоветовать предварительно использовать GET_CURRENT_CHAR_WEAPON. Ну и я не знаю, не закосячил ли ты с обращением к игроку, потому что не понимаю, чем у тебя отличается Player от Player.Character.

#25 vorotkov

vorotkov

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

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

Отправлено 10 April 2015 - 06:14

Кто знает... Можешь попробовать:
1. вызывать нейтив WAIT, (по-моему задержка в хуке реализована в обход нейтива).
Что-то не пашет WAIT в GTA iV, не даёт задержки:
If e.Key = Keys.NumPad0 Then
   Native.Function.Call("WAIT", 10000)
   Game.DisplayText("TEST", 1000)
End If
А ещё лучше писать лог всего этого действа в файл, если сам хук этого не умеет.
Честно говоря, пока не представляю как это сделать, программист из меня аховый :D
Попробую разобраться.
Как всегда, не помню деталей, могу только посоветовать предварительно использовать GET_CURRENT_CHAR_WEAPON. Ну и я не знаю, не закосячил ли ты с обращением к игроку, потому что не понимаю, чем у тебя отличается Player от Player.Character.

В Net ScriptHook v1.7.1.7b by HazardX переменная Player это результат выполнения функции "CONVERT_INT_TO_PLAYERINDEX", а Player.Character это "GET_PLAYER_CHAR".

В описании GET_AMMO_IN_CLIP указан "Parameter 1    integer    Char handle", поэтому там соответственно использовал "Player.Character", а в SET_AMMO_IN_CLIP стоит "Parameter 1    integer    player index", т.е. "Player".

И ты как обычно оказался прав, если заменить Player на Player.Character, то функция заработала. Т.е. в описании SET_AMMO_IN_CLIP допущена ошибка - в параметре #1 вместо "player index" должно стоять "Char handle".

В который раз попадаюсь на доверии в правильности описания функций на сайте :lol:


Сообщение отредактировал vorotkov: 10 April 2015 - 06:16


#26 vorotkov

vorotkov

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

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

Отправлено 13 April 2015 - 12:07

Подскажите пж-та, с помощью какой функции можно предотвратить вылет персонажа через лобовое стекло транспортного средства при столкновении?



#27 НикИТОС

НикИТОС

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

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


Отправлено 13 April 2015 - 12:19

Подскажите пж-та, с помощью какой функции можно предотвратить вылет персонажа через лобовое стекло транспортного средства при столкновении?

SET_CHAR_WILL_FLY_THROUGH_WINDSCREEN(Ped ped, boolean value);

#28 vorotkov

vorotkov

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

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

Отправлено 13 April 2015 - 17:06

О! Спасибо!!! А я всё искал функцию со словом _CAR_, думал её название что-то аналогичное SET_CHAR_CAN_BE_KNOCKED_OFF_BIKE



#29 vorotkov

vorotkov

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

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

Отправлено 13 April 2015 - 17:25

Ещё пара вопросов: :)

Возможно ли через скрипт переназначить игровые клавиши управления?
Т.е., например, в игре клавиша "Вперёд" по умолчанию назначена на "W", возможно ли её в процессе игрового процесса динамически изменить?
Или хотя бы принудительно её "отпустить" по какому-либо условию во время нажатия пользователем?

 

И ещё просьба:

При использовании GTA4.Net ScriptHook v1.7.1.7b by HazardX можно вызвать консоль клавишей '~'. Так вот, при её вызове видимо активируется какой-то Debug-режим для игры - камера фиксируется, игрок принудительно останавливается, при это это не просто Freeze - объекты физически обрабатываются.

Не мог бы ты посмотреть исходник GTA4.Net ScriptHook v1.7.1.7b by HazardX, если конечно разбираешься в Си, на предмет определения функции вызывающей данный режим или хотя бы подсказать в каком направлении копать?

Переменная в коде, вызывающая консоль называется "ConsoleKey", сам файл описывающий работу консоли Console.cpp.

Я смотрел, но не нашёл, всё-таки ограничивает мало знакомый синтаксис.


Сообщение отредактировал vorotkov: 13 April 2015 - 17:28


#30 НикИТОС

НикИТОС

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

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


Отправлено 13 April 2015 - 18:11

Ещё пара вопросов: :)
Возможно ли через скрипт переназначить игровые клавиши управления?
Т.е., например, в игре клавиша "Вперёд" по умолчанию назначена на "W", возможно ли её в процессе игрового процесса динамически изменить?
Или хотя бы принудительно её "отпустить" по какому-либо условию во время нажатия пользователем?

Не совсем понимаю, что тебе нужно. Опиши, что конкретно хочешь реализовать.

#31 vorotkov

vorotkov

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

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

Отправлено 13 April 2015 - 18:35

Хочу реализовать принудительное "отпускание" клавиши "Назад" при торможении автомобиля, в момент достижения им нулевой скорости, для предотвращения автоматического начала реверсивного движения. Просто принудительная остановка авто без "отрывания" пользователя от клавиатуры даёт не реалистичную картину происходящего на экране. Собственно поэтому и про консоль нет-скриптхука спрашиваю, там осуществляется физически правильная остановка транспортного средства в момент её запуска (вплоть до того, что у игрока вычитается HP из-за возникшего при этом резком сбросе скорости (напр. с 80 до 0). Сделал для себя уже около десятка версий данного мода, но вот идеальной картины не получается, в каждом из применённых методов есть свои минусы - где-то физическая картина процесса, где-то визуальная.


Сообщение отредактировал vorotkov: 13 April 2015 - 19:03


#32 НикИТОС

НикИТОС

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

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


Отправлено 13 April 2015 - 18:41

Хочу реализовать принудительное "отпускание" клавиши "Назад" при торможении автомобиля, в момент достижения им нулевой скорости, для предотвращения автоматического начала реверсивного движения. Просто принудительная остановка авто без "отрывания" пользователя от клавиатуры даёт не реалистичную картину происходящего на экране. Собственно поэтому и про консоль нет-скриптхука спрашиваю, там осуществляется физически правильная остановка транспортного средства в момент её запуска (вплоть до того, что у игрока вычитается HP из-за возникшего при этом резком сбросе скорости (напр. со 100 до 0).

Жаль, нет возможности запустить игру и посмотреть, как оно выглядит. Возможно, там используется SET_TIME_SCALE(float scale).

Также стоит покопаться вокруг NetHook::Console->isActive во всех файлах исходников.

Сообщение отредактировал НикИТОС: 13 April 2015 - 18:49


#33 vorotkov

vorotkov

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

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

Отправлено 13 April 2015 - 19:13

Ок, гляну, но мне кажется там что-то другое, нежели SET_TIME_SCALE, ибо всё вокруг не затормаживается, а принудительно останавливается только игрок, остальной мир живёт своей жизнью (так, например, пока мы копаемся в консоли, в авто игрока может въехать какой-нибудь неуклюжий водитель :D и коллизии обоих транспортных средств при этом будут обработаны корректно и в реальном времени).


Сообщение отредактировал vorotkov: 13 April 2015 - 19:13


#34 НикИТОС

НикИТОС

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

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


Отправлено 13 April 2015 - 19:17

Ок, гляну, но мне кажется там что-то другое, нежели SET_TIME_SCALE, ибо всё вокруг не затормаживается, а принудительно останавливается только игрок, остальной мир живёт своей жизнью (так, например, пока мы копаемся в консоли, в авто игрока может въехать какой-нибудь неуклюжий водитель :D и коллизии обоих транспортных средств при этом будут обработаны корректно и в реальном времени).

Думаю, SET_PLAYER_CONTROL тебе подойдёт.

#35 vorotkov

vorotkov

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

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

Отправлено 13 April 2015 - 19:29

Спасибо! Буду пробовать.

 

P.S. Ещё вот кстати нашёл FREEZE_CAR_POSITION_AND_DONT_LOAD_COLLISION, может эта функция что-то прояснит... До этого пользовался только встроенной командой хука "Player.Character.CurrentVehicle.FreezePosition" (FREEZE_CAR_POSITION), а она останавливает объект с "замораживанием" физики.


Сообщение отредактировал vorotkov: 13 April 2015 - 19:48


#36 vorotkov

vorotkov

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

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

Отправлено 13 April 2015 - 20:23

Шикарно! SET_PLAYER_CONTROL именно то, что надо!!! Преогромнейшее спасибо!!!



#37 vorotkov

vorotkov

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

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

Отправлено 18 April 2015 - 08:11

Вот здесь нашёл интересную тему, про вывод диагностической информации об объектах в игре прямо в 3-D мире.

Там есть скрин, на котором рисуется прямоугольник без заливки, но с белой рамкой. Какой функцией такое можно осуществить, ведь DRAW_RECT не умеет рисовать рамки?

 

Посмотрел исходники хука, похоже там через Direct3D идёт рисование.


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


#38 VcSaJen

VcSaJen

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

  • Пользователи
  • PipPipPip
  • 270 сообщений
  • Пол:Мужчина
  • Интересы:GTA, скриптинг в GTA.


Отправлено 20 April 2015 - 03:44

на котором рисуется прямоугольник без заливки, но с белой рамкой. Какой функцией такое можно осуществить, ведь DRAW_RECT не умеет рисовать рамки?

Просто рисуешь с DRAW_RECT четыре очень тонких прямоугольника по сторонам.

Или если прямоугольник статичен (размер не изменяется), то можно текстуру рамки загрузить.

Сообщение отредактировал VcSaJen: 20 April 2015 - 03:46


#39 vorotkov

vorotkov

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

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

Отправлено 20 April 2015 - 19:38

Возник ещё один вопрос: как получить данные из GET_CAR_FORWARD_VECTOR (Parameter 2    vector3     variable to store forward vector) используя только стандартные средства программирования, через переменные типа float? Массив? Или создать объект содержащий 3 переменные типа float? Если можно, то хотелось бы пример кода на любом синтаксисе.


Сообщение отредактировал vorotkov: 20 April 2015 - 19:39


#40 НикИТОС

НикИТОС

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

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


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

Возник ещё один вопрос: как получить данные из GET_CAR_FORWARD_VECTOR (Parameter 2    vector3     variable to store forward vector) используя только стандартные средства программирования, через переменные типа float? Массив? Или создать объект содержащий 3 переменные типа float? Если можно, то хотелось бы пример кода на любом синтаксисе.

GET_CAR_FORWARD_VECTOR(Car car, Vector3 *vec), где
typedef struct _Vector3
{
float x;
float y;
float z;
} Vector3, *PVector3;

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




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

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