| Автор | Сообщение |
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 -
 | | 1404 |
 Doom Rate: 2.27 Posts quality: +789 |
Отправлено: 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 -
 | | 1404 |
 Doom Rate: 2.27 Posts quality: +789 |
Отправлено: 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")  |
|
|
| |
Void Weaver = Captain =
 | | 2496 |
 Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 26.06.19 15:38:17 | |
|
Возможно я туплю, но зачем тебе в принципе унификация проверки на базовый класс ключей?
Ну вот допустим что такая конструкция возможна: CheckActorInventory(tid,"Key"). Теперь представим что игрок нашёл "синий ключ", а ф-ция вернёт просто "ключ" (ну или "дум ключ"). Ну и как в таком случае определить ключ какого цвета должен быть выдан другим игрокам?
Так что унификация иногда просто бессмысленна. |
|
|
| 1 |
9 |
1 |
 |
|
| |
FoxPlays = Sergeant Major =
 | | 644 |
 Doom Rate: 2.14 Posts quality: +371 |
Отправлено: 26.06.19 16:00:03 | |
|
Void Weaver
Уфф... Что-то я и правда не подумал об этом. Может это как-то будет возможно сделать на ZScript'е ?
Сделать проверку подобранного предмета и является ли он ключом и если этот предмет (актор) - ключ, то он раздаётся всем другим игрокам? |
|
|
| |
N00b Chief Petty Officer
 | | 922 |
Doom Rate: 2.15 Posts quality: +384 |
Отправлено: 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);
}
}
Вообще это, как нетрудно догадаться, тоже костыль  |
|
|
| |
FoxPlays = Sergeant Major =
 | | 644 |
 Doom Rate: 2.14 Posts quality: +371 |
Отправлено: 26.06.19 18:57:06 | |
|
N00b2015
Проверил в мультиплеере, сообщение выводит, а вот ключ не выдаёт  |
|
|
| |
Void Weaver = Captain =
 | | 2496 |
 Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 26.06.19 19:28:31 | |
|
| N00b2015 пишет: | | GiveInventory(GetClass(), 1); | А что если таки GiveInventory(GetClassName(),1);
Бтв, а что делает GetKeyType? Отсюда и отсюда. |
|
|
| 1 |
9 |
1 |
 |
|
| |
+Ku6EPyXOBEPTKA+ = Major =
 |  | | 3137 |
 Doom Rate: 2.05 Posts quality: +1571 |
Отправлено: 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 =
 | | 2496 |
 Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 28.06.19 17:20:50 | |
|
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. В каких случаях оперирование этим свойством наиболее целесообразно? |
|
|
| 1 |
9 |
1 |
 |
|
| |
JSO x - 2nd Lieutenant -
 | | 1404 |
 Doom Rate: 2.27 Posts quality: +789 |
Отправлено: 29.06.19 13:35:22 | |
|
| Args[ 5 ] -- массив из пяти беззнаковых однобайтных целых чисел (0..255), которые пришли ещё с... Hexen, вроде. Могут задаваться напрямую из-под редактора, то есть при появлении объектов в самой игре у них уже будут Args, заданные ещё при построении карты автором. Используются для конфигурации различных скриптов ("Arg" -- сокращение от "Argument") и, иногда, свойств самого актора. По умолчанию все аргументы -- ноль: "0, 0, 0, 0, 0". Использовать их как переменные нежелательно, так как если этот самый аргумент на карте уже используется, например, как параметр скрипта, то либо исполнение этого самого скрипта из-за изменения аргументов нарушится, либо переменные с самого начала будут иметь неверные значения. |
|
|
| 2 |
8 |
1 |
 |
|
| |
Void Weaver = Captain =
 | | 2496 |
 Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 29.06.19 15:44:32 | |
|
Спасибо за ликбез. ^_^
1. Правильно ли я понимаю что вместо Аргс-массива следует использовать (ЮзерВар-)массивы? Да.
2. Что значит следующая ремарка:Означает ли это что область применения юзервар-массива как-то лимитирована по сравнению с аргс-массивом? Или это наоборот преимущество? Преимущество. Это значит что юзермас не используются в оригинальных преопределённых акторах или скриптах, ибо юзермассивы просто не представлены в играх поскольку задаются извне, моддером.
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
 | | 965 |
 Doom Rate: 2.13 Posts quality: +295 |
Отправлено: 29.06.19 17:11:23 | |
|
Очень плохой код, просто очень плохой код
Есть кастомный белый(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 =
 | | 2496 |
 Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 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
 | | 965 |
 Doom Rate: 2.13 Posts quality: +295 |
Отправлено: 29.06.19 18:10:28 | |
|
Void Weaver
Спасибо, прожектайл заметно"веселее" стал спауниться, к сожалению, правда, проблему не решил.
Чувствую, надо делать как надо, в зскрипте, рыщу в околоподобных модах. Пока что смотрю в книгу - вижу фигу: как так, почему здесь это, что здесь происходит вообще? |
|
|
| 1 |
3 |
 |
|
| |
Void Weaver = Captain =
 | | 2496 |
 Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 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
 | | 965 |
 Doom Rate: 2.13 Posts quality: +295 |
Отправлено: 29.06.19 18:22:04 | |
|
Void Weaver
от ACS_EXECUTE(205, 0); в ENTER скрипте |
|
|
| 1 |
3 |
 |
|
| |
Void Weaver = Captain =
 | | 2496 |
 Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 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 |
9 |
1 |
 |
|
| |
Zeberpal_98 Chief Petty Officer
 | | 965 |
 Doom Rate: 2.13 Posts quality: +295 |
Отправлено: 29.06.19 19:33:13 | |
|
Void Weaver
Спасибо большое! Заработало, монстр получил актор, теперь осталось все почистить и привести в нормальный вид. |
|
|
| 1 |
3 |
 |
|
| |
Void Weaver = Captain =
 | | 2496 |
 Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 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 |
9 |
1 |
 |
|
| |
Zeberpal_98 Chief Petty Officer
 | | 965 |
 Doom Rate: 2.13 Posts quality: +295 |
Отправлено: 29.06.19 22:13:23 | |
|
Void Weaver
Еще раз спасибо, теперь все работает идеально, как и надо  |
|
|
| 1 |
3 |
 |
|
| |
FoxPlays = Sergeant Major =
 | | 644 |
 Doom Rate: 2.14 Posts quality: +371 |
Отправлено: 30.06.19 07:57:12 | |
|
Как сделать вывод информации о игроке если он в поле зрения (например: здоровье, никнейм, оружие которое он в данный момент использует, ну и патроны), мб при помощи PickActor ?
Когда пытаюсь сделать через PickActor, скрипт выводит только врагов
 |
|
|
| |
Void Weaver = Captain =
 | | 2496 |
 Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 30.06.19 08:19:07 | |
|
| Конфиг PickActor в студию плиз. |
|
|
| 1 |
9 |
1 |
 |
|
| |