В bounce-снаряд можно прописать одноимённый стэйт в котором (стэйте) может выполняться последовательность действий, если таковые прописаны.
Так же любому актору можно выставить REFLECTIVE флаг который заставит отскакивать снаряды от этого актора.
Вопрос: есть ли какой-нибудь декор (или хотя бы АЦС) способ вклинить выполнение неких действий после отражения снаряда флагом REFLECTIVE, по аналогии с баунс-стэйтом снаряда; иными словами: как выполнить чек на то что сработал флаг REFLECTIVE? Или это можно только через зскрипт?
-----------
И всё таки я был бы признателен если кто подскажет как написать такой скрипт:
Нужен скрипт который активируется игроком и при этом раздаёт некий итем ВСЕМ монстрам и итемам (оружию, патронам, ключам, аптечкам, бронькам, пауэрапам) на карте.
Привет всем! Вопрос: можно ли выводить на экран во время прохождения карты составные тексты?
Я имею ввиду небольшой текст за которым следует другой небольшой текст показывающий значение переменной.
Пример такого текста:
pressed switches 6
Где слова "pressed switches" это обычный текст, а цифра "6" это своего рода счётчик, показывающий сколько рубильников нажато, то есть шестёрка это переменная которая показывается прямо в тексте (pressed switches 1, pressed switches 2, 3, 4 и т.п...)
Формат ACS скрипт. Кто шарит помогите пожалуйста
Void Weaver Сделал тестовую версию, по началу не работала. Из-за спешки не там символы понаставил и ещё при первом нажатии ноль показывал, не мог понять почему, оказалось нужно принт ставить после начисления переменной Оо сам допёр, как не знаю))) Благодарилую!!!
Скрытый текст:
int mapvar1;
script 2 (void) { mapvar1++; print(s: "pressed switches 2/", d:mapvar1); Door1(); }
script 3 (void) { mapvar1++; print(s: "pressed switches 2/", d:mapvar1); Door1(); }
function void Door1 (void)
{ if (mapvar1 == 2)
{ //print(s: "central door is open");
ambientsound("Sound/gong", 100);
}
if (mapvar1 == 6)
{ //print(s: "central door is open");
ambientsound("Sound/Gurgles", 100);
}
}
Чуток обрисую нынешнюю проблему. Игрок ставит стационарную турель которая выдаёт игроку бобло как только цель турели (монстр) скопытится. Проблема в том что если один монстр является целью сразу нескольких турелей, то по смерти монстра ревард игроку выдадут ВСЕ турели для которых усопший был последней целью.
Отсюда вопрос следующий: каким образом можно отследить и зафиксировать авторство убийства одного актора другим БЕЗ модификации кода жертв? Годится любой метод, но лично мне предпочтительней решение на декоре.
----
2. Есть ли какой-нибудь способ визуализировать field of view+sight range актора в перекрестии прицела? Т. е. например наводишь прицел на актор и под ним тут же отрисовывается сектор (в визуальном смысле а не в смысле маппинга) отражающий текущие параметры A_LookEx? Ну типа если у цели field of view = 45 градусам а sight range = 500, то и сектор на полу будет подсвечен ровно на 500 мапюнитов и строго в диапазоне 45 градусов от "лица" цели.
Void Weaver 1. Посмертно выдать цели итем, который может существовать в инвентаре в единственном экземпляре. А значит, и чекнуть+изъять для подтверждения реварда его можно один лишь раз.
2. Здесь проблема не в способе визуализации (можно какие-нибудь 3д-модели скейлить), а в выковыривании настроек A_LookEx. Это ведь вообще не Property, ни через CheckActorProperty, ни зскриптом это не вытащить. Если не трогать код монстра, единственный зыбкий путь, который я вижу - это мутить какие-то тестовые объекты, которые будут агрить монстра на себя, предварительно запомнив его стейт и возвращая ему его стейт. И багов здесь будет просто овердофига.
Хотя я, конечно, плохо знаю зскрипт. Возможно, где-то в недокументированных глубинах и есть какая-нибудь хрень, позволяющая спарсить текст исполняемой строчки декорейта, но скорее всего это из области фантастики.
1. Посмертно выдать цели итем, который может существовать в инвентаре в единственном экземпляре.
А можно чуток подробнее кто кому должен выдавать итем (аутентификатор выдачи реварда, да?)? Если что, то по умолчанию игрок остаётся целью монстров, исходя из того что турели не нацеливаемые.
Олсо, до публикации вопроса я было попробовал замхать выдачу хабара игроку непосредственно из самого пуффа, и казалось бы что всё логично, правильно, красиво и косяков не содержит по определению. Но ВНЕЗАПНО хз по какой причине периодически таки продолжает проскакивать двойная награда:
Скрытый текст:
Actor TurretPuff : BulletPuff
{
+PUFFONACTORS
+HITTRACER
+PUFFGETSOWNER
var int user_lootClass;
States
{
Spawn:
TNT1 A 0 NoDelay A_CheckFlag("NOBLOOD","XDeath",AAPTR_TRACER)
Goto Super::Spawn
XDeath:
TNT1 A 1 A_ChangeFlag("ALLOWPARTICLES",0) //Тут ОБЯЗАТЕЛЬНО должен быть буфферный ТИК!
//TNT1 A 0 A_CheckFlag("CORPSE","GiveReward",AAPTR_TRACER)
//TNT1 A 0 A_JumpIfHealthLower(1,"GiveReward",AAPTR_TRACER) //У некоторых монстров может не быть трупа, так что универсальней чекать хп
TNT1 A 0 //На всякий пожарный 2 в одном
{
If(A_JumpIfHealthLower(1,"GiveReward",AAPTR_TRACER)&&A_CheckFlag("CORPSE","GiveReward",AAPTR_TRACER)){Return state("GiveReward");}
Else{Return state("");}
}
Stop
GiveReward:
TNT1 A 0 A_PlaySound("brain/pain",0)
//TNT1 A 0 A_GiveToTarget("RewardActivator")
//*
TNT1 A 0
{
If(CheckClass("ZombieMan",AAPTR_TRACER,1)){user_lootClass=1;Return state("");}
Else If(CheckClass("ShotgunGuy",AAPTR_TRACER,1)){user_lootClass=2;Return state("");}
Else If(CheckClass("ChaingunGuy",AAPTR_TRACER,1)){user_lootClass=4;Return state("");}
Else If(CheckClass("DoomImp",AAPTR_TRACER,1)){user_lootClass=3;Return state("");} //Иногда 1 импа таки "валят" сразу 1+ пушки и получаем 6 шеллсов, такое впечатление что это тот случай когда сбоит та самая "распределённая одновременность": http://i.iddqd.ru/viewtopic.php?p=104278#104278
Else If(CheckClass("Demon",AAPTR_TRACER,1)){user_lootClass=4;Return state("");}
Else If(CheckClass("LostSoul",AAPTR_TRACER,1)){user_lootClass=0;Return state("");}
Else If(CheckClass("Revenant",AAPTR_TRACER,1)){user_lootClass=7;Return state("");}
Else If(CheckClass("Cacodemon",AAPTR_TRACER,1)){user_lootClass=6;Return state("");}
Else If(CheckClass("HellKnight",AAPTR_TRACER,1)){user_lootClass=7;Return state("");}
Else If(CheckClass("BaronofHell",AAPTR_TRACER,1)){user_lootClass=8;Return state("");}
Else If(CheckClass("Arachnotron",AAPTR_TRACER,1)){user_lootClass=7;Return state("");}
Else If(CheckClass("Fatso",AAPTR_TRACER,1)){user_lootClass=8;Return state("");}
Else If(CheckClass("Archvile",AAPTR_TRACER,1)){user_lootClass=9;Return state("");}
Else If(CheckClass("SpiderMastermind",AAPTR_TRACER,1)){user_lootClass=10;Return state("");}
//Else If(CheckClass("Cyberdemon",AAPTR_TRACER,1)){user_lootClass=10;Return state("");}
Else{user_lootClass=10;Return state("");} //Значит остался только Кибер
}
//TNT1 A 0 A_GiveToTarget("Shell",user_lootClass) //Строка для использования из волыны
TNT1 A 0 A_RearrangePointers(AAPTR_DEFAULT,AAPTR_DEFAULT,AAPTR_NULL) //На всякий пожарный?...
TNT1 A 0 A_GiveToTarget("Shell",user_lootClass,AAPTR_MASTER)
//*/
Stop
}
}
----
2. Не-не, для этого пункта код монстра вполне открыт для любых модификаций. Вернуть параметры A_LookEx я полагаю ваще изи если использовать для оных юзерварки. Честно говоря меня как раз интересует гибкость визуализации. И если то, как отрисовывать на полу круг с динамичным радиусом это хотя бы относительно понятно, то вот как рисовать динамичную "дольку" (при FoV<360) я вообще хз.
Мб. как-нибудь через A_SetVisibleRotation?
А можно чуток подробнее кто кому должен выдавать итем (аутентификатор выдачи реварда, да?)?
Ну для начала рассмотрим простейший пулемётно-хитскановый случай.
1. Турель лупит по монстру, с каждым выстрелом делая A_JumpIfHealthLower(1, int offset , AAPTR_TARGET), и как только здоровье монстра падает до нуля - выдаёт ему итем.
2. Идёт небольшая задержка. (Для надёжности её можно рандомизировать, загнав фрейм в бесконечный самоповтор с джампом на выход с некоторым шансом).
3. Проверка A_JumpIfInventory("итем",1, int offset,AAPTR_TARGET) ведёт на действие: забрать у таргета итем, дать игроку награду.
4. Далее A_ClearTarget.
В теории, даже если несколько турелей попадут на этап 3 одновременно, то обрабатывать их движок будет по очереди. И как только одна из них изымет у таргета итем - все остальные уже не смогут пройти эту проверку.
С ракетными турелями всё чуть сложнее, ракета сразу после спауна должна узнавать у турели её текущий таргет и записывать в AAPTR_TRACER. При попадании в цель все вышеописанные действия совершает уже ракета (разумеется, вместо таргетфилда теперь трасерфилд).
И если то, как отрисовывать на полу круг с динамичным радиусом это хотя бы относительно понятно, то вот как рисовать динамичную "дольку" (при FoV<360) я вообще хз.
A_SetVisibleRotation всего лишь делает объект невидимым с некоторых ракурсов, так что она тут малополезна.
Вообще, если решать задачу "в тупую", то можно установить шаг погрешности (допустим, 10 градусов) и спаунить под объектом модель вида "плоский треугольник" в количестве от 1 до 36 штук. Вершина треугольника должна быть координатным центром модели, а радиус мы задаём через Scale. (Здесь есть некоторая жопа в том, что параметр ограничен значением 4.0, так что изначально должен быть выставлен сильно меньше 1.)
Если решать умнее, то мы спауним всего 8 треугольников, чтобы было похоже на логотип Umbrella corporation. По дефолту треугольники имеют угол 45 градусов и разложены по полу с шагом в 45 градусов. Но если применить особую уличную магию тригонометрии, то можно определить коэффициент YScale для любого числа градусов. (Навскидку K = tg(α/2)/tg(45/2), если я ничего не путаю). В этом случае мы одновременно уменьшаем угловой шаг и угловой размер треугольника, и логотип Umbrella corporation превращается в китайский веер, который может быть разложен на какой угодно угол от 0 до 360, и давать точный результат при экономии полигонов.
Да, там вылезет небольшая проблема центровки, ибо линия, разделяющая треугольники №4 и №5 должна быть сориентирована чётко по морде монстра, т.е. их угол должен равняться "собственный угол монстра ± шаг/2", но это уже всё легко и понятно делается.
1. Так, я в общем подозревал что будет шило на мыло, ну в общем оно так и вышло: остальные турели выполняют всё те же действия над всё той же ОБЩЕЙ целью! Лут сыпется как из ведра. Пока что лучший результат показывает вышеприведённый пуфф, но хоть убей не понимаю в какой момент проскакивает мультилут.
Со снарядами полагаю механика будет аналогичная, причём подозреваю что заглюков с мультилутом у маслин будет меньше чем у хитсканов, либо вообще не будет такой проблемы. Но хитскан, ссука, никак не лечится, хотя по логике он-то как раз должен был бы полностью исключён из подобных коллизий - на 1 труп 1 пуля.
Есть ещё какие соображения, няш?
2. A_SetVisibleRotation - я полагал типа спаунить слоёнку "круглых" спрайтов, глядящих в разные стороны, видимость которых задавать через установку (не)видимого угла, а диапазон как раз брать из ФоВ _ЛукЭкса. Т. е. использовать функцию как общую маску для всех разнонаправленных слоёв круглых спрайтов, что в теории будет означать что с какой стороны не взгляни то везде будет отрисовываться видимый сектор ("долька") одного из кругов. Аналогично устройству механизма лимбового (сейфового) замка.
В моделях не шарю но на бумаге твой вариант выглядит перспективно. Подождём результатов от FoxPlays, если что.
По-эксперементировал -- без серьёзных результатов.
1. Пытался что-то похожее сделать на ACS, но без должных результатов. Если у меня всё-таки не получиться сделать эту штуку с деньгами, то сделаю деньги физическими, то-есть они будут выпадать с монстров. Лучший результат получился у воида, также спасибо и герру с помощью.
2. Визуальный радиус турелей не думаю добавлять, обойдусь добавлением информации о радиусе для турелей по типу - Radius: Small, Medium, Large.
На том спасибо.
Если у меня всё-таки не получиться сделать эту штуку с деньгами, то сделаю деньги физическими, то-есть они будут выпадать с монстров.
Ну да, наверное это логично.
А игроку можно запилить что-то типа "магнитного" скилла который при юзе будет собирать дроп в радиусе на некоторой дистанции. Ну или со всей мапы. Правда меня всё ещё интересует решение этой задачи именно через получение награды из самой турели или из инфликтора её урона. Иначе придётся оставить механизм выдачи экспы не за киллы а за нанесённый урон.
FoxPlays 2. Если будешь когда-нибудь работать с моделями попробуй реализовать визуализацию по методу Смертоносца. Отпишусь если получится по A_SetVisibleRotation.