Нет. В свойствах эффекта есть строковый параметр, в котором задаётся время старта эффекта и окончания генерации частиц.Я так понимаю, что включает и выключает его движок по названию в имени NIGHT?
instance GROUNDFOGNIGHT_OUTDOOR_LOW(C_PARTICLEFX)
{
...
timestartend_s = "23 9";
};
// необязательный, вы можете установить допустимый временной период, в котором этот pfx должен быть отрисован (например, "8 22": должен быть отрисован с 08 до 22 часов")
var string timeStartEnd_S;
Самый простой путь через айвар. Свободный индекс айваров с 89 по 99.Вопрос, возможно глупый, но всё же попробую сформулировать:
есть ли возможность в чистых скриптах, без расширителей (в том числе и Юниона) задать одну переменную типа var int, которая будет через скрипты изменяться индивидуально для каждого отдельного персонажа?
Нужно, чтобы эта переменная отсчитывала свой собственный таймер для каждого отдельного персонажа, если эффект активировался сразу на нескольких NPC.
Что-то вроде константы AI, например, как const int AIV_VictoryXPGiven (конкретно эта определяет, получен ли опыт за данного NPC),
но с возможностью изменяться в диапазоне от 0 до 10.
Надеюсь, более-менее понятно объяснил)
const int AIV_RageStateTime = 89;
func void ZS_Rage () {
if (self.aivar[AIV_RageStateTime] == 0) {
// ------ сброс состояния охраны ------
self.aivar[AIV_Guardpassage_Status] = GP_NONE;
Npc_SetRefuseTalk(self, 0);
// ------ Temp_Att (отношение) "сброс" ------
Npc_SetTempAttitude(self, Npc_GetPermAttitude(self, hero));
// ------ Сброс оверлеев ------
B_StopLookAt(self);
AI_StopPointAt(self);
Npc_ClearAIQueue(self);
if (!Npc_HasBodyFlag(self, BS_FLAG_INTERRUPTABLE)) {
AI_StandUp(self);
} else {
AI_StandUpQuick(self);
};
B_ClearPerceptions(self);
Wld_PlayEffect("spellFX_Rage_TARGET", self, self, 0, 0, 0, 0);
if (self.guild < GIL_SEPERATOR_HUM) {
AI_Wait(self, 0.5);
AI_TurnToNpc(self, hero); // Примечание: заклинание использует только Hero.
AI_Wait(self, 0.5);
AI_PlayAni(self, "T_GREETNOV");
AI_Wait(self, 0.3);
};
};
};
func int ZS_Rage_Loop () {
// Выход из ZS
if (self.aivar[AIV_RageStateTime] >= SPL_Victims_Rage) {
Npc_ClearAIQueue(self);
return LOOP_END;
};
self.aivar[AIV_RageStateTime] = self.aivar[AIV_RageStateTime]+1;
Npc_PerceiveAll(self);
if (Wld_DetectNpcEx(self, -1, NOFUNC, -1, 0) == TRUE) {
if (self.guild < GIL_SEPERATOR_HUM) {
var int rnd; rnd = Hlp_Random (100);
if (rnd <= 40) {
Snd_Play3D(self, "SVM_1_BERZERK");
}
else if (rnd <= 80) {
Snd_Play3D(self, "SVM_2_BERZERK");
}
else if (rnd <= 99) {
Snd_Play3D(self, "SVM_3_BERZERK");
};
};
Npc_SetTarget(self, other);
if (other.guild < GIL_SEPERATOR_HUM) {
B_Attack(self, other, AR_NONE, 0);
} else {
AI_StartState(self, ZS_MM_Attack, 0, "");
};
};
// никогда не достигается
return LOOP_CONTINUE;
};
func void ZS_Rage_End() {
AI_StandUp(self);
if (self.guild < GIL_SEPERATOR_HUM) {
AI_Dodge(self);
AI_Dodge(self);
AI_PlayAni(self, "T_SEARCH");
B_Say_Overlay(self, self, "$WHATWASTHAT");
AI_RemoveWeapon(self);
AI_Wait(self, 1);
AI_PlayAni(self, "T_DONTKNOW");
AI_Wait(self, 0.5);
};
if (self.attribute[ATR_HITPOINTS] < (self.attribute[ATR_HITPOINTS_MAX]/2))
{
AI_StartState(self, ZS_HealSelf, 0, "");
return;
};
};
Она не в активном блоке препроцессора расположена. Не комиилится в ехешник и, соответственно, не вызывается.Player_Victim_Is_Immortal
Через проекцию 3D точки на вьюпорт. МетодДрузья, всем привет. Какая функция отвечает за размещение 3д текста, ака имя персонажа над его головой, и вообще моб объекты? И по какой формуле все это просчитывается?
zCCamera::Project
. Игра выводит текст в точке, когда значение глубины проекции положительно, то бишь находится перед камерой, а не за ней.Переменная нужна, но трудность здесь не в наличии самой переменной, а в том, как она будет изменяться. Вернее - ГДЕ. Мне видится пока только один путь - это введение во ВСЕ состояния ИИ, в которых может пребывать непись, контроль и изменение этой переменной. Но это тот ещё геморр.Скорее всего для этого мне и нужна переменная, которая будет считать тики, но считать их отдельно для каждого персонажа.
Использование айвара вида self.aivar[AIV_...] почему-то не позволяет мне остановить эффект после достижения определенного значения ... либо не хватает соображалки для реализации)
Она не в активном блоке препроцессора расположена. Не комиилится в ехешник и, соответственно, не вызывается.
Эффективнее назначить аивару любое угодное значение и уменьшать, пока значение не будет равно нулю.Ну айвар же надо обнулять, когда его значение стало больше твоего
Ну блин, если тебя интересует алгоритм вызова каждой, то это довольно трудоёмко . Максимум могу потом сказать существует ли реализация вызова в принципе.А что по другим?
Согласен. Но камрада, как я понимаю, интересует нанесение растянутого во времени повреждения. И тут большее значение имеет не время нанесения этого урона, а его величина. Понятно, что в разных состояниях этот урон будет наноситься с разной скоростью. Частично, это можно учесть и скомпенсировать. Но идеального решения не выйдет.@ElderGamer, так у состояний ещё время отклика разное.
// Вызвать эту функцию из любого удобного места программы
func void Test()
{
var C_Trigger trigger;
// Создать триггер на функцию TriggerTest с
// задержкой 1000мс и привязкой в self персонажа hero
trigger = AI_StartTriggerScriptEx("TriggerTest", 1000, hero, null, null);
trigger.AIVariables[0] = 15; // Предположим это будет число повторов триггера
trigger.AIVariables[1] = 5; // Сколько HP будем отнимать у hero каждую секунду
};
// Тело триггера
func int TriggerTest()
{
// Завершаем цикл, если количество доступных повторений равно нулю
if (SelfTrigger.AIVariables[0] <= 0)
{
return Loop_end;
};
SelfTrigger.Delay -= 20; // Ускоряем цикл на 20мс каждый последующий вызов функции
SelfTrigger.AIVariables[0] -= 1; // Понижаем счетчик повторов
Self.Attribute[ATR_HITPOINTS] -= SelfTrigger.AIVariables[1]; // Отнимаем здоровье привязанного к триггеру Npc
// Продолжаем цикл
return Loop_continue;
};