Автор | Сообщение |
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: +367 |
Отправлено: 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: +367 |
Отправлено: 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 =
| | 2993 |
Doom Rate: 2.06 Posts quality: +1462 |
Отправлено: 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 -
| 1334 |
Doom Rate: 2.26 Posts quality: +726 |
Отправлено: 29.06.19 13:35:22 | | | Args[ 5 ] -- массив из пяти беззнаковых однобайтных целых чисел (0..255), которые пришли ещё с... Hexen, вроде. Могут задаваться напрямую из-под редактора, то есть при появлении объектов в самой игре у них уже будут Args, заданные ещё при построении карты автором. Используются для конфигурации различных скриптов ("Arg" -- сокращение от "Argument") и, иногда, свойств самого актора. По умолчанию все аргументы -- ноль: "0, 0, 0, 0, 0". Использовать их как переменные нежелательно, так как если этот самый аргумент на карте уже используется, например, как параметр скрипта, то либо исполнение этого самого скрипта из-за изменения аргументов нарушится, либо переменные с самого начала будут иметь неверные значения. |
|
|
2 |
7 |
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
| 935 |
Doom Rate: 2.15 Posts quality: +254 |
Отправлено: 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
| 935 |
Doom Rate: 2.15 Posts quality: +254 |
Отправлено: 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
| 935 |
Doom Rate: 2.15 Posts quality: +254 |
Отправлено: 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
| 935 |
Doom Rate: 2.15 Posts quality: +254 |
Отправлено: 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
| 935 |
Doom Rate: 2.15 Posts quality: +254 |
Отправлено: 29.06.19 22:13:23 | | | Void Weaver
Еще раз спасибо, теперь все работает идеально, как и надо | |
|
1 |
3 |
|
|
| |
FoxPlays = Sergeant Major =
| 644 |
Doom Rate: 2.14 Posts quality: +367 |
Отправлено: 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 |
|
|
| |