Так, коль скоро идёт активный движ по АЦС то пожалуй тоже спрошу про оный.
Нужен скрипт который активируется игроком и при этом раздаёт некий итем ВСЕМ монстрам и итемам (оружию, патронам, ключам, аптечкам, бронькам, пауэрапам) на карте.
Void Weaver А чем не подходит стандартный метод с A_RadiusGive с флагами RGF_MONSTERS | RGF_ITEMS?
Если нужен именно ACS-скрипт, выдавай в нём игроку CustomInventory, которая будет вызывать этот A_RadiusGive.
Проблема в том что сейчас механика как раз завязана на A_RadiusGive с соотв. флагами и активируется именно непосредственно из кастом-игрока. Но если верить вики то радиус действия ф-ции лимитирован жалкими 16К, т. е. мой алгоритм не будет пахать на картах больших размеров чем 16К по максимальной диагонали.
Честно говоря я не проверял предел эффективного радиуса _РадиусГив, хотя бы потому что не знаю как это можно проверить. В любом случае на всякий пожарный хотелось бы перенести эту часть на скрипт глобального охвата. Но не на OPEN\ENTER поскольку скрипт должен выполняться многократно.
Привет всем. И снова простецкий вопрос, на который я не могу найти ответ)
Перерыл думвики и нашёл только SetLineTexture для линии. Ни как не могу найти подобный спешл(для сектора) для замены текстуры на полу или потолке. Напишите его пожалуйста, если есть такой в природе.
я искал типо этого:
SetFloorTexture
И с потолком та же беда)))) кто же знал что названия настолько перепутаны. Не догадался на Change пробить
Благодарю!
измерив дистанцию непосредственно между игроком и целью в прицеле и записав это значение как множитель урона прямо в A_FireBullets.
А как это сделать на ACS если не секрет? )
На самом деле тут даже скрипты не нужны, всё элементарно делается по чудесному указателю AAPTR_PLAYER_GETTARGET. Формулы пишем прямо в _ФайрБуллетс без кастом-пуффов:
Actor PistFP : Pistol replaces Pistol
{
+WEAPON.NOAUTOAIM
Weapon.SlotNumber 2
Weapon.SlotPriority 1
States
{
Fire:
PISG A 4
//PISG B 0 A_FireBullets(5.6,0,1,1000/(GetDistance(1,AAPTR_PLAYER_GETTARGET)-8)+1,"BulletPuff",FBF_USEAMMO|FBF_NORANDOMPUFFZ|FBF_NORANDOM) //Урон растёт по мере уменьшения дистанции до цели
PISG B 0 A_FireBullets(5.6,0,1,(GetDistance(1,AAPTR_PLAYER_GETTARGET)-8)*0.1+5,"BulletPuff",FBF_USEAMMO|FBF_NORANDOMPUFFZ|FBF_NORANDOM) //Урон растёт по мере увеличения дистанции до цели
PISG B 0 A_PlaySound("weapons/pistol",1)
PISG B 6 A_GunFlash
PISG C 4
PISG B 5 A_ReFire
Goto Ready
}
}
Добавлено спустя 11 часов 25 минут 59 секунд:
===========
===========
ВОПРОС:
Мапперы, каков максимально возможный размер карты с учётом монстр-контейнеров секторов обычно размещаемых за пределами игрового пространства?
Есть ли какой-нибудь способ получить значение максимальной стороны карты?
Void Weaver А ты скачай билдер и проверь.
У меня получилось в UDMF сделать карту размерами 256 * 65535 (65535 = 2^16 - 1). Работает, и вроде без багов. Больше 65536 карта (под GZDoom) размер иметь точно не может, все три координаты в GZDoom ограничены по модулю 32768. Смотри исходники.
Мапперы стараются не делать размер карты большим, чем 32768, потому что это вызывает ошибки, связанные всё с тем же переполнением.
Контейнеры --- это точно такие же секторы, как и "игровое пространство".
С чего ты взял, кстати, что 16 тысяч, указанные в статье, --- это ограничение?
На вики написано "A good range for the entirety of the map would be 16383", то есть, это значение было бы неплохой априорной догадкой (учитывая соглашение о 32768). Но в коде A_RadiusGive я не вижу ничего похожего.
Я бы попробовал взять 65535. Потом, если будут проблемы, заменить на 32767 и, как у них в статье, телепортировать актора-проверяющего в (0, 0, 0) (хотя эта точка может легко оказаться вне игрового пространства...)
Да, я уже выяснил, так что значение радиуса более 113к не имеет смысла. И да, заметка на вики абсолютная бессмысленная имхота, хотя оказывается не один я так заблуждался.
За соус отдельное спасибо.
Но всё-таки скрипт лучше подойдёт для массовой выдачи итема по всей карте, ибо при огромном количестве получателей итема (все монстры и предметы) каждый лишний мапюнит _РадиусГив некисло снижает фпс. Так что если в ваде одна карта максимального размера, а другая крошечная но густонаселённая например, то избыточный радиус функции будет только вхолостую отъедать ресурсы на маленькой карте. А если при получении итема спаунится ещё что-то (как в моём случае), то это вообще светопреставление.
Да, A_ChangeVelocity позволяет динамично корректировать скорость акторов, включая даже капризные FastProjectile.
Для "фиксированного" линейного ускорения\замедления также можно использовать более примитивную A_ScaleVelocity.
Имей в виду что A_SetSpeed НЕ РАБОТАЕТ для не-сикер снарядов!
И снова здравствуйте. Сложная задача.
Есть много потолков связанных друг с другом только тегом, после их запуска в виде медленных прессов и остановки потолки оказываются на разных высотах, из-за давки монстров.
Все потолки склеить во едино нельзя, и быстрый пресс не подходит, который не сбивает высоту при давке(особенности строения карты карты).
Мне нужно как-то выровнять все потолки после остановки на одну координату, допустим глобальную координату карты 512 или как-то так. При этом потолки могут оказаться или выше или ниже координаты 512. Как такое можно провернуть подскажите пожалуйста?
Так это же сдвинуть на определённый диапазон относительно того, где остановился каждый потолок, а мне нужно сдвинуть все потолки на глобальную координату карты.
Вот скрипт, не поднимает потолки после остановки прессов:
Пытаюсь дать актору A предмет B, когда в этот актор А попадает пуля, и если у него уже есть другой предмет С. Модифицирую успешный код Void Weaver'а, где было условие "если у актора А есть флаг +ISMONSTER".
так выглядели важные строчки у успешного кода:
// актор пуффа, который попадал в монстра
//[...]
XDeath:
TNT1 A 0
TNT1 A 0 A_CheckFlag("ISMONSTER","GiveSuccessMark",AAPTR_TRACER)
Stop
GiveSuccessMark:
TNT1 A 0 A_GiveInventory("HitShot",1,AAPTR_TRACER)
//[...]
В моей задачи пришлось сделать нового актора, для теста просто взял актор Демона и приписал там
//[...] к демона
Spawn:
SARG AB 10 A_Look
SARG A 0 A_SetInventory("ISENEMY", 1, AAPTR_DEFAULT, FALSE)
Loop
//[...]
Actor ISENEMY : Inventory
{
Inventory.MaxAmount 1
}
//[...] в акторе пуффа, который попадает в монстра
XDeath:
TNT1 A 0
TNT1 A 0 A_JumpIfInventory("ISENEMY", 1, "GiveSuccessMark",AAPTR_TRACER)
Stop
GiveSuccessMark:
TNT1 A 0 A_GiveInventory("HitShot",1,AAPTR_TRACER)
//[...]
Не работает, пробовал и A_giveInventory, менять актор пойнтеры, все равно. Может я неправильно даю монстру предмет, это делается иначе?
Странно, почему не работает.
Возможно, многое зависит от конфигурации карты. Если позволяет геометрия, попробуй обвести каждый потолок-давилку тонким сектором в 1-2 маппикселя ширины, ему поставь нужную высоту, а экшен поменяй на Ceiling_RaiseToNearest.
Странно, почему не работает.
Возможно, многое зависит от конфигурации карты. Если позволяет геометрия, попробуй обвести каждый потолок-давилку тонким сектором в 1-2 маппикселя ширины, ему поставь нужную высоту, а экшен поменяй на Ceiling_RaiseToNearest.
Нашёл в чём проблема. Если потолок хотя бы раз запускается как пресс, то после этого неважно остановил его или нет, этим потолком больше нельзя управлять с помощью дверных и потолочных спешелов, на нём будут работать только прессовые спешелы. Возможно в самой гозе недоработка или я чего-то не понял.
Пробовал по всякому потолками управлять после запуска их как прессов, не двигаются, даже если Ceiling_CrushStop был запущен.