Welcome to U.A.C.
login / register 
Status: Guest
Архивы форума | iddqd.ru
Wolf 3D
ПравилаПравила ПоискПоиск
18+
Тема для новичков. Вопросы по маппингу/моддингу - любые!-2 1, 2, 3 ... 36, 37, 38  След.
   Список разделов - Местечко мапперов и моддеров - Тема для новичков. Вопросы по маппингу/моддингу - любые!-2Ответить
АвторСообщение
Nil
= 2nd Lieutenant =
Next rank: - 1st Lieutenant - after 127 points
1513

Doom Rate: 2.31

Posts quality: +64
Ссылка на пост №1 Отправлено: 27.04.18 00:37:14
В этой теме Обсуждаются все общие И мелкие вопросы. не создавайте новых тем по пустякам. Спасибо за внимание.

При задавании общих вопросов в духе "как сделать X?" — указывать порт ОБЯЗАТЕЛЬНО.
Читаем правила.

-----------------------------------------------------------------------------

Прежде чем задать здесь свой вопрос, настоятельно рекомендуется ознакомится с перечнем ответов на наиболее популярные вопросы в http://iddqd.ru/faq.

Рейтинг сообщения: +2, отметил(и): +Ku6EPyXOBEPTKA+, Zoomer0k
1 2 1
Nil
= 2nd Lieutenant =
Next rank: - 1st Lieutenant - after 127 points
1513

Doom Rate: 2.31

Posts quality: +64
Ссылка на пост №2 Отправлено: 29.04.18 15:49:16
+Ku6EPyXOBEPTKA+, ещё пожалуйся, что в BOOM 2.02 не работает.
https://github.com/coelckers/gzdoom/blob/master/specs/udmf_zdoom.txt
Можешь почитать, что там и как менялось, может ещё что-нибудь не знал.
Есть ещё основной раздел, содержащий только основные вещи из Doom, Heretic, Hexen и Strife, но там точно нет ничего нового для тебя:
https://github.com/coelckers/gzdoom/blob/master/specs/udmf_zdoom.txt
1 2 1
FoxPlays
= Sergeant Major =
Next rank: UAC Sergeant Major after 36 points
644

Doom Rate: 2.14

Posts quality: +371
Ссылка на пост №3 Отправлено: 23.06.19 22:18:55
Всё пытаюсь и без успехов...
Как можно сделать проверку желательно на ACS (т.к. на нём я и пытался) на совпадение следующего уровня [ PRINTNAME_NEXTLEVEL ] со следующим секретным [ PRINTNAME_NEXTSECRET ] и если бы они совпадали, то выводилось какое-нибудь сообщение через Log?

Конечно-же с помощью PRINTNAME_NEXTLEVEL и PRINTNAME_NEXTSECRET это не получится, но надеюсь что есть рабочий и похожий даже малость способ :)
1 1 1
N00b
Chief Petty Officer
Next rank: Chief Petty Officer after 18 points
922

Doom Rate: 2.15

Posts quality: +384
Ссылка на пост №4 Отправлено: 23.06.19 22:54:56
FoxPlays
Да нет, должно получиться.
Вот страничка на форуме zdoom, в которой фактически решается та же проблема.
Готовый код для вопроса:
str nextname = StrParam(n: PRINTNAME_NEXTLEVEL);
str secretname = StrParam(n: PRINTNAME_NEXTSECRET);
if (StrCmp(nextname, secretname) == 0) {
  A_Log("Nothing here.");
} else {
  A_Log("Watch out, something interesting is hidden!");
}

У тебя не получалось, скорее всего, из-за того, что сравнивать строки оператором "==" практически бесполезно (поскольку передаются не сами строки по значению, а номера в таблице строк).

Рейтинг сообщения: +2, отметил(и): VladGuardian, Void Weaver
1 2
FoxPlays
= Sergeant Major =
Next rank: UAC Sergeant Major after 36 points
644

Doom Rate: 2.14

Posts quality: +371
Ссылка на пост №5 Отправлено: 24.06.19 14:18:24
N00b2015
Спасибо, только через Log(s:"Nothing here."); , а не A_Log("Nothing here.");

Всё работает, но только в некоторых вадах, т.к. в других вадах скрипт выводит Watch out, something interesting is hidden! каждый уровень.

Можно ли попробовать как нибудь сделать проверку на наличие секретного выхода на уровне?
1 1 1
N00b
Chief Petty Officer
Next rank: Chief Petty Officer after 18 points
922

Doom Rate: 2.15

Posts quality: +384
Ссылка на пост №6 Отправлено: 24.06.19 19:51:53
FoxPlays
Да-да, конечно. Опечатка.

На zscript-е, если я правильно понимаю, вполне можно сделать проверку на наличие лайндефа на карте с заданным экшном (там, Exit_Normal или Exit_Secret), но работать корректно это тоже будет не везде, поскольку такой экшн может вызываться не с лайндефа напрямую, а из ACS-скрипта, например. Ещё бывают такие экшны как Teleport_NewMap.

Ну, что-то вроде этого для классики сработает:
version "3.0"

class NewHandler: EventHandler {
  override void WorldLoaded(WorldEvent e) {
    int linecount = level.lines.size();
      bool hasnormal = false, hassecret = false;
    for (int i = 0; i < linecount; ++i) {
      line currline = level.lines[i];
      if (currline.special == Exit_Normal) {
              hasnormal = true;
          }
          if (currline.special == Exit_Secret) {
              hassecret = true;
          }
      } //all lines processed
      if (hasnormal) {
          if (hassecret) {
              Console.Printf("Something interesting is hidden!");
          } else {
              Console.Printf("Nothing special here.");
          }
      } else {
          if (hassecret) {
              Console.Printf("Plutonia MAP31, ain't it?");
          } else {
              Console.Printf("No exit!");
          }
      }
  }
}

Сообщения выводятся в консоль, но не печатаются игроку на экран. Можно попробовать как-нибудь найти актор игрока и от его имени вызвать A_Log, но эти костыли сам пиши, если такой эффект не устраивает :wacky:
Ещё нужно в MAPINFO прописать:
gameinfo {
  EventHandlers = "NewHandler"
}
1 2
JSO x
- 2nd Lieutenant -
Next rank: = 2nd Lieutenant = after 36 points
1404

Doom Rate: 2.27

Posts quality: +789
Ссылка на пост №7 Отправлено: 24.06.19 23:27:43
Есть минимум два способа вводить на экран не через консоль. Первый -- переопределить обработчик "virtual void RenderOverlay( RenderEvent e ) {}"; в этом случае информация будет выводиться всем. Пример:
override void RenderOverlay( RenderEvent e ) {
	screen.DrawText( Font.FindFont( "smallfont" ), Font.CR_DARKGRAY,
			10, 10, "Score: " .. GetScore(),
			DTA_VirtualWidth, 640, DTA_VirtualHeight, 480 );
}


Второй -- создать свой SBarInfo. Примеры для IWAD'ов есть в (g/q)zdoom.pk3, "\zscript\statusbar.txt", оттуда много интересного тоже подчерпнуть можно.

Предупреждение: оба варианта действуют исключительно из-под user-interface сферы, так что многие вещи, спокойно запускающиеся из-под "play" scope (сферы влияния самого "экшена"), здесь будут работать только на readonly или не работать вовсе.


Ага, нашёл третий.
N00b2015 пишет:
Можно попробовать как-нибудь найти актор игрока и от его имени вызвать A_Log, но эти костыли сам пиши, если такой эффект не устраивает
players[ consoleplayer ].mo.A_Log( "Something..." );



* * *

Дополнение, насчёт этого:
    for (int i = 0; i < linecount; ++i) {
      line currline = level.lines[i];
      if (currline.special == Exit_Normal) {
              hasnormal = true;
          }
          if (currline.special == Exit_Secret) {
              hassecret = true;
          }
      } //all lines processed

Так перебираются, насколько я знаю, не все варианты. Более полным перебором будет
int s = level.lines[ i ].special;
if ( s == 74 || s == 75 || s == Exit_Normal )
    hasnormal = true;
if ( s == 243 || s == 244 || s == Exit_Secret )
    hassecret = true;
2 8 1
Darknesss
Recruit
Next rank: Recruit after 4 points
6

Doom Rate: 2

Ссылка на пост №8 Отправлено: 25.06.19 00:05:44
Здарова Думеры, до этого качал всякие моды на новое оружие и в целом всё было нормально, но есть одна проблема которая довольно сильно раздражает. Отдача во многих модах которая поднимает прицел оружия до небес и приходится постоянно регулировать её, можно ли как-нибудь отключить отдачу в настройках, чтобы прицел не поднимало? Я просто не силен в английском и ничего не нашел в настройках по поводу отдачи.
N00b
Chief Petty Officer
Next rank: Chief Petty Officer after 18 points
922

Doom Rate: 2.15

Posts quality: +384
Ссылка на пост №9 Отправлено: 25.06.19 00:21:08
JSO x
JSO x пишет:
players[ consoleplayer ].mo.A_Log( "Something..." );

Я же из Handler-а пытаюсь написать сообщение. Или ты предлагаешь в хэндлере обрабатывать, а выводить как-нибудь отдельно? Как информацию передать? Только не говори про глобальные переменные :x
JSO x пишет:
Более полным перебором будет

75-ый, действительно, тоже нужно обработать. 244 == Exit_Secret. А с 74-ым труднее, там же на любой слот можно перескочить, хоть на сорок разных штук с одной карты, и вопрос потеряет смысл (секретная карта называться может как угодно).
Кстати, с уровня можно выходить ещё множеством неразобранных способов вроде триггеров A_BossDeath или секторов (классического, не знаю, во что его xlat превращает) типа 11 :oops:
Darknesss
Нет такой стандартной характеристики у оружия в Doom :-)
Если не видно настроек самого мода, то напрямую никак. Но вполне можно написать "для личного использования" (не в мультиплеере) небольшую модификацию. Если укажешь мод, могу посмотреть.

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

Doom Rate: 2

Ссылка на пост №10 Отправлено: 25.06.19 00:59:52
N00b2015 пишет:

Darknesss
Нет такой стандартной характеристики у оружия в Doom
Если не видно настроек самого мода, то напрямую никак. Но вполне можно написать "для личного использования" (не в мультиплеере) небольшую модификацию. Если укажешь мод, могу посмотреть.


Да всё норм, надо было просто в настройках мыши покопаться)
JSO x
- 2nd Lieutenant -
Next rank: = 2nd Lieutenant = after 36 points
1404

Doom Rate: 2.27

Posts quality: +789
Ссылка на пост №11 Отправлено: 25.06.19 12:55:05
Darknesss пишет:
Отдача во многих модах которая поднимает прицел оружия до небес и приходится постоянно регулировать её, можно ли как-нибудь отключить отдачу в настройках, чтобы прицел не поднимало?

Реально сделать. "Options" -> "Comportability options" -> "Allow freelook: off". Будет невозможно смотреть вверх/вниз, но вместе с тем и любое изменение наклона головы будет само автоматически приводиться обратно, к "центральному" взгляду.


N00b2015 пишет:
Я же из Handler-а пытаюсь написать сообщение. Или ты предлагаешь в хэндлере обрабатывать, а выводить как-нибудь отдельно? Как информацию передать? Только не говори про глобальные переменные

В смысле? Этот обработчик находится в play-scope, то есть из-под него вполне можно вызвать всё, что принадлежит этой же сфере. Такой код --
override void WorldTick() {
	Actor rPlayer = players[ 0 ].mo;
	if ( rPlayer == NULL ) return;
	rPlayer.A_Print( "Pitch: " .. rPlayer.pitch ); /* */
} // Этот код я для другого писал, потому он кажется здесь неуместным и некрасивым.
-- вполне работает, выводя текущий pitch игрока:
Скрытый текст:


Точно так же работает и WorldLoaded(), он тоже относится к play-сфере.

Так что нет, неправ ты. Это -- третий работающий способ вывода информации на экран.

Рейтинг сообщения: +2, отметил(и): Mostcus, N00b
2 8 1
N00b
Chief Petty Officer
Next rank: Chief Petty Officer after 18 points
922

Doom Rate: 2.15

Posts quality: +384
Ссылка на пост №12 Отправлено: 25.06.19 17:10:21
JSO x
Да я не говорил, что ты неправ или что они не работающие. Просто нужно всех игроков рассматривать, и просто написать players[0].mo мне показалось каким-то несимметричным решением.
Наверное, в той ситуации тогда лучше A_PrintBold вызвать (но один раз), чтобы все видели сообщение, а не только первый игрок.
1 2
Doomgay1999
- Corporal -
Next rank: = Corporal = after 4 points
96

Doom Rate: 2

Posts quality: +1
Ссылка на пост №13 Отправлено: 26.06.19 05:29:42
А можно ли с при помощи Slade от редактировать музыку? Если нет то есть какой-то редактор по этому поводу?
Xtor
= Lance Corporal =
Next rank: - Master Corporal - after 38 points
162

Doom Rate: 1.95

Posts quality: +18
Ссылка на пост №14 Отправлено: 26.06.19 08:50:10
Doomgay1999, например, Audacity или Adobe Audition.
ZZYZX
- UAC Commissar -
Next rank: = UAC Commissar = after 16 pointsМодератор форума
6284

Doom Rate: 1.65

Posts quality: +1633
Ссылка на пост №15 Отправлено: 26.06.19 11:36:15
Xtor
Ему ж небось нужно миды или мусы.
https://zdoom.org/wiki/MIDI#External_links тут пара ссылок есть
2 2 1
FoxPlays
= Sergeant Major =
Next rank: UAC Sergeant Major after 36 points
644

Doom Rate: 2.14

Posts quality: +371
Ссылка на пост №16 Отправлено: 26.06.19 13:11:24
Насчёт скрипта с показом секретного выхода. Уже давно сделал всё на костылях :o

Появился ещё вопрос.
Как сделать проверку инвентаря игроков на наличие какого-либо ключа (см. quote ниже) и если ключ был найден в инвентаре игрока, то он раздаётся всем другим игрокам у которых нет этого или этих ключей? Хорошо если это получиться в виде ACS кода :x



CheckInventory - надеюсь через него можно будет сделать проверку

Вот пример:

ACTOR RedCard : DoomKey
{
Inventory.PickupMessage "$GOTREDCARD"
Inventory.Icon "STKEYS2"
States
{
Spawn:
RKEY A 10
RKEY B 10 Bright
Loop
}
}

Актор выходит из DoomKey, а DoomKey выходит к Key

ACTOR DoomKey : Key
{
Radius 20
Height 16
+NOTDMATCH
}

Значит этот актор (или же предмет) является ключём.

1 1 1
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +808
Ссылка на пост №17 Отправлено: 26.06.19 14:56:24
Во-первых, не надо использовать повторные определения уже существующих акторов (ключей), если хочешь создать новые на базе существующих то используй Species свойство:
Actor NewRedCard : RedCard replaces RedCard
{
Species "RedCard"
States
{
Spawn:
ABCD A -1 //Новые спрайты
}
}
Во-вторых, для таких целей надо использовать CheckActorInventory и GiveActorInventory; кстати в примерах по ссылкам уже представлен подобный скрипт.
1 9 1
FoxPlays
= Sergeant Major =
Next rank: UAC Sergeant Major after 36 points
644

Doom Rate: 2.14

Posts quality: +371
Ссылка на пост №18 Отправлено: 26.06.19 15:02:39
Void Weaver

Ок, но можно как-нибудь сделать без создания новых акторов?
Возможно ли сделать проверку на базе уже существующих?
Просто делать проверку ключей отдельно для Doom, Heretic или же Strife будет тем не менее муторно :o
1 1 1
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +808
Ссылка на пост №19 Отправлено: 26.06.19 15:19:30
Ну разумеется, тогда просто проверяй наличие ванильных уже существующих ключей. Я просто решил что ты желаешь запилить новые ключи. :)
Но проверку для ключей каждого типа игры делать придётся по любому.

Т. е. для Еретика:
CheckActorInventory(tid,"KeyBlue")
CheckActorInventory(tid,"KeyGreen")

для Дума:
CheckActorInventory(tid,"RedCard")
CheckActorInventory(tid,"BlueSkull")

ЭДИТ:
Если я не ошибаюсь то из декор\ацс чек-функций проверять базовый класс умеет только CheckClass, но её АЦС версия не умеет в чек родительского класса. (

Рейтинг сообщения: +1, отметил(и): FoxPlays
1 9 1
FoxPlays
= Sergeant Major =
Next rank: UAC Sergeant Major after 36 points
644

Doom Rate: 2.14

Posts quality: +371
Ссылка на пост №20 Отправлено: 26.06.19 15:25:34
Void Weaver

Спасибо. Только жаль что нельзя проверять через CheckActorInventory(tid,"Key") :)
1 1 1
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +808
Ссылка на пост №21 Отправлено: 26.06.19 15:38:17
Возможно я туплю, но зачем тебе в принципе унификация проверки на базовый класс ключей?

Ну вот допустим что такая конструкция возможна: CheckActorInventory(tid,"Key"). Теперь представим что игрок нашёл "синий ключ", а ф-ция вернёт просто "ключ" (ну или "дум ключ"). Ну и как в таком случае определить ключ какого цвета должен быть выдан другим игрокам?

Так что унификация иногда просто бессмысленна.
1 9 1
FoxPlays
= Sergeant Major =
Next rank: UAC Sergeant Major after 36 points
644

Doom Rate: 2.14

Posts quality: +371
Ссылка на пост №22 Отправлено: 26.06.19 16:00:03
Void Weaver

Уфф... Что-то я и правда не подумал об этом. Может это как-то будет возможно сделать на ZScript'е ?
Сделать проверку подобранного предмета и является ли он ключом и если этот предмет (актор) - ключ, то он раздаётся всем другим игрокам?

Рейтинг сообщения: +1, отметил(и): Void Weaver
1 1 1
N00b
Chief Petty Officer
Next rank: Chief Petty Officer after 18 points
922

Doom Rate: 2.15

Posts quality: +384
Ссылка на пост №23 Отправлено: 26.06.19 18:52:46
FoxPlays
В синглплеере, по-моему, работает без багов, а как тестить мультиплеер, я не знаю :-)
Эту штуку нужно поместить в инвентарь каждому игроку (например, скриптом).
class KeyChecker: Inventory {
  override bool HandlePickup (Inventory item)
	{
		if (item is "Key")
		{
			Console.Printf("A key has been found!");
			for (int i = 0; i < MAXPLAYERS; ++i) {
				if (playeringame[i] && i != consoleplayer && CountInv(GetClass()) == 0) {
					players[i].mo.GiveInventory(GetClass(), 1);
				}
			}
		}
		return Super.HandlePickup(item);
	}
}

Вообще это, как нетрудно догадаться, тоже костыль :o
1 2
FoxPlays
= Sergeant Major =
Next rank: UAC Sergeant Major after 36 points
644

Doom Rate: 2.14

Posts quality: +371
Ссылка на пост №24 Отправлено: 26.06.19 18:57:06
N00b2015
Проверил в мультиплеере, сообщение выводит, а вот ключ не выдаёт :o
1 1 1
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +808
Ссылка на пост №25 Отправлено: 26.06.19 19:28:31
N00b2015 пишет:
GiveInventory(GetClass(), 1);
А что если таки GiveInventory(GetClassName(),1);

Бтв, а что делает GetKeyType? Отсюда и отсюда.
1 9 1
+Ku6EPyXOBEPTKA+
= Major =
Next rank: Lieutenant Colonel after 153 pointsМодератор форума
3137

Doom Rate: 2.05

Posts quality: +1571
Ссылка на пост №26 Отправлено: 28.06.19 12:51:33
Landsberg пишет:
Беру ресурсы с реалм667 для дума, те которые во вкладке думстайл работают почти всегда корректно, но те, что во вклатке хексен/херетик стайл - не работают и вовсе(посе добавления декорейта, текстур и так далее они просто отсутствуют в игре и не вызываются никакими консольными командами)

1. Только что попробовал ACOLYTE (2018) и BANSHEE (2013). Оба спавнятся без проблем. Могу лишь предположить, что виновник версия гозы, на которой идёт запуск, так как некоторые из мобов уже написаны на zscript. Но опять же гадание на кофейной гуще.

2. В любом случае понадобится дополнительный ammotype, чтобы был раздельное общее количество и количество в магазине. Далее наверно лучше сделать скриптом, чтобы было правильно. Можно извратиться и переменными в коде оружия (в ZSCript это удобнее, но и в Decorate это можно было сделать). Смысл скрипта или кода в том, чтобы при перезарядке (отдельный стейт Reload вроде) попеременно переключалась переменная с числовым значением патронов в конкретном магазине. При стрельбе соответсвтенно проверка, чтобы отнимался именно из нужного магазина (то есть из нужной переменной). Далее можно выделить кнопку под добавление патронов в магазин, опять же с проверкой.

3. Без патча никак. Один из простейших методов - замена оригинальной пушки на код спавнера, который будет спавнить копию старого оружия и нового с шансом 50% (или любой другой на усмотрение). Номер слота можно теперь вроде прописывать в самом оружии, дабы класс ещё переписывать не пришлось. Но последнее лучше уточнить. ой... каюсь, не о том... это если нужно добавить оружие к оружейнику.

4. Вот тут боюсь просто так уже не подскажу. Выделенных под это функций нет, а значит надо писать скрипт который будет:
а - считывать то что перед нами монстр
б - считывать что в руках данное оружие
в - считывать что прошёл удар (это самое сложное наверно)
г - менять кастомную переменную чтобы при проверке давало спрайт окровавленного оружия
2 1 7
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +808
Ссылка на пост №27 Отправлено: 28.06.19 17:20:50
Создание зачётного сообщения/новости (+20)
Landsberg
1. Пример нерабочих акторов в студию пожалуйста.

2. Доп. аммотайп вовсе не обязателен, можно сделать всё на инвенторных ф-циях и токенах. Например. А вообще нужно больше конкретики, ибо вариантов как задачи так и решений - масса.
Под ЗСкрипт основу рекомендую ознакомиться с оружейным гайдом Мэтта.

3. В потенциально модифицируемое оружие изначально прописываешь ВСЕ возможные эффекты от ВСЕХ возможных модификаций. Основной же трюк заключается в том что все эти прописанные плюшки от модификаций изначально недоступны и будут открываться по A_JumpIfInventory("модификация",1,"стэйтоффсет_в_котором_прописан_эффект_от_модификации"), т. е. приобретение модификации "вскрывает" скрытые фичи и характеристики оружия.

4. Изи делается на декоре.
а) в оружие помещаем кастом пуфф (можно невидимый) который обладает +PUFFONACTORS, +PUFFGETOWNER и +HITTRACER. Далее этот пуфф проверяет наличие флага "SHOOTABLE" и отсутствие "NOBLOOD" у AAPTR_TRACER - если эти условия соблюдаются то этот актор может "кровоточить" (мб. нужно чекать ещё какой флаг);
б) далее пуфф активирует A_GiveToTarget("степень_окровавленности_оружия_токен") непосредственно из XDeath стэйта - пуфф может войти в этот стэйт только если актор может "кровоточить" (есть "SHOOTABLE" и отсутствует "NOBLOOD");
в) в Ready стэйте оружия стоят A_JumpIfInventory("степень_окровавленности_оружия_токен",х,"Ready_стэйт_с_окровавленными_спрайтами") в количестве сколько степеней окровавленности должно быть, типа:
//В данном примере рассматривается оружие с 3 степенями окровавленности

Ready: //Чистое оружие
ABCD A 1 
{
If(CountInv("BloodyToken")==1){Return state("BloodyReadyA");}
Else 
  {
    A_WeaponReady;
    Return state("");
  }
}
Loop

BloodyReadyA: //Чуток заляпанное кровякой
ABCD A 1 
{
If(CountInv("BloodyToken")==2){Return state("BloodyReadyB");}
Else 
  {
    A_WeaponReady;
    Return state("");
  }
}
Loop

BloodyReadyB: //Ещё более замызганное
ABCD A 1 
{
If(CountInv("BloodyToken")==3){Return state("BloodyReadyC");}
Else 
  {
    A_WeaponReady;
    Return state("");
  }
}
Loop

BloodyReadyC: //В кровищще по самую рукоять
ABCD A 1 A_WeaponReady
Loop

//Между тем делаем аналогичные чеки в "(Alt)Fire:" стэйтах и их "кровавых" аналогах:

Fire: //Чистое оружие
TNT1 A 0 A_JumpIfInventory("BloodyToken",3,"BloodyFireC")
TNT1 A 0 A_JumpIfInventory("BloodyToken",2,"BloodyFireB")
TNT1 A 0 A_JumpIfInventory("BloodyToken",1,"BloodyFireA")
<...>
TNT1 A 0 A_Refire
Goto Ready

BloodyFireA: //Чуток заляпанное кровякой
TNT1 A 0 A_JumpIfInventory("BloodyToken",3,"BloodyFireC")
TNT1 A 0 A_JumpIfInventory("BloodyToken",2,"BloodyFireB")
<...>
TNT1 A 0 A_Refire
Goto BloodyReadyA

BloodyFireB: //Ещё более замызганное
TNT1 A 0 A_JumpIfInventory("BloodyToken",3,"BloodyFireC")
<...>
TNT1 A 0 A_Refire
Goto BloodyReadyB

BloodyFireC: //В кровищще по самую рукоять
<...>
TNT1 A 0 A_Refire
Goto BloodyReadyC
г) при деселекте все токены убираются, типа игрок очистил клинок от крови.

Добавлено спустя 12 часов 28 минут 57 секунд:
===================
Давно хотел детально расспросить но надеялся что разберусь сам. Не вышло.
Итак, пачка вопросов про Args:

1. Собс-но что это за свойство Args и с чем это едят?
1.1. Каково количество заданных Аргс и их значения по умолчанию? Или если это свойство не задано то по умолчанию не используется вовсе?
1.2. Правильно ли я понимаю что у любого актора может быть определено и задано от 0 да 5 разных Аргс?
1.3. Почему вика не рекомендует их использовать? Или я неправильно что-то перевёл?
2. Какова область применения оного?
3. Есть ещё какие-нибудь общие (не рестриктед по классу) А_Функции работающие с Аргс помимо следующих?
A_SetArg
A_JumpIf
A_SetSpecial
A_CallSpecial
A_CountdownArg
4. В каких случаях оперирование этим свойством наиболее целесообразно?

Рейтинг сообщения: +2, отметил(и): VladGuardian, +Ku6EPyXOBEPTKA+
1 9 1
JSO x
- 2nd Lieutenant -
Next rank: = 2nd Lieutenant = after 36 points
1404

Doom Rate: 2.27

Posts quality: +789
Ссылка на пост №28 Отправлено: 29.06.19 13:35:22
Args[ 5 ] -- массив из пяти беззнаковых однобайтных целых чисел (0..255), которые пришли ещё с... Hexen, вроде. Могут задаваться напрямую из-под редактора, то есть при появлении объектов в самой игре у них уже будут Args, заданные ещё при построении карты автором. Используются для конфигурации различных скриптов ("Arg" -- сокращение от "Argument") и, иногда, свойств самого актора. По умолчанию все аргументы -- ноль: "0, 0, 0, 0, 0". Использовать их как переменные нежелательно, так как если этот самый аргумент на карте уже используется, например, как параметр скрипта, то либо исполнение этого самого скрипта из-за изменения аргументов нарушится, либо переменные с самого начала будут иметь неверные значения.

Рейтинг сообщения: +1, отметил(и): Void Weaver
2 8 1
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +808
Ссылка на пост №29 Отправлено: 29.06.19 15:44:32
Спасибо за ликбез. ^_^

1. Правильно ли я понимаю что вместо Аргс-массива следует использовать (ЮзерВар-)массивы? Да.

2. Что значит следующая ремарка:

User arrays are not used by anything internally, contrarily to the args array and the special1 and special2 fields.
Означает ли это что область применения юзервар-массива как-то лимитирована по сравнению с аргс-массивом? Или это наоборот преимущество? Преимущество. Это значит что юзермас не используются в оригинальных преопределённых акторах или скриптах, ибо юзермассивы просто не представлены в играх поскольку задаются извне, моддером.

3. Можно пример синтаксиса и оперирования юзервар-массивом на декоре? Нашёл.

4. Чем отличается Dynamic arrays от обычного массива (ну кроме того что первый для ЗСкрипта)? В чём заключается "динамичность" динамического? Индексация динамического может быть уменьшена или увеличена, тогда как обычный массив позволяет менять только значения индексов.

5. Что такое мерность массивов? Эта форма объявления массива только для АЦС\ЗСкрипта или на декоре также возможна подобная форма записи? Не для декора.

6. Есть ли способ компактно (без использования токен-итемов) эмулировать на декоре механизм A_CountdownArg используя юзервар-массив вместо Аргс? Т. е. сделать что-то типа A_Countdown но на юзерварах и позволяющее задать стэйт джампа? Всё, допёр.

7. Что такое и зачем нужны "special1 and special2 fields"? Или обычно в моддинге эти свойства (параметры?) также не задействуются?

8. Спрошу ещё раз. Что такое [identifier]? В каких случая целесообразно применение оного?

identifier is optional. Calls to a random function with an identifier do not interfere with the RNG for calls with a different identifier, which can be used to make the outcome of some events unaffected by others.
1 9 1
Zeberpal_98
Chief Petty Officer
Next rank: - Warrant Officer - after 75 points
965

Doom Rate: 2.13

Posts quality: +295
Ссылка на пост №30 Отправлено: 29.06.19 17:11:23
:lamer: Очень плохой код, просто очень плохой код

Есть кастомный белый(WHITE) прицел, который выводится на экран через HudMessage. Я хочу менять его на красный(RED), когда на линии прицела появляется монстр.

• От игрока непрерывно спауниться молниеносный прожектайл,
SpawnProjectile(0, "Target_DETECTOR", ((GetActorAngle(ActivatorTID()) >> 8) + 0) % 256, 9999, 0,  0, 0);
delay(1);
restart;


который при попадании в монстра(тэг 37), дает ему дамми актор
ACTOR Target_DETECTOR
{
  Mass 0
  damage 0
  Radius 32
  Height 32
  Speed 0
  Projectile
  +NOBLOOD
  +SOLID
  RenderStyle Add
  Alpha 0.75
  States
  {
  Spawn:
	APLS A -1 
    Loop
  Death:
  TNT1 A -1 A_RadiusGive("TARGET_YES", 32, RGF_MONSTERS, 1) // TARGET_YES и есть дамми актор
    Stop
  }
}

Actor TARGET_YES : Inventory
{
Inventory.MaxAmount 1
} 



Далее вот, что делается, чтобы все это заработало:

• Узнаю, есть ли дамми актор у монстра 37
int TARGETED=false;

Script 205 (void)
{
if(CheckActorInventory(37, "TARGET_YES"))
{
TARGETED=true;
}
else
{
TARGETED=false;
}
delay(1);
restart;
}


• Затем если да, то прицел меняется на красный, если нет - то на белый(стандартный)
Script 203 (void)
{
if(TARGETED == true)
{
	setfont("RED");
	SetHudSize(SCREEN_X, SCREEN_Y, FALSE);
	hudmessage(s:"A";HUDMSG_PLAIN,997,CR_UNTRANSLATED, OFFS_X, OFFS_Y, 0.0);
}
else if(TARGETED == false)
{
	setfont("WHITE");
	SetHudSize(SCREEN_X, SCREEN_Y, FALSE);
	hudmessage(s:"A";HUDMSG_PLAIN,996,CR_UNTRANSLATED, OFFS_X, OFFS_Y, 0.0);
}
delay(1);
restart;
}


Ну и попутно отбираю у монстра дамми актор, чтобы прицел не был вечно красным
Script 204 (void)
{
TakeActorInventory(37, "TARGET_YES", 999);
delay(3); //три тика, чтобы хотя бы понять работает или нет
restart;
}


Проблема в том, что монстр не получает актор, ибо с RGF_PLAYERS работает. Почему так? Как примерно по уму делается?
1 3
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +808
Ссылка на пост №31 Отправлено: 29.06.19 17:39:50
За скриптинг и ХУДы не скажу но снаряд лучше исправить на:
ACTOR Target_DETECTOR
{
  Mass 0
  Damage 0
  Radius 4
  Height 4
  Speed 0
  Projectile
  //+NOBLOOD //Бессмысленно, используй вместо этого:
  +BLOODLESSIMPACT
  +HITTRACER //Маркируем цель для дальнейших манипуляций
  //+SOLID //Бессмысленно
  RenderStyle Add
  Alpha 0.75
  States
  {
  Spawn:
	APLS A -1 
    //Loop //Бессмысленно
  Death:
  TNT1 A 0 A_CheckFlag("ISMONSTER","GiveMark",AAPTR_TRACER)
//TNT1 A -1 A_RadiusGive("TARGET_YES", 32, RGF_MONSTERS, 1) // TARGET_YES и есть дамми актор
    Stop
GiveMark:
TNT1 A 0 A_GiveInventory("TARGET_YES",1,AAPTR_TRACER)
Stop
  }
}
1 9 1
Zeberpal_98
Chief Petty Officer
Next rank: - Warrant Officer - after 75 points
965

Doom Rate: 2.13

Posts quality: +295
Ссылка на пост №32 Отправлено: 29.06.19 18:10:28
Void Weaver

Спасибо, прожектайл заметно"веселее" стал спауниться, к сожалению, правда, проблему не решил.
Чувствую, надо делать как надо, в зскрипте, рыщу в околоподобных модах. Пока что смотрю в книгу - вижу фигу: как так, почему здесь это, что здесь происходит вообще?
1 3
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +808
Ссылка на пост №33 Отправлено: 29.06.19 18:12:08
Бтв, не уверен, но вот это место похоже не в поряде: CheckActorInventory(37, "TARGET_YES"), нужно более генерализированное решение, чтобы проверялось наличие предмета по 0 тиду (активатору скрипта) а не по конкретному. Тоже самое и с изъятием токена.
При этом (Give\Check\Take)ActorInventory не воспринимают 0 тид как активатор скрипта, поэтому полагаю надо использовать иную конструкцию, на базе CheckInventory.

И кстати откуда у тебя происходит активация 205 скрипта?
1 9 1
Zeberpal_98
Chief Petty Officer
Next rank: - Warrant Officer - after 75 points
965

Doom Rate: 2.13

Posts quality: +295
Ссылка на пост №34 Отправлено: 29.06.19 18:22:04
Void Weaver
от ACS_EXECUTE(205, 0); в ENTER скрипте
1 3
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +808
Ссылка на пост №35 Отправлено: 29.06.19 18:30:40
Так я и думал. Тип ENTER указывает что активатор игрок, поэтому вся конструкция только на игроках и работает. Тут определённо нужен (void), а активация должна инициироваться тем кого ударил снаряд.
Кстати вместо SpawnProjectile тебе определённо стОит использовать LineAttack.

Добавлено спустя 24 минуты 21 секунду:

ЕЯПП, то сейчас всё должно сработать:
ACTOR Target_DETECTOR
{
Mass 0
Damage 0
Radius 4
Height 4
Speed 0
Projectile
+BLOODLESSIMPACT
+HITTRACER
RenderStyle Add
Alpha 0.75
States
{
Spawn:
APLS A -1 

Death:
TNT1 A 0 A_CheckFlag("ISMONSTER","GiveMark",AAPTR_TRACER)
Stop

GiveMark:
TNT1 A 0 A_GiveInventory("TARGET_YES",1,AAPTR_TRACER)
TNT1 A 0 A_GiveInventory("ScriptActivatorGiver",1,AAPTR_TRACER)
Stop
}
}

Actor ScriptActivatorGiver : CustomInventory
{
+INVENTORY.ALWAYSPICKUP
Inventory.MaxAmount 0
States
{
Spawn:
TNT1 A -1
Pickup:
TNT1 A 0 ACS_ExecuteWithResult(205)
Stop
}
}
Отключи ENTER-скрипт который сейчас у тебя активирует 205-ый, в самом 205-м замени CheckActorInventory(37, "TARGET_YES") на CheckInventory("TARGET_YES").
Я проверить не могу поскольку компиляция не проходит - ругается на твои ХУДовые параметры (SCREEN_X, SCREEN_Y, OFFS_X, OFFS_Y).

Рейтинг сообщения: +1, отметил(и): Zeberpal_98
1 9 1
Zeberpal_98
Chief Petty Officer
Next rank: - Warrant Officer - after 75 points
965

Doom Rate: 2.13

Posts quality: +295
Ссылка на пост №36 Отправлено: 29.06.19 19:33:13
Void Weaver

:cool2: Спасибо большое! Заработало, монстр получил актор, теперь осталось все почистить и привести в нормальный вид.
1 3
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +808
Ссылка на пост №37 Отправлено: 29.06.19 19:44:29
^_^

На твоём месте я бы таки прежде всего заменил SpawnProjectile на LineAttack, а конструкцию Target_DETECTOR замхал бы в кастом пуфф, типа:
ACTOR Target_DETECTOR
{
Radius 2
Height 2
+BLOODLESSIMPACT
+PUFFONACTORS
+NOBLOCKMAP
+NOGRAVITY
+HITTRACER
States
{
Spawn:
TNT1 A 0 
Stop

XDeath:
TNT1 A 0
TNT1 A 0 A_CheckFlag("ISMONSTER","GiveMark",AAPTR_TRACER)
Stop

GiveMark:
TNT1 A 0 A_GiveInventory("TARGET_YES",1,AAPTR_TRACER)
TNT1 A 0 A_GiveInventory("ScriptActivatorGiver",1,AAPTR_TRACER)
Stop
}
}

Рейтинг сообщения: +1, отметил(и): Zeberpal_98
1 9 1
Zeberpal_98
Chief Petty Officer
Next rank: - Warrant Officer - after 75 points
965

Doom Rate: 2.13

Posts quality: +295
Ссылка на пост №38 Отправлено: 29.06.19 22:13:23
Void Weaver
Еще раз спасибо, теперь все работает идеально, как и надо :o
1 3
FoxPlays
= Sergeant Major =
Next rank: UAC Sergeant Major after 36 points
644

Doom Rate: 2.14

Posts quality: +371
Ссылка на пост №39 Отправлено: 30.06.19 07:57:12
Как сделать вывод информации о игроке если он в поле зрения (например: здоровье, никнейм, оружие которое он в данный момент использует, ну и патроны), мб при помощи PickActor ?
Когда пытаюсь сделать через PickActor, скрипт выводит только врагов :(

:help:
1 1 1
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +808
Ссылка на пост №40 Отправлено: 30.06.19 08:19:07
Конфиг PickActor в студию плиз.
1 9 1
Страница 1 из 38Перейти наверх 1, 2, 3 ... 36, 37, 38  След.
   Список разделов - Местечко мапперов и моддеров - Тема для новичков. Вопросы по маппингу/моддингу - любые!-2