Эта система нужна для того что бы легко создавать и использовать у себя в сборке различные эффекты(бафы/дебафы/различные пассивные эффекты).
В мода гта как и в других играх часто используются различные эффекты, но реализовываются они обычно
непосредственно в самих функциях(там где это видел я), на пример когда вы ложитесь в лечебную койку или жрете бургер
вам постепенно восстанавливается здоровье, не смотря на то что это один и тот же эффект реализуются они в разных местах дублируя друг друга.
Этот скрипт поможет вам реализовать эффект один раз и использовать его повсеместно по всей сборке простым вызовом функции.
По умолчанию в скрипте присутствуют конфиги, с помощью которых можно кастомизировать эффект.
int Duration - Время действия эффекта
uint UpdateRate - Частота обновления
bool IsDublicable - Можно ли наложить несколько копий эффекта(не работает вместе с IsUpdatable)
bool IsUpdatable - Можно ли обновить эффект при повторном использовании(не работает вместе с IsDublicable )
bool IsCancelable - Может ли игрок отменить его
Сам класс эффекта должен реализовать три абстрактные функции
public abstract bool Set(Player player); - Вызывается при наложении эффекта
public abstract bool Update(Player player); - Вызывается при работе эффекта
public abstract void End(Player player); - Вызывается при завершении работы эффекта
Дополнительно, если Duration равен нулю, то эффект работает бесконечно, пока не отменят из вне, а если -1 то эффект накладывается но не обновляется
так можно реализовывать эффекты которые выполнять определенное действие единожды, и отменятся из вне при определенных условия, на пример
у вас есть зеленая зона, при входе в ЗЗ вы просто накладываете неуязвимость, а при выходе отменяете его.
Пример реализации эффекта восстановления хп
Исходный код: EffectManager
P.S. Система не тестировалась, так что могут быть проблемы, если кто что то заменить - пишите в теме(если она кому-то вообще будет нужна)
В мода гта как и в других играх часто используются различные эффекты, но реализовываются они обычно
непосредственно в самих функциях(там где это видел я), на пример когда вы ложитесь в лечебную койку или жрете бургер
вам постепенно восстанавливается здоровье, не смотря на то что это один и тот же эффект реализуются они в разных местах дублируя друг друга.
Этот скрипт поможет вам реализовать эффект один раз и использовать его повсеместно по всей сборке простым вызовом функции.
По умолчанию в скрипте присутствуют конфиги, с помощью которых можно кастомизировать эффект.
int Duration - Время действия эффекта
uint UpdateRate - Частота обновления
bool IsDublicable - Можно ли наложить несколько копий эффекта(не работает вместе с IsUpdatable)
bool IsUpdatable - Можно ли обновить эффект при повторном использовании(не работает вместе с IsDublicable )
bool IsCancelable - Может ли игрок отменить его
Сам класс эффекта должен реализовать три абстрактные функции
public abstract bool Set(Player player); - Вызывается при наложении эффекта
public abstract bool Update(Player player); - Вызывается при работе эффекта
public abstract void End(Player player); - Вызывается при завершении работы эффекта
Дополнительно, если Duration равен нулю, то эффект работает бесконечно, пока не отменят из вне, а если -1 то эффект накладывается но не обновляется
так можно реализовывать эффекты которые выполнять определенное действие единожды, и отменятся из вне при определенных условия, на пример
у вас есть зеленая зона, при входе в ЗЗ вы просто накладываете неуязвимость, а при выходе отменяете его.
Пример реализации эффекта восстановления хп
C#:
namespace HardLife.Core.Effects
{
//Duration 10000 означает что эффект будет длится 10 секунд
//IsDublicable false значит что его нельзя наложить несколько раз
//UpdateRate 1000 значит что функция Update будет вызыватся каждую секунду на протяжении Duration(10 сек)
[Effect(Id = 0, Name = "Heal", Duration = 10000, UpdateRate = 1000, IsDublicable = false)]
public class FoodHealEffect : Effect
{
//Вызывается при наложении эффекта
//возвращает bool, наложение эффекта можно отменить вернув false
//так как на пример нету смысла накладывать эффект восстановления хп
//если хп полное
public override bool Set(Player player)
{
Console.WriteLine($"Sets effect: {Name}");
if(player.Health >= 100) return false;
return true;
}
//Вызывается при завершении работы эффекта
public override void End(Player player)
{
Console.WriteLine($"End effect: {Name}");
}
//Если вернуть false, то еффект прекратит действовать
//в данной функции false возвращается когда hp игрока полное
public override bool Update(Player player)
{
bool status = true;
if (player.Health + 3 > 100) { player.Health = 100; status = false; }
else player.Health += 3;
Console.WriteLine($"Name {player.Name}, Heal: {player.Health}");
return status;
}
}
}
Исходный код: EffectManager
P.S. Система не тестировалась, так что могут быть проблемы, если кто что то заменить - пишите в теме(если она кому-то вообще будет нужна)