Welcome to U.A.C. [O.S.A.]
login / register 
Status: Guest
Архивы форума | iddqd.ru
Wolf 3D
ПравилаПравила ПоискПоиск
18+
Тема для новичков. Вопросы по маппингу/моддингу - любые! Пред.  1, 2, 3 ... 173, 174, 175 ... 198, 199, 200  След.
   Список разделов - Флуд и устаревшие темы - Тема для новичков. Вопросы по маппингу/моддингу - любые!Ответить
АвторСообщение
nailzx128
- Lance Corporal -
Next rank: = Lance Corporal = after 24 points
136

Doom Rate: 1.43

Posts quality: +97
Ссылка на пост №3461 Отправлено: 23.08.18 22:39:29
alekv:
Что именно не работает?

Не работает скрипт самоуничтожения и управления
alekv
- Colonel -
Next rank: = Colonel = after 272 pointsМодератор форума
4168

Doom Rate: 1.87

Posts quality: +949
Ссылка на пост №3462 Отправлено: 23.08.18 22:48:45
nailzx128:
Не работает скрипт самоуничтожения и управления


А это уже попробовал?

alekv:
А еще у тебя вот эта строка лишняя
Thing_ChangeTID(MissileID, 0);
ты получается заменяешь тид снаряда на 0... Убери эту строку.


alekv:
Снаряд запускает скрипт ?

типа такого
States{
spawn:
TNT1 A 0
TNT1 A 0 ACS_NamedExecute("missilecam", 0)
idle:
...
1 3 1
nailzx128
- Lance Corporal -
Next rank: = Lance Corporal = after 24 points
136

Doom Rate: 1.43

Posts quality: +97
Ссылка на пост №3463 Отправлено: 24.08.18 11:24:27
Строку Thing_ChangeTID(MissileID, 0) убирал. Не работает даже без неё.
alekv:
Снаряд запускает скрипт ?

Разумеется.
Spawn:
		MISL A 1 Bright {
		acs_namedexecute("missilecam",0);
		a_weave(2,2,2,2);
		}
	Loop
alekv
- Colonel -
Next rank: = Colonel = after 272 pointsМодератор форума
4168

Doom Rate: 1.87

Posts quality: +949
Ссылка на пост №3464 Отправлено: 24.08.18 12:14:45
SetActivatorToTarget(MissileID);
эту строку замени на 0


т.к. получается ахинея
int MissileID = UniqueTID(); //даем тид переменной
Thing_ChangeTID(0, MissileID); //меняем тид активатора скрипта на переменную выше (активатор скрипта снаряд)
SetActivatorToTarget(MissileID); //почему-то опять ставим активатором снаряд... Должен быть ГГ активатором. По этому ставь тут 0

Если не поможет попробуй написать так:
SetActivator(0, AAPTR_PLAYER1);
1 3 1
nailzx128
- Lance Corporal -
Next rank: = Lance Corporal = after 24 points
136

Doom Rate: 1.43

Posts quality: +97
Ссылка на пост №3465 Отправлено: 24.08.18 12:43:47
alekv:
SetActivatorToTarget(MissileID);
эту строку замени на 0


т.к. получается ахинея
int MissileID = UniqueTID(); //даем тид переменной
Thing_ChangeTID(0, MissileID); //меняем тид активатора скрипта на переменную выше (активатор скрипта снаряд)
SetActivatorToTarget(MissileID); //почему-то опять ставим активатором снаряд... Должен быть ГГ активатором. По этому ставь тут 0

Если не поможет попробуй написать так:
SetActivator(0, AAPTR_PLAYER1);

Попробовал всё что ты предложил. Не помогло(
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +808
Ссылка на пост №3466 Отправлено: 24.08.18 23:12:49
Если вдруг кому интересно:
Void Weaver:
кстати кто-нибудь может объяснить как прописывать PoisonDamage value, duration, period? Что там исчисляется в тиках а что в секундах?
Итак, господин FDARI разложил всё по полочкам, итого:

PoisonDamage value[, duration[, period]]
value: Значение урона, наносимого каждый раз по прошествии количества тиков заданных в "period".
duration: Значение (в у. е.) задающее общее количество вызовов урона. Т. е. отвечает за то, сколько раз в итоге яд стукнет.
period: Количество тиков между вызовами ядовитого урона. Дефолтное значение 0 означает вызов раз в секунду, т. е. period(0) = period(35).

Общий урон без учёта других источников яда считается по формуле: tD = value * duration
Общая длительность в тиках без учёта других источников яда считается по формуле: tT = duration * period

Примеры:
Скрытый текст:

Пример1
PoisonDamage 32, 3, 0
Итоговый урон - 96
Итоговая длительность - 105 тиков (3 сек)
Периодичность - раз в 35 тиков (1 сек)

Пример2
PoisonDamage 10, 5, 70
Итоговый урон - 50
Итоговая длительность - 350 тиков (10 сек)
Периодичность - раз в 70 тиков (2 сек)

Пример3
PoisonDamage 3, 45, 5
Итоговый урон - 135
Итоговая длительность - 225 тиков (~6,4 сек)
Периодичность - раз в 5 тиков (~0,14 сек)

Пример4
PoisonDamage 100, 0, 5
Итоговый урон - 0
Итоговая длительность - 0 тиков
Периодичность - раз в 5 тиков

Пример5
PoisonDamage (5-10000)
Итоговый урон - 20-21
Итоговая длительность - 10 секунд
Периодичность - раз в ~7 тиков

Пример6
PoisonDamage 100, 5
Итоговый урон - 500
Итоговая длительность - 5 секунд
Периодичность - раз в 1 секунду

Наличие у актора свойства "PoisonDamage" также автоматически устанавливает "DamageType" как "Poison".
Из 5-ого примера видно что PoisonDamage практически не имеет никакой корреляции со значением "value" ЕСЛИ отсутствует значение "duration" и в этом случае действует только на игрока.

ЭДИТ:
Как вычислить значение PoisonDamage согласно желаемому результату:
Скрытый текст:

Допустим мы хотим задать значения PoisonDamage v,d,p так, чтобы нанеслось 100 итогового урона (tD) за 20 сек (tT) с (p) в 5 тиков.
Вычисляем значения v и d:

{d = tT ((20)*35 tics)/p (5 tics)
{v = tD (100)/d

{d = 700/5 = 140
{v = 100/140 = 0,714285

К сожалению дробные значения не принимаются, поэтому в этом случае придётся изменить периодичность если не хочется жертвовать общими значениями урона и длительности. Тогда возьмём минимально допустимое значение v - единицу:

{tD (100) = v(1)*d
{tT (700 tics) = d*p

{d = 100
{p = 7

Значит по прошествии 20 сек 100 итогового урона будет нанесено по 1 с периодом в 7 тиков при PoisonDamage 1,100,7

1 9 1
alekv
- Colonel -
Next rank: = Colonel = after 272 pointsМодератор форума
4168

Doom Rate: 1.87

Posts quality: +949
Ссылка на пост №3467 Отправлено: 25.08.18 00:39:46
nailzx128:
Попробовал всё что ты предложил. Не помогло(

Держи, проверил, работает:
Скрытый текст:


#include "zcommon.acs"

script "missilecam" (void)
{
int but;
int MissileID = UniqueTID();
Thing_ChangeTID(0, MissileID);

//SetActivatorToTarget(0);
SetActivator(0, AAPTR_PLAYER1);
ChangeCamera(MissileID, 0, 0);
SetPlayerProperty(0, ON, PROP_Frozen);

while (GetActorProperty(MissileID, APROP_Health) > 0)
	{
	but = GetPlayerInput(-1, INPUT_BUTTONS);
	SetActorVelocity (MissileID, 0, 0, GetActorVelZ(MissileID), false, false);

	if(but == BT_ATTACK)
		{
		if(CheckActorState (MissileID, "Death") == true)
			{
			setactorstate(missileid,"death");
			SetPlayerProperty(0, off, PROP_Frozen);
			ChangeCamera(0, 0, 0);
			Terminate;
			}
		}

	if(but == BT_FORWARD)
		{
		SetActorVelocity (MissileID, GetActorVelX(MissileID), -5.0, GetActorVelZ(MissileID), false, false);
		PrintBold(s:"FORWARD");
		}
	if(but == BT_BACK)
		{
		SetActorVelocity (MissileID, GetActorVelX(MissileID), 5.0, GetActorVelZ(MissileID), false, false);
		PrintBold(s:"BACK");
		}

	if(but == BT_MOVELEFT)
		{
		SetActorVelocity (MissileID, 5.0, GetActorVelY(MissileID), GetActorVelZ(MissileID), false, false);
		PrintBold(s:"left");
		}
	if(but == BT_MOVERIGHT)
		{
		SetActorVelocity (MissileID, -5.0, GetActorVelY(MissileID), GetActorVelZ(MissileID), false, false);
		PrintBold(s:"right");
		}
	Delay(1);
	}
}


Стрейф влево, подвинет влево, вправо - вправо.
Только тут просто как бы ходить будет снаряд.. настрой как тебе надо что бы летал.

Рейтинг сообщения: +1, отметил(и): Void Weaver
1 3 1
nailzx128
- Lance Corporal -
Next rank: = Lance Corporal = after 24 points
136

Doom Rate: 1.43

Posts quality: +97
Ссылка на пост №3468 Отправлено: 25.08.18 10:12:54
alekv:
Стрейф влево, подвинет влево, вправо - вправо.
Только тут просто как бы ходить будет снаряд.. настрой как тебе надо что бы летал.

Отлично! Спасибо! Ещё один вопрос. Как сделать так, что бы снарядом нельзя было управлять после его смерти? А то моим снарядом можно ещё управлять, пока он взрывается(смерть снаряда - многократный спаун взрывов). И да. Не работает кнопка самоуничтожения...опять :ha:
alekv
- Colonel -
Next rank: = Colonel = after 272 pointsМодератор форума
4168

Doom Rate: 1.87

Posts quality: +949
Ссылка на пост №3469 Отправлено: 25.08.18 10:44:27
nailzx128:
И да. Не работает кнопка самоуничтожения...опять

Я не знаю что ты там пишешь в коде у себя, я не экстрасенс. То что я тебе скинул там все работает и управление и "самоуничтожение" по кнопке атаки.

nailzx128:
Как сделать так, что бы снарядом нельзя было управлять после его смерти?

Если надо забирать управление когда снаряд ударился об стену\актера, то можно как-то так в декорейте в стейте смерти прописать
death:
TNT1 A 0 {
   ACS_NamedTerminate("missilecam", 0); // завершит скрипт 
   ACS_NamedExecute("ChangeCam", 0); //там пропиши смену камеры и разморозку ГГ.
   }

Это кажется самый простой вариант.

Рейтинг сообщения: +1, отметил(и): Void Weaver
1 3 1
nailzx128
- Lance Corporal -
Next rank: = Lance Corporal = after 24 points
136

Doom Rate: 1.43

Posts quality: +97
Ссылка на пост №3470 Отправлено: 25.08.18 14:25:48
Огромное спасибо, alekv! Появился ещё один вопрос. Как реализовать поворот снаряда? Я попробовал через ThrustThing, но это работает очень странно. Я даже не знаю как пояснить. Сторона поворота кардинально меняется, в зависимости положения игрока на карте.
script "missilecam" (void)
{
int but;
int MissileID = UniqueTID();
Thing_ChangeTID(0, MissileID);
SetActivator(0, AAPTR_PLAYER1);
ChangeCamera(MissileID, 0, 0);
SetPlayerProperty(0, ON, PROP_Frozen);

while (GetActorProperty(MissileID, APROP_Health) > 0)
	{
	but = GetPlayerInput(-1, INPUT_BUTTONS);
	if(but == BT_FORWARD)
		{
		setactorpitch (MissileID, getactorpitch (missileid)  +0.02);
		thrustthingz(MissileID,-4,0,-5);
		}
	if(but == BT_BACK)
		{
		setactorpitch (MissileID, getactorpitch (missileid)  -0.02);
		thrustthingz(MissileID,+4,0,+5);
		}

	if(but == BT_MOVELEFT)
		{
		setactorangle (MissileID, getactorangle (missileid) +0.02);
		ThrustThing(-15, -15, 0, MissileID);
		}
	if(but == BT_MOVERIGHT)
		{
		setactorangle (MissileID, getactorangle (missileid) -0.02);
		ThrustThing(+15, +15, 0, MissileID);
		}
	Delay(1);
	}
}
MyNameIs
= 1st Lieutenant =
Next rank: - Captain - after 36 points
2054

Doom Rate: 2.04

Posts quality: +893
Ссылка на пост №3471 Отправлено: 25.08.18 14:41:18
а ацсом можно узнать наименьшее/наибольшее число из списка чисел?
если список состоит из переменных, например

в принципе, можно каждое проверять через if-else, но это говнокодом попахивает, наверняка есть нормальный способ
1 1 1
alekv
- Colonel -
Next rank: = Colonel = after 272 pointsМодератор форума
4168

Doom Rate: 1.87

Posts quality: +949
Ссылка на пост №3472 Отправлено: 25.08.18 14:46:44
nailzx128:
Как реализовать поворот снаряда?

я не понимаю какой поворот нужен? У тебя же снаряд и так вертится благодаря setactorangle (....); и setactorpitch (....);
зачем тебе еще и thrustthing?

1 3 1
nailzx128
- Lance Corporal -
Next rank: = Lance Corporal = after 24 points
136

Doom Rate: 1.43

Posts quality: +97
Ссылка на пост №3473 Отправлено: 25.08.18 15:12:47
Благодаря setactorangle (....); и setactorpitch (....); я реализовал поворот только камеры, но не самого снаряда. Понимаешь, чего я хочу добиться? Что бы поворачивалась не только камера, но и снаряд вместе с ней.
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +808
Ссылка на пост №3474 Отправлено: 25.08.18 18:54:48
Можно ли на декоре прописать стэйт "блока" урона? Т. е. как прописать чтобы моб с некоторым шансом игнорил весь входящий урон при попадании в него снаряда или мили-атаки?
Офк, есть ф-ции A_(Un)SetInvulnerable и A_ChangeFlag, но я хз как их прописать чтобы они выполнялись ДО калькуляции получения урона. Или такая проверка осуществима только скриптами?
1 9 1
Герр Смертоносец
- Warrant Officer -
Next rank: = Warrant Officer = after 97 points
1043

Doom Rate: 1.38

Posts quality: +854
Ссылка на пост №3475 Отправлено: 25.08.18 23:10:53
Void Weaver
Не понял задачи. Если надо, чтобы моб тупо с некоторым шансом включал полную неуязвимость, то просто включай Invulnerable-флаги по рандомным джампам. А вот если надо, чтобы моб игнорил входящий урон при неких условиях - тут надо конкретизировать, при каких именно.
5
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +808
Ссылка на пост №3476 Отправлено: 25.08.18 23:44:25
Герр Смертоносец:
А вот если надо, чтобы моб игнорил входящий урон при неких условиях - тут надо конкретизировать, при каких именно.
Зыс ван. Условие тривиальное - при столкновении моба с чьим-то кулаком или маслиной с Х% шансом входит в кастом стэйт и игнорит текущий входящий урон. Со снарядами у меня таки пришла мысля типа прописать какой-нибудь чек акторов в предельно малом радиусе, и при обнаружении в оном миссайлей прыгать в стэйт включающий бога. А вот как быть с мили - хз.

Я знаю что механика эвэйда реализована в моде Aetherius, но там, емнип, это запилено на скрипте.

З. Ы.
Сссука, уже в который раз мне пердак рвёт от того что обе CheckProximity только по акторклассу пашут.
1 9 1
Герр Смертоносец
- Warrant Officer -
Next rank: = Warrant Officer = after 97 points
1043

Doom Rate: 1.38

Posts quality: +854
Ссылка на пост №3477 Отправлено: 26.08.18 00:30:07
Void Weaver:

Зыс ван. Условие тривиальное - при столкновении моба с чьим-то кулаком или маслиной с Х% шансом входит в кастом стэйт и игнорит текущий входящий урон. Со снарядами у меня таки пришла мысля типа прописать какой-нибудь чек акторов в радиусе, и при обнаружении в оном миссайлей прыгать в стэйт включающий бога. А вот как быть с мили - хз.

Т.е. задача в визуализации блока.
Очевидно, что в узерваре должно сохраняться текущее здоровье монстра. При попадании в Pain/Death с некими шансами срабатывает скрипт, который возвращает ему здоровье взад и ведёт на стейт с анимацией блока.

Рейтинг сообщения: +1, отметил(и): Void Weaver
5
Shadowman
UAC General
Next rank: Unavailable after 0 points
8389

Doom Rate: 2.08

Posts quality: +1986
Ссылка на пост №3478 Отправлено: 26.08.18 17:51:26
Void Weaver:
PoisonDamage value[, duration[, period]]
value: Значение урона, наносимого каждый раз по прошествии количества тиков заданных в "period".
duration: Значение (в у. е.) задающее общее количество вызовов урона. Т. е. отвечает за то, сколько раз в итоге яд стукнет.
period: Количество тиков между вызовами ядовитого урона. Дефолтное значение 0 означает вызов раз в секунду, т. е. period(0) = period(35).

Все это здорово, но под такой яд нельзя соорудить противоядие (используемый айтем вроде бутылки здоровья, только снимает эффект яда). Также не совсем понятно, можно ли настроить в этом случае "зеленую ауру" на экран при отравлении.
1 7 2
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +808
Ссылка на пост №3479 Отправлено: 26.08.18 21:49:42
Герр Смертоносец:
Очевидно, что в узерваре должно сохраняться текущее здоровье монстра. При попадании в Pain/Death с некими шансами срабатывает скрипт, который возвращает ему здоровье взад и ведёт на стейт с анимацией блока.
Ну как вариант, правда не понятно когда(где) эта конструкция должна проверяться\выполняться, ибо тогда придётся прописывать этот чек в каждый кадр моба - а это писец какой гигантский код выйдет. Или я заблуждаюсь?

Shadowman:
Void Weaver:
PoisonDamage value[, duration[, period]]
value: Значение урона, наносимого каждый раз по прошествии количества тиков заданных в "period".
duration: Значение (в у. е.) задающее общее количество вызовов урона. Т. е. отвечает за то, сколько раз в итоге яд стукнет.
period: Количество тиков между вызовами ядовитого урона. Дефолтное значение 0 означает вызов раз в секунду, т. е. period(0) = period(35).

Все это здорово, но под такой яд нельзя соорудить противоядие (используемый айтем вроде бутылки здоровья, только снимает эффект яда). Также не совсем понятно, можно ли настроить в этом случае "зеленую ауру" на экран при отравлении.
У меня тоже нет мыслей как прервать действие PoisonDamage яда. Возможно яд на А_Дэмэдж ф-циях прервать куда реальнее. Через какой-нибудь хитрый ДжампИфИнвентори с вызовом скрипта-прерывателя.
К сожалению, по неизвестным причинам "зелёный экран" в этом случае действительно не пашет. Но, еяпп, то его можно задать через самого игрока свойством Player.DamageScreenColor.
1 9 1
Герр Смертоносец
- Warrant Officer -
Next rank: = Warrant Officer = after 97 points
1043

Doom Rate: 1.38

Posts quality: +854
Ссылка на пост №3480 Отправлено: 27.08.18 01:06:17
Void Weaver:
Ну как вариант, правда не понятно когда(где) эта конструкция должна проверяться\выполняться, ибо тогда придётся прописывать этот чек в каждый кадр моба - а это писец какой гигантский код выйдет. Или я заблуждаюсь?

PainChance надо прописать 256.
Есть узервар user_currenthealth. По умолчанию он должен быть равен максимальному здоровью моба. Он должен тупо должен время от времени сверяться с текущим уровнем здоровья: A_SetUserVar("user_currenthealth",health). Насколько часто это делать - вопрос философский. Я считаю, что достаточно одной сверки на выходе из стейта Pain, но для надежности можно делать это при каждом проходе стейта See.
Любой факт нанесения урона переключает моба либо в Pain, либо в Death. В случае срабатывания скрипта он мгновенно будет переведён на стейт блокировки с возвратом того количества здоровья, которое было у него при предыдущей проверке. Здесь даже ACS не нужен - просто A_SetHealth(user_currenthealth) и всё. Получится, что урона по монстру как будто бы и не было, хотя на самом деле был.
5
Страница 174 из 200Перейти наверх Пред.  1, 2, 3 ... 173, 174, 175 ... 198, 199, 200  След.
   Список разделов - Флуд и устаревшие темы - Тема для новичков. Вопросы по маппингу/моддингу - любые!