| Автор | Сообщение | 
|---|
| 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")
  |  |  | 
 | 
|  |  |