Может кого заинтересует, на просторах здум форума нашёл пост от ззузха, о добавлении к монстрам атаку на упреждение
На зскрипт ее не планируют переводить?
Добавлено спустя 1 час 24 минуты 9 секунд:
ZZYZX:
Можно делать менюшки, можно делать статусбары, можно делать intermission'ы, всё это не привязано к конкретному виду, а можно напрямую отрисовать всё, что тебе надо. Причём не на 35фпс, а на реальном фпс экрана.
А если я делаю 3дмодель для монстра или HUD оружия, то реально сделать чтобы она рендерилась (интерполировалась) не в 35 фпс, а в реальном фпс экрана?
ZZYZX:
А, да, ещё там прямой текстовый инпут есть. И мыша.
Я правильно понял, что "прямой текстовый инпут" это считывание данных из текстового файла, которое может помочь при реализации спавна монстров за донат?
Может кого заинтересует, на просторах здум форума нашёл пост от ззузха, о добавлении к монстрам атаку на упреждение
Это вещь! Реализована скриптами? Идея взята с DoomLegacy ?(там называлось "Prediction Monsters") там эта хрень уже лет как 10 реализована, и было очень жаль что в GZDOOM ее в настройках нет, но теперь...
Не создавали, но смысл в ней сейчас хз. Никто толком ничего про зскрипт тут не знает, а кто знает, либо лень, либо сложно с этим делом кому-то помогать т.к. зскрипт уже скорее полноценный ЯП. Нормальных доков еще нет и когда появятся не известно.
Если по шаблону:
заказ на Zcкрипт от: YURA111
Cкрипт должен:
Мне нужна полная эмуляция функции: https://zdoom.org/wiki/A_SorcSpinBalls Порт: GZDoom v2.4+
Если это возможно конечно.
Функция является Хексеновской и может быть использована только с акторами которые являются дочерними от актора "Heresiarch". Мне это никак не подходит, а функция нужна...
YURA_111 делал в прошлом году такую функцию на декорейте и ACS(хотя там не только это функция, а весь ерисиарх). получилось такое: (звук уже исправлен)
из недостатков: звук и атака фиолетовыми шарами не в точности повторяют оригинал, нет ускорения в начале быстрого вращения, сразу переход на максимальную или минимальную скорость вращения.
подумываю переделать на Zscript.
делал в прошлом году такую функцию на декорейте и ACS
Впечатляет! И смотрится действительно круто и то, что весь монстр сделан это хорошо, но я бы все таки хотел если не точную копию, то близкую по действию.
Dasperal:
из недостатков: звук и атака фиолетовыми шарами не в точности повторяют оригинал.
подумываю переделать на Zscript.
Если сделаешь - ОГРОМНАЯ просьба, поделись пожалуйста - сам точно не осилю
Других монстров еретика и хексена я переделываю декорейтом, т.к. ACS боюсь использовать и поэтому не изучаю из за возможных проблем в мультиплеере (мой мод мультиплеерный). Иногда получается много "букавок" - но работает именно так, как мне нужно...
Подробно что должен делать скрипт: что бы при использовании оружия ближнего боя(пользовательского),на экране игрока появлялись капли крови ,а по окончанию боя игрок вытирал кровь рукой
Подробно что должен делать скрипт: В мультиплеере, когда один игрок зашел в некую неизведанную локацию, чтобы у всех союзников по кооперативу на МАПе показывалась эта локация (а не так как сейчас, что каждый должен туда прийти, чтобы локация показывалась на карте).
Тип скрипта: ZScript (не ACS)
The automap is not part of the game simulation. ACS has no defined access to this information
YURA_111:
каждый должен туда прийти, чтобы локация показывалась на карте
Не просто прийти, а ткнуться носом в лайндефы. То есть, для отображения комнаты, нужно развернуться на 360°, и так, чтобы ничего не загораживало обзор. Можно обратиться к Nash'у. Он как-раз чем-то отдаленно похожим заморочился. Стандартная карта блокируется, а вместо неё:
Скрытый текст:
Nash:
There is a HudMessage flag that only appears when the automap is up. Code a map drawing system like in this picture, using said flag to draw the tiles.
Kragoth762:
телепортация игрока на другого игрока в мгновение? (0 tic) и сбор информации.
Да, это прекрасно скажется на управлении. Каждый тик его телепортить, э? А если игроков много?
Господа, давайте не писать костыли, раз уж в требованиях зскрипт.
Насколько я помню, отображение на автокарте прописывается в флагах линии. Есть глобальный массив level.lines, в котором есть много вот таких штук. В которых, опять же если ничего не путаю, ML_MAPPED означает что на данном клиенте эта линия отображается.
А получить все линии не из глобального массива, а только в определённом радиусе в свою очередь можно через вот эту фигню.
ZZYZX О zscript крайне мало информации. Нужно-же считать уже увиденные игроком линии и отрисовать их у союзников. Ничего даже приблизительно похожего я не нашел.
Нужно-же считать уже увиденные игроком линии и отрисовать их у союзников
Ткни меня носом где так написано. Нужно определить что игрок открыл какую-то область и открыть её же у всех остальных.
Но если нужно именно чтобы через других игроков отрисовывались линии в других частях карты только те которые эти другие игроки видят, то это в принципе нереализуемо через телепорт. По той простой причине что линии на карте автоматически появляются во время отрисовки кадра, т.е. как минимум 1 тик камера игрока должна быть полностью переключена на другого актора. Это невозможно.
Единственный относительно адекватный вариант — повторить логику появления линий на автокарте (BlockLinesIterator и сделать проверку на видимость). Довольно нетривиально и может лагать (не пробовал), но реализуемо, по идее.
Ткни меня носом где так написано. Нужно определить что игрок открыл какую-то область и открыть её же у всех остальных.
Ну, видимо, не так выразился. Как открыть эту область у остальных игроков? Впрочем, если считать в радиусе, то как это будет на обширных локациях, или же наоборот, в очень маленьких - сквозь стены не будет просвечивать?
Вот есть две фичи: MonsterMove() и TryWalk(), которые заставляют монстра перемещаться строго по прямой вдоль мировой координаты X. Никаких аргументов эти функции не имеют, никакими перепробованными колдунствами не удалось заставить монстра изменить это направление. Несколько часов гугления убедили меня в том, что ни на официальном форуме, ни в вики инфы по этой теме просто нет.
Собственно, вопрос№1: каким образом заставить эти фичи работать в других направлениях?
Далее, единственная вменяемая фича, с которой можно заставить монстра двигаться в произвольном направлении - TryMove(). Но она, блэт, принципиально не открывает двери. (Зато их замечательно открывает MonsterMove).
Собственно, вопрос№2: каким образом можно заставить монстра открыть произвольную дверь в обход вшитых механизмов A_Chase?
Грубые и громоздкие решения у меня есть, но интересуют более-менее изящные. Внутри ещё теплится надежда, что Graf Zahl не настолько поехал, чтобы встраивать в релиз заведомо неработающие фичи.
Заставить монстра открыть дверь можно легко и непринуждённо — найти эту дверь при помощи того же BlockLinesIterator, проверить что она перед монстром и на вменяемой высоте, после чего заюзать дверь в ручном режиме (активировать спешиал). Только имей в виду что если на двери стоит "player presses use", то ацс может неадекватно отреагировать на открытие такой двери монстром. Хотя это в принципе возможно по идее.
Я подозреваю что эти функции двигают монстра строго вперёд. Перёд ему менять не пробовал?
Ммм, а теперь ещё раз. Что такое P_Move, где, как и чем его менять? Как он вообще задаёт перёд, являясь булевой переменной? И откуда дровишки? В вики ничего подобного нет. Какие-то глубокие внутренности движка?
ZZYZX:
Заставить монстра открыть дверь можно легко и непринуждённо — найти эту дверь при помощи того же BlockLinesIterator
А это что за зверь, это зскрипт или acs, и какими аргументами оно питается?
Возникает ощущение, что где-то есть какая-то другая более подробная документация.
P_Move это внутренняя функция которая вызывается.
MonsterMove = P_Move
Двигает согласно комментарию в текущем направлении. Текущее — это куда морда повёрнута. Следовательно поворачивай в правильную сторону, и тогда будет не только вдоль оси X.
Герр Смертоносец:
А это что за зверь, это зскрипт или acs, и какими аргументами оно питается?
Это зскрипт.
Герр Смертоносец:
Возникает ощущение, что где-то есть какая-то другая более подробная документация.
В связи с тем, что зскрипт по принципу работы практически дословно повторяет C++, то можно лазить в гздум и смотреть как там сделано. И пытаться делать так же.
Документации как таковой... не. Врать не буду. Она есть. Но у меня в голове из-за опыта с исходником гздума документация раза в 4 подробнее чем можно найти в текстовом виде.
В связи с чем я всем советую зскрипт и даже иногда на вопросы отвечаю >_>
P_Move это внутренняя функция которая вызывается.
MonsterMove = P_Move
Двигает согласно комментарию в текущем направлении. Текущее — это куда морда повёрнута. Следовательно поворачивай в правильную сторону, и тогда будет не только вдоль оси X.
Я понял, что внутри движка есть свои функции с очень продвинутым функционалом, но как оперировать ими в Zscript lump с точки зрения синтаксиса? Нужны какие-то примеры работоспособного кода. Тупо непонятно, что писать, в каком формате, и с какой стороны к этому вообще подступиться. Метод тыка не работает.
P_Move = Vec2Angle(speed,angle);
Это, например, выдаёт ошибку Unknown identifier 'P_Move'. Все прочие попытки манипулировать этим из Зскрипта тоже выдают ошибку.
Если же монстру просто повернуть морду через A_SetAngle или A_FaceTarget, то ничего не меняется - он продолжает двигаться вдоль оси Х независимо от того, как он визуально развёрнут. Либо это баг, либо разрабы забыли сделать доступный из Zscript способ изменить внутреннюю функцию, без которого внешние бесполезны. Либо я чего-то фундаментально не понимаю.
И по BlockLinesIterator вопрос.
Парсер внезапно сожрал BlockLinesIterator(self). Но попытки посмотреть логику его работы через старый добрый A_PrintBold(BlockLinesIterator(self)) выдали "Cannot convert to string". Спрашивается, что за загадочный формат переменной оно выдаёт, и куда его можно вставить, чтобы снять с него инфу о линии? И чем эту линию потом исследовать? В списке функций ничего подобного нет. Опять же, нужны какие-то примеры рабочего кода в Zscript.
Вообще это жуть и пагубность, конечно. При Рэнди такой хуйни не было. Порт, давший расцвет модостроению за счёт своей прекрасной документированности, развивается в сторону "чёрного ящика", который можно полноценно использовать только если лично перелопачивать весь исходный код.
ёмаё да забудь ты про P_Move. Это цитата из кода гздума была.
Вертишь актора в нужную сторону. А потом MonsterMove юзаешь.
Методом тыка зскрипт НЕ РАБОТАЕТ. Примеры читать в gzdoom.pk3 папке zscript.
BlockLinesIterator(self) это дичь. Парсер хавает потому что это динамическое преобразование типов, которое возвращает null.
Отдельно про направление. Судя по всему используется переменная actor->movedir. В нашем случае self.movedir, я так понимаю byte angle.
Герр Смертоносец:
Порт, давший расцвет модостроению за счёт своей прекрасной документированности, развивается в сторону "чёрного ящика", который можно полноценно использовать только если лично перелопачивать весь исходный код.
Я тебя умоляю, не смеши мои тапки, пяткам щекотно. По-твоему документация по ацс и декору всегда была полноценной? Зскрипт появился полгода назад.
Единственная проблема с зскриптом в том, что осваивать его методом тыка примерно то же самое, что и осваивать С++ методом тыка. Можно, но нерационально.
И таки да. Раньше многие вещи были бы невозможны вообще от слова совсем ) А сейчас всего-то нужно применить глаза и почитать код.
А ранди вообще последние несколько лет задерживал(а)(о) развитие порта, из-за чего ничего принципиально нового не появлялось, DoomScript стал байкой, а выражение "для ввода фичи она должна пройти через здум" отбивало у контрибьюторов всё желание что-то делать. Видимо, проблемы с гендерной самоидентификацией важнее ввода новых фич.
Вертишь актора в нужную сторону. А потом MonsterMove юзаешь.
void A_testchase()
{
A_SetAngle(5+angle); //верчу актора в нужную сторону
MonsterMove();
}
Сделал. Монстр должен ровненько ходить по кругу. А он движется по прямой, вращаясь. В чём ошибка?
ZZYZX:
По-твоему документация по ацс и декору всегда была полноценной?
Возможно, самых бородатых времён я не застал, но по крайней мере в последние годы к выходу свежей версии всё очень оперативно прописывалось.
upd:
ZZYZX:
Отдельно про направление. Судя по всему используется переменная actor->movedir. В нашем случае self.movedir, я так понимаю byte angle.
Значит "перёд" определяет всё-таки не angle. Сейчас буду с этим пробовать.
upd2: Так, прогресс! Направление действительно задаётся через self.movedir, но это явно не byte angle, не градусы и не fixed, а какой-то другой формат. Всего доступно 8 значений: (0,1,2,3,4,5,6,7), которые задают направления с шагом в 45 градусов. При попытке подставить отрицательное число или 8 и больше монстр просто стоит на месте и не двигается. При попытке задать дробное значение оно принудительно округляется. При попытке задать вектор парсер выдаёт ошибку.
Англ вообще по-дефолту выдаёт значения от 0 до 180, а потом резко перескакивает на -179 и дальше идёт по отрицательным числам, поэтому его в любом случае пришлось шлифануть дополнительной проверочкой. Но в итоге movedir действительно жрёт странный формат угла, в котором всего 8 значений. Возможно, это какие-то особенности работы pathfinding из оригинального doom, фиг знает.
Пока сделал громоздкое подобие A_Chase, в котором MonsterMove с выбором одного из 8 направлений задействуется исключительно при застревании. В принципе они уже более-менее ходят и открывают двери.
Подробно что должен делать скрипт: Мне нужна функция или что-то в этом духе на zscript, которая может определить нажатие клавиши ESC и передать acs скрипту..!
Что бы в acs мог потом использовать как-то так, если это вообще возможно:
Надеюсь с помощью такой функции смогу проверять не только нажатие кнопки ESC, но и понять открыто меню игры или нет..
Буду несказанно рад, если функция сможет проверять не только esc но и все клавиши Под какой порт: GZDOOM 3.2+
Советую писать сразу на зскрипте, т.к. при открытом меню ацс работать не будет в принципе.
Привязка класса зскрипта к конкретной карте (если нужно) возможна через MAPINFO EventHandlers. (документировано как ни странно)
Наличие открытого меню в зскрипте проверяется через Menu.GetCurrentMenu() - возвращает объект или null.
Вызов зскрипта из ацс возможен через https://zdoom.org/wiki/ScriptCall
при открытом меню ацс работать не будет в принципе.
Совсем про это забыл.. печалька =(
ZZYZX:
Привязка класса зскрипта к конкретной карте (если нужно) возможна через MAPINFO EventHandlers. (документировано как ни странно)
Наличие открытого меню в зскрипте проверяется через Menu.GetCurrentMenu() - возвращает объект или null.
увы, ни хрена не понял =(
мне понятно только вот это:
Мне это надо вот для такой задачи:
Если игрок открыв кастомное UI на acs в игре, мог нажать на ESC и это кастомное UI закрылось игнорируя открытие меню игры!,
На деле получается просто открывается menu.. И это явно плохо и не нормально.. Кнопка ESC должна закрыть любое открытое кастомное UI и только потом открыть menu игры.
По этому я хз как это сделать что бы acs проверял нажатие esc т.к. все менюхи у меня acsные, а зскрипт блокировал открытие меню пока не закрыты acs менюшки.
Погуглить не пробовал? http://zdoom.org/wiki/Events_and_handlers / https://zdoom.org/wiki/MAPINFO/Map_definition Но учитывая то что ты дальше написал, не рекомендую это делать. Вместо этого рекомендую идти переделывать гуй на зскрипте. В связи с тем, что гуй на ацс это извращение и пережиток прошлого, а в зскрипте нормальная модель событий ввода сделана как в JS, Qt, C# и так далее.
Вместо этого рекомендую идти переделывать гуй на зскрипте.
Ну не целесообразно.. Меня на 100% устраивает acs интерфейс, проблема только в клавише ESC, и из-за нее переписывать ВСЕ UI в игре которого не мало, да еще и на языке который я вообще не знаю и знать не хочу т.к. он мне не пригодится т.к. кроль последнее что сделаю на этом гздуме.. ну так себе идея.
ZZYZX:
0 и null это разные вещи.
я не программист.. откуда мне знать
Добавлено спустя 1 день 23 часа 3 минуты 51 секунду:
ZZYZX Решил попробовать разобраться в зскриптовом меню и нашел баг
Скрытый текст:
Это происходит когда в оконном режиме вкл. меню и нажал на развернуть окно.
А еще заметил что там у тебя только обычное меню, а настройки это дефолтное гоззы?
Из-за нового шрифта мне придется писать меню на зскрипте т.к. дефолтное гоззо меню говно.