Герр Смертоносец F*ck, you're goddamn right. Я не учел этот момент, хотя в самом начале думал об этом, но мысль не зацепилась. Спасибо, в credits'ах укажу
UPD: theleo_ua, я перечитал предложенный Вами вариант, он очень хорош, но только если речь идет о собственной карте. Я право не указал один момент, что повлекло за собой последствия - это должно работать на любом pwad/iwad на любой карте. Хотя я придумал более интересный момент - или сразу спавнится Кибер/Спайдер, либо спавнится обычный Таргет. Конечно, баланс и сама физическая логика несколько иная будет, но в принципе то...чего уж париться, основная нагрузка совсем не на этих тварей приходится.
Наверное, можно, раз уж там есть такие понятия, как 'классы'. Берешь, создаешь какой-то базовый класс айтема или актора, а потом другой можешь унаследовать от базового. Если ты об этом, конечно.
Я имел в виду создание пользователем подпрограмм на подобие "A_FireBFG" и подобных.
Вот тебе:
ACS functions
ACS_ExecuteWithResult — runs a script and uses its return value.
ACS_NamedExecuteWithResult — runs a named script and uses its return value.
CallACS — shorter alias for ACS_NamedExecuteWithResult.
Подскажите, есть ли способ как-то сделать так что бы можно было в ацс прописать HUDMessage(s:"техт") и в аргументах thinga прописать текст который подставился бы в HUDMessage, любой способ?
1) Когда BossTarget'ы были чисто заменой монстров, то BossEye не мог пулять кубы (он считал, что Таргетов нет). Тогда я переделал спавн систему, и сделал выпадение Таргета через RandomSpawner. Заработало, но...
Из вики:
BossTarget // Spawn Cube Landing Spot (Spawn these before you spawn the shooter or it won't spit cubes!)
Следовательно, BossEye стреляет только по тем BossTarget, которые были отспавнены раньше, чем сам BossEye. Поэтому либо после появления каждой новой BossTarget "удалять и спавнить заново" BossEye (я не знаю, как это повлияет на скрипты карты), либо забить на BossTarget-ы и реализовать через a_custommissile
Fantom:
UPD: Хотя, в таком случае, прибегну к инфе выше. Сделаю так, чтобы спавншот ронял акторов самостоятельно, а eye лишь запускал спавншоты. Пока не уверен, что сработает, но надо проверять, а не гадать.
UPD: Не сработало. Даже с вариациями этой идеи. Я не понимаю, почему. Неучтенная багофича движка?
сделай так:
do { delay(1); int x = GetActorX(0); int y = GetActorY(0); int z = GetActorZ(0) + 100.0; int angle = GetActorAngle(0) >> 8;
суть такова, что скрипт циклически пытается спавнить монстра до тех пор, пока у него не получится
И да, вместо spawn можно заюзать spawnforced, он не чекает условия и спавнит "всегда".
Если не хочешь через ACS, тогда в spawnitemex поставь флаг "nocheckposition"
VladGuardian:
Кстати, рождается оригинальная идея "фрактального" размножения монстров - не успел прибить "ветку" - и на ней распустились "листья"
до слез
Fantom:
theleo_ua, я перечитал предложенный Вами вариант, он очень хорош, но только если речь идет о собственной карте.
Мой метод был для конкретных карт, но необязательно собственных:) Т.е. он должен работать на мап30 например. А если ты хочешь "вообще на любой карте", тогда да, тут уже другое дело
Если ты хочешь сделать такое:
Fantom:
это должно работать на любом pwad/iwad на любой карте
Fantom:
Но вообще у меня какая проблема. Решил сделать условно простенький мод, где все монстры заменены на BossTarget'ы, а все оружие заменено на BossEye.
то проблема сводится к "как оружию определить координаты ближайших монстров"
тогда тебе надо определиться со следующим: какой максимальный радиус атаки у таких "bosseye-оружий" ?
Если радиус не "бесконечный", тогда есть такие полезные функции:
Давая предмет, можно потом монстру в декорейте чекать "если предмет есть, то [выполнить действия такие-то] и выкинуть предмет". А проверяя возможность хитскан атаки, можно банально чекнуть "долетит куб до цели или нет". С помощью http://zdoom.org/wiki/Distance будешь отсекать тех монстров/оружия, которые за пределами радиуса.
И в таком случае ты будешь просто делать "GetactorXYZ" для "монстров", чтобы узнать их координаты для выстрела. Если тебе известны координаты монстра и оружия, то чтобы оружие выстрелило строго в монстра, можно определить угол оружия с помощью http://zdoom.org/wiki/VectorAngle , установить этот угол и сделать выстрел
theleo_ua, это все очень хорошо, и я благодарю Вас, но Вы же можете видеть, что проблема то была решена, поэтому половина поста в данный момент утратила какой-либо смысл.
Но что касается второй половины про конкретность...Радиус можно сделать не бесконечным, хотя это нежелательно. Но я смотрю, тут что-то очень сильное колдунство, я слишком быдлокодер, чтобы такие вещи уметь делать, тут слишком абстрактные объяснения и сухая теория. Однако, благодарю за то, что Вы распинались и даже ссылки скинули.
Но я смотрю, тут что-то очень сильное колдунство, я слишком быдлокодер, чтобы такие вещи уметь делать, тут слишком абстрактные объяснения и сухая теория.
1) Да, это колдунство даже если полностью разобраться как это работает, придется педалить костыли и танцевать с бубнами 2) Если есть непонимания теории, могу постепенно рассказать по каждому из пунктов
В общем определитесь, насколько сильно Вам нужен такой мод и готовы ли Вы разбираться в новых функциях и танцевать с бубнами, и если да, могу постепенно уже на конкретных упрощенных примерах объяснить, как работает каждая из расписанных мной идей
Что ж, могу сказать, что я решил поступить с Кибером и Мастермайндом другим способом. Еще раз благодарю за уделение внимания моему вопросу.
Но хочу отметить, что ко мне подкралась новая проблема, не связанная с предыдущей. Знаменитый таг 666 и 667. Обычно это фиксится связью "parent-child", но в данной ситуации такая система не работает, ибо child'ом является обычный Монстер Таргет, который нельзя убить. Как поступить в таком случае? Тут скорее предложение идеи на тему, нежели чем вопрос по теории. Лично тут я решил, что надо просто делать специальный Босс Спавнер, который можно убить, и как раз он будет child'ом, но эту мысль я пока обрабатываю, мне не очень нравится эта концепция, хотя...с Кибером я уже пошел на некоторые уловки (которые являются одновременно и уступками первоначальной затеи), так что...
Напишите пож. как правильно прописать в menudef эпизоды? Собс-но проблема, когда захожу в меню\новая игры\открывается меню эпизодов, там можно юзать текст в качестве названия или картинку.. но курсор у меня заходит на текст, решил сделать названия эпизодов картинками, но там та же проблема, в общем мне надо знать как можно отдалить друг от друга 2 названия эпизода. Вот как к примеру в общем меню делается такое:
Position 180, 119//Это позиция где будет показываться моя картинка
PatchItem "Graphics/Menu/APlay.png", "d", "StartGameMenu"// какая картинка будет показываться и что надо делать когда на нее нажали
В Episode Menu все тоже самое можно прописать, но что надо делать когда нажали на картинку эпизода? Ведь в пред. случае была команда открыть меню новой игры.. а у эпизода такого нет что делать???
MAPINFO не подходит т.к. там можно только указать текст или картинку, но позицию прописать нельзя... Курсор менять, не вариант, меню стилизованное и не обычное. Возможно попробую еще выход из такой ситуации с помощью шрифта с большой буквой размером 64х64.. такой шрифт можно прописать в эпизоде и по идее получится, но это черезжопный вариант.
есть ли способ как-то сделать так что бы можно было в ацс прописать HUDMessage(s:"техт") и в аргументах thinga прописать текст который подставился бы в HUDMessage, любой способ?
Другой способ - в теле скрипта определить (одномерный) массив строк, а в аргументе, передающимся от thing-а, передавать только номерок (индекс той строки в массиве, которую нужно напечатать).
Можно взаимоувязать тэг thing-а, и этот самый номерок - например, пусть индекс строки будет иметь значение на сотню меньше, чем само значение тэга. То есть, например, если у thing-а тэг 102, то индекс выводимой строки должен быть 102 - 100 = 2 (это делается для того, чтобы кроме тэга thing-у не нужно было хранить никакой другой избыточной информации)
Имеется ввиду заранее прописать текст который буду использовать, а потом поставить циферку соответствующую нужной строчки в аргументах и оно будет писать писать мой текст? Ну я думал о таком варианте, только в моем случае проще использовать функцию ReadUserData();, но я хотел бы просто в аргументах прописать простой текст, а в игре оно выводится что бы без лишних телодвижений, но уже понял что на данный момент это не возможно.. в аргументах текст не пишется, да и больше 9 символов не прописать =(
Unregistered:
Как использовать ACS без привязки к уровню?
Это как так? Ты имеешь ввиду компиляцию скрипта в файл .acs? Если да, то создаем lump с именем: LOADACS если PK3 архив создаем папку acs и в нее кладем файл со скриптами, после в слейде 3 правой кнопкой мыши кликаем на скрипт в выпадающем меню Scripts/CompileACS (только не забудь сохранить исходник скрипта!!! Компилируй только копию скрипта) После компиляции (или до..) впиши имя скомпилированного скрипта в lump LOADACS т.е. просто без заморочек> ACS_Sour Да и все..
Я имею в виду подобную ситуацию: У монстра в атаке стоит запуск скрипта, и нужно активировать этот скрипт не зависимо то уровня. Даже на картах оригинального дума.
Я имею в виду подобную ситуацию: У монстра в атаке стоит запуск скрипта, и нужно активировать этот скрипт не зависимо то уровня. Даже на картах оригинального дума.
Допустим у нас есть такой зомбимен:
Скрытый текст:
ACTOR ZombieManForever: ZombieMan replaces ZombieMan { States { Missile: POSS E 10 A_FaceTarget POSS F 8 A_PosAttack POSS E 8 ACS_NamedExecuteWithResult("doom_forever", параметры) Goto See }//States }//ACTOR ZombieManForever: ZombieMan replaces ZombieMan
Такой зомбимен будет каждый раз при атаке вызывать скрипт doom_forever независимо от уровня, даже на картах оригинального дума.
Добавлено спустя 4 часа 36 минут 34 секунды:
Есть ряд акторов, которые до определенного стейта (а некоторые всю жизнь) спавнят партиклы (в качестве партиклов свои кастомные акторы, т.е. функция A_SpawnParticle не используется). В целях оптимизации производительности, решил ограничить спавн партиклов по условию "дистанция до игрока больше X".
Вопросы следующие:
1) Что даст большую производительность - A_RadiusGive + CheckInventory или FDistance ? Напомню, что RadiusGive в гоззе 2.0.05 (а я делаю именно под нее) не умеет в "список акторов кому гивать"
2) Есть ли другие способы, которые быстрее работают?
3) Какими проблемами грозит изменение tid игроку? Речь о сингле
1) Что даст большую производительность - A_RadiusGive + CheckInventory или FDistance ? Напомню, что RadiusGive в гоззе 2.0.05 (а я делаю именно под нее) не умеет в "список акторов кому гивать"
Ну смотри, я понятия не имею как утроены функции на C++ внутри гоззы, но вот просто посудить A_RadiusGive раздает всем итем, а оно надо?+ еще и надо чекать инвентори итемы.. По моему лучший вариант проверка дистанции, только не тот пример что в вики, он мне лично не подошел т.к. когда много акторов вызывающих функцию Distance, игра начинает лагать т.е. надо туже функцию из вики переписать в простой скрипт типа: Script "Distance" (int dist) и в декорейте уже вызывать по такому принципу TNT1 A 0 A_JumpIf(CallACS(Distance) > 256, "LowPar")
А еще лучше делать так когда игрок далеко от объекта, лучше вообще вырубать всякие партикли, динлайты и прочее.. (если юзаешь 3д модели, то и их тоже) Но это лично моё мнение..
theleo_ua:
2) Есть ли другие способы, которые быстрее работают?
Врятли есть быстрее чем скрипт distance, но именно скрипт, а не функция из вики
theleo_ua:
3) Какими проблемами грозит изменение tid игроку? Речь о сингле
Да никакими.. TID меняешь когда захочешь. Можно и старый вернуть, можно новый дать, тут дело не в проблемах, а в том где и зачем будешь это юзать и там где юзаешь просто указываешь новый TID игрока если его вообще надо указывать) Вот я сколько скриптую(ну ты видел мою игру про зайца) я там игроку TID не менял вообще, а вся игра построена на Thing-ах