Перезаряжаемые предметы
Делаем предметы перезаряжаемыми
Если хотите сделать перезаряжаемый предмет, воспользуйтесь интерфейсом IDoUpdate
:
public class MyRechargeableItem : CustomItem, IDoUpdate
{
/* ... */
}
Шаблоны
Вот парочка полезных шаблонов:
- Время восстановления
- Зарядка
Cooldown
представляет из с ебя количество секунд до полной перезарядки.
public float Cooldown { get; private set; }
public void Update() => Cooldown = Mathf.Max(Cooldown - Time.deltaTime, 0f);
С настраиваемой скоростью перезарядки:
public float RechargeSpeed = 1f;
public float Cooldown { get; private set; }
public void Update() => Cooldown = Mathf.Max(Cooldown - Time.deltaTime * RechargeSpeed, 0f);
Использование:
public bool UseItem()
{
if (Cooldown != 0f) return false;
/* ... */
Cooldown = 1.5f;
return true;
}
Вы можете использовать другие методы активации тоже, например CombineItems
, TargetObject
, TargetPosition
и др.
Если хотите отображать Cooldown
вместо количества предмета, то перегрузите метод GetCountString
:
public override CustomTooltip GetCountString()
{
if (Cooldown != 0f) return new CustomTooltip(Cooldown, Color.red);
return base.GetCountString(); // отобразить количество по умолчанию
}
Charge
представляет из себя количество секунд "накопленной энергии".
public float Charge { get; private set; } = 5f;
public void Update() => Charge = Mathf.Min(Charge + Time.deltaTime, 5f);
С настраиваемой скоростью зарядки и максимальным зарядом:
public float ChargeSpeed = 1f, MaxCharge = 5f;
public float Charge { get; private set; } = 5f;
public void Update() => Charge = Mathf.Min(Charge + Time.deltaTime * ChargeSpeed, MaxCharge);
Плюс, с задержкой зарядки:
public float DelayThreshold = 3f, ChargeSpeed = 1f, MaxCharge = 5f;
private float lastUsage;
public float Charge { get; private set; } = 5f;
public void Update()
{
if (lastUsage + DelayThreshold < Time.time)
Charge = Mathf.Min(Charge + Time.deltaTime * ChargeSpeed, MaxCharge);
}
Использование:
public bool UseItem()
{
if (Charge < 1.5f) return false;
/* ... */
Charge -= 1.5f;
lastUsage = Time.time;
return true;
}
Вы можете использовать другие методы активации тоже, например CombineItems
, TargetObject
, TargetPosition
и др.
Если хотите отображать Charge
вместо количества предмета, то перегрузите метод GetCountString
:
public override CustomTooltip GetCountString()
{
string text = $"{Charge} ({base.GetCountString()})"; // display both charge and count
Color color = Color.Lerp(Color.red, Color.white, Charge / MaxCharge);
// color between red and white: red - no charge, white - full charge
return new CustomTooltip(text, color);
}
Также существует ванильный способ перезарядки, но он крайне нелогичный и ненадёжный.
Примеры
- Quantum Fud
using UnityEngine;
namespace RogueLibsCore.Test
{
[ItemCategories(RogueCategories.Food, RogueCategories.Technology)]
public class QuantumFud : CustomItem, IItemUsable, IDoUpdate
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomItem<QuantumFud>()
.WithName(new CustomNameInfo("Quantum Fud"))
.WithDescription(new CustomNameInfo("A very complicated piece of quantum technology. When you eat it, its quantum equivalent clone is consumed, while the original thing remains intact."))
.WithSprite(Properties.Resources.QuantumFud)
.WithUnlock(new ItemUnlock
{
UnlockCost = 10,
LoadoutCost = 15,
CharacterCreationCost = 10,
Prerequisites = { VanillaItems.FoodProcessor },
});
}
public override void SetupDetails()
{
Item.itemType = ItemTypes.Food;
Item.itemValue = 180;
Item.healthChange = 1;
Item.cantBeCloned = true;
Item.goesInToolbar = true;
}
public float Cooldown { get; set; }
public void Update() => Cooldown = Mathf.Max(Cooldown - Time.deltaTime, 0f);
public bool UseItem()
{
if (Cooldown != 0f) return false;
int heal = new ItemFunctions().DetermineHealthChange(Item, Owner);
Owner!.statusEffects.ChangeHealth(heal);
if (Owner.HasTrait(VanillaTraits.ShareTheHealth)
|| Owner.HasTrait(VanillaTraits.ShareTheHealth2))
new ItemFunctions().GiveFollowersHealth(Owner, heal);
gc.audioHandler.Play(Owner, VanillaAudio.UseFood);
Cooldown = 0.5f;
return true;
}
}
}