Да не огорчайся ты)
Так, немного надо переделать код. Мне кажется нужно проверять немного по другому. Т. е.:
#Include "ZCommon.Acs"
int n; // Я не помню всех здумовских инструкций в АЦС, но по идее в переменную N нужно заносить информацию о высоте пола или потолка.
script 1 (void)
{
GetSectorFloorHeight(это не точная функция, а пример) = N; //По идее что то в здуме должно быть.
Смысл скрипта:
В самом начале скрипта в переменную N заносится информация о высоте пола или потолка(что по душе) - число. Далее скрипт делает ТРИ проверки.
Первая проверка проверяет не движется ли у нас лифт, т.е. по логике получается не равна ли высота 144 и 1168(Проверяет сразу два условия), если лифт движется, то скрипт автоматически терминирует - второй раз не включится, что нам и нужно.
Вторая проверяет не стоит ли у нас лифт на высоте 144, т.е. если стоит, то он будет подниматься.
Третья проверяет не стоит ли у нас лифт на высоте 1168, т.е. если стоит, то будет опускаться(Или что там инструкция делает).
Стоит запомнить одну главную вещь - код выполняется ПОСТРОЧНО, поэтому как поставишь проверки, так и будет работать
Короче заработал прежний, код... только добавил одно слово else )))
#Include "ZCommon.Acs"
int n = 0;
Script 1 (void)
{
if (n == 0) // если лифт находится вверху
{
FloorAndCeiling_LowerByValue(42, 8, 1168);
delay(1200);
n = 1;
}
else if (n == 1) // если лифт находится внизу
{
FloorAndCeiling_RaiseByValue(42, 8, 1168);
delay(1200);
n = 0;
}
}
Только тут надо рассчитывать delaу, если меньше поставишь и можно будет нажать на кнопку, а лифт ещё не доехал до низа, как только он доедет до низа и остановиться, нажимаем ещё раз кнопку, а он уже вместо верха снова вниз. вот я и спрашивал, сколько тиков в 1-й секунде)))) сидел считал, сколько по времени лифт едет))))) в самый раз получилось 1200.
И ещё вопрос, а как сделать так (исходя из скрипта выше), чтобы когда лифт едет вниз, а в это время игрок находится под лифтом внизу, и когда лифт соприкасается с ним, то игрока раздавливает... аналогично когда лифт прижимает игрока к потолку.
Нашёл вот такой похожий скрипт, но синтаксис другой.
35. Поэтому если тебе нужна задержка в секундах, то лучше прописывать так: Delay (35*n) - где n - секунды задержки. (Г)Здум сам выполнит математическую операцию в итоге тебе не придется множить на калькуляторе. Точно также можно применять хитрости в других функциях, например заставить ЗДум самому посчитать высоту, на которую должен опуститься лифт.
Ну может Вы подскажите, как заставить лифтом (3d пол) раздавить игрока?
Тут забавная ситуация выходит. Физически, потолок не может придавить игрока сверху, а пол придавить внизу, так как у секторального движка дума от таких приколов разрыв шаблона. Дело в том, что пол зд пола - это потолок 3д сектора, а нижняя часть - пол. Поэтому, встроенными функциями никак не обойтись. Выход - написать проверку расстояния от зд поверхности до потолка или пола и сделать Sector_SetDamage урон игроку (или через другую функцию).
P.S: А ещё проще - не подпускать игрока в шахту. Сделай что-то вроде сетки или ограждения. Можно вообще обойтись невидимыми 3d секторами (будут выполнять функцию impassible)
Ну может Вы подскажите, как заставить лифтом (3d пол) раздавить игрока?
Кажись видел подобное в моде Doom Do Christmas тут на сайте есть, там в начале игры был типо лифт, 3д платформа если точнее которая давила игрока если тот стоит под ней.
P.S. Кстати этот мод заставил меня посмотреть на Doom под другим углом, может и у тебя также будет
этот лифт давит игрока, когда он под ним, но мне нужно переделать, чтобы при нажатии на кнопку лифт ехал вниз, а потом после нажатия на кнопку ехал вверх. (при этом, пока лифт едет, на кнопку нажимать было нельзя)
так же, чтобы лифт давил игрока, когда лифт прижимает его потолку.
этот лифт давит игрока, когда он под ним, но мне нужно переделать, чтобы при нажатии на кнопку лифт ехал вниз, а потом после нажатия на кнопку ехал вверх. (при этом, пока лифт едет, на кнопку нажимать было нельзя)
так же, чтобы лифт давил игрока, когда лифт прижимает его потолку.
Братиш, я написал в прошлом посте код, где можно вставить и возможность давилки. В нём уже есть проверка на то, что лифт едет(почитай подробнее)
Парни у меня очередной вопрос. Как работает прозрачность игрока в АЦС? Я вот пытаюсь замутить свою невидимость, написал вот это:
Братиш, я написал в прошлом посте код, где можно вставить и возможность давилки. В нём уже есть проверка на то, что лифт едет(почитай подробнее)
Братишь:) нет такой функции GetSectorFloorHeight, есть только GetSectorFloorZ(тэг. х. у) и GetSectorCeilingZ(тэг. х. у).
здесь чёт есть, но так и не понял, даже с транслитом. http://forum.zdoom.org/viewtopic.php?f=3&t=2565
в общем залью для примера тестовый вад, чтобы понятней было)))
Лифт у меня в виде бокса. т.е. есть крыша и пол.
может кто поможет дописать скрипт, чтобы игрока давило.
А получаю вот такую "не шибко хорошую невидимость":
Не знаю, с этой прозрачностю в АЦС ужасные проблемы. У меня был вадник, где монстры через скрипт воскресали и должны били стать прозрачными, но это вообще не сработало ни разу, сколько я ни бился.
Можно пропробовать подменить эти (.bmp) спрайты прозрачными .png-шками (размером эдак 3x3 пикселя с тем же именем) и засунуть их между HI_START, HI_END.
(В скриптах я ноль), но если не получается, то чем это не выход?! В определенный момент "X" (наступления невидимости), ссылаетесь на эти спрайты.
Я имею ввиду полную невидимость.
Если же невидимость должна быть как в ориг.doom то опять же, рисуете прозрачные спрайты из оригинальных и сохранете в .png В общем как то так...
А что будет, если значение alpha брать не 1.0 а меньше? 0.5, например?
Спрайт будет таким же тёмным, но с прозрачностью(он тёмным вообще не должен быть, изображение не такое)
vlr66 :
Можно пропробовать подменить эти (.bmp) спрайты прозрачными .png-шками (размером эдак 3x3 пикселя с тем же именем) и засунуть их между HI_START, HI_END.
(В скриптах я ноль), но если не получается, то чем это не выход?! В определенный момент "X" (наступления невидимости), ссылаетесь на эти спрайты.
Я имею ввиду полную невидимость.
Это не вариант вообще, т.к. это ОЧЕНЬ много спрайтов, потому что для каждого оружия нужно будет делать аналогичную вариацию.
Спрайт будет таким же тёмным, но с прозрачностью(он тёмным вообще не должен быть, изображение не такое)
Странно. В Гозе 21 пре и зандротине 1.2.1 в режиме hardware (openGL) работает всё нормально. Проверил в софтваре - абсолютно так же. Не в спрайтах ли какая беда? Посмотри в скрипте кулаков - не стоит ли там рендер какой-то, а то может конфликтует? Сборку порта тож укажи, желательно, хотя проверил даже на ZDoom 2.1.7, там норма.
Нет, я выставил прозрачность напрямую в проперти игрока - там все норм, но в АЦС упорно вылетает такой баг. Тестил в последней сборке гоззы.
Странное явление. Проверил кусок кода (часть, где acs меняет редер игрока и альфа параметр), но всё работает нормально (проверял на оригинальном спрайте пистолета). Скинь код кулаков, код игрока и код поверапа (если невидимость активируется через него). Может ли быть причиной поверап (флаг где-нибудь вредный или параметр)?
P.S: пошерстил настройки гозы, но что-то ничего не нашёл, чтобы такой эффект создать.
ACTOR Fists : Weapon
{
+WEAPON.WIMPY_WEAPON
+WEAPON.MELEEWEAPON
+NOALERT
Attacksound "CGWHACK"
States
{
Ready:
TNT1 A 0 A_JumpIfInventory("Punched", 1, "ReadyBloodFists")
PNCH A 1 A_Jump(256,"Ready1","Ready2")
Goto Ready
ReadyBloodFists:
PNCH E 1 A_Jump(256,"Ready1BloodFists","Ready2BloodFists")
Goto ReadyBloodFists
Ready1:
TNT1 A 0 A_JumpIfInventory("Punched", 1, "Ready1BloodFists")
PNCH A 1 A_WeaponReady
Loop
Ready1BloodFists:
PNCH E 1 A_WeaponReady
Loop
Ready2:
TNT1 A 0 A_JumpIfInventory("Punched", 1, "Ready2BloodFists")
PNCH B 1 A_WeaponReady
Loop
Ready2BloodFists:
PNCH F 1 A_WeaponReady
Loop
Deselect:
TNT1 A 0 A_JumpIfInventory("Punched", 1, "DeselectBloodFists")
PNCH A 0 A_TakeInventory("FistsSelect",1)
PNCH A 0 A_Lower
PNCH A 1 A_Lower
Loop
DeselectBloodFists:
PNCH E 0 A_TakeInventory("FistsSelect",1)
PNCH E 0 A_Lower
PNCH E 1 A_Lower
Loop
Select:
TNT1 A 0 A_JumpIfInventory("Punched", 1, "SelectBloodFists")
PNCH A 0 A_GiveInventory("FistsSelect",1)
PNCH A 0 A_Raise
PNCH A 1 A_Raise
loop
SelectBloodFists:
PNCH E 0 A_GiveInventory("FistsSelect",1)
PNCH E 0 A_Raise
PNCH E 1 A_Raise
Loop
Fire:
TNT1 A 0 A_JumpIfInventory("Punched", 1, "FireBloodFists")
PNCH C 0 A_Playsound("PUNCH")
PNCH C 2
PNCH C 1 offset(-30, 14) A_CustomPunch(random(20,40),1,0,"FistsPuff")
TNT1 A 5
TNT1 A 1 A_ReFire
PNCH A 1 offset(1, 142)A_WeaponReady(1)
PNCH A 1 offset(1, 133)A_WeaponReady(1)
PNCH A 1 offset(1, 124)A_WeaponReady(1)
PNCH A 1 offset(1, 106)A_WeaponReady(1)
PNCH A 1 offset(1, 97)A_WeaponReady(1)
PNCH A 1 offset(1, 88)A_WeaponReady(1)
PNCH A 1 offset(1, 70)A_WeaponReady(1)
PNCH A 1 offset(1, 60)A_WeaponReady(1)
PNCH A 1 offset(1, 52)A_WeaponReady(1)
PNCH A 1 offset(1, 34)A_WeaponReady(1)
PNCH A 1 offset(1, 32)A_WeaponReady(1)
Goto Ready
FireBloodFists:
PNCH G 0 A_Playsound("PUNCH")
PNCH G 2
PNCH G 1 offset(-30, 14) A_CustomPunch(random(20,40),1,0,"FistsPuff")
TNT1 A 5
TNT1 A 1 A_ReFire
PNCH E 1 offset(1, 142)A_WeaponReady(1)
PNCH E 1 offset(1, 133)A_WeaponReady(1)
PNCH E 1 offset(1, 124)A_WeaponReady(1)
PNCH E 1 offset(1, 106)A_WeaponReady(1)
PNCH E 1 offset(1, 97)A_WeaponReady(1)
PNCH E 1 offset(1, 88)A_WeaponReady(1)
PNCH E 1 offset(1, 70)A_WeaponReady(1)
PNCH E 1 offset(1, 60)A_WeaponReady(1)
PNCH E 1 offset(1, 52)A_WeaponReady(1)
PNCH E 1 offset(1, 34)A_WeaponReady(1)
PNCH E 1 offset(1, 32)A_WeaponReady(1)
Goto Ready
//--------------------------Holding-------------------------------------------//
Hold:
TNT1 A 0 A_JumpIfInventory("Punched", 1, "HoldBloodFists")
PNCH C 1 offset(1,32) A_Jump(256,"Hold1","Hold2","Hold3")
Goto Ready
Hold1:
NULL A 1
PNCH C 0 A_Playsound("PUNCH")
PNCH C 1 offset(1,32)
PNCH C 1 offset(-30, 14) A_CustomPunch(random(20,40),1,0,"FistsPuff")
NULL A 1 A_ReFire
Goto HoldEnd
Hold2:
NULL A 1
PNCH C 0 A_Playsound("PUNCH")
PNCH C 1 offset(1,32)
PNCH C 1 offset(-30, 14) A_CustomPunch(random(20,40),1,0,"FistsPuff")
PNCH C 1 offset(-42, 14)
PNCH C 1 offset(-33, 62)
NULL A 3
NULL A 1 A_ReFire
Goto HoldEnd
Hold3:
NULL A 4
PNCH D 0 A_Playsound("PUNCH")
PNCH D 1 offset(1,32)
PNCH D 1 offset(30, 14) A_CustomPunch(random(20,40),1,0,"FistsPuff")
PNCH D 1 offset(42, 14)
PNCH D 1 offset(33, 62)
NULL A 1
NULL A 1 A_ReFire
Goto HoldEnd
//----------------------------------------------------------------------------//
HoldBloodFists:
PNCH G 1 offset(1,32) A_Jump(256,"Hold1BloodFists","Hold2BloodFists","Hold3BloodFists")
Goto Ready
Hold1BloodFists:
TNT1 A 1
PNCH G 0 A_Playsound("PUNCH")
PNCH G 1 offset(1,32)
PNCH G 1 offset(-30, 14) A_CustomPunch(random(20,40),1,0,"FistsPuff")
TNT1 A 1 A_ReFire
Goto HoldEndBloodFists
Hold2BloodFists:
TNT1 A 1
PNCH G 0 A_Playsound("PUNCH")
PNCH G 1 offset(1,32)
PNCH G 1 offset(-30, 14) A_CustomPunch(random(20,40),1,0,"FistsPuff")
PNCH G 1 offset(-42, 14)
PNCH G 1 offset(-33, 62)
TNT1 A 3
TNT1 A 1 A_ReFire
Goto HoldEndBloodFists
Hold3BloodFists:
TNT1 A 4
PNCH H 0 A_Playsound("PUNCH")
PNCH H 1 offset(1,32)
PNCH H 1 offset(30, 14) A_CustomPunch(random(20,40),1,0,"FistsPuff")
PNCH H 1 offset(42, 14)
PNCH H 1 offset(33, 62)
TNT1 H 1
TNT1 H 1 A_ReFire
Goto HoldEndBloodFists
//------------End Holding-----------------------------------------------------//
HoldEnd:
PNCH A 1 offset(1, 142)A_WeaponReady(1)
PNCH A 1 offset(1, 133)A_WeaponReady(1)
PNCH A 1 offset(1, 124)A_WeaponReady(1)
PNCH A 1 offset(1, 106)A_WeaponReady(1)
PNCH A 1 offset(1, 97)A_WeaponReady(1)
PNCH A 1 offset(1, 88)A_WeaponReady(1)
PNCH A 1 offset(1, 70)A_WeaponReady(1)
PNCH A 1 offset(1, 60)A_WeaponReady(1)
PNCH A 1 offset(1, 52)A_WeaponReady(1)
PNCH A 1 offset(1, 34)A_WeaponReady(1)
PNCH A 1 offset(1, 32)A_WeaponReady(1)
Goto Ready
//----------------------------------------------------------------------------//
HoldEndBloodFists:
PNCH E 1 offset(1, 142)A_WeaponReady(1)
PNCH E 1 offset(1, 133)A_WeaponReady(1)
PNCH E 1 offset(1, 124)A_WeaponReady(1)
PNCH E 1 offset(1, 106)A_WeaponReady(1)
PNCH E 1 offset(1, 97)A_WeaponReady(1)
PNCH E 1 offset(1, 88)A_WeaponReady(1)
PNCH E 1 offset(1, 70)A_WeaponReady(1)
PNCH E 1 offset(1, 60)A_WeaponReady(1)
PNCH E 1 offset(1, 52)A_WeaponReady(1)
PNCH E 1 offset(1, 34)A_WeaponReady(1)
PNCH E 1 offset(1, 32)A_WeaponReady(1)
Goto Ready
}
}
Код инвентории, которая активирует АЦС скрипт
Скрытый текст:
ACTOR SmokeBomb : CustomInventory
{
Inventory.PickupMessage "Smoke Bomb"
Inventory.Amount 100
Inventory.InterHubAmount 100
Inventory.MaxAmount 100
Inventory.Icon "SWINB0"
Inventory.PickupSound "DSITEMUP"
+INVENTORY.INVBAR
-INVENTORY.AUTOACTIVATE
+INVENTORY.PERSISTENTPOWER
scale 0.5
States
{
Spawn:
SWIN A -1
stop
Use:
TNT1 A 1
TNT1 A 0 A_JumpIfInventory("SmokeBombCheck", 1, "Use2")
TNT1 A 0 A_GiveInventory("SmokeBombCheck", 1)
TNT1 A 0 A_PlaySound("GASPOP")
TNT1 A 0 ACS_ExecuteAlways(290, 0,0,0)
Fail
Use2:
TNT1 A 0 A_PlaySound("GASPOP")
TNT1 A 0 A_TakeInventory("SmokeBombCheck", 1)
Fail
}
}
Поверапы никакие не даются. Я решил запрогать эффект полной невидимости, естесно с проверочками в самих монстрах, что у игрока есть техническая инвентория SmokeBombCheck.(Это просто для расшифровки, чтобы было более понятно)