Оному нужно "приклеить" полупрозрачный оверлэй-эффект
Когда-то задавался таким же вопросом, да и сейчас тоже. Про A_Overlay не знал. сегодня помучаю эту функцию и посмотрю что выйдет.
Void Weaver:
Отпишись если чо выйдет, а я тогда попробую через Варп.
Anto96WS, если ещё вопрос актуален то эффекты прекрасно приклеиваются Варпом, причём как на оружие, так и на монстров:
Для монстров:
Скрытый текст:
Actor A
{
Monster
States
{
See: //Стандартный "See" - вызывается только раз для спауна эффекта
TNT1 A 0 A_SpawnItemEx("B", 0, 0, 0, 0, 0, 0, 0, SXF_SETMASTER) //Спауним наш Чилдрен-эффект
SeeTrue: //Эрзац-"See" - вызываем во всех остальных случаях и стэйтах
MPIL ABCDEFGH 3 A_Chase
Loop
Missile:
Goto SeeTrue
Melee:
Goto SeeTrue
Pain:
Goto SeeTrue
Death:
//Здесь ещё можно поставить А_РемувЧилдрен
Stop
}
}
=====
Actor B
//RenderStyle //Опционально
//Alpha //Опционально
{
States
{
Spawn:
MPOV ABCDEFGHIJKLMNO 1 bright A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_NOCHECKPOSITION | WARPF_COPYINTERPOLATION)
Loop
}
}
Хотя можно вызывать и временный эффект - тогда уже из других стэйтов.
Для оружия конструкция более вариативна:
Вот это слабое место. Здесь надо тестить, работает ли оно без указания акторкласса. Если не работает - значит всех потенциально сжираемых монстров надо делать наследием условного актора "NewMonster", искать именно его, а в флаги прописать CPXF_ANCESTOR.
Вотжиговнакусок, акторкласс необходим. (( Костыль конечно хороший но писец какой массивный, вряд ли кто-то захочет перепиливать весь бестиарий ради добавления одного монстра.
Есть ещё какие соображения?
Герр Смертоносец:
В простейшем случае делаем A_FaceMaster и одновременно толкаем его в задницу отрицательным A_Recoil с очень малым значением. (Через каждые N секунд даём ему побродить с A_Wander рандомное число тактов на случай, если где-то застрянет.) Одновременно делаем проверки A_JumpIfMasterCloser на малый радиус, с него переход на CorpseRemove.
Про ФэйсМастера я забыл, то что надо! Жаль блин нет ЧейсМастера. Да и с обособлением РемувМастера затупил-с. Вот только Вандер меня напрягает - если карты не лягут, то будет хаотично бродить до посинения.
Добавлено спустя 42 минуты 23 секунды:
Ещё вот соблазнительно выглядит A_JumpIfHealthLower (1,"SeeCorpseChase",AAPTR_???), но вот не знаю как и с чем её можно увязать. Сама же она не позволяет изменить указатель, да и в радиусе не чекает.
Добавлено спустя 14 минут 58 секунд:
Или может лучше попробовать поиск трупов через A_GiveRadius, A_JumpIfInventory и кастомитемы раздающие подобравшему флаг CORPSE?
Костыль конечно хороший но писец какой массивный, вряд ли кто-то захочет перепиливать весь бестиарий ради добавления одного монстра.
А тебе вообще это для чего надо? Если для своего вадника, то нет проблем прописать бестиарий в одну строчку по типу "ACTOR Doomimp : Newmonster replaces Doomimp".
Или у тебя задача в совместимости с любым бестиарием и подключаемым модом вообще?
Void Weaver:
Есть ещё какие соображения?
Из хорошего - никаких. По сути ты приказываешь актору проверить "любую херню" поблизости. Декорейт понятие "любой херни" не понимает, для него это равносильно поголовной проверке вообще всех акторов, имеющихся на карте. Это было бы ресурсоёмко и вообще хреново.
Есть муторный путь делать "радар" по A_CheckLOF, который будет вращаться на 360 градусов, захватывая абсолютно любой объект. Это должен быть громоздкий циклический скрипт, в котором проверяется линия, сразу же проверяется объект на ней, и если объекта нет либо объект не является трупом - скрипт делает шаг на 1 градус. И дебажить эту хрень придётся долго.
Или у тебя задача в совместимости с любым бестиарием и подключаемым модом вообще?
Зыс. Всё для людей.
Скрытый текст:
Не знаю, видел ты или нет но я тут недавно выкладывал монстров, склёпанных благодаря советам уютненького РДЦ; тебя вот в кредитсы записал. ^_^ А так-то началось с проекта, для возжелавших странного, по экспорту монстро-спрайтов из Дьябло серии в вид удобоваримый для моддинга ид-игорь. В перерывах стал попутно покуривать декор и всё заверте... Тем более так сошлись звёзды что один чел практически сразу же нашёл применение этим ресурсам в своём рпг-моде.
Герр Смертоносец:
Есть муторный путь делать "радар" по A_CheckLOF, который будет вращаться на 360 градусов, захватывая абсолютно любой объект. Это должен быть громоздкий циклический скрипт
Скрипт... ну тупой я для скриптинга. По крайней мере на данный момент. В скрипте-то вроде особых проблем быть не должно, они же более гибкие; как там Anto96WS писал... (ClassifyActor(target) & ACTOR_DEAD) в радиусе then SetActivator to Master?
Добавлено спустя 13 минут 53 секунды:
Герр Смертоносец:
По сути ты приказываешь актору проверить "любую херню" поблизости. Декорейт понятие "любой херни" не понимает, для него это равносильно поголовной проверке вообще всех акторов, имеющихся на карте.
Ну не "любую" а вполне конкретную - чек в радиусе флагов ISMONSTER|-SOLID|SHOOTABLE с последующим присвоением мастера ближайшему\первому найденному и джамп ту самвэ. Разве это так много? Вообще эта самая чекПрокс была бы идеальна без обязательной привязки к акторклассу. В конце-то концов есть же радиусные ф-ции работающие "только" на флагах, та же чекЛОФ. Вот кстати ей например зеркально не хватает трупофлага, который есть у чекПрокс. Писец... близко локоток, а не укусишь.
А функцию A_CheckFlag (с проверкой флага "Corpse") не пробовал с поинтером типа AAPTR_GET_LINETARGET ( https://zdoom.org/wiki/Actor_pointer ) - может что-то удастся выудить полезного...
P.S. правда она с недавних пор депрекейтыд (но рабюотает) и есть некий симилар у Zscript, но это дебри...
YURA_111, ого! Занятное сочетание, возьму на заметку. Но к сожалению в нём куча недостатков для моей ситуации:
а) не в радиусе;
б) только первая цель по линии обзора, т. е. если кто-то будет заслонять перед ним труп, то чек обломится.
в) не переназначает указатель, что означает что актор не будет атаковать агрессора, если тот вдруг окажется в радиусе атаки во время следования актора к трупу:
Скрытый текст:
CorpseSearch:
TNT1 A 0 A_CheckFlag ("CORPSE", "CorpseChase", AAPTR_LINETARGET)
Goto SeeMelee
CorpseChase:
MPIL A 0 A_FaceMaster
MPIL ABCDEFGH 1 A_Recoil(-2)
TNT1 A 0 A_JumpIfMasterCloser (10,"CorpseRemove",False)
Loop
CorpseRemove:
MPIL ABCDEFGH 1 A_Remove (AAPTR_MASTER)
TNT1 A 0 A_ChangeFlag ("NOPAIN", 1)
Goto SeeFull
Но может я просто чего не догоняю?..
Хотя...
JSO x:
Вообще ещё думал над таким способом проверки "а кто меня воскрешает":
1) Арч всё время создаёт актор, который проверяет трупы вокруг; 2) Когда находит, "таргетится" на него (устанавливает свой AAPTR_TARGET);
3) Через A_TransferPointer передаёт арчу свой target-указатель как на tracer'а (например).
После этого через указатели вполне легко можно проверить, что за зверь мой воскрешатель и кого он поднимает.
А как тут вообще актор арча проводит поиск трупа, тоже по чекПрокс? Или как-то иначе?
1. Если монстру дать A_GiveInventory ("Timer", 1) такую шнягу:
Actor Timer : inventory
{
States
{
Spawn:
TNT1 A 1050
Stop
}
}
то я правильно понимаю что она будет существовать в монстре и чекаться A_JumpIfInventory ("Timer", 1, "стэйт") ровно 30 секунд?
=======
2. Есть ли разница в производительности и\или надёжности между:
TNT1 A 0 A_CheckProximity ("SeeCorpseChase", "actorclass1", 1024, 1, CPXF_DEADONLY|CPXF_SETMASTER|CPXF_CLOSEST)
TNT1 A 0 A_CheckProximity ("SeeCorpseChase", "actorclass2", 1024, 1, CPXF_DEADONLY|CPXF_SETMASTER|CPXF_CLOSEST)
TNT1 A 0 A_CheckProximity ("SeeCorpseChase", "actorclass3", 1024, 1, CPXF_DEADONLY|CPXF_SETMASTER|CPXF_CLOSEST)
И как идёт проверка во втором случае? Все строки одновременно или в порядке очереди строк?
=======
3. Может что-нибудь сломаться если два или более актора собираются "съесть" (A_Remove) одного и того же _МАСТЕРА, но:
а) один успел раньше?
б) начали "есть" одновременно (если такое физически возможно)?
Как можно обойти негативные последствия (если таковые имеются\могут произойти) нацеливания на одного и того же _МАСТЕРА? Или даже вообще запретить одновременное нацеливание?
Попробую развить тему с альтернативными способами трупоискания.
1. Трупоед периодически срёт в пространство невидимыми, проходимыми, неучитывающимися в количестве монстров миньонами. (Их количество надо ограничивать и периодически переспаунивать.)
2. Миньоны тупо бегают вокруг с Vile_Chase, не агрятся на игрока.
3. Попав на стейт "Heal" миньон захватывает воскрешаемый труп в поинтер через A_CheckBlock либо A_CheckLOF и далее застревает в неком подвешенном состоянии.
4. Далее слабое место схемы: нам нужно, чтобы труп остался лежать трупом, а не восстал. Но воскрешение жёстко прописано на уровне движка, предотвратить его невозможно. Поэтому нужно сразу же в момент восставания мгновенно убить воскрешаемого ещё раз. По идее мог бы помочь SetActorState(0,"Death"), но он заново начнёт анимацию смерти. Её можно было бы сделать невидимой через SetActorProperty(0,APROP_RenderStyle,STYLE_None), но тогда на какое-то время труп исчезнет из видимости вообще. На ум пока не приходит ни один метод, позволяющий заставить живого сразу же перейти в состояние лежачего. Возможно, он есть.
5. Когда трупоед хочет жрат - он через застрявших в подвешенном состянии миньонов выбирает любой заранее ими помеченный труп.
Так-то я временно переключился на напейсание других монстриков, дабы не терять время в тщетных раздумьях, а трупоеду решил поставить "заглушку" в виде тупо перечисления чеков всех ванильных монстр-акторклассов ид-игорь. Так что на данный момент я бы предпочёл получить ответы на хотя бы часть из вопросов поставленных выше (особенно на первый), тем более что я склонен терять не закреплённые соображения.
Герр Смертоносец Что касается твоего наброска, я вижу в нём кучу белых пятен (может всего-лишь из-за моего невежества?):
Скрытый текст:
1-2. Казалось бы тут всё просто и понятно - клепаем высокоскоростных ТНТ1 мобов с +LOOKALLAROUND +NOBLOCKMONST +THRUACTORS(?) -SOLID +NEVERTARGET и ВайлЧейсом. Ок. Но как определить лимит на количество иили частоту спауна ТНТшников? Учти, трупоед - это не босс а рядовой моб и десяток таких с персональными "армиями" вероятно могут некисло так заслоудаунить игру.
3-4.
Герр Смертоносец:
3. Попав на стейт "Heal" миньон захватывает воскрешаемый труп в поинтер через A_CheckBlock либо A_CheckLOF и далее застревает в неком подвешенном состоянии.
Герр Смертоносец:
4. Далее слабое место схемы: нам нужно, чтобы труп остался лежать трупом, а не восстал. Но воскрешение жёстко прописано на уровне движка, предотвратить его невозможно. Поэтому нужно сразу же в момент восставания мгновенно убить воскрешаемого ещё раз.
Либо я тебя не понял вообще, либо ты переборщил с действиями, но я вижу это приблизительно так: наткнувшись ВайлЧесом на труп наш ТНТшник тупо останавливается и прыгает в "Хил", и тут, я полагаю, необходимо "перехватить" инициативу у инструкции кода. Допустим мы принудительно "расширяем" "Хил" стэйт следующим образом:
Heal: //указатель же для запуска стэйта просто _TARGET, да? Тогда:
TNT1 A 0 A_RearrangePointers (Сразу же "выбиваем" поинтер с _TARGET на _MASTER) //Не знаю что тут писать, поскольку нуб в указателях.
TNT1 A 0 A_TransferPointer (Тут же "пересылаем" нового текущего МАСТЕРА (хилимый труп) старому (трупоеду))//Аналогично - не знаю что тут писать, поскольку нуб в указателях. Либо же получается что у ТНТшника появляется одновременно 2 МАСТЕРА (вот кстати тут актуален мой 3 вопрос из предыдущего поста)
TNT1 A 0 A_KillMaster ("damagetype", KILS_EXFILTER, "класс трупоеда") //Тут "упокоиваем" всех МАСТЕРов (трупов, начавших воскресать) кроме нашего трупоеда
TNT1 A 0 Jump (Death) или просто Stop //Киляем отработанного ТНТшника
Если же сначала выполняется воскрешение, а затем уже остальные кастом-функции стэйта, то весь набросок кода накрывается тазом.
5. А вот тут я вообще не понял - таки как трупоед выбирает мастер-трупа? Рандомно? А если ему тоже "переслали" одновременно 2 и более "МАСТЕР-трупа" (снова мой 3-ий вопрос выше ), пузо-то не "лопнет" часом? И опять таки в идеале нужно целиться на ближайший от трупоеда труп, но при столь рандомном поиске есть шанс выбрать "по указке" труп, лежащий где-нибудь в ебенях, одновременно пропустив лежащий рядом.
Если где сморозил ересь - просьба сильно не пинать, я только начал изучать декор.
Добавлено спустя 57 минут 40 секунд:
Void Weaver:
Если же сначала выполняется воскрешение, а затем уже остальные кастом-функции стэйта, то весь набросок кода накрывается тазом.
О! Ща прикинул что тогда можно попробовать помучить труп уже после "хила", типа:
ВайлЧейс=>
Heal: //Поднял труп
Goto AfterHeal
AfterHeal:
TNT1 A 0 A_KillTarget //Тут же кладём ожившего
TNT1 A 0 A_RearrangePointers () //Из предыдущего варианта
TNT1 A 0 A_TransferPointer () //---/---
TNT1 A 0 Jump (256, Death) или просто Stop //---/---
Бтв, в обоих случаях идёт левая анимация поднятиякилла, что опять таки возможно будет нагружать игру, да и просто выглядеть нелепо, собс-но то, о чём ты сразу заявил.
Добавлено спустя 27 минут 29 секунд: =========
Наводящий вопрос... а реально ли записать проходящий сквозь любые акторы кроме трупов снаряд +SEEKERMISSILE +HITMASTER и нацеленный исключительно на трупы? А кидать его через СпаунИтемЕх (ТРАНСФЕРПОИНТЕРС) например.
Добавлено спустя 1 час 5 минут 52 секунды: =========
А что если...
Скрытый текст:
Actor CEater
See:
TNT1 A 0 GiveInventory ("CorpseMark", 1) //На старте выдаём уникальный токен.
SeeHungry: //Не может стрелять, нужен труп
TNT1 A 0 A_JumpIfTargetInsideMeleeRange ("SeeMelee") //Настырному чистит рыло
EATR ABCDEFGH 1 A_Chase ("CorpseSearch")
SeeMelee:
EATR ABCDEFGH 1 A_Chase ("Melee")
Loop
Melee:
Goto SeeHungry
CorpseSeek: //Ищем ПРЕТЕНДЕНТА на труп
TNT1 A 0 CheckLOF (на дистанции 1024, в радиусе 360 градусов, чекаем всех ДРУЗЕЙ|НЕДРУГОВ|НЕВРАЖДЕБНЫХ|СМОТРИМСКВОЗЬВСЕХ, "Джамп CorpseCheck")
Goto SeeHungry
CorpseCheck: //Проверяем достоин ли ПРЕТЕНДЕНТ носить гордое звание трупа
TNT1 A 0 CheckFlag ("CORPSE", "CorpseMarking", AAPTR_TARGET)
Goto CorpseSeek
CorpseMarking: //Да, это ОН!
TNT1 A 0 TakeInventory ("CorpseMark", 1) //Отрываем от сердца самое ценное...
TNT1 A 0 GiveInventory ("CorpseMark", 1, AAPTR_TARGET) //... и отдаём ему заслуженную награду! ^_^
TNT1 A 0 JumpIfInventory ("CorpseMark", 1, "CorpseChase", AAPTR_TARGET)//Ищем нашего кумира в толпе <3
CorpseChase:
??? ////...вот только как до него добраться (заставить идти к ИТЕМУ)?
TNT1 A 0 A_JumpIfTargetInsideMeleeRange ("CorpseRemove") //Бросаемся в объятья...
Loop
CorpseRemove:
EATR ABCDEFGH 1 A_Remove (AAPTR_TARGET)//... и ОМ-НОМ-НОМ...
TNT1 A 0 GiveInventory ("CorpseMark", 1) //... оставляя на память медальку.
TNT1 A 0 A_ChangeFlag ("NOPAIN", 1)
Goto SeeFull
SeeFull:
EATR ABCDEFGH 1 A_Chase ("Missile")
Loop
Missile:
EATR ABCDEFGH 1 A_CustomMissile()
TNT1 A 0 A_ChangeFlag ("NOPAIN", 0)
Goto SeeHungry
Вот только я подозреваю что после нацеливания на труп, любой агрессор может навсегда сбить его с маркированной цели и токен будет безвозвратно утерян. Или там какой-нибудь игнор всего вокруг прописать? И вообще, есть шанс на взлёт?
1-2. Казалось бы тут всё просто и понятно - клепаем высокоскоростных ТНТ1 мобов с +LOOKALLAROUND +NOBLOCKMONST +THRUACTORS(?) -SOLID +NEVERTARGET и ВайлЧейсом. Ок. Но как определить лимит на количество иили частоту спауна ТНТшников? Учти, трупоед - это не босс а рядовой моб и десяток таких с персональными "армиями" вероятно могут некисло так заслоудаунить игру.
Это как раз элементарно. У монстра в инвентаре, допустим, 10 патронов, каждый раз спауня миньона он тратит 1 патрон. Каждый раз, когда миньон дохнет, он отдаёт мастеру 1 патрон. При этом надо, чтобы время от времени миньоны самоубивались, дозволяя ушедшему в другую локацию наспаунить новых.
Void Weaver:
Либо я тебя не понял вообще, либо ты переборщил с действиями, но я вижу это приблизительно так: наткнувшись ВайлЧесом на труп наш ТНТшник тупо останавливается и прыгает в "Хил", и тут, я полагаю, необходимо "перехватить" инициативу у инструкции кода. Допустим мы принудительно "расширяем" "Хил" стэйт следующим образом:
Судя по коду архвайла, инциативу перехватить невозможно. Сам факт перехода на стейт "Heal" подразумевает, что труп начал воскрешаться. Причём сам стейт "Heal" чисто декоративный, никаких экшенов в нём нет. Изначальных поинтерных сношений между архвайлом и трупом тоже нет. Всё, что мы можем сделать - это установить его в поинтер постфактум и убить, при этом анимацию смерти никак не обойти.
Скрытый текст:
Upd: Есть крайне сомнительная идея запустить через зскрипт фичу, действующую на поинтер и включающую в себя A_SetTics. С некоторой вероятностью можно будет "заморозить" начавшего восставать монстра на первом кадре, визуально повторяющем труп. Подрихтовать ему флаги и.т.п, сделав технически неотличимым от трупа. Ничего не гарантирую в плане работоспособности, я в зскрепте ещё не разобрался толком.
Void Weaver:
5. А вот тут я вообще не понял - таки как трупоед выбирает мастер-трупа? Рандомно? А если ему тоже "переслали" одновременно 2 и более "МАСТЕР-трупа" (снова мой 3-ий вопрос выше ), пузо-то не "лопнет" часом? И опять таки в идеале нужно целиться на ближайший от трупоеда труп, но при столь рандомном поиске есть шанс выбрать "по указке" труп, лежащий где-нибудь в ебенях, одновременно пропустив лежащий рядом.
Как вариант - команду на SeeCorpseChase выдаёт миньон через A_JumpIfMasterCloser. При этом все прочие миньоны убиваются. Таким образом, трупоед в любом случае наведётся на один из ближайших трупов, а пометки с других трупов исчезнут.
Void Weaver:
А что если...
Void Weaver:
TNT1 A 0 CheckLOF (на дистанции 1024, в радиусе 360 градусов, чекаем всех ДРУЗЕЙ|НЕДРУГОВ|НЕВРАЖДЕБНЫХ|СМОТРИМСКВОЗЬВСЕХ, "Джамп CorpseCheck")
Я про этот вариант писал раньше. Только CheckLOF не работает в радиусе. Т.е. в идеале здесь нужен цикл, в котором эта функция вызывается 360(!) раз за нулевое время. (Можно меньше, тогда вырастет шанс пропустить труп, попавший между линий проверки.) И поставить флаг CLOFF_SETTRACER, чтобы попавший в этот "вращающийся локатор" объект не конфликтовал с TARGET-поинтером.
Прописывая цикл, важно, чтобы локатор сохранял угол поворота после проверки CorpseCheck. Т.е. если он повернулся с 0 до 30 градусов и наткнулся на живого монстра - чтобы дальше он продолжил поворачиваться с 30 градусов дальше, а не начинал бы с начала.
Грамотно расписал, теперь всё понятно. Спасибо!
Но из-за "Хил" это мне не подходит.
Герр Смертоносец:
Я про этот вариант писал раньше. Только CheckLOF не работает в радиусе. Т.е. в идеале здесь нужен цикл, в котором эта функция вызывается 360(!) раз за нулевое время. (Можно меньше, тогда вырастет шанс пропустить труп, попавший между линий проверки.) И поставить флаг CLOFF_SETTRACER, чтобы попавший в этот "вращающийся локатор" объект не конфликтовал с TARGET-поинтером.
Прописывая цикл, важно, чтобы локатор сохранял угол поворота после проверки CorpseCheck. Т.е. если он повернулся с 0 до 30 градусов и наткнулся на живого монстра - чтобы дальше он продолжил поворачиваться с 30 градусов дальше, а не начинал бы с начала.
то видимо я тогда не въехал о чём шла речь. И кстати технически же ЧекЛОФ может работать в радиусе: параметр дистанция + параметр угол. Ставим угол 360 и получаем окружность с заданным радиусом. А результат я наблюдал когда мой Дьябла периодически застревал в собственных миньонах (так и не понял в чём было дело ) во время чарджа с ЧекЛОФом; подходя к нему со спины он моментально выпрыгивал по ЧекЛОФу (на 360 градусов) из заглюченного цикла. Или мы говорим о разных "радиусах"?
А почему CLOFF_SETTRACER, а не МАСТЕР? И я так и не понял как чо писать в CorpseChase по итему.
Да, может таки кто пояснит о времени жизни инвентори итема взятого другим актором:
Void Weaver:
1. Если монстру дать A_GiveInventory ("Timer", 1) такую шнягу:
И кстати технически же ЧекЛОФ может работать в радиусе: параметр дистанция + параметр угол. Ставим угол 360 и получаем окружность с заданным радиусом.
Angle это не ширина сектора, а смещение луча проверки на определённый угол. Сам луч остаётся тонким. 360 градусов это эквивалент нуля градусов. Я хз, что там со спины заглючило, но в широком угле он штатно работать не должен. Концептуально это аналог hitscan-механизма. Можно пульнуть несколько векторов, но нельзя сделать вектор толстым.
Void Weaver:
А почему CLOFF_SETTRACER, а не МАСТЕР?
Можно и мастер, пофиг. Лишь бы не таргет. Мне привычнее для "альтернативного таргета" юзать трасер.
Void Weaver:
И я так и не понял как чо писать в CorpseChase по итему.
По какому итему? В системе с локатором или с миньонами? Это две разные системы, лол. В системе с локатором, если CheckLOF в состоянии задетектить труп, то никаких итемов не нужно - тупо делаем A_FaceMaster (либо FaceTracer) и даём ему пендаля.
Void Weaver:
Да, может таки кто пояснит о времени жизни инвентори итема взятого другим актором:
Время жизни шняги в Spawn-стейте это время существования итема, свободно лежащего на карте. На поведение итема в инвентаре оно не влияет ровным счётом никак. В случае с игроком можно сделать итем замедленного действия, самоубирающийся из инвентаря через некоторое время, прописав стейт Pickup:
Pickup:
TNT1 A 1050
TNT1 A 0 A_TakeInventory ("Шняганейм", 1)
//TNT1 A 0 A_SpawnItemEx("BFGBall")
stop
Что будет в случае с монстром - я хз. Закомменченная строчка для проверки. Если через 30 секунд шар появится - значит сработало.
привет MоD3леры: Все нижесказанное, особенно подчеркнутое, актуально для Gzdoom?
MD3 Limits
The MD3_PATH+file name cannot be longer than 63 characters. (Textures and model names)
The group name and point name cannot be longer than 63 characters.
Maximum of 1024 animation frames Maximum of 16 Points (Quake 3 Tags)
Maximum of 32 Groups.......................//Groups всмысле мэшы?
Maximum of 256 Textures per Group
Maximum of 8192 Triangles per Group Maximum of 4096 Verticies per Group
P.S никто не владеет инсайдом про ZMDL, происходит ли с ним что-то?
Angle это не ширина сектора, а смещение луча проверки на определённый угол. Сам луч остаётся тонким. 360 градусов это эквивалент нуля градусов. Я хз, что там со спины заглючило, но в широком угле он штатно работать не должен. Концептуально это аналог hitscan-механизма. Можно пульнуть несколько векторов, но нельзя сделать вектор толстым.
Да, похоже ты прав. Может так?:
Скрытый текст:
CorpseSeek:
TNT1 A 0 A_SetUserVar("user_CLOFangle",0) //setting of uservar initial value
CLOFInRadius:
TNT1 A 0 A_CheckLOF ("CorpseCheck", CLOFF_JUMPENEMY|CLOFF_JUMPFRIEND|CLOFF_JUMPNONHOSTILE|CLOFF_SKIPTARGET|CLOFF_BEYONDTARGET|CLOFF_ALLOWNULL|CLOFF_CHECKPARTIAL|CLOFF_SETTRACER, 1024, 0, user_CLOFangle, 0, 0, 0, AAPTR_TRACER, 0) //uservar assignment to CheckLOF angle
TNT1 A 0 A_SetUserVar("user_CLOFangle", user_CLOFangle+1) //+1 degree uservar increasement
TNT1 A 0 A_JumpIf(user_CLOFangle==360,"CLOFCircle") //360 degrees uservar check (when full circle), then jumping out of loop
Loop
CLOFCircle:
Goto SeeHungry
Герр Смертоносец:
Можно и мастер, пофиг. Лишь бы не таргет. Мне привычнее для "альтернативного таргета" юзать трасер.
А я-то думал что TRACER только для снарядов. Спасибо!
Герр Смертоносец:
Время жизни шняги в Spawn-стейте это время существования итема, свободно лежащего на карте. На поведение итема в инвентаре оно не влияет ровным счётом никак. В случае с игроком можно сделать итем замедленного действия, самоубирающийся из инвентаря через некоторое время, прописав стейт Pickup:
Note that due to this special behavior, the Use and Pickup states will ignore all frame durations and shouldn't be looped, attempts to do to so may result in the sequence being interrupted by the engine; every frame will execute within the same tic.
Про трупоискание: чуваки, пишите на зскрипте. А то сидит куча вроде бы вполне норм программистов и выдумывают костыли. Я просто в шоке с ваших альтернативных извращений.
https://github.com/jewalky/ZSDuke/blob/master/Code/dn3d/monsters/slimer.txt#L174 (остальная часть функции реализует ползание протозоида по потолкам, нам это не нужно)
A_EatCorpse:
https://github.com/jewalky/ZSDuke/blob/master/Code/dn3d/monsters/slimer.txt#L98 Оно немного своеобразно написано, но поиск трупов думаю можно вычленить.
A_EatCorpse работает в двух режимах — eatingActor=true, и eatingActor=false.
Когда eatingActor=false, происходит поиск (рандомное назначение corpseTarget, а A_MyChase в свою очередь движется в сторону трупа, если эта переменная назначена).
Когда eatingActor=false, при этом corpseTarget назначен и находится прям рядом с монстром, то eatingActor назначается в true.
Когда eatingActor=true, актор никуда не двигается (путём возвращения false из A_EatCorpse) и показывает анимацию поедания.
Если уж прям очень-очень хочется сделать именно через декор, рекомендую A_RadiusGive с флагом RGF_CORPSES, и вызывать ACS-скрипт, заставляющий монстра идти и жрать труп.