Перейти к основному содержимому
The project's repository is archived as part of the GitHub Archive Program. RogueLibs' code and the documentation will no longer be updated.

Создаём кастомный эффект

Класс CustomEffect

Чтобы сделать кастомный эффект, создайте класс наследующий от CustomEffect:

MyCustomEffect.cs
public class MyCustomEffect : CustomEffect
{
/* ... */
}

Вам нужно реализовать 5 методов:

MyCustomEffect.cs
public class MyCustomEffect : CustomEffect
{
public override int GetEffectTime() { /* ... */ }
public override int GetEffectHate() { /* ... */ }
public override void OnAdded() { /* ... */ }
public override void OnRemoved() { /* ... */ }
public override void OnUpdated(EffectUpdatedArgs e) { /* ... */ }
}

GetEffectTime определяет время эффекта по умолчанию. Особенности типа "Продолжительные статусные эффекты", "Продолжительные статусные эффекты +" и "Короткие статусные эффекты" применяются после вызова этого метода.

GetEffectHate определяет количество ненависти, которое персонажи получат по отношению к тому, кто нанёс на них этот эффект, по умолчанию. Обычно, это 5 для отрицательных эффектов, и 0 для положительных.

предупреждение

GetEffectTime и GetEffectHate вызываются на частично инициализированных хуках, а то есть владелец эффекта может и не иметь эффекта на самом деле. Не инициализируйте какие-либо переменные в этих методах.

OnAdded вызывается когда эффект нанесён на персонажа, и OnRemoved вызывается когда эффект убран с персонажа.

OnUpdated работает как Update в Unity, но с выставляемым интервалом (по умолчанию, 1 секунда):

    public void OnUpdated(EffectUpdatedArgs e)
{
e.UpdateDelay = 0.5f; // 2 обновления в секунду
/* ... */
CurrentTime--;
}
к сведению

Ответственность за уменьшение CurrentTime лежит на вас. Так что, не забывайте это делать.

Все классы кастомных эффектов должны иметь атрибут EffectParameters. Вы можете указать должен ли эффект сниматься при смерти, нокауте или между уровнями. По умолчанию, RemoveOnDeath (убирать только при смерти).

[EffectParameters(EffectLimitations.RemoveOnDeath | EffectLimitations.RemoveOnKnockOut)]
public class MyCustomEffect : CustomEffect
{
/* ... */
}

Инициализация

Просто вызовите метод CreateCustomEffect с типом своего эффекта в качестве параметра:

MyCustomEffect.cs
public class MyCustomEffect : CustomEffect
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomEffect<MyCustomEffect>();
}
}
примечание

Смотрите подробнее об атрибуте RLSetup здесь.

Вы можете выставить название и описание своего эффекта с помощью методов WithName и WithDescription:

MyCustomEffect.cs
public class MyCustomEffect : CustomEffect
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomEffect<MyCustomEffect>()
.WithName(new CustomNameInfo("My Custom Effect"))
.WithDescription(new CustomNameInfo("My Custom Effect is very cool and does a lot of great stuff"));
}
}
к сведению

Примеры

Простой эффект, дающий временный бонус к некоторым характеристикам. Вы можете посмотреть реализацию предмета Адреналин, дающего этот эффект, в Используемые предметы: Примеры.

namespace RogueLibsCore.Test
{
[EffectParameters(EffectLimitations.RemoveOnDeath | EffectLimitations.RemoveOnKnockOut)]
public class Adrenaline : CustomEffect
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomEffect<Adrenaline>()
.WithName(new CustomNameInfo("Adrenaline"))
.WithDescription(new CustomNameInfo("Gives you a ton of boosts for a short period of time."));
}

public override int GetEffectTime() => 15;
public override int GetEffectHate() => 0;
public override void OnAdded()
{
Owner.ChangeHealth(20);
Owner.SetStrength(Owner.strengthStatMod + 2);
Owner.SetEndurance(Owner.enduranceStatMod + 2);
Owner.SetAccuracy(Owner.accuracyStatMod - 1);
Owner.SetSpeed(Owner.speedStatMod + 2);
Owner.critChance += 30;
}
public override void OnRemoved()
{
Owner.SetStrength(Owner.strengthStatMod - 2);
Owner.SetEndurance(Owner.enduranceStatMod - 2);
Owner.SetAccuracy(Owner.accuracyStatMod + 1);
Owner.SetSpeed(Owner.speedStatMod - 2);
Owner.critChance -= 30;
}
public override void OnUpdated(EffectUpdatedArgs e)
{
e.UpdateDelay = 1f;
CurrentTime--;
}
}
}

The project's repository is archived as part of the GitHub Archive Program. RogueLibs' code and the documentation will no longer be updated.