Тут используется НЕ тид а целое число, означающее номер игрока. Полагаю что правильнее GetUserCVarString(PlayerNumber(),"name"), но это сработает если активатором скрипта будет актор который был выбран самой PickActor.
Если что, я хз как менять активатор по тиду не выходя за пределы скрипта. Мб. надо где-то вклинить что-то типа SetActivator или SetActivatorToTarget.
У меня есть предложение, может все-таки разделить тему на две: тему для "реально действительно новичков", с вопросами в духе "Как правильно сделать ловушку - телепорт монстров" или "как импортировать монстров из одной игры в другую", и тему, в которой обсуждаются вышенаписанные вещи, которые требуют большого опыта и к новичкам не относятся вообще никак?
Это бы помогло ориентироваться в информации и заодно из-за гораздо меньшего размера "новичковой" темы, служило бы также своего рода FAQ'ом. Ну а профи вопросы обсуждались бы в другой теме совершенно свободно.
Товарищи, а может кто-нибудь сказать, откуда на картах берутся лишние вертексы? Например, открываю карту в Doom builder, там их 784, ту же карту открываю в слэйде - их уже 914
svl это как-то связано с тем, как node builder разбивает карту (в процессе этого создаются дополнительные вертексы - технические и не доступные для манипуляций маппером). Возможно в слейде они доступны. А может быть недоступны, но считаются в счетчике, я точно не знаю.
разбивка карты (и создание дополнительных "типалайндефов" под названием "segs" и доп. вертексов) нужна для отрисовки карты и еще для чего-то, но это стандартный метод как я понял в думе и многих других шутерах, такая логическая структуризация пространства
Как-то практика не совсем сходится с теорией. Размер лампа соответствует количеству отображаемых в списке слэйда вертексов. Удалил эти "лишние" вертексы, размер лампа уменьшился, но опять же соответствует. Карта остается вполне играбельной. Т.е., никаких дополнительных вертексов автоматом не создается.
Может, эти вертексы были созданы в каком-то редакторе, потом в процессе редактирования карты были удалены, но информация о них осталась?
Да, карта для Еретика, если это важно
Возможно есть дублирующиеся вертексы которые билдер затирает при загрузке (потому что они на одинаковых координатах). Попробуй сохранить карту билдером, скорее всего количество сведётся к одинаковому в обоих редакторах.
Сохранять я пробовал, остается то же самое. Координаты у этих лишних оригинальные (т.е. не дубли), попадают где-нибудь на линии. Подумалось еще вот что: возможно, карта делалась в редакторе, который действительно добавлял свои вертексы, а более современные этого уже не делают, т.к. ресурсы компов выросли, и необходимость в этом отпала
Если попадают на линии, то да, это и есть скорее всего те дополнительные вертексы от Нод билдера, они именно так и получаются, разбиение лайндфов на "сеги"
Вероятно всем насрать, но тем не менее.
Наткнулся на один из своих первых реквестов в моддинге, и вопрос был о том как работает A_CheckBlock, и почему она не работала в моём случае. Тогда вопрос так и не был решён, только сейчас допёр:
Скрытый текст:
A_CheckBlock сначала учитывает THRU-флаги если таковые имеются, а затем проверяет находится лиТОЧКА ВЫЗОВА* функции в состоянии коллизии при которой дальнейшее перемещение с помощью A_Chase или подобной ф-ции будет невозможно. Если это так то совершает джамп в указанный стэйт.
Теперь подводные камни или почему работал код Юры и не работал мой(A_CheckBlock("Charge2")):
Вот один из многочисленных примеров в моем коде:
Missile:
MNTR X 0 A_FaceTarget
MNTR X 0 A_PlaySound("minotaur/sight")
MNTR X 0 A_CheckBlock("MissileA", CBF_DROPOFF, AAPTR_TARGET, 512, 0, 110)
Goto PreCharge
Все работает - отчего ж у тебя трабла - сча гляну...
Add: не понимаю почему у тебя не работает
1. *Дело в том что эта проверка ТОЧЕЧНАЯ (проверяется НЕ весь актор а только ТОЧКА в определённых координатах) и по умолчанию (при 0 x-офсете) выполняется непосредственно в центре актора-коллера, т. е. монстр уткнувшийся во что\кого-либо при нулевом х-офсете никогда не удостоверится что его что-то блочит. Иными словами значение х-офсета ф-ции должно быть больше значения радиуса актора-коллера! 2. По умолчанию ф-ция использует AAPTR_TARGET, тогда как для корректной проверки самого себя нужно использовать AAPTR_DEFAULT поинтер! Вывод: для регулярного монстра наиболее оптимальная форма записи функции для чарджа (векторного движения НЕ-Чейс подобными функциями) будет вида:
Actor CBLImp : DoomImp replaces DoomImp //Бухие импо-бычары, будут биться со всеми об кого шарахнутся башкой
{
const int CBF_MYFLAGSET = CBF_SETTARGET|CBF_DROPOFF;
States
{
Melee:
Missile:
TNT1 A 0 A_Jump(128,"ChargeAPSTENU")
Goto Super::Melee
ChargeAPSTENU:
/* //Обычная форма записи
TROO A 2 A_FaceTarget
TROO A 0 A_Recoil(-2.0)
TROO A 0 A_CheckBlock("Pain",CBF_MYFLAGSET,AAPTR_DEFAULT,Radius+frandom(MeleeRange*0.1,MeleeRange*0.2)+1)
TROO A 2 A_FaceTarget
TROO A 0 A_Recoil(-2.0)
TROO A 0 A_CheckBlock("Pain",CBF_MYFLAGSET,AAPTR_DEFAULT,Radius+frandom(MeleeRange*0.1,MeleeRange*0.2)+1)
TROO B 2 A_FaceTarget
TROO B 0 A_Recoil(-2.0)
TROO B 0 A_CheckBlock("Pain",CBF_MYFLAGSET,AAPTR_DEFAULT,Radius+frandom(MeleeRange*0.1,MeleeRange*0.2)+1)
TROO B 2 A_FaceTarget
TROO B 0 A_Recoil(-2.0)
TROO B 0 A_CheckBlock("Pain",CBF_MYFLAGSET,AAPTR_DEFAULT,Radius+frandom(MeleeRange*0.1,MeleeRange*0.2)+1)
TROO C 2 A_FaceTarget
TROO C 0 A_Recoil(-2.0)
TROO C 0 A_CheckBlock("Pain",CBF_MYFLAGSET,AAPTR_DEFAULT,Radius+frandom(MeleeRange*0.1,MeleeRange*0.2)+1)
TROO C 2 A_FaceTarget
TROO C 0 A_Recoil(-2.0)
TROO C 0 A_CheckBlock("Pain",CBF_MYFLAGSET,AAPTR_DEFAULT,Radius+frandom(MeleeRange*0.1,MeleeRange*0.2)+1)
TROO D 2 A_FaceTarget
TROO D 0 A_Recoil(-2.0)
TROO D 0 A_CheckBlock("Pain",CBF_MYFLAGSET,AAPTR_DEFAULT,Radius+frandom(MeleeRange*0.1,MeleeRange*0.2)+1)
TROO D 2 A_FaceTarget
TROO D 0 A_Recoil(-2.0)
TROO D 0 A_CheckBlock("Pain",CBF_MYFLAGSET,AAPTR_DEFAULT,Radius+frandom(MeleeRange*0.1,MeleeRange*0.2)+1)
Loop
*/
TROO AABBCCDD 2 //Форма записи в анон-"упаковке"
{
A_FaceTarget;
A_Recoil(-2.0);
If(A_CheckBlock("Pain",CBF_MYFLAGSET,AAPTR_DEFAULT,Radius+frandom(MeleeRange*0.1,MeleeRange*0.2)+1,0,0))
{
Return state("Pain");
}
Else
{
Return state("");
}
}
Loop
}
}
Zeberpal_98 Вообще-то, в аналогичный чек умеет более сложная и гибкая A_CheckLOF и последние года я использовал именно её в качестве инструмента проверки на блок движения.
Но для проверки блока "изнутри" актора A_CheckBlock просто незаменима, плюс в рядовых случаях разумеется лучше использовать надлежащую функцию вместо A_CheckLOF в качестве её громоздкого суррогата.
FoxPlays Грац, растёшь как на дрожжах.
GetArmorInfo - вернёт инфу о типе армора и степени защиты;
CheckInventory("BasicArmor") - вернёт текущее количество очков брони.
Получить значение собственного тид можно просто использовав кейворд "tid", для получения тидов таргета, трэйсера или мастера используй GetActorProperty(<tid>,APROP_TargetTID), APROP_TracerTID или APROP_MasterTID соответственно.
Получить значение собственного тид можно просто использовав кейворд "tid", для получения тидов трэйсера или таргета используй GetActorProperty(<tid>,APROP_TargetTID) или APROP_TracerTID соответственно.
Ну в принципе ничто не мешает вызвать в скрипте "лестничное" инфо:
GetArmorInfo(Армортайп)
GetArmorInfo(АрморСэйв%)
CheckInventory("BasicArmor")
Получится весьма детально.
Нет, именно те патроны которые использует оружие которое в руках у игрока.
С 2009 года этот вопрос и его производные поднимались на z-форуме как минимум 5 раз и каждый раз ответ был 2*нет: "нет" - на ацс нельзя, и "нет" - такие фичи запиливать не планируется.
Предлагаются либо решения через SBARINFO (типа такого), либо же прописывать чеки на вручную преопределённые аммотайпы (типа так).