Spill hand contents when dropping them in a fall (#3304)
* Spill hand contents when dropping them due to falling down * Better approach * cleanup * grammar * stupid
This commit is contained in:
@@ -3,13 +3,14 @@ using Content.Shared.GameObjects.Components.Chemistry;
|
|||||||
using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
|
using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
|
||||||
using Content.Shared.GameObjects.Verbs;
|
using Content.Shared.GameObjects.Verbs;
|
||||||
using Content.Shared.Interfaces;
|
using Content.Shared.Interfaces;
|
||||||
|
using Content.Shared.Interfaces.GameObjects.Components;
|
||||||
using Robust.Shared.GameObjects;
|
using Robust.Shared.GameObjects;
|
||||||
using Robust.Shared.Localization;
|
using Robust.Shared.Localization;
|
||||||
|
|
||||||
namespace Content.Server.GameObjects.Components.Fluids
|
namespace Content.Server.GameObjects.Components.Fluids
|
||||||
{
|
{
|
||||||
[RegisterComponent]
|
[RegisterComponent]
|
||||||
public class SpillableComponent : Component
|
public class SpillableComponent : Component, IDropped
|
||||||
{
|
{
|
||||||
public override string Name => "Spillable";
|
public override string Name => "Spillable";
|
||||||
|
|
||||||
@@ -51,10 +52,16 @@ namespace Content.Server.GameObjects.Components.Fluids
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Need this as when we split the component's owner may be deleted
|
// Need this as when we split the component's owner may be deleted
|
||||||
var entityLocation = component.Owner.Transform.Coordinates;
|
solutionComponent.Drain(solutionComponent.DrainAvailable).SpillAt(component.Owner.Transform.Coordinates, "PuddleSmear");
|
||||||
var solution = solutionComponent.Drain(solutionComponent.DrainAvailable);
|
}
|
||||||
solution.SpillAt(entityLocation, "PuddleSmear");
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IDropped.Dropped(DroppedEventArgs eventArgs)
|
||||||
|
{
|
||||||
|
if (!eventArgs.Intentional && Owner.TryGetComponent(out ISolutionInteractionsComponent solutionComponent))
|
||||||
|
{
|
||||||
|
solutionComponent.Drain(solutionComponent.DrainAvailable).SpillAt(Owner.Transform.Coordinates, "PuddleSmear");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -252,18 +252,19 @@ namespace Content.Server.GameObjects.Components.GUI
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="item">The itemcomponent of the item to be dropped</param>
|
/// <param name="item">The itemcomponent of the item to be dropped</param>
|
||||||
/// <param name="doMobChecks">Check if the item can be dropped</param>
|
/// <param name="doMobChecks">Check if the item can be dropped</param>
|
||||||
|
/// <param name="intentional">If the item was dropped intentionally</param>
|
||||||
/// <returns>True if IDropped.Dropped was called, otherwise false</returns>
|
/// <returns>True if IDropped.Dropped was called, otherwise false</returns>
|
||||||
private bool DroppedInteraction(ItemComponent item, bool doMobChecks)
|
private bool DroppedInteraction(ItemComponent item, bool doMobChecks, bool intentional)
|
||||||
{
|
{
|
||||||
var interactionSystem = _entitySystemManager.GetEntitySystem<InteractionSystem>();
|
var interactionSystem = _entitySystemManager.GetEntitySystem<InteractionSystem>();
|
||||||
if (doMobChecks)
|
if (doMobChecks)
|
||||||
{
|
{
|
||||||
if (!interactionSystem.TryDroppedInteraction(Owner, item.Owner))
|
if (!interactionSystem.TryDroppedInteraction(Owner, item.Owner, intentional))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
interactionSystem.DroppedInteraction(Owner, item.Owner);
|
interactionSystem.DroppedInteraction(Owner, item.Owner, intentional);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -284,7 +285,7 @@ namespace Content.Server.GameObjects.Components.GUI
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Drop(string slot, EntityCoordinates coords, bool doMobChecks = true, bool doDropInteraction = true)
|
public bool Drop(string slot, EntityCoordinates coords, bool doMobChecks = true, bool doDropInteraction = true, bool intentional = true)
|
||||||
{
|
{
|
||||||
var hand = GetHand(slot);
|
var hand = GetHand(slot);
|
||||||
if (!CanDrop(slot, doMobChecks) || hand?.Entity == null)
|
if (!CanDrop(slot, doMobChecks) || hand?.Entity == null)
|
||||||
@@ -302,7 +303,7 @@ namespace Content.Server.GameObjects.Components.GUI
|
|||||||
_entitySystemManager.GetEntitySystem<InteractionSystem>().UnequippedHandInteraction(Owner, item.Owner,
|
_entitySystemManager.GetEntitySystem<InteractionSystem>().UnequippedHandInteraction(Owner, item.Owner,
|
||||||
ToSharedHand(hand));
|
ToSharedHand(hand));
|
||||||
|
|
||||||
if (doDropInteraction && !DroppedInteraction(item, false))
|
if (doDropInteraction && !DroppedInteraction(item, false, intentional))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
item.RemovedFromSlot();
|
item.RemovedFromSlot();
|
||||||
@@ -325,7 +326,7 @@ namespace Content.Server.GameObjects.Components.GUI
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public bool Drop(string slot, BaseContainer targetContainer, bool doMobChecks = true, bool doDropInteraction = true)
|
public bool Drop(string slot, BaseContainer targetContainer, bool doMobChecks = true, bool doDropInteraction = true, bool intentional = true)
|
||||||
{
|
{
|
||||||
if (slot == null)
|
if (slot == null)
|
||||||
{
|
{
|
||||||
@@ -363,7 +364,7 @@ namespace Content.Server.GameObjects.Components.GUI
|
|||||||
_entitySystemManager.GetEntitySystem<InteractionSystem>().UnequippedHandInteraction(Owner, item.Owner,
|
_entitySystemManager.GetEntitySystem<InteractionSystem>().UnequippedHandInteraction(Owner, item.Owner,
|
||||||
ToSharedHand(hand));
|
ToSharedHand(hand));
|
||||||
|
|
||||||
if (doDropInteraction && !DroppedInteraction(item, doMobChecks))
|
if (doDropInteraction && !DroppedInteraction(item, doMobChecks, intentional))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
item.RemovedFromSlot();
|
item.RemovedFromSlot();
|
||||||
@@ -379,7 +380,7 @@ namespace Content.Server.GameObjects.Components.GUI
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Drop(IEntity entity, EntityCoordinates coords, bool doMobChecks = true, bool doDropInteraction = true)
|
public bool Drop(IEntity entity, EntityCoordinates coords, bool doMobChecks = true, bool doDropInteraction = true, bool intentional = true)
|
||||||
{
|
{
|
||||||
if (entity == null)
|
if (entity == null)
|
||||||
{
|
{
|
||||||
@@ -391,15 +392,15 @@ namespace Content.Server.GameObjects.Components.GUI
|
|||||||
throw new ArgumentException("Entity must be held in one of our hands.", nameof(entity));
|
throw new ArgumentException("Entity must be held in one of our hands.", nameof(entity));
|
||||||
}
|
}
|
||||||
|
|
||||||
return Drop(slot, coords, doMobChecks, doDropInteraction);
|
return Drop(slot, coords, doMobChecks, doDropInteraction, intentional);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Drop(string slot, bool mobChecks = true, bool doDropInteraction = true)
|
public bool Drop(string slot, bool mobChecks = true, bool doDropInteraction = true, bool intentional = true)
|
||||||
{
|
{
|
||||||
return Drop(slot, Owner.Transform.Coordinates, mobChecks, doDropInteraction);
|
return Drop(slot, Owner.Transform.Coordinates, mobChecks, doDropInteraction, intentional);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Drop(IEntity entity, bool mobChecks = true, bool doDropInteraction = true)
|
public bool Drop(IEntity entity, bool mobChecks = true, bool doDropInteraction = true, bool intentional = true)
|
||||||
{
|
{
|
||||||
if (entity == null)
|
if (entity == null)
|
||||||
{
|
{
|
||||||
@@ -411,10 +412,10 @@ namespace Content.Server.GameObjects.Components.GUI
|
|||||||
throw new ArgumentException("Entity must be held in one of our hands.", nameof(entity));
|
throw new ArgumentException("Entity must be held in one of our hands.", nameof(entity));
|
||||||
}
|
}
|
||||||
|
|
||||||
return Drop(slot, Owner.Transform.Coordinates, mobChecks, doDropInteraction);
|
return Drop(slot, Owner.Transform.Coordinates, mobChecks, doDropInteraction, intentional);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Drop(IEntity entity, BaseContainer targetContainer, bool doMobChecks = true, bool doDropInteraction = true)
|
public bool Drop(IEntity entity, BaseContainer targetContainer, bool doMobChecks = true, bool doDropInteraction = true, bool intentional = true)
|
||||||
{
|
{
|
||||||
if (entity == null)
|
if (entity == null)
|
||||||
{
|
{
|
||||||
@@ -426,7 +427,7 @@ namespace Content.Server.GameObjects.Components.GUI
|
|||||||
throw new ArgumentException("Entity must be held in one of our hands.", nameof(entity));
|
throw new ArgumentException("Entity must be held in one of our hands.", nameof(entity));
|
||||||
}
|
}
|
||||||
|
|
||||||
return Drop(slot, targetContainer, doMobChecks, doDropInteraction);
|
return Drop(slot, targetContainer, doMobChecks, doDropInteraction, intentional);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -716,11 +716,11 @@ namespace Content.Server.GameObjects.EntitySystems.Click
|
|||||||
/// Activates the Dropped behavior of an object
|
/// Activates the Dropped behavior of an object
|
||||||
/// Verifies that the user is capable of doing the drop interaction first
|
/// Verifies that the user is capable of doing the drop interaction first
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool TryDroppedInteraction(IEntity user, IEntity item)
|
public bool TryDroppedInteraction(IEntity user, IEntity item, bool intentional)
|
||||||
{
|
{
|
||||||
if (user == null || item == null || !ActionBlockerSystem.CanDrop(user)) return false;
|
if (user == null || item == null || !ActionBlockerSystem.CanDrop(user)) return false;
|
||||||
|
|
||||||
DroppedInteraction(user, item);
|
DroppedInteraction(user, item, intentional);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -728,9 +728,9 @@ namespace Content.Server.GameObjects.EntitySystems.Click
|
|||||||
/// Calls Dropped on all components that implement the IDropped interface
|
/// Calls Dropped on all components that implement the IDropped interface
|
||||||
/// on an entity that has been dropped.
|
/// on an entity that has been dropped.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void DroppedInteraction(IEntity user, IEntity item)
|
public void DroppedInteraction(IEntity user, IEntity item, bool intentional)
|
||||||
{
|
{
|
||||||
var dropMsg = new DroppedMessage(user, item);
|
var dropMsg = new DroppedMessage(user, item, intentional);
|
||||||
RaiseLocalEvent(dropMsg);
|
RaiseLocalEvent(dropMsg);
|
||||||
if (dropMsg.Handled)
|
if (dropMsg.Handled)
|
||||||
{
|
{
|
||||||
@@ -742,7 +742,7 @@ namespace Content.Server.GameObjects.EntitySystems.Click
|
|||||||
// Call Land on all components that implement the interface
|
// Call Land on all components that implement the interface
|
||||||
foreach (var comp in comps)
|
foreach (var comp in comps)
|
||||||
{
|
{
|
||||||
comp.Dropped(new DroppedEventArgs(user));
|
comp.Dropped(new DroppedEventArgs(user, intentional));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ namespace Content.Server.GameObjects.EntitySystems
|
|||||||
|
|
||||||
foreach (var heldItem in hands.GetAllHeldItems())
|
foreach (var heldItem in hands.GetAllHeldItems())
|
||||||
{
|
{
|
||||||
hands.Drop(heldItem.Owner, doMobChecks);
|
hands.Drop(heldItem.Owner, doMobChecks, intentional:false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ namespace Content.Server.Interfaces.GameObjects.Components.Items
|
|||||||
/// <param name="mobChecks">Whether to check the <see cref="ActionBlockerSystem.CanDrop()"/> for the mob or not.</param>
|
/// <param name="mobChecks">Whether to check the <see cref="ActionBlockerSystem.CanDrop()"/> for the mob or not.</param>
|
||||||
/// <param name="doDropInteraction">Whether to perform Dropped interactions.</param>
|
/// <param name="doDropInteraction">Whether to perform Dropped interactions.</param>
|
||||||
/// <returns>True on success, false if something blocked the drop.</returns>
|
/// <returns>True on success, false if something blocked the drop.</returns>
|
||||||
bool Drop(string slot, bool mobChecks = true, bool doDropInteraction = true);
|
bool Drop(string slot, bool mobChecks = true, bool doDropInteraction = true, bool intentional = true);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Drops an item held by one of our hand slots to the same position as our owning entity.
|
/// Drops an item held by one of our hand slots to the same position as our owning entity.
|
||||||
@@ -125,7 +125,7 @@ namespace Content.Server.Interfaces.GameObjects.Components.Items
|
|||||||
/// <exception cref="ArgumentException">
|
/// <exception cref="ArgumentException">
|
||||||
/// Thrown if <see cref="entity"/> is not actually held in any hand.
|
/// Thrown if <see cref="entity"/> is not actually held in any hand.
|
||||||
/// </exception>
|
/// </exception>
|
||||||
bool Drop(IEntity entity, bool mobChecks = true, bool doDropInteraction = true);
|
bool Drop(IEntity entity, bool mobChecks = true, bool doDropInteraction = true, bool intentional = true);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Drops the item in a slot.
|
/// Drops the item in a slot.
|
||||||
@@ -135,7 +135,7 @@ namespace Content.Server.Interfaces.GameObjects.Components.Items
|
|||||||
/// <param name="doMobChecks">Whether to check the <see cref="ActionBlockerSystem.CanDrop()"/> for the mob or not.</param>
|
/// <param name="doMobChecks">Whether to check the <see cref="ActionBlockerSystem.CanDrop()"/> for the mob or not.</param>
|
||||||
/// <param name="doDropInteraction">Whether to perform Dropped interactions.</param>
|
/// <param name="doDropInteraction">Whether to perform Dropped interactions.</param>
|
||||||
/// <returns>True if an item was dropped, false otherwise.</returns>
|
/// <returns>True if an item was dropped, false otherwise.</returns>
|
||||||
bool Drop(string slot, EntityCoordinates coords, bool doMobChecks = true, bool doDropInteraction = true);
|
bool Drop(string slot, EntityCoordinates coords, bool doMobChecks = true, bool doDropInteraction = true, bool intentional = true);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Drop the specified entity in our hands to a certain position.
|
/// Drop the specified entity in our hands to a certain position.
|
||||||
@@ -158,7 +158,7 @@ namespace Content.Server.Interfaces.GameObjects.Components.Items
|
|||||||
/// <exception cref="ArgumentException">
|
/// <exception cref="ArgumentException">
|
||||||
/// Thrown if <see cref="entity"/> is not actually held in any hand.
|
/// Thrown if <see cref="entity"/> is not actually held in any hand.
|
||||||
/// </exception>
|
/// </exception>
|
||||||
bool Drop(IEntity entity, EntityCoordinates coords, bool doMobChecks = true, bool doDropInteraction = true);
|
bool Drop(IEntity entity, EntityCoordinates coords, bool doMobChecks = true, bool doDropInteraction = true, bool intentional = true);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Drop the item contained in a slot into another container.
|
/// Drop the item contained in a slot into another container.
|
||||||
@@ -173,7 +173,7 @@ namespace Content.Server.Interfaces.GameObjects.Components.Items
|
|||||||
/// but practical remove or insert returned false anyways.
|
/// but practical remove or insert returned false anyways.
|
||||||
/// This is an edge-case that is currently unhandled.
|
/// This is an edge-case that is currently unhandled.
|
||||||
/// </exception>
|
/// </exception>
|
||||||
bool Drop(string slot, BaseContainer targetContainer, bool doMobChecks = true, bool doDropInteraction = true);
|
bool Drop(string slot, BaseContainer targetContainer, bool doMobChecks = true, bool doDropInteraction = true, bool intentional = true);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Drops an item in one of the hands into a container.
|
/// Drops an item in one of the hands into a container.
|
||||||
@@ -194,7 +194,7 @@ namespace Content.Server.Interfaces.GameObjects.Components.Items
|
|||||||
/// <exception cref="ArgumentException">
|
/// <exception cref="ArgumentException">
|
||||||
/// Thrown if <see cref="entity"/> is not actually held in any hand.
|
/// Thrown if <see cref="entity"/> is not actually held in any hand.
|
||||||
/// </exception>
|
/// </exception>
|
||||||
bool Drop(IEntity entity, BaseContainer targetContainer, bool doMobChecks = true, bool doDropInteraction = true);
|
bool Drop(IEntity entity, BaseContainer targetContainer, bool doMobChecks = true, bool doDropInteraction = true, bool intentional = true);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Checks whether the item in the specified hand can be dropped.
|
/// Checks whether the item in the specified hand can be dropped.
|
||||||
|
|||||||
@@ -16,12 +16,15 @@ namespace Content.Shared.Interfaces.GameObjects.Components
|
|||||||
|
|
||||||
public class DroppedEventArgs : EventArgs
|
public class DroppedEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
public DroppedEventArgs(IEntity user)
|
public DroppedEventArgs(IEntity user, bool intentional)
|
||||||
{
|
{
|
||||||
User = user;
|
User = user;
|
||||||
|
Intentional = intentional;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEntity User { get; }
|
public IEntity User { get; }
|
||||||
|
|
||||||
|
public bool Intentional { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -45,10 +48,16 @@ namespace Content.Shared.Interfaces.GameObjects.Components
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public IEntity Dropped { get; }
|
public IEntity Dropped { get; }
|
||||||
|
|
||||||
public DroppedMessage(IEntity user, IEntity dropped)
|
/// <summary>
|
||||||
|
/// If the item was dropped intentionally.
|
||||||
|
/// </summary>
|
||||||
|
public bool Intentional { get; }
|
||||||
|
|
||||||
|
public DroppedMessage(IEntity user, IEntity dropped, bool intentional)
|
||||||
{
|
{
|
||||||
User = user;
|
User = user;
|
||||||
Dropped = dropped;
|
Dropped = dropped;
|
||||||
|
Intentional = intentional;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user