GTA Builder Форум

GTA Vice City => Моды => Тема начата: Prographer от Октябрь 27, 2019, 07:33:12 pm

Название: SkinSwitcher
Отправлено: Prographer от Октябрь 27, 2019, 07:33:12 pm
Всем привет! :) Недавно начал тут работать над небольшим модом по выбору и покупке одежды в VC, но столкнулся с небольшой проблемой. Изначально планировал сделать так, чтобы мод можно было расширять, добавляя новые точки на карте через опкод 05F5 (http://gtagmodding.com/opcode-database/opcode/05F5/), но приходится каждую точку добавлять в отдельный файл. Пожалуйста, подскажите, может, как-то можно сделать лучше?

Вот сам скрипт
https://yadi.sk/d/xHQ3O1kNX6cxxw (https://yadi.sk/d/xHQ3O1kNX6cxxw)

Видео с демонстрацией работы
https://yadi.sk/i/dqBpTPBJTKpbaA (https://yadi.sk/i/dqBpTPBJTKpbaA)
https://yadi.sk/i/MfTsm4fdaCz1ow (https://yadi.sk/i/MfTsm4fdaCz1ow)

Кстати, делаю ещё небольшую штуку, типа небольшого фреймворка. Его код есть в архиве с модом. Суть его в том, чтобы абстрагироваться от опкодов и сделать набор функций делающий всё самое необходимое одним вызовом опкода 05F5 с параметрам или без.
Название: Re: SkinSwitcher
Отправлено: Shagg_E от Октябрь 27, 2019, 10:38:18 pm
Классный мод!
но приходится каждую точку добавлять в отдельный файл. Пожалуйста, подскажите, может, как-то можно сделать лучше?
В теории, можно как-то задать и менять через CLEO строку и потом при помощи неё подгружать изменяемые данные из ini, где точки будут обозначены примерно так:
[MAIN]
SQUANT = 2 // quantity of spots

[SPOT1]
X = 230.9363
Y = -1262.4741
Z = 20.1103
COMMERC = 0

[SPOT2]
X = 409.886
Y = 1037.4531
Z = 25.2999
COMMERC = 1

- и т.д. Т.е. изменяемой строкой будет ключ секции "SPOTx":

Код: Text
  1. 0AF0: 0@ = get_int_from_ini_file "cleo\skin_switcher.ini" section "MAIN" key "SQUANT"  // получаем общее кол-во точек
  2. 0006: 5@ = 0
  3.  
  4. :CYCLE
  5. 001D:   0@ > 5@
  6. jf @END
  7. 000A: 5@ += 1
  8.  
  9. // тут, в зависимости от текущего значения 5@, меняется строка 15@, от "SPOT1" до "SPOTx"(где x = 0@)
  10.  
  11. 0AF2: 1@ = get_float_from_ini_file "cleo\skin_switcher.ini" section 15@ key "X"
  12. 0AF2: 2@ = get_float_from_ini_file "cleo\skin_switcher.ini" section 15@ key "X"
  13. 0AF2: 3@ = get_float_from_ini_file "cleo\skin_switcher.ini" section 15@ key "X"
  14. 0AF0: 4@ = get_int_from_ini_file "cleo\skin_switcher.ini" section 15@ key "COMMERC"
  15. 05F5: call_scm_func @CreateSkinSwitcher params_count 4  1@ 2@ 3@ 4@
  16. jump @CYCLE
  17.  
  18. :END
  19. end_thread


. Но я не знаю, как сделать самое интересное - как править строки через CLEO...

Кстати, делаю ещё небольшую штуку, типа небольшого фреймворка. Он его код есть в архиве с модом. Суть его в том, чтобы абстрагироваться от опкодов и сделать набор функций делающий всё самое необходимое одним вызовом опкода 05F5 с параметрам или без.

Вообще - хорошая идея, должна прокатить. У меня с функциями CarRec не прокатило(даже с моей помощью, людям было слишком сложно пользоваться, и они просто забивали) возможно потому, что функции лежали просто отдельным текстовиком. До инклудов я тогда как-то не догадался ¯\_(ツ)_/¯
Название: Re: SkinSwitcher
Отправлено: Prographer от Октябрь 27, 2019, 11:15:58 pm
Цитировать
Вообще - хорошая идея, должна прокатить. У меня с функциями CarRec не прокатило(даже с моей помощью, людям было слишком сложно пользоваться, и они просто забивали) возможно потому, что функции лежали просто отдельным текстовиком. До инклудов я тогда как-то не догадался ¯\_(ツ)_/¯
По-моему, достаточно удобно будет, например, создать педа. Сейчас для его создания нужно написать достаточно кода: загрузить модель, проверить её, и только после этого создавать. Для новичка это не очевидно, поэтому одной функции будет достаточно, которая просто вернёт хендл готового педа. Также это решит проблему с количеством локальных переменных. Пожалуй, создам репу на GitHub, чтобы каждый смог внести свой вклад.

Цитировать
. Но я не знаю, как сделать самое интересное - как править строки через CLEO...
Пожалуй, да. Это самый главный вопрос :)
Название: Re: SkinSwitcher
Отправлено: Shagg_E от Октябрь 28, 2019, 12:19:22 am
По-моему, достаточно удобно будет, например, создать педа. Сейчас для его создания нужно написать достаточно кода: загрузить модель, проверить её, и только после этого создавать. Для новичка это не очевидно, поэтому одной функции будет достаточно, которая просто вернёт хендл готового педа. Также это решит проблему с количеством локальных переменных. Пожалуй, создам репу на GitHub, чтобы каждый смог внести свой вклад.
   Ну да, только всё равно нужно всё хорошенько обдумать, чтобы не возникла ситуация, когда для новичков "слишком сложно", а для опытных "слишком упрощенно, без свободы"(тот же спавн педов в оригинальном своем виде хорош оптимизацией ресурсов. Функция, в свою очередь, будет для каждого педа вызывать load requested models, что выльется в лаги и/или другие проблемы с производительностью, если нужно заспавнить сразу много педов). В этом плане, усидеть на двух стульях крайне сложно. Я из-за этого всё-таки решил делать свои опкоды: и у меня больше свободы, и людям, в случае чего, будет проще это использовать.
   Т.е. тут проблема в "рынке". Многие скриптеры Вайса уходят в программирование либо вообще из моддинга. Те же, кто остались, в основном делятся на тех, кто не сможет использовать сложные(пусть и функциональные) решения и тех, кто сможет, но им это не нужно. И только единицы будут готовы заморочиться как угодно лишь ради того, чтобы получить нужный функционал(я таким был - потом всё же перешел в категорию "создателей решений").
   В итоге, готовые простые решения разлетаются как пирожки, а всё, что чуть сложнее ковыряния ini - не уходит дальше просмотров на Youtube.
   Сейчас есть взрыв популярности GTA 3d-эры в Латинской Америке и Индии, но им зачастую, опять же, проще перескакивать процесс углубленного скриптинга сразу в программирование.
   Если же говорить про совсем-совсем новичков - знаю, что определенно есть существенный спрос на аналог DYOM для Вайса. Но это довольно масштабная разработка - никто за неё, скорее всего, не возьмется.
   А вот чего я не знаю - так это того, что в этой ситуации делать. Лично я пару лет назад решил окончательно забить на это и делать всё только для себя(своих проектов). И выкатывать в паблик лишь те вещи, что, так уж вышло, подходят и для ванильного вайса.

P.S. Я ни в коем случае не пытаюсь тебя отговорить от создания подобного инструмента. Просто будь готов, что если не продумаешь вопрос "рынка" - ты можешь получить тысячи просмотров на YouTube и даже сотню закачек, но 0 практических использований(как было у меня с MMS и CarRec).

Пожалуй, да. Это самый главный вопрос
   Есть опкод 0AD3(есть и в CLEO Вайса), он как бы и позволяет форматировать строки(типа, там должно быть не 15@, а 15@v), а потом пихать их куда заблагорассудится. Но я совершенно не копал эту тему(видел лишь когда-то примеры использования в SA, но уже не помню, где), а сейчас и времени на это не находится...
   Будет круто, если ты сможешь разобраться и отпишешься о результатах. Приложил к сообщению хэлп-файл CLEO4, там есть простенькое описание.
Название: Re: SkinSwitcher
Отправлено: Prographer от Ноябрь 04, 2019, 11:22:56 am
Запилено. Милости прошу опробовать ;)
https://github.com/PrographerMan/skin-switcher (https://github.com/PrographerMan/skin-switcher)
Название: Re: SkinSwitcher
Отправлено: Shagg_E от Ноябрь 05, 2019, 03:24:24 pm
Нашел минутку затестить. Всё работает здорово, но из-за того, что камера в отеле не строго фиксирована, а стоит относительно игрока - иногда(в зависимости от прогресса прохождения) одежда может перекрывать игрока (https://i.gyazo.com/af5d7e8e61c334cfbd63928e1ed07651.jpg), а иногда - нет (https://i.gyazo.com/0deb00519ccac5b748e4d3d524c201c6.jpg)(на освещение не обращай внимание - это мое баловство). Да и сам шкаф просвечивает даже на твоем видео. Наверное, лучше камеру расположить по другую сторону от игрока. Хотя - в этом случае усложняется процесс написания таких точек...
Есть один вариант: каждые 200-300 миллисекунд записываются координаты игрока в специальные переменные. Перезаписываются эти координаты только в случае, если игрок ушел от предыдущих координат на метр. Должно быть 2 тройки координат: первые сменяют вторые, а вторые - первые, т.е. поочередная запись. Так вот, при заходе на маркер скрипт должен оценить, какие из этой пары координат находятся дальше от игрока, и плюхнуть туда камеру. Таким образом, никогда не возникнет ситуации, что камера расположена там, где её не могло быть(за стеной, например), поскольку камера всегда будет там, где игрок физически бывал, на расстоянии 1-2 метра.
Название: Re: SkinSwitcher
Отправлено: Prographer от Ноябрь 05, 2019, 09:54:29 pm
Действительно, косяк. Спасибо, исправлю :)