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

Направляемые предметы

Делаем предметы направляемыми

Просто реализуйте интерфейс IItemTargetable в классе вашего предмета:

MyTargetableItem.cs
public class MyTargetableItem : CustomItem, IItemTargetable
{
public bool TargetFilter(PlayfieldObject target) { /* ... */ }
public bool TargetObject(PlayfieldObject target) { /* ... */ }
public CustomTooltip TargetCursorText(PlayfieldObject target) { /* ... */ }
}

TargetFilter определяет какие объекты должны быть подсвечены, при использовании текущего предмета.

TargetObject использует текущий предмет на цели. Возвращаемое значение определяет успешно ли он был использован или нет. Если предмет нельзя использовать, вы можете проиграть звук "CantDo" и заставить игрока сказать что-нибудь. Возврат true также проиграет анимацию.

TargetCursorText определяет текст возле курсора над определённым объектом. Text выставленный на null определится как "Использовать", и Color выставленный на null определится как

#FFFFFF
.

Примеры

Шпионотрон 3000 из Team Fortress 2. Маскирует вас под выбранного персонажа и копирует их отношения с другими.

namespace RogueLibsCore.Test
{
[ItemCategories(RogueCategories.Social, RogueCategories.Stealth,
RogueCategories.Technology, RogueCategories.Usable)]
public class SPYTRON3000 : CustomItem, IItemTargetable
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomItem<SPYTRON3000>()
.WithName(new CustomNameInfo("SPYTRON 3000"))
.WithDescription(new CustomNameInfo("Always wanted to be someone else? Now you can!"))
.WithSprite(Properties.Resources.SPYTRON3000)
.WithUnlock(new ItemUnlock
{
UnlockCost = 10,
LoadoutCost = 2,
CharacterCreationCost = 3,
Prerequisites = { VanillaItems.BodySwapper },
});

DisguiseCursorText = RogueLibs.CreateCustomName("Disguise", NameTypes.Interface, new CustomNameInfo("Disguise as"));
}
private static CustomName DisguiseCursorText = null!;

public override void SetupDetails()
{
Item.itemType = ItemTypes.Tool;
Item.itemValue = 40;
Item.initCount = 2;
Item.rewardCount = 3;
Item.stackable = true;
Item.goesInToolbar = true;
}
public bool TargetFilter(PlayfieldObject target) => target is Agent a && a != Owner;
public bool TargetObject(PlayfieldObject targetObj)
{
if (!TargetFilter(targetObj)) return false;
Agent target = (Agent)targetObj;

string prev = Owner!.agentName;
Owner.agentName = target.agentName;

Owner.relationships.CopyLooks(target);
foreach (Relationship rel in target.relationships.RelList)
{
Relationship otherRel = rel.agent.relationships.GetRelationship(target);

Owner.relationships.SetRel(rel.agent, rel.relType);
Owner.relationships.SetRelHate(rel.agent, 0);
Owner.relationships.GetRelationship(rel.agent).secretHate = rel.secretHate;
Owner.relationships.GetRelationship(rel.agent).mechHate = rel.mechHate;

rel.agent.relationships.SetRel(Owner, otherRel.relType);
rel.agent.relationships.SetRelHate(Owner, 0);
rel.agent.relationships.GetRelationship(Owner).secretHate = otherRel.secretHate;
rel.agent.relationships.GetRelationship(Owner).mechHate = otherRel.mechHate;
}
target.relationships.SetRel(Owner, "Hateful");
target.relationships.SetRelHate(Owner, 25);

Owner.agentName = prev;

Owner.gc.audioHandler.Play(Owner, VanillaAudio.Spawn);
Owner.gc.spawnerMain.SpawnParticleEffect("Spawn", Owner.tr.position, 0f);

Count--;
Item.invInterface.HideTarget();
return true;
}
public CustomTooltip TargetCursorText(PlayfieldObject? _) => DisguiseCursorText;
}
}

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