Files
tbd-station-14/Content.Server/GameObjects/Components/PottedPlantHideComponent.cs
Víctor Aguilera Puerto d9ae942759 Make InteractUsing async, make tools use DoAfter. (#1772)
* Make IInteractUsing async, make tools use DoAfter.

* Disable warning 1998 in Content.Server

* Update Content.Server/GameObjects/Components/AnchorableComponent.cs
2020-08-18 14:39:08 +02:00

97 lines
3.3 KiB
C#

using System.Threading.Tasks;
using Content.Server.GameObjects.Components.GUI;
using Content.Server.GameObjects.Components.Items.Storage;
using Content.Server.Interfaces.GameObjects.Components.Items;
using Content.Shared.Audio;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
using Robust.Server.GameObjects.Components.Container;
using Robust.Server.GameObjects.EntitySystems;
using Robust.Shared.GameObjects;
using Robust.Shared.GameObjects.Systems;
using Robust.Shared.Localization;
using Robust.Shared.ViewVariables;
namespace Content.Server.GameObjects.Components
{
[RegisterComponent]
public class PottedPlantHideComponent : Component, IInteractUsing, IInteractHand
{
private const int MaxItemSize = (int) ReferenceSizes.Pocket;
public override string Name => "PottedPlantHide";
[ViewVariables] private ContainerSlot _itemContainer;
public override void Initialize()
{
base.Initialize();
_itemContainer =
ContainerManagerComponent.Ensure<ContainerSlot>("potted_plant_hide", Owner, out _);
}
async Task<bool> IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs)
{
if (_itemContainer.ContainedEntity != null)
{
Rustle();
Owner.PopupMessage(eventArgs.User, Loc.GetString("There's already something in here?!"));
return false;
}
var size = eventArgs.Using.GetComponent<ItemComponent>().ObjectSize;
// TODO: use proper text macro system for this.
if (size > MaxItemSize)
{
Owner.PopupMessage(eventArgs.User,
Loc.GetString("{0:TheName} is too big to fit in the plant!", eventArgs.Using));
return false;
}
var handsComponent = eventArgs.User.GetComponent<IHandsComponent>();
if (!handsComponent.Drop(eventArgs.Using, _itemContainer))
{
return false;
}
Owner.PopupMessage(eventArgs.User, Loc.GetString("You hide {0:theName} in the plant.", eventArgs.Using));
Rustle();
return true;
}
bool IInteractHand.InteractHand(InteractHandEventArgs eventArgs)
{
Rustle();
if (_itemContainer.ContainedEntity == null)
{
Owner.PopupMessage(eventArgs.User, Loc.GetString("You root around in the roots."));
return true;
}
Owner.PopupMessage(eventArgs.User, Loc.GetString("There was something in there!"));
if (eventArgs.User.TryGetComponent(out HandsComponent hands))
{
hands.PutInHandOrDrop(_itemContainer.ContainedEntity.GetComponent<ItemComponent>());
}
else if (_itemContainer.Remove(_itemContainer.ContainedEntity))
{
_itemContainer.ContainedEntity.Transform.GridPosition = Owner.Transform.GridPosition;
}
return true;
}
private void Rustle()
{
EntitySystem.Get<AudioSystem>()
.PlayFromEntity("/Audio/Effects/plant_rustle.ogg", Owner, AudioHelpers.WithVariation(0.25f));
}
}
}