Welcome to U.A.C. [O.S.A.]
login / register
Status: Guest
Архивы форума | iddqd.ru
Wolf 3D
ПравилаПравила ПоискПоиск
18+
Тема для новичков. Вопросы по маппингу/моддингу - любые!-2 Пред.  1, 2, 3, ... 18, 19, 20  След.
   Список разделов - Местечко мапперов и моддеров - Тема для новичков. Вопросы по маппингу/моддингу - любые!-2Ответить
АвторСообщение
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

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

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

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

Doom Rate: 2.26

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

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

Рейтинг сообщения: +1, отметил(и): Void Weaver
1 1 1
N00b2015
= Master Sergeant =
Next rank: - Sergeant Major - after 36 points
494

Doom Rate: 2.17

Posts quality: +162
Ссылка на пост №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 1
FoxPlays
= Master Sergeant =
Next rank: - Sergeant Major - after 4 points
526

Doom Rate: 2.26

Posts quality: +250
Ссылка на пост №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: +785
Ссылка на пост №25 Отправлено: 26.06.19 19:28:31
N00b2015 пишет:
GiveInventory(GetClass(), 1);
А что если таки GiveInventory(GetClassName(),1);

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

Doom Rate: 1.98

Posts quality: +1154
Ссылка на пост №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: +785
Ссылка на пост №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
- Sergeant Major -
Next rank: = Sergeant Major = after 26 points
574

Doom Rate: 2.39

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

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

Doom Rate: 1.82

Posts quality: +785
Ссылка на пост №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
UAC Sergeant Major
Next rank: UAC Sergeant Major after 13 points
747

Doom Rate: 2

Posts quality: +115
Ссылка на пост №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 1
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +785
Ссылка на пост №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
UAC Sergeant Major
Next rank: UAC Sergeant Major after 13 points
747

Doom Rate: 2

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

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

Doom Rate: 1.82

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

И кстати откуда у тебя происходит активация 205 скрипта?
1 9 1
Zeberpal_98
UAC Sergeant Major
Next rank: UAC Sergeant Major after 13 points
747

Doom Rate: 2

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

Doom Rate: 1.82

Posts quality: +785
Ссылка на пост №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
UAC Sergeant Major
Next rank: UAC Sergeant Major after 13 points
747

Doom Rate: 2

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

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

Doom Rate: 1.82

Posts quality: +785
Ссылка на пост №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
UAC Sergeant Major
Next rank: UAC Sergeant Major after 13 points
747

Doom Rate: 2

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

Doom Rate: 2.26

Posts quality: +250
Ссылка на пост №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: +785
Ссылка на пост №40 Отправлено: 30.06.19 08:19:07
Конфиг PickActor в студию плиз.
1 9 1
Страница 2 из 20Перейти наверх Пред.  1, 2, 3, ... 18, 19, 20  След.
   Список разделов - Местечко мапперов и моддеров - Тема для новичков. Вопросы по маппингу/моддингу - любые!-2