Автор | Сообщение |
FoxPlays = Sergeant Major =
 | 644 |
 Doom Rate: 2.14 Posts quality: +370 |
Отправлено: 31.07.19 19:22:12 | | | 1. Можно ли временно сделать чтобы игрок не мог возрождаться? Есть что-то по типу SetPlayerProperty?
Нужно для ACS кода
2. Как сделать чтобы Handler в ZScript срабатывал только один раз после начала уровня?
3. Можно ли string использовать между ACS и ZScript? Например получил нужное содержание для string и с ним потом производить манипуляции в Zscript, и после готовый результат вывести в ACS?
Ещё пример:
| ACS:
str playerweapon;
while (PlayerNumber() >= 0)
{
SetActivatorToTarget(new_tid);
playerweapon = GetWeapon();
Delay(1);
}
Zscript:
str playerweapon_t;
playerweapon _t = GetTag(playerweapon);
ACS:
HudMessage( s:playerweapon_t ); |
( вот так я и пытаюсь получить в ACS тег из оружия ) |
Рейтинг сообщения: +1, отметил(и): YURA_111 |
|
| |
YURA_111 UAC Sergeant Major
 | 768 |
 Doom Rate: 1.98 Posts quality: +136 |
Отправлено: 31.07.19 20:38:13 | | | FoxPlays пишет: | Можно ли временно сделать чтобы игрок не мог возрождаться? |
Ох как надо и очень желательно на Zscript | |
|
| |
Void Weaver = Captain =
 | 2496 |
 Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 01.08.19 01:08:32 | | | YURA_111 пишет: | FoxPlays пишет: | Можно ли временно сделать чтобы игрок не мог возрождаться? |
Ох как надо и очень желательно на Zscript | FoxPlays, YURA_111, ребят за АЦС\ЗСкрипт не скажу, но есть один забавный трюк по безвозвратному уничтожению игрока без возможности юзать команду "resurrect"... на декоре. Вероятно это не то что вам нужно, но вдруг пригодится, да и адаптировать механизм под скрипты думаю будет несложно. Дайте игроку вот эту штуку:Actor SelfFreezer : CustomInventory
{
+INVENTORY.ALWAYSPICKUP
Inventory.MaxAmount 0
States
{
Pickup:
TNT1 A 0 A_Die //Убиваем игрока. Опционально, главное чтобы в момент смерти он немедленно выполнил следующие действия:
TNT1 A 0 Thing_Stop(0) //или A_Stop //Обязательно прерываем импульс - это важное условие для уничтожения тела во избежание появления призрака игрока!
TNT1 A 0 A_FreezeDeathChunks //А теперь вызываем эту функцию которая мгновенно уничтожит труп игрока, точнее превратит его в единственный АйсЧанк. Команда resurrect не сработает если нет трупа!
Stop
}
}
//Такой вот ракетой например
Actor FreezerRocket : Rocket replaces Rocket
{
States
{
Death:
TNT1 A 0 A_RadiusGive("SelfFreezer",256,RGF_PLAYERS|RGF_MONSTERS)
//TNT1 A 0 A_GiveToTarget("SelfFreezer")
Goto Super::Death
}
}
=============
Выручайте, господа. Стоило только взяться за АЦС как опять заблудился в трёх соснах.
Этот скрипт вызывается в пэйн стэйте неопределённого актора с 3к хп. Проблема в том что он всё время печатает зелёным цветом вместо того чтобы выводить цвета в зависимости от текущих хп:Script "USSRShieldHealth" (void)
{
int CurrentHp = GetActorProperty(0,APROP_Health);
int SpawnHp = GetActorProperty(0,APROP_SpawnHealth);
If(CurrentHp<GetActorProperty(0,APROP_SpawnHealth*0.1))
{Log(s:"\cg", d:CurrentHp);} //КРАСНЫЙ
Else If(CurrentHp<GetActorProperty(0,APROP_SpawnHealth*0.25)&&CurrentHp>=GetActorProperty(0,APROP_SpawnHealth*0.1))
{Log(s:"\cx", d:CurrentHp);} //ОГНЕННЫЙ
Else If(CurrentHp<GetActorProperty(0,APROP_SpawnHealth*0.33)&&CurrentHp>=GetActorProperty(0,APROP_SpawnHealth*0.25))
{Log(s:"\ci", d:CurrentHp);} //ОРАНЖЕВЫЙ
Else If(CurrentHp<GetActorProperty(0,APROP_SpawnHealth*0.5)&&CurrentHp>=GetActorProperty(0,APROP_SpawnHealth*0.33))
{Log(s:"\cz", d:CurrentHp);} //ТЕАЛ
Else If(CurrentHp<GetActorProperty(0,APROP_SpawnHealth*0.75)&&CurrentHp>=GetActorProperty(0,APROP_SpawnHealth*0.5))
{Log(s:"\cq", d:CurrentHp);} //ТЁМНО-ЗЕЛЁНЫЙ
Else //If(CurrentHp<GetActorProperty(0,APROP_SpawnHealth)&&CurrentHp>=GetActorProperty(0,APROP_SpawnHealth*0.75))
{Log(s:"\cd", d:CurrentHp);} //ЗЕЛЁНЫЙ
} Пробовал выстраивать конструкцию по этому образцу но без толку. Ещё пытался выстроить через case но тупо не компилится.
И ещё одна странность: если вынести множитель за скобку ИЗ функции | If(CurrentHp<GetActorProperty(0,APROP_SpawnHealth)*0.1) | то наоборот печатает всегда красным. х_х | |
|
1 |
9 |
1 |
 |
|
| |
YURA_111 UAC Sergeant Major
 | 768 |
 Doom Rate: 1.98 Posts quality: +136 |
Отправлено: 01.08.19 06:52:13 | | | Void Weaver пишет: | Команда resurrect не сработает если нет трупа! |
Вот скажи мне - кто тебя так жестоко обманул??? Отсутствие трупа никак не связано с перерождением (респавном). | |
|
| |
Void Weaver = Captain =
 | 2496 |
 Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 01.08.19 06:58:20 | | | Простите, но речь шла о команде ресуррект (о чём есть пруф от разрабов), у меня всё работает как часы. Против естественного респа по команде use это конечно не спасает. Поэтому заранее оговорил: Void Weaver пишет: | Вероятно это не то что вам нужно |
Лучше бы с лог-скриптом подсказал.
Добавлено спустя 23 минуты 26 секунд:
Кстати вот так Мэтт предлагал отключать респаун в мульте:
override void DeathThink()
{
if(player)player.cmd.buttons&=~BT_USE;
super.DeathThink();
} | |
|
1 |
9 |
1 |
 |
|
| |
MyNameIs = 1st Lieutenant =
 | 2068 |
 Doom Rate: 2.03 Posts quality: +911 |
Отправлено: 01.08.19 08:42:26 | | | YURA_111 пишет: | Отсутствие трупа никак не связано с перерождением (респавном). |
но в вики пишет, что связано
| Note - cannot be used when the player is "broken apart" e.g. shattered to pieces after being frozen. |
| |
|
| |
YURA_111 UAC Sergeant Major
 | 768 |
 Doom Rate: 1.98 Posts quality: +136 |
Отправлено: 01.08.19 09:34:59 | | | MyNameIs пишет: | но в вики пишет, что связано
|
Я делаю мод ориентированный на мультиплеер. Единственное что действительно нельзя - так это ВОСКРЕСИТЬ игрока другим игроком, - что собственно логично если отсутствует труп. Но если вы просто хотите респавниться - то ничего и НИКОГДА не мешало...
Да и это легко проверяется - я просто на работе, иначе давно бы видео запилил... | |
|
| |
FoxPlays = Sergeant Major =
 | 644 |
 Doom Rate: 2.14 Posts quality: +370 |
Отправлено: 01.08.19 11:24:24 | | | Void Weaver пишет: | Против естественного респа по команде use это конечно не спасает. |
Прочитал это после многократных попыток
Мне нужно было чтобы отключилось возрождение на один уровень, на карте после смерти начинает идти катсцена. Ладно, попробую как-нибудь сделать без этой функции
Что-ж, у меня осталось два не решённых вопроса -
1. Как сделать чтобы Handler в ZScript срабатывал только один раз после начала уровня?
Скрипт -
| class MultiplayerMonstersHandler: EventHandler
{
override void WorldThingSpawned( WorldEvent e )
{
CVar mmonsters = CVar.FindCVar("scpack_nommonsters");
if ( multiplayer && e.Thing != NULL && e.Thing.bIsMonster && !( e.Thing.SpawnFlags & MTF_Single ) && mmonsters) {
if(mmonsters.GetInt())
{
e.Thing.ClearCounters();
e.Thing.Destroy();
}
}
}
} |
2. Можно ли string использовать между ACS и ZScript? Например получил нужное содержание для string и с ним потом производить манипуляции в Zscript, и после готовый результат вывести в ACS?
Ещё пример:
| ACS:
str playerweapon;
while (PlayerNumber() >= 0)
{
SetActivatorToTarget(new_tid);
playerweapon = GetWeapon();
Delay(1);
}
Zscript:
str playerweapon_t;
playerweapon _t = GetTag(playerweapon);
ACS:
HudMessage( s:playerweapon_t );
|
( вот так я и пытаюсь получить в ACS тег из оружия ) | |
|
| |
JSO x - 2nd Lieutenant -
 | 1366 |
 Doom Rate: 2.29 Posts quality: +744 |
Отправлено: 01.08.19 13:54:48 | | | FoxPlays пишет: | 1. Как сделать чтобы Handler в ZScript срабатывал только один раз после начала уровня? |
Несколько вариантов, в зависимости от того, что тебе нужно. Как понимаю, следующее: чтобы мультиплеерные монстры не спаунились только при загрузке уровня, то есть если они должны появляться каким-нибудь "Thing_Spawn", то они бы появлялись. Если это, то либо используй метод "WorldLoaded( WorldEvent e ) {}" и внутри перебирай всех акторов, либо, что здесь гораздо проще, в "WorldThingSpawned( WorldEvent e ) {}" припиши ещё проверку на "level.time == 0":
if ( multiplayer && !level.time && e.Thing && e.Thing.bIsMonster && !( e.Thing.SpawnFlags & MTF_Single ) ) {}
FoxPlays пишет: | Можно ли string использовать между ACS и ZScript? Например получил нужное содержание для string и с ним потом производить манипуляции в Zscript, и после готовый результат вывести в ACS? |
Напрямую невозможно: ACS_Execute() и все его производные, которые можно вызвать через ZScript, понимают в качестве параметров только числовые значения. "CallScript()", который можно использовать для обращения из ACS к ZScript/Decorate, также принимает только числовые значения. Как это обойти: во-первых, можно присваивать некую уже существующую строку типа тега сначала в одной среде, потом, встроенной функцией, брать в другой. Во-вторых, можно использовать только ZScript (там есть аж две-три разных функции вывода на экран: через StatusBar и через RenderOver-/Underlay. Правда, разбираться со взаимодействием сфер влияния (которые play, UI, data) будет долгим процессом, несмотря на явную простоту. В-третьих, на крайний и самый извращённый случай, можно разбивать на одной стороне символы на ASCII-код, посылать каждый по-отдельности, на другой -- собирать обратно в одно слово. |
|
|
2 |
8 |
1 |
 |
|
| |
FoxPlays = Sergeant Major =
 | 644 |
 Doom Rate: 2.14 Posts quality: +370 |
Отправлено: 01.08.19 14:49:46 | | | JSO x, спасибо!
Ещё вопрос - можно ли использовать FadeTo наоборот? | |
|
| |
Void Weaver = Captain =
 | 2496 |
 Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 01.08.19 16:58:00 | | | Во-первых, предлагаю РДЦ либо определить точные значения русских вариантов процессов respawn, resurrect, и внешний resurrect\revive, либо же тупо печатать оригинальное название процесса дабы пресечь любые возможные непонятки и затупы в терминологии между "возрождаться", "перерождаться", "воскрешаться" и "респауниться".
Во-вторых, таки совет Мэтта оказывается не решение а подсказка в какую сторону копать, но походу это самый верный способ ограничить respawn на зскрипте (отсюда и далее): | You can override PlayerPawn's DeathThink method and code in your custom death/revival game mechanics there. | Ссыль на соус активации respawn по команде use.
-------
Вопрос с АЦС уже подсказали - оказывается результат каждого выражения надо было делить на 65536 (>>16). |
|
|
1 |
9 |
1 |
 |
|
| |
YURA_111 UAC Sergeant Major
 | 768 |
 Doom Rate: 1.98 Posts quality: +136 |
Отправлено: 01.08.19 17:25:07 | | | Void Weaver пишет: | Во-первых, предлагаю РДЦ либо определить точные значения русских вариантов процессов respawn, resurrect, и внешний resurrect\revive, либо же тупо печатать оригинальное название процесса дабы пресечь любые возможные непонятки и затупы в терминологии между "возрождаться", "перерождаться", "воскрешаться" и "респауниться".
|
А что тут определяться то - с самого начала в Дум респавн\респоун\RESPAWN\перерождение означал перерождение в точке старта, будь то монстр или игрок с потерей всего набранного\накопленного в уровне и возвращение всех статов и инвентори по default...
Ну а воскрешение\RESURRECT появилось уже наверное со входом ZSCRIPT (если не считать чит Resurrect в консоли и ARCH-Vile-овские возможности)
Void Weaver пишет: | Кстати вот так Мэтт предлагал отключать респаун в мульте:
override void DeathThink()
{
if(player)player.cmd.buttons&=~BT_USE;
super.DeathThink();
} |
А можно к этому как то прикрутить инвентори итем, дабы в зависимости от количества этого самого итема можно было делать RESPAWN, т.е. например если игрок погибал на уровне уже 5 раз, то RESPAWN не срабатывал бы, но чтобы было допустимо воскрешение? | |
|
| |
Void Weaver = Captain =
 | 2496 |
 Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 01.08.19 17:43:40 | | | YURA_111
Ок, буду придерживаться твоей терминологии.
FoxPlays пишет: | Ещё вопрос - можно ли использовать FadeTo наоборот? | Это простите как "наоборот"? о_0 | |
|
1 |
9 |
1 |
 |
|
| |
FoxPlays = Sergeant Major =
 | 644 |
 Doom Rate: 2.14 Posts quality: +370 |
Отправлено: 01.08.19 17:48:54 | | | Void Weaver пишет: | Это простите как "наоборот"? о_0 |
Обычно FadeTo работает так - FadeTo (0, 0, 0, 0.5, 2.0) = затемнение экрана.
Как сделать чтобы от затемнённого экрана он светлел?
Уже решил! Просто не заметил существование - FadeRange
| FadeRange(0,0,0,1.0,0,0,0,0,4.0); |
| |
|
| |
Void Weaver = Captain =
 | 2496 |
 Doom Rate: 1.82 Posts quality: +808 |
Отправлено: 01.08.19 17:52:53 | | | 255*3, не?
-----
Ну тоже вариант. |
Рейтинг сообщения: +1, отметил(и): FoxPlays |
|
1 |
9 |
1 |
 |
|
| |
MyNameIs = 1st Lieutenant =
 | 2068 |
 Doom Rate: 2.03 Posts quality: +911 |
Отправлено: 01.08.19 18:25:19 | | | у FadeTo же есть amount. ставишь 0 - будет переход в прозрачно.
| FadeTo (0, 0, 0, 0.0, 2.0); |
|
Рейтинг сообщения: +1, отметил(и): FoxPlays |
|
| |
FoxPlays = Sergeant Major =
 | 644 |
 Doom Rate: 2.14 Posts quality: +370 |
Отправлено: 01.08.19 18:36:26 | | | MyNameIs, спасибо, но к сожалению это так не работает!  | |
|
| |
MyNameIs = 1st Lieutenant =
 | 2068 |
 Doom Rate: 2.03 Posts quality: +911 |
Отправлено: 01.08.19 19:07:50 | | | FoxPlays
ты что пытаешься высветлить? черный экран, залитый FadeTo?
или сразу пытаешься сделать переход в прозрачно, когда все и так прозрачно?
потому что вот это должно работать
script 666 ENTER
{
FadeTo (0, 0, 0, 1.0, 0.0);
Delay(20);
FadeTo (0, 0, 0, 0.0, 1.0);
} |
|
|
| |
FoxPlays = Sergeant Major =
 | 644 |
 Doom Rate: 2.14 Posts quality: +370 |
Отправлено: 01.08.19 19:11:04 | | | MyNameIs
Да, это работает, спасибо, но пожалуй воспользуюсь FadeRange(0,0,0,1.0,0,0,0,0,4.0) для большей компактности  | |
|
| |
JSO x - 2nd Lieutenant -
 | 1366 |
 Doom Rate: 2.29 Posts quality: +744 |
Отправлено: 01.08.19 20:28:46 | | | YURA_111 пишет: | А можно к этому как то прикрутить инвентори итем, дабы в зависимости от количества этого самого итема можно было делать RESPAWN, т.е. например если игрок погибал на уровне уже 5 раз, то RESPAWN не срабатывал бы, но чтобы было допустимо воскрешение? |
override void DeathThink() {
PlayerPawn playerActor = PlayerPawn( self );
if ( playerActor.player && multiplayer && ( playerActor.CountInv( "DeathItem" ) >= 5 ) )
playerActor.player.cmd.buttons &= ~BT_USE;
Super.DeathThink();
} |
|
|
2 |
8 |
1 |
 |
|
| |