Welcome to U.A.C. [O.S.A.]
login / register
Status: Guest
Архивы форума | iddqd.ru
Wolf 3D
ПравилаПравила ПоискПоиск
18+
Тема для новичков. Вопросы по маппингу/моддингу - любые!-2 Пред.  1, 2, 3 ... , 13, 14, 15  След.
   Список разделов - Местечко мапперов и моддеров - Тема для новичков. Вопросы по маппингу/моддингу - любые!-2Ответить
АвторСообщение
YURA_111
= Sergeant Major =
Next rank: UAC Sergeant Major after 78 points
602

Doom Rate: 1.98

Posts quality: +99
Ссылка на пост №261 Отправлено: 06.09.19 22:36:02
MelaDoZer пишет:
Может, возможно заменить одного конкретного актёра на другого, как в первом вопросе? Того же сержанта с индексом 101 на импа, например.


Может RandomSpawner? ( https://zdoom.org/wiki/Classes:RandomSpawner )
Правда в этом случае заменяются все монстры этого класса на уровне и в игре.
MelaDoZer
Recruit
Next rank: Recruit after 4 points
6

Doom Rate: 2

Posts quality: +1
Ссылка на пост №262 Отправлено: 07.09.19 03:41:37
YURA_111 пишет:
Может RandomSpawner? ( https://zdoom.org/wiki/Classes:RandomSpawner )
Правда в этом случае заменяются все монстры этого класса на уровне и в игре.



Увы, не могу как раз так сделать, не такая цель :( Но спасибо!
Просто пытаюсь, как в пример, заменить одного конкретного сержанта на E1M1 (индекс 90) на пулемётчика, как было в Playstation Doom на сложности Ultra-Violence. Заспаунить монстра легко, как и повернуть его и присвоить флаги, а вот как удалять определённый thing c карты ZScript'ом мне пока непонятно :) По идее, если бы я знал как удалить монстра, то я бы смог написать функцию для эдакой замены (и получился бы ответ на мой второй вопрос, хех).

В ACS лезть не хочется, а то придётся как-то код разрывать. Есть у меня ACS-библиотека, которая на OPEN удаляет thing'и с тегами, но я вообще хотел про неё забыть и не использовать больше :D Должен быть какой-то способ...
ZZYZX
- Commissar -
Next rank: = Commissar = after 202 pointsМодератор форума
5138

Doom Rate: 1.73

Posts quality: +1440
Ссылка на пост №263 Отправлено: 07.09.19 03:52:39
Destroy() от объекта, чтобы удалить.

Только я не уверен, как найти актора именно по индексу из карты, а не по тэгу. И сохраняется ли эта информация вообще при загрузке. Известно что именно для акторов дум херит довольно много информации, в том числе UDMF-свойства от акторов, например (именно поэтому нельзя получить "comment" у актора, даже если он был — "не реализовано"). Индекс, вероятно, не сохраняется тоже, во всяком случае я его не нашёл.

Есть код в LevelCompatibility, но этот код вызывается не в любое время, а между загрузками карты. И да, там есть доступ к индексу тхинга. Только нормальному человеку это использовать невозможно никак, это встроенный файл в гздуме.

Предлагаю искать монстра по X/Y и типу.

Рейтинг сообщения: +3, отметил(и): JSO x, Void Weaver, MelaDoZer
2 2 1
MelaDoZer
Recruit
Next rank: Recruit after 4 points
6

Doom Rate: 2

Posts quality: +1
Ссылка на пост №264 Отправлено: 07.09.19 06:05:20
ZZYZX пишет:
олько я не уверен, как найти актора именно по индексу из карты, а не по тэгу. И сохраняется ли эта информация вообще при загрузке. Известно что именно для акторов дум херит довольно много информации, в том числе UDMF-свойства от акторов, например (именно поэтому нельзя получить "comment" у актора, даже если он был — "не реализовано"). Индекс, вероятно, не сохраняется тоже, во всяком случае я его не нашёл.

Есть код в LevelCompatibility, но этот код вызывается не в любое время, а между загрузками карты. И да, там есть доступ к индексу тхинга. Только нормальному человеку это использовать невозможно никак, это встроенный файл в гздуме.


Да, я как-то давно читал, что LevelCompatibility недоступен для наследования (вроде так, поправьте если что, я могу неправильно термины применять :D).
Однако, у меня получилось. Вычитал на форуме ZDoom'а, что его можно юзать. Я не заметил как это изменили в GZDoom, выходит. Вот пример (да и вдруг кому нужно будет):
Скрытый текст:

class UltimateDoomMonsters : LevelCompatibility
{
    protected void Apply(Name checksum, String mapname)
    {
	if ('B49F7A6C519757D390D52667DB7D8793' == checksum) // - Ultimate Doom E1M1: Hangar
		{
			SetThingFlags(114, 0);
		}
	}
}


Это убирает Bloody mess 1 напротив старта. Как на скрине:
Скрытый текст:



Однако, теперь какие-то проблемы со спауном монстров в этом коде и GZDoom просто крашится, по ошибкам пусто (просто уровень загружается, да и всё). Ну это не так уж и страшно, с этим можно ещё разобраться (думаю это из-за самой функции Apply, тут уж придётся поделить).
Спасибо большое, я бы даже не копал в направлении LevelCompatibility, если бы не напомнили :) Думал, что нужно ждать обновления гоззы.
Впрочем, надо ещё разобраться с архитектурой, насколько её можно изменять :)

Рейтинг сообщения: +1, отметил(и): Void Weaver
Толик
Recruit
Next rank: Marine after 2 points
18

Doom Rate: 1.64

Posts quality: +9
Ссылка на пост №265 Отправлено: 09.09.19 22:13:39
ZZYZX пишет:
Известно что именно для акторов дум херит довольно много информации, в том числе UDMF-свойства от акторов, например (именно поэтому нельзя получить "comment" у актора, даже если он был — "не реализовано"). Индекс, вероятно, не сохраняется тоже, во всяком случае я его не нашёл.

Откуда инфа?

MelaDoZer пишет:
Вычитал на форуме ZDoom'а, что его можно юзать

Можно чексумму получить и просто так с помощью levellocals.getchecksum() и потом в worldloded/worldthingspawned/etc ивенте поменять монстра если его координаты, тип и чексума карты совпадают с заданными.
Void Weaver
- Captain -
Next rank: = Captain = after 72 points
2268

Doom Rate: 1.8

Posts quality: +706
Ссылка на пост №266 Отправлено: 10.09.19 07:25:36
Имеется актор с набором спрайтов
СПРТ АБВГДЕ 1
и этим спрайтам в редакторе выставлен определённый оффсет (как для монстра).

Также имеется другой актор с тем же набором спрайтов
СПРТ АБВГДЕ 1
но для этого актора нужен совершенно иной оффсет (как для снаряда).

Вопрос: можно ли в пределах одного вада иметь одинаковый набор спрайтов с разными оффсетами, и если да то как это сделать?
Конечно можно тупо переименовать второй набор спрайтов, но их довольно много + будет дубликат ресурсов, и поэтому такой вариант только если не найдётся других решений.
1 8 1
Герр Смертоносец
= Sergeant Major =
Next rank: UAC Sergeant Major after 65 points
615

Doom Rate: 1.54

Posts quality: +354
Ссылка на пост №267 Отправлено: 10.09.19 16:18:07
Void Weaver пишет:
Вопрос: можно ли в пределах одного вада иметь одинаковый набор спрайтов с разными оффсетами, и если да то как это сделать?

Нормальный принудительный оффсет "СПРТ А 1 Offset(x, y)" работает только для HUD-пушек. С какого лешего эту фичу не стали распространять на все спрайты - сие тайна великая есть.
Теоретически единственный обходной путь (и только по вертикали) - шаманить с A_SetFloatBobPhase, благо что амплитуду можно задать произвольно. Второй обходной путь - это делать актора невидимым и спавнить самоварпящихся призраков с NOINTERACTION-флагов, но это уже совсем троллейбус из хлеба.
Что характерно - а вот для моделей такой путь есть! Ибо всё прописывается в MODELDEF, и можно на одну модель запилить сколько угодно комбинацией. Впрочем, я много раз говорил, что Z-порты являются одной большой насмешкой над универсальностью. :oops:

Рейтинг сообщения: +1, отметил(и): Void Weaver
2
ZZYZX
- Commissar -
Next rank: = Commissar = after 202 pointsМодератор форума
5138

Doom Rate: 1.73

Posts quality: +1440
Ссылка на пост №268 Отправлено: 10.09.19 17:11:05
Толик
Из исходников гздума, очевидно, не сам придумал
2 2 1
Void Weaver
- Captain -
Next rank: = Captain = after 72 points
2268

Doom Rate: 1.8

Posts quality: +706
Ссылка на пост №269 Отправлено: 10.09.19 17:48:46
Герр Смертоносец пишет:
Нормальный принудительный оффсет "СПРТ А 1 Offset(x, y)" работает только для HUD-пушек. С какого лешего эту фичу не стали распространять на все спрайты - сие тайна великая есть.
Мне куда более "доставило" что помимо кейворда есть ещё и A_WeaponOffset и A_OverlayOffset, которые разумеется не пашут на акторах кроме волын и кинвентори.

Герр Смертоносец пишет:
Второй обходной путь - это делать актора невидимым и спавнить самоварпящихся призраков с NOINTERACTION-флагов, но это уже совсем троллейбус из хлеба.
Ну ты, блин, кулибин! В общем-то мне как раз и нужно смещение по вертикали, пожалуй закинусь хлебцем. :crazy:
EDIT:
Работает идеально!
1 8 1
Толик
Recruit
Next rank: Marine after 2 points
18

Doom Rate: 1.64

Posts quality: +9
Ссылка на пост №270 Отправлено: 10.09.19 22:24:59
ZZYZX пишет:
Из исходников гздума

Ссылочку.
Неужели граф парсер для удмфа написать не в состоянии?
ZZYZX
- Commissar -
Next rank: = Commissar = after 202 pointsМодератор форума
5138

Doom Rate: 1.73

Posts quality: +1440
Ссылка на пост №271 Отправлено: 10.09.19 23:35:02
Толик
Мне не нравятся откровенные докапывания, но вот:
https://github.com/coelckers/gzdoom/blob/master/src/playsim/p_mobj.cpp#L5203
Функция по ссылке осуществляет создание актора из FMapThing.
FMapThing определён тут:
https://github.com/coelckers/gzdoom/blob/master/src/doomdata.h#L356
А читается из удмф тут:
https://github.com/coelckers/gzdoom/blob/master/src/maploader/udmf.cpp#L471

Понятие "индекс тхинга" там вообще отсутствует. Не нужно это было никому. Оно есть только в массиве converted чётотам, именно на этом уровне работает обработка совместимости.
Более того, код настолько древний, что там встречаются выражения в духе "The fields of the mapthing should already be in host byte order". Такие комментарии характерны для софта который читал данные сразу в структуру.

Подозреваю что те же UDMF-комментарии у тхинга нельзя прочитать по той же причине — их банально никто не сохраняет, читая из карты.
А чтобы их можно было прочитать, необходимо сначала запихать их в FMapThing, а потом в актора.
2 2 1
Толик
Recruit
Next rank: Marine after 2 points
18

Doom Rate: 1.64

Posts quality: +9
Ссылка на пост №272 Отправлено: 11.09.19 21:25:04
Мне было просто интересно глянуть на реализацию.
И да, это действительно наследие ренди. Граф его не трогает потому что работает.
Void Weaver
- Captain -
Next rank: = Captain = after 72 points
2268

Doom Rate: 1.8

Posts quality: +706
Ссылка на пост №273 Отправлено: 11.09.19 22:35:13
Можно ли задать спрайту такое вращение?
1 8 1
ZZYZX
- Commissar -
Next rank: = Commissar = after 202 pointsМодератор форума
5138

Doom Rate: 1.73

Posts quality: +1440
Ссылка на пост №274 Отправлено: 12.09.19 00:28:10
Можно, но придётся добавлять +WALLSPRITE / +FLATSPRITE / +FLOORSPRITE (или как там их) и вертеть спрайт руками в любую сторону )
2 2 1
Void Weaver
- Captain -
Next rank: = Captain = after 72 points
2268

Doom Rate: 1.8

Posts quality: +706
Ссылка на пост №275 Отправлено: 12.09.19 08:38:25
WALLSPRITE и FLATSPRITE не совместимы друг с другом, а насчёт "вертеть руками" хотелось бы подробней. Потому что на зфоруме один чел посоветовал что-то не менее расплывчатое:
Wouldn't this, in effect, be the same as simply decreasing the y-scale of the actor while increasing it's z-pos?

Если что то речь идёт о кастомных спрайтах снаряда, которые я хотел бы заставить вращаться в полёте в стиле KnightAxe еретиковских Кнайтов.
Мб. как-то через SpriteAngle?
---
1. Как записать чтобы что-то происходило только когда некая переменная кратна 10? Так: If(user_var%10==0)?
2. Как записать 256-маску шанса по проценту от текущих хп?
Т. е. нужно что-то типа A_JumpIf([если Health=100% то шанс 0, если Health=50% то 128, если Health=1% то 256],"state")
1 8 1
JSO x
- Sergeant Major -
Next rank: = Sergeant Major = after 36 points
564

Doom Rate: 2.4

Posts quality: +210
Ссылка на пост №276 Отправлено: 12.09.19 09:27:29
1) Да, так. И на "user_var == 0" действие тоже будет выполняться.

2) На Decorate -- "A_JumpIf( 256 - health / GetSpawnHealth() * 256, "state" )". На ZScript -- то же самое, но лучше с использованием переменной "StartHealth".

Рейтинг сообщения: +1, отметил(и): Void Weaver
1 5
Void Weaver
- Captain -
Next rank: = Captain = after 72 points
2268

Doom Rate: 1.8

Posts quality: +706
Ссылка на пост №277 Отправлено: 12.09.19 10:33:52
2) То что надо! Я правильно понимаю что прямая пропорция будет "A_Jump( health / GetSpawnHealth() * 256, "state" )",
а отсчёт с половины хп будет "A_Jump(256 - health / GetSpawnHealth()/2 * 256, "state" )" или "-256" просчитается не корректно и для маски с 50% надо писать предварительное условие типа:

If(Health<GetSpawnHealth/2)
{
Return A_Jump(256-Health/GetSpawnHealth/2*256,"state");
}
Else
{
Return state("");
}
1 8 1
ZZYZX
- Commissar -
Next rank: = Commissar = after 202 pointsМодератор форума
5138

Doom Rate: 1.73

Posts quality: +1440
Ссылка на пост №278 Отправлено: 12.09.19 14:39:02
Void Weaver пишет:
WALLSPRITE и FLATSPRITE не совместимы друг с другом, а насчёт "вертеть руками" хотелось бы подробней. Потому что на зфоруме один чел посоветовал что-то не менее расплывчатое:

Тебе посоветовали пытаться добиться эффекта вращения спрайта вокруг своей оси используя X/YScale :)

А вообще какая картинка, такой и ответ. Я нифига не понял в какую сторону последний кадр должен крутиться.
2 2 1
VladGuardian
- Colonel -
Next rank: = Colonel = after 315 points
4125

Doom Rate: 1.27

Posts quality: +1131
Ссылка на пост №279 Отправлено: 12.09.19 14:52:05
Void Weaver пишет:
Можно ли задать спрайту такое вращение?

Опыт трёхмерных афинных преобразований говорит нам, что вращение объекта вокруг произвольного вектора (ex,ey,ez),
представимо в виде комбинации двух вращений вокруг осей OX + OY (или вокруг OX + OZ, неважно)
В приложении к этим вашим декорейтам / зскриптам - не знаю, так как я несколько отстал от жизни.

Немного оффтоп:
Когда-то давно (около 15-20 лет назад) я для себя написал функцию вращения точки вокруг оси (Q1, Q2) на угол angle.
Она реально работает, хотя скорее всего, с точки зрения скорости выполнения она не столь эффективна, как прямые преобразования матрицы движения...
Скрытый текст:

void Cxyz::Rotate(float angle, const Cxyz& Q1, const Cxyz& Q2)
{
  // копии: Q1,Q2 нельзя изменять
  Cxyz R1=Q1,R2=Q2;

  R1=P0; R2-=R1; (*this)-=R1;

  // вычисляем нужный угол
  float angle_xoz=0, angle_yoz=0;
  if (R2.z-R1.z!=0 || R2.x-R1.x!=0)
    angle_xoz = -ATAN2(R2.x-R1.x, R2.z-R1.z);

  R1.RotateY(angle_xoz);
  R2.RotateY(angle_xoz);
  this->RotateY(angle_xoz);

  // вычисляем нужный угол
  if (R2.z-R1.z!=0 || R2.y-R1.y!=0)
    angle_yoz = ATAN2(R2.y-R1.y, R2.z-R1.z);

  this->RotateX(angle_yoz);
  this->RotateZ(angle);
  this->RotateX(-angle_yoz);
  this->RotateY(-angle_xoz);
  (*this)+=R1;
}


Рейтинг сообщения: +1, отметил(и): Mostcus
3 10 21
Void Weaver
- Captain -
Next rank: = Captain = after 72 points
2268

Doom Rate: 1.8

Posts quality: +706
Ссылка на пост №280 Отправлено: 12.09.19 15:10:52
ZZYZX пишет:
Тебе посоветовали пытаться добиться эффекта вращения спрайта вокруг своей оси используя X/YScale :)
Ну я приблизительно так и понял, но абсолютно не понимаю как это реализовать, поскольку столь же не въезжаю как это должно помочь.

ZZYZX пишет:
А вообще какая картинка, такой и ответ. Я нифига не понял в какую сторону последний кадр должен крутиться.
Ну как сумел, хотя дорисовка третьей оси могла бы наверное сделать пикчу более информативной.
Попробую "на пальцах".
Представь спрайт монстра (но в моём случае снаряда), например импа, обращённого к игроку "лицом". Ну а теперь надо придать такое вращение чтобы поворот совершался в центре спрайта (пузе), так чтобы в следующем кадре "ноги" импа оторвались от земли а "голова" наоборот наклонилась к земле в сторону зрителя.
И ещё один.
Помните старый советский настольный футбол с футболистами на осях? :ha: Ну вот такое вращение мне и нужно. В нормальной геометрии это вроде как вращение вокруг Х?


VladGuardian
Еяпп, то проблема как раз в том что гозза (по крайней мере декор) тупо не предоставляет возможности вращения по второй оси. Либо я об этом не в курсе, что и пытаюсь выяснить.
1 8 1
Страница 14 из 15Перейти наверх Пред.  1, 2, 3 ... , 13, 14, 15  След.
   Список разделов - Местечко мапперов и моддеров - Тема для новичков. Вопросы по маппингу/моддингу - любые!-2