The project's repository is archived as part of the GitHub Archive Program. RogueLibs' code and the documentation will no longer be updated.
Используемые предметы
Делаем предметы используемыми
Просто реализуйте интерфейс IItemUsable
в классе вашего предмета:
MyUsableItem.cs
public class MyUsableItem : CustomItem, IItemUsable
{
public bool UseItem() { /* ... */ }
}
Возвращаемое значение UseItem
определяет, был ли предмет успешно использован. Возврат true
также проигрывает анимацию. При возврате false
, вы можете проиграть звук "CantDo"
, и, может, заставить текущего владельца сказать, почему предмет нельзя использовать:
if (cantUse)
{
gc.audioHandler.Play(Owner, "CantDo");
Owner.SayDialogue("CantUseItemBecause...");
// не забудьте создать диалог с этим айди
return false;
}
к сведению
Ответственность за уменьшение Count
лежит на вас. Так что, не забывайте делать это.
Примеры
- Сборник шуток
- Адреналин
- Универсальный проход сквозь стены
Простой используемый предмет, дающий игроку возможность использовать способность Шутка.
namespace RogueLibsCore.Test
{
[ItemCategories(RogueCategories.Usable, RogueCategories.Social)]
public class JokeBook : CustomItem, IItemUsable
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomItem<JokeBook>()
.WithName(new CustomNameInfo("Joke Book"))
.WithDescription(new CustomNameInfo("Always wanted to be a Comedian? Now you can! (kind of)"))
.WithSprite(Properties.Resources.JokeBook)
.WithUnlock(new ItemUnlock
{
UnlockCost = 10,
LoadoutCost = 5,
CharacterCreationCost = 3,
Prerequisites = { VanillaAgents.Comedian + "_BQ" },
});
}
public override void SetupDetails()
{
Item.itemType = ItemTypes.Tool;
Item.itemValue = 15;
Item.initCount = 10;
Item.rewardCount = 10;
Item.stackable = true;
Item.hasCharges = true;
Item.goesInToolbar = true;
}
public bool UseItem()
{
if (Owner!.statusEffects.makingJoke) return false;
string prev = Owner.specialAbility;
Owner.specialAbility = VanillaAbilities.Joke;
Owner.statusEffects.PressedSpecialAbility();
Owner.specialAbility = prev;
Count--;
return true;
}
}
}
Простой используемый предмет, дающий игроку эффект "Адреналин". Вы можете посмотреть реализацию эффекта Адреналин в Создаём кастомный эффект: Примеры.
namespace RogueLibsCore.Test
{
[ItemCategories(RogueCategories.Drugs, RogueCategories.Melee, RogueCategories.Usable)]
public class AdrenalineShot : CustomItem, IItemUsable
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomItem<AdrenalineShot>()
.WithName(new CustomNameInfo("Adrenaline Shot"))
.WithDescription(new CustomNameInfo("Gives you a ton of boosts for a short period of time."))
.WithSprite(Properties.Resources.AdrenalineShot)
.WithUnlock(new ItemUnlock
{
UnlockCost = 10,
LoadoutCost = 5,
CharacterCreationCost = 3,
Prerequisites = { VanillaItems.RagePoison, VanillaItems.Antidote },
});
RogueLibs.CreateCustomName("AdrenalineElectronic", NameTypes.Dialogue,
new CustomNameInfo("I don't have a circulatory system."));
}
public override void SetupDetails()
{
Item.itemType = ItemTypes.Consumable;
Item.healthChange = 20;
Item.itemValue = 60;
Item.initCount = 1;
Item.rewardCount = 2;
Item.stackable = true;
Item.goesInToolbar = true;
}
[IgnoreChecks("FullHealth")]
public bool UseItem()
{
if (Owner!.electronic)
{
Owner.SayDialogue("AdrenalineElectronic");
gc.audioHandler.Play(Owner, VanillaAudio.CantDo);
return false;
}
Owner.AddEffect<Adrenaline>();
gc.audioHandler.Play(Owner, VanillaAudio.UseSyringe);
Count--;
return true;
}
}
}
Более сложный используемый предмет, основанный на коде Прохода сквозь стены (см. ItemFunctions.UseItem
).
using UnityEngine;
namespace RogueLibsCore.Test
{
[ItemCategories(RogueCategories.Technology, RogueCategories.Usable, RogueCategories.Stealth)]
public class WildBypasser : CustomItem, IItemUsable
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomItem<WildBypasser>()
.WithName(new CustomNameInfo("Wild Bypasser"))
.WithDescription(new CustomNameInfo("Warps you in the direction you're facing. Teleports through any amount of walls."))
.WithSprite(Properties.Resources.WildBypasser)
.WithUnlock(new ItemUnlock
{
UnlockCost = 10,
LoadoutCost = 7,
CharacterCreationCost = 3,
Prerequisites = { VanillaItems.WallBypasser },
});
}
public override void SetupDetails()
{
Item.itemType = ItemTypes.Tool;
Item.itemValue = 60;
Item.initCount = 2;
Item.rewardCount = 3;
Item.stackable = true;
Item.goesInToolbar = true;
}
public bool UseItem()
{
Vector3 position = Owner!.agentHelperTr.localPosition = Vector3.zero;
TileData tileData;
int limit = 0;
do
{
position.x += 0.64f;
Owner.agentHelperTr.localPosition = position;
tileData = gc.tileInfo.GetTileData(Owner.agentHelperTr.position);
} while ((gc.tileInfo.IsOverlapping(Owner.agentHelperTr.position, "Anything")
|| tileData.wallMaterial != wallMaterialType.None) && limit++ < 250);
if (limit > 250)
{
gc.audioHandler.Play(Owner, VanillaAudio.CantDo);
return false;
}
Owner.SpawnParticleEffect("Spawn", Owner.tr.position);
Owner.Teleport(Owner.agentHelperTr.position, false, true);
Owner.rb.velocity = Vector2.zero;
if (!(Owner.HasTrait(VanillaTraits.IntrusionArtist)
&& gc.percentChance(Owner.DetermineLuck(80, "ThiefToolsMayNotSubtract", true)))
&& !(Owner.HasTrait(VanillaTraits.IntrusionArtist2)
&& gc.percentChance(Owner.DetermineLuck(40, "ThiefToolsMayNotSubtract", true))))
Count--;
Owner.SpawnParticleEffect("Spawn", Owner.tr.position, false);
gc.audioHandler.Play(Owner, VanillaAudio.Spawn);
return true;
}
}
}
The project's repository is archived as part of the GitHub Archive Program. RogueLibs' code and the documentation will no longer be updated.