| Автор | Сообщение | 
Nil = 2nd Lieutenant =
   |  | 1513 |  
   Doom Rate: 2.31 Posts quality: +64 | 
  Отправлено: 27.04.18 00:37:14 |  |  
 |  
В этой теме Обсуждаются все общие И мелкие вопросы. не создавайте новых тем по пустякам. Спасибо за внимание.
 
 При задавании общих вопросов в духе "как сделать X?" — указывать порт ОБЯЗАТЕЛЬНО.
 Читаем правила.
 
 -----------------------------------------------------------------------------
 
 Прежде чем задать здесь свой вопрос, настоятельно рекомендуется ознакомится с перечнем ответов на наиболее популярные вопросы в http://iddqd.ru/faq. |  
  |  
  | 
| 1 | 
2 | 
1 | 
  | 
 
 
 |  
  |  | 
Nil = 2nd Lieutenant =
   |  | 1513 |  
   Doom Rate: 2.31 Posts quality: +64 | 
 | 
| 1 | 
2 | 
1 | 
  | 
 
 
 |  
  |  | 
FoxPlays = Sergeant Major =
   |  | 644 |  
   Doom Rate: 2.14 Posts quality: +371 | 
  Отправлено: 23.06.19 22:18:55 |  |  
 |  
Всё пытаюсь и без успехов...
 Как можно сделать проверку желательно на ACS (т.к. на нём я и пытался) на совпадение следующего уровня [ PRINTNAME_NEXTLEVEL ] со следующим секретным [ PRINTNAME_NEXTSECRET ] и если бы они совпадали, то выводилось какое-нибудь сообщение через Log?
 
 Конечно-же с помощью PRINTNAME_NEXTLEVEL и PRINTNAME_NEXTSECRET это не получится, но надеюсь что есть рабочий и похожий даже малость способ    |  
 |  
  | 
 |  | 
N00b Chief Petty Officer
   |  | 922 |  
  Doom Rate: 2.15 Posts quality: +384 | 
  Отправлено: 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!");
}
 У тебя не получалось, скорее всего, из-за того, что сравнивать строки оператором "==" практически бесполезно (поскольку передаются не сами строки по значению, а номера в таблице строк). |  
  |  
  | 
 |  | 
FoxPlays = Sergeant Major =
   |  | 644 |  
   Doom Rate: 2.14 Posts quality: +371 | 
  Отправлено: 24.06.19 14:18:24 |  |  
 |  
N00b2015
 Спасибо, только через Log(s:"Nothing here."); , а не A_Log("Nothing here.");
 
 Всё работает, но только в некоторых вадах, т.к. в других вадах скрипт выводит Watch out, something interesting is hidden! каждый уровень.
 
 Можно ли попробовать как нибудь сделать проверку на наличие секретного выхода на уровне? |  
 |  
  | 
 |  | 
N00b Chief Petty Officer
   |  | 922 |  
  Doom Rate: 2.15 Posts quality: +384 | 
  Отправлено: 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, но эти костыли сам пиши, если такой эффект не устраивает  
 Ещё нужно в MAPINFO прописать:
 gameinfo {
  EventHandlers = "NewHandler"
} |  
 |  
  | 
 |  | 
JSO x - 2nd Lieutenant -
   |  | 1386 |  
   Doom Rate: 2.28 Posts quality: +758 | 
  Отправлено: 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
   |  | 6 |  
  Doom Rate: 2
  | 
  Отправлено: 25.06.19 00:05:44 |  |  
 |  
| Здарова Думеры, до этого качал всякие моды на новое оружие и в целом всё было нормально, но есть одна проблема которая довольно сильно раздражает. Отдача во многих модах которая поднимает прицел оружия до небес и приходится постоянно регулировать её, можно ли как-нибудь отключить отдачу в настройках, чтобы прицел не поднимало? Я просто не силен в английском и ничего не нашел в настройках по поводу отдачи. |  
 |  
  | 
 |  | 
N00b Chief Petty Officer
   |  | 922 |  
  Doom Rate: 2.15 Posts quality: +384 | 
  Отправлено: 25.06.19 00:21:08 |  |  
 |  
JSO x
  	  | JSO x пишет: | 	 		  | players[ consoleplayer ].mo.A_Log( "Something..." ); | 	  
 Я же из Handler-а пытаюсь написать сообщение. Или ты предлагаешь в хэндлере обрабатывать, а выводить как-нибудь отдельно? Как информацию передать? Только не говори про глобальные переменные  
  	  | JSO x пишет: | 	 		  | Более полным перебором будет | 	  
 75-ый, действительно, тоже нужно обработать. 244 == Exit_Secret. А с 74-ым труднее, там же на любой слот можно перескочить, хоть на сорок разных штук с одной карты, и вопрос потеряет смысл (секретная карта называться может как угодно).
 Кстати, с уровня можно выходить ещё множеством неразобранных способов вроде триггеров A_BossDeath или секторов (классического, не знаю, во что его xlat превращает) типа 11  
 Darknesss
 Нет такой стандартной характеристики у оружия в Doom  
 Если не видно настроек самого мода, то напрямую никак. Но вполне можно написать "для личного использования" (не в мультиплеере) небольшую модификацию. Если укажешь мод, могу посмотреть. |  
  |  
  | 
 |  | 
Darknesss Recruit
   |  | 6 |  
  Doom Rate: 2
  | 
  Отправлено: 25.06.19 00:59:52 |  |  
 |  
 	  | N00b2015 пишет: | 	 		  
 Darknesss
 Нет такой стандартной характеристики у оружия в Doom  
 Если не видно настроек самого мода, то напрямую никак. Но вполне можно написать "для личного использования" (не в мультиплеере) небольшую модификацию. Если укажешь мод, могу посмотреть.
  | 	  
 
 Да всё норм, надо было просто в настройках мыши покопаться) |  
 |  
  | 
 |  | 
JSO x - 2nd Lieutenant -
   |  | 1386 |  
   Doom Rate: 2.28 Posts quality: +758 | 
  Отправлено: 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 | 
8 | 
1 | 
  | 
 
 
 |  
  |  | 
N00b Chief Petty Officer
   |  | 922 |  
  Doom Rate: 2.15 Posts quality: +384 | 
  Отправлено: 25.06.19 17:10:21 |  |  
 |  
JSO x
 Да я не говорил, что ты неправ или что они не работающие. Просто нужно всех игроков рассматривать, и просто написать players[0].mo мне показалось каким-то несимметричным решением.
 Наверное, в той ситуации тогда лучше A_PrintBold вызвать (но один раз), чтобы все видели сообщение, а не только первый игрок. |  
 |  
  | 
 |  | 
Doomgay1999 - Corporal -
   |  | 96 |  
  Doom Rate: 2 Posts quality: +1 | 
  Отправлено: 26.06.19 05:29:42 |  |  
 |  
| А можно ли с при помощи Slade от редактировать музыку? Если нет то есть какой-то редактор по этому поводу? |  
 |  
  | 
 |  | 
Xtor = Lance Corporal =
   |  | 162 |  
   Doom Rate: 1.95 Posts quality: +18 | 
  Отправлено: 26.06.19 08:50:10 |  |  
 |  
| Doomgay1999, например, Audacity или Adobe Audition. |  
 |  
  | 
 |  | 
ZZYZX - UAC Commissar -
   |   |  | 6284 |  
   Doom Rate: 1.65 Posts quality: +1633 | 
 | 
| 2 | 
2 | 
1 | 
  | 
 
 
 |  
  |  | 
FoxPlays = Sergeant Major =
   |  | 644 |  
   Doom Rate: 2.14 Posts quality: +371 | 
  Отправлено: 26.06.19 13:11:24 |  |  
 |  
Насчёт скрипта с показом секретного выхода. Уже давно сделал всё на костылях  
 
 Появился ещё вопрос.
 Как сделать проверку инвентаря игроков на наличие какого-либо ключа (см. quote ниже) и если ключ был найден в инвентаре игрока, то он раздаётся всем другим игрокам у которых нет этого или этих ключей? Хорошо если это получиться в виде ACS кода   
 
  	   |  	 		  
 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
 }
 
 Значит этот актор (или же предмет) является ключём.
 
  | 	 
  |  
 |  
  | 
 |  | 
Void Weaver = Captain =
   |  | 2496 |  
   Doom Rate: 1.82 Posts quality: +808 | 
  Отправлено: 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 =
   |  | 644 |  
   Doom Rate: 2.14 Posts quality: +371 | 
  Отправлено: 26.06.19 15:02:39 |  |  
 |  
Void Weaver
 
 Ок, но можно как-нибудь сделать без создания новых акторов?
 Возможно ли сделать проверку на базе уже существующих?
 Просто делать проверку ключей отдельно для Doom, Heretic или же Strife будет тем не менее муторно   |  
 |  
  | 
 |  | 
Void Weaver = Captain =
   |  | 2496 |  
   Doom Rate: 1.82 Posts quality: +808 | 
  Отправлено: 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 =
   |  | 644 |  
   Doom Rate: 2.14 Posts quality: +371 | 
  Отправлено: 26.06.19 15:25:34 |  |  
 |  
Void Weaver
 
 Спасибо. Только жаль что нельзя проверять через CheckActorInventory(tid,"Key")    |  
 |  
  | 
 |  |