Проблема. Пытаюсь исправить неправильное поведение чейнгана, при 1 патроне. Нужно, чтобы когда осталась 1 пуля (Clip = 1) — силком отправить в стейт Ready, чтобы оттуда, при нажатии ОГОНЬ, алгоритм понял, что надо сменить оружие.
Написал так вот:
Fire:
CHGG A 0 A_PlaySound("weapons/chngun", CHAN_WEAPON)
CHGG A 0 A_Overlay (2, "Muzzle1")
CHGG A 4 A_FireBullets(5.6, 0, 1, 5, "BulletPuff")
TNT1 A 0 A_JumpIfInventory("Clip", 1, "Ready") // если в количество пуль = 1 —> отправить в стейт Ready.
CHGG B 0 A_PlaySound("weapons/chngun", CHAN_WEAPON)
CHGG B 0 A_Overlay (2, "Muzzle2")
CHGG B 4 A_FireBullets(5.6, 0, 1, 5, "BulletPuff")
CHGG B 0 A_ReFire
Goto Ready
В игре какая-то хрень. Работает неправильно. Гозза почему-то тупо проигрывает только выстрел из первого ствола пулемёта и не переключается на выстрел второго. Что не так?
Добавлено спустя 6 минут 29 секунд:
P.S.: починил
___
Было:
...
TNT1 A 0 A_JumpIfInventory("Clip", 1, "Ready")
...
DOOMGABR джампифинвентори проверяет не равенство, а есть ли "это количество этого итема" в наличии у актора
A_JumpIfInventory Clip 1, например, будет работать, если патронов больше/равно единице
поэтому оно должно выглядеть как-то так
Скрытый текст:
Fire:
CHGG A 0 A_PlaySound("weapons/chngun", CHAN_WEAPON)
CHGG A 0 A_Overlay (2, "Muzzle1")
CHGG A 4 A_FireBullets(5.6, 0, 1, 5, "BulletPuff")
TNT1 A 0 A_JumpIfInventory("Clip", 1, "Fire1")
Goto Ready
Fire1:
CHGG B 0 A_PlaySound("weapons/chngun", CHAN_WEAPON)
CHGG B 0 A_Overlay (2, "Muzzle2")
CHGG B 4 A_FireBullets(5.6, 0, 1, 5, "BulletPuff")
CHGG B 0 A_ReFire ("Fire")
Goto Ready
еще можно сделать это прыжком не на стейт файер1, а прыжком по цифре, но я не оч понял принципы их прыжков, поэтому им не доверяю
DOOMGABR Как вариант:
TNT1 A 0 A_JumpIf(CountInv("Clip")==1,"Ready") // если в количество пуль = 1 —> отправить в стейт Ready.
---------------------------------
N00b2015
Spawn:
TNT1 A 0
TNT1 A 0 A_UnsetShootable
TNT1 A 0 A_ChangeFlag("CORPSE",1)
CYBR A -1 CanRaise
Stop
На декоре норм пашет, проверил. Т. е. "Death" вообще не нужен.
states {
Spawn:
TNT1 A 0;
TNT1 A 0;
Death:
TNT1 A 0 A_UnsetShootable;
TNT1 A 0 A_UnsetSolid;
TNT1 A 0; //(1)
CYBR A -1 CanRaise; //чтобы актора видно было
stop;
Raise:
//а тут будет происходить то, ради чего всё и затевается (будет спауниться другой актор)
stop;
}
}
Вся проблема в том, что простой переход из некого ("не смертельного") стейта в стейт DEATH не означает что АКТОР погибает.
Для правильности нужно именно убить актора, а значит писать так:
Spawn:
TNT1 A 0
TNT1 A 0 A_Die
Stop
А штуковина CanRaise вообще здесь не нужна.
Проблема. Не воспроизводится звук щелчка дробовика (кастомный — "weapons/shotgp") у монстра. Причину вообще не понимаю. "weapons/shotgf" — звук выстрела без щелчка цевьем.
Стейт атаки шотганнера:
Missile:
SPOS E 7 A_FaceTarget
TNT1 A 0 A_PlaySound("weapons/shotgf", CHAN_AUTO)
SPOS F 7 Bright A_CustomBulletAttack(22.5, 0, 3, random(1,5)*3, "BulletPuff", 0, CBAF_NORANDOM)
SPSR A 5 A_PlaySound("weapons/shotgp", CHAN_AUTO)
SPSR B 6
SPSR A 5
Goto See
Кстати вместо Goto LightDone можно просто ставить Stop.
Неверно. В Software-рендерере это создаёт непогашенную имитацию света. В OpenGL -- да, можно, там A_Light-производные просто не отображаются. Там Light( <тип> ) как имитатор выстрела используется.
DOOMGABR, у одного человека (nailzx128) крайне похожее было, точь-в-точь. Папка "Sounds", а не "Sound", должна называться. Это графика в любом читается. Звуки -- нет. Другого объяснения не вижу. Замена на "CHAN_WEAP" не должна помочь.
Всем конечно спасибо за ваши ответы, но произошло нечто. Я тупо ночью выключил комп и пошёл спать, а на утро всё заработало. Ошибки как таковой не было, по факту. Слейд я точно сохранял, все названия папок, декларации, имена файлов, правильные имена в коде. Всё было на своих местах. Странно
Возникла небольшая проблема. Вот скрипт для увеличения максимального кол-ва переносимых патронов. Он не работает корректно.
Если заспавнить мой AmmoExtender через консоль, всё работает хорошо. НО! Суть в том, что этот предмет заменяет оригинальный Backpack. На некоторых картах, при самом первом подборе предмета, ничего не происходит. А вот к примеру на седьмой карте Doom 2, этот предмет вообще поднимается максимальное кол-во раз! Итак, вопрос знатокам. Что я сделал не так?
Ниже публикую код, если это что-то даст.
1. Как сделать, чтобы БФГ-шар не уничтожал актор своим трейсером? В моём случае, это думовская взрывная бочка.
2. Не могу понять, где найти код который отвечает за выпускание Ревенантом обычной ракеты и самонаводящейся. На ZDoom Вики я запутался и так ничего и не понял.
когда должно быть
if (GetAmmoCapacity("energyammo") > 100)
nailzx128:
этот предмет вообще поднимается максимальное кол-во раз!
Типа берёшь 1 а эффект как от 10? Если да, то попробуй прописать в ammoextender:
+INVENTORY.ALWAYSPICKUP
Inventory.Amount 1
Inventory.MaxAmount 1
---------------------------
DOOMGABR 1. Вижу 2 варианта:
Вариант №1:
Actor MyBarrel : ExplosiveBarrel replaces ExplosiveBarrel
{
DamageFactor "BFGSplash", 0.0 //Тупо даём бочке иммунитет к БФГ-трэйсерам
}
Плюс - не затрагивается игрок; минус - в этом случае вспышки будут по-прежнему спауниться на бочках.
Вариант №2:
Actor MyDoomguy: DoomPlayer
{
Species "BFGTracerFriends" //Даём игроку и бочке одинаковый специес
}
Actor MyBFGExtra : BFGExtra replaces BFGExtra
{
+MTHRUSPECIES //Даём флаг кастомному трэйсер-пуффу БФГ
}
Actor MyBarrel : ExplosiveBarrel replaces ExplosiveBarrel
{
Species "BFGTracerFriends" //Даём игроку и бочке одинаковый специес
}
Плюс - выглядит идеально; минус - надо эдитить игрока, а также тратить уникальное свойство Species, ну и до кучи игрок становится неуязвим к БФГ-трэйсерам.
Не исключено что можно сделать какой-нибудь хитрый джамп с проверкой акторкласса чтобы игрок таки получал урон от БФГ-спрея.
---------------------------
2. По поводу ракет Рева.
DOOMGABR:
Не могу понять, где найти код который отвечает за выпускание Ревенантом обычной ракеты и самонаводящейся.
Дело в том что за оба типа снарядов отвечает ОДИН актор (RevenantTracer) и ОДНА ф-ция (A_Tracer). Штука весьма хитрожопая и работает в зависимости от совпадения таймингов вызова ф-ции и некоего глобального таймера кратного 4. Т. е. шанс и степень самонаведения строго зависят от того какое число тиков использовано при вызове A_Tracer. Это вкратце.
Имхо, с А_Трэйсер вообще не стоит связываться, ну если только не планируешь нечто мега извратное.
Добавлено спустя 1 час 19 минут 7 секунд:
ЕЯПП, то правила следующие:
Если интервал вызова ф-ции нечётный, то наведение будет срабатывать каждый интервал×4 tics.
Например:
Скрытый текст:
Actor Tracer3 : RevenantTracer
{
States
{
Spawn:
FATB AB 3 bright A_Tracer
loop
}
}
Будет всегда наводящаяся, но наведение будет слабым - каждые 12 тиков.
Если интервал вызова ф-ции кратен 4, то будет срабатывать каждый интервал, но только если ракета была выстрелена в глобальный тик кратный 4.
Например:
Скрытый текст:
Actor Tracer4 : RevenantTracer
{
States
{
Spawn:
FATB AB 4 bright A_Tracer
loop
}
}
Будет наводящаяся если выстрел совершён в глобал-тик кратный 4, а наведение будет сильным - каждые 4 тика.
Если интервал вызова ф-ции чётный но НЕ кратен 4, то будет срабатывать каждый интервал×2 tics, но только если ракета была выстрелена в чётный глобальный тик.
Например:
Скрытый текст:
Actor RevenantTracer
{
States
{
Spawn:
FATB AB 2 bright A_Tracer
loop
}
}
Классика. Будет наводящаяся если выстрел совершён в чётный глобал-тик, а наведение будет сильным - каждые 4 тика.
Максимально злой вариант будет при FATB AB 1 bright A_Tracer - спаунится всегда наводящейся с максимальным наведением в 4 тика.
nailzx128
Из того что на поверхности:
nailzx128 :
if (GetAmmoCapacity("energyammo") >> 0)
когда должно быть
if (GetAmmoCapacity("energyammo") > 100)
nailzx128 :
этот предмет вообще поднимается максимальное кол-во раз!
Типа берёшь 1 а эффект как от 10? Если да, то попробуй прописать в ammoextender:
+INVENTORY.ALWAYSPICKUP
Inventory.Amount 1
Inventory.MaxAmount 1
Спасибо! Проблема с эффектом как от 10 решена! Однако, осталась проблема с первым поднятием.
И да, ещё вопрос знатокам.Почему двигло ругается на это:
weapon.ammouse (random (1, 0))
?
Суть в том, что я хочу снизить потребление патронов у одной очень скорострельной пушки. Одна из идей была в установке рандомного параметра в пункте кол-ва потребления аммуниции.
прописать A_checkproximity, c проверкой рядом ли бочка во время этой самой вспышки и если рядом то прыжок на TNT1 A 0. Вспышки не будет визуально...
Кстати да, работает как часы :
Actor MyBFGExtra : BFGExtra replaces BFGExtra
{
States
{
Spawn:
TNT1 A 0 NoDelay A_CheckProximity("Death","MyBarrel",20.0,1)
BFE2 ABCD 8 Bright
Death:
TNT1 A 0
Stop
}
}
-----------------
nailzx128:
Суть в том, что я хочу снизить потребление патронов у одной очень скорострельной пушки. Одна из идей была в установке рандомного параметра в пункте кол-ва потребления аммуниции.
Полагаю речь идёт о Wailer, да? У тебя в коде все ф-ции каждого выстрела "упакованы" в 1 тик анонимной ф-ции, из-за этого пуха дико скорострельна. А ты не думал пойти несколько иным путём - чуток снизить скорострельность (повысив дамаг и\или ко-во пуль) вместо просто снижения потребления аммо?
Полагаю речь идёт о Wailer, да? У тебя в коде все ф-ции каждого выстрела "упакованы" в 1 тик анонимной ф-ции, из-за этого пуха дико скорострельна. А ты не думал пойти несколько иным путём - чуток снизить скорострельность (повысив дамаг и\или ко-во пуль) вместо просто снижения потребления аммо?
Главная фишка этого оружия - бешеная скорострельность. Именно она выделяет этот ствол на фоне остальных. Я не хочу жертвовать скорострельностью.