2020-02-09 06:42:12 -03:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Linq;
|
2020-08-18 14:39:08 +02:00
|
|
|
|
using System.Threading.Tasks;
|
Bodysystem and damagesystem rework (#1544)
* Things and stuff with grids, unfinished w/ code debug changes.
* Updated submodule and also lost some progress cause I fucked it up xd
* First unfinished draft of the BodySystem. Doesn't compile.
* More changes to make it compile, but still just a framework. Doesn't do anything at the moment.
* Many cleanup changes.
* Revert "Merge branch 'master' of https://github.com/GlassEclipse/space-station-14 into body_system"
This reverts commit ddd4aebbc76cf2a0b7b102f72b93d55a0816c88c, reversing
changes made to 12d0dd752706bdda8879393bd8191a1199a0c978.
* Commit human.yml
* Updated a lot of things to be more classy, more progress overall, etc. etc.
* Latest update with many changes
* Minor changes
* Fixed Travis build bug
* Adds first draft of Body Scanner console, apparently I also forgot to tie Mechanisms into body parts so now a heart just sits in the Torso like a good boy :)
* Commit rest of stuff
* Latest changes
* Latest changes again
* 14 naked cowboys
* Yay!
* Latest changes (probably doesnt compile)
* Surgery!!!!!!!!!~1116y
* Cleaned some stuff up
* More cleanup
* Refactoring of code. Basic surgery path now done.
* Removed readme, has been added to HackMD
* Fixes typo (and thus test errors)
* WIP changes, committing so I can pull latest master changes
* Still working on that god awful merge
* Latest changes
* Latest changes!!
* Beginning of refactor to BoundUserInterface
* Surgery!
* Latest changes - fixes pr change requests and random fixes
* oops
* Fixes bodypart recursion
* Beginning of work on revamping the damage system.
* More latest changes
* Latest changes
* Finished merge
* Commit before removing old healthcode
* Almost done with removing speciescomponent...
* It compiles!!!
* yahoo more work
* Fixes to make it work
* Merge conflict fixes
* Deleting species visualizer was a mistake
* IDE warnings are VERBOTEN
* makes the server not kill itself on startup, some cleanup (#1)
* Namespaces, comments and exception fixes
* Fix conveyor and conveyor switch serialization
SS14 in reactive when
* Move damage, acts and body to shared
Damage cleanup
Comment cleanup
* Rename SpeciesComponent to RotationComponent and cleanup
Damage cleanup
Comment cleanup
* Fix nullable warnings
* Address old reviews
Fix off welder suicide damage type, deathmatch and suspicion
* Fix new test fail with units being able to accept items when unpowered
* Remove RotationComponent, change references to IBodyManagerComponent
* Add a bloodstream to humans
* More cleanups
* Add body conduits, connections, connectors substances and valves
* Revert "Add body conduits, connections, connectors substances and valves"
This reverts commit 9ab0b50e6b15fe98852d7b0836c0cdbf4bd76d20.
* Implement the heart mechanism behavior with the circulatory network
* Added network property to mechanism behaviors
* Changed human organ sprites and added missing ones
* Fix tests
* Add individual body part sprite rendering
* Fix error where dropped mechanisms are not initialized
* Implement client/server body damage
* Make DamageContainer take care of raising events
* Reimplement medical scanner with the new body system
* Improve the medical scanner ui
* Merge conflict fixes
* Fix crash when colliding with something
* Fix microwave suicides and eyes sprite rendering
* Fix nullable reference error
* Fix up surgery client side
* Fix missing using from merge conflict
* Add breathing
*inhale
* Merge conflict fixes
* Fix accumulatedframetime being reset to 0 instead of decreased by the threshold
https://github.com/space-wizards/space-station-14/pull/1617
* Use and add to the new AtmosHelpers
* Fix feet
* Add proper coloring to dropped body parts
* Fix Urist's lungs being too strong
* Merge conflict fixes
* Merge conflict fixes
* Merge conflict fixes
Co-authored-by: GlassEclipse <tsymall5@gmail.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
Co-authored-by: AJCM-git <60196617+AJCM-git@users.noreply.github.com>
2020-08-17 01:42:42 +02:00
|
|
|
|
using Content.Server.GameObjects.Components.Body;
|
2020-07-25 15:11:16 +02:00
|
|
|
|
using Content.Server.GameObjects.Components.GUI;
|
2020-05-25 13:58:56 +02:00
|
|
|
|
using Content.Server.GameObjects.Components.Interactable;
|
2020-10-10 15:25:13 +02:00
|
|
|
|
using Content.Shared.GameObjects.Components.Body;
|
2020-05-25 13:58:56 +02:00
|
|
|
|
using Content.Shared.GameObjects.Components.Interactable;
|
2019-07-31 15:02:36 +02:00
|
|
|
|
using Content.Shared.GameObjects.Components.Storage;
|
2020-06-24 04:04:43 +02:00
|
|
|
|
using Content.Shared.GameObjects.EntitySystems;
|
2020-08-13 14:40:27 +02:00
|
|
|
|
using Content.Shared.GameObjects.Verbs;
|
2020-05-25 13:58:56 +02:00
|
|
|
|
using Content.Shared.Interfaces;
|
2020-07-18 22:51:56 -07:00
|
|
|
|
using Content.Shared.Interfaces.GameObjects.Components;
|
2019-07-31 15:02:36 +02:00
|
|
|
|
using Robust.Server.GameObjects;
|
2019-04-17 23:26:00 +02:00
|
|
|
|
using Robust.Server.GameObjects.Components.Container;
|
2020-05-31 12:40:36 -05:00
|
|
|
|
using Robust.Server.GameObjects.EntitySystems;
|
2019-09-09 14:50:12 -07:00
|
|
|
|
using Robust.Server.Interfaces.GameObjects;
|
2019-04-17 23:26:00 +02:00
|
|
|
|
using Robust.Shared.GameObjects;
|
2020-01-11 14:12:20 -08:00
|
|
|
|
using Robust.Shared.GameObjects.Components;
|
2020-05-31 12:40:36 -05:00
|
|
|
|
using Robust.Shared.GameObjects.Systems;
|
2019-04-17 23:26:00 +02:00
|
|
|
|
using Robust.Shared.Interfaces.GameObjects;
|
2020-05-25 13:58:56 +02:00
|
|
|
|
using Robust.Shared.Interfaces.Timing;
|
|
|
|
|
|
using Robust.Shared.IoC;
|
|
|
|
|
|
using Robust.Shared.Localization;
|
2019-04-17 23:26:00 +02:00
|
|
|
|
using Robust.Shared.Maths;
|
|
|
|
|
|
using Robust.Shared.Serialization;
|
|
|
|
|
|
using Robust.Shared.ViewVariables;
|
|
|
|
|
|
|
2020-07-26 20:49:41 +02:00
|
|
|
|
namespace Content.Server.GameObjects.Components.Items.Storage
|
2019-04-17 23:26:00 +02:00
|
|
|
|
{
|
2019-07-31 15:02:36 +02:00
|
|
|
|
[RegisterComponent]
|
|
|
|
|
|
[ComponentReference(typeof(IActivate))]
|
|
|
|
|
|
[ComponentReference(typeof(IStorageComponent))]
|
2020-08-27 08:27:49 -06:00
|
|
|
|
public class EntityStorageComponent : Component, IActivate, IStorageComponent, IInteractUsing, IDestroyAct, IActionBlocker, IExAct
|
2019-04-17 23:26:00 +02:00
|
|
|
|
{
|
2020-09-02 01:30:03 +02:00
|
|
|
|
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
|
|
|
|
|
|
2019-04-17 23:26:00 +02:00
|
|
|
|
public override string Name => "EntityStorage";
|
|
|
|
|
|
|
2019-09-01 17:08:15 -07:00
|
|
|
|
private const float MaxSize = 1.0f; // maximum width or height of an entity allowed inside the storage.
|
|
|
|
|
|
|
2020-05-25 13:58:56 +02:00
|
|
|
|
private static readonly TimeSpan InternalOpenAttemptDelay = TimeSpan.FromSeconds(0.5);
|
|
|
|
|
|
private TimeSpan _lastInternalOpenAttempt;
|
|
|
|
|
|
|
|
|
|
|
|
[ViewVariables]
|
2020-07-03 14:54:45 +02:00
|
|
|
|
private int _storageCapacityMax;
|
2020-05-25 13:58:56 +02:00
|
|
|
|
[ViewVariables]
|
2020-07-03 14:54:45 +02:00
|
|
|
|
private bool _isCollidableWhenOpen;
|
2020-05-25 13:58:56 +02:00
|
|
|
|
[ViewVariables]
|
2020-07-03 14:54:45 +02:00
|
|
|
|
private IEntityQuery _entityQuery;
|
2020-01-03 16:00:30 -08:00
|
|
|
|
private bool _showContents;
|
2020-07-26 08:25:53 -04:00
|
|
|
|
private bool _occludesLight;
|
2020-05-25 01:03:44 +02:00
|
|
|
|
private bool _open;
|
2020-05-25 13:58:56 +02:00
|
|
|
|
private bool _isWeldedShut;
|
2020-01-03 13:38:58 -08:00
|
|
|
|
|
2020-07-26 20:49:41 +02:00
|
|
|
|
[ViewVariables]
|
|
|
|
|
|
protected Container Contents;
|
|
|
|
|
|
|
2020-01-03 16:00:30 -08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Determines if the container contents should be drawn when the container is closed.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
|
|
|
|
public bool ShowContents
|
|
|
|
|
|
{
|
|
|
|
|
|
get => _showContents;
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
_showContents = value;
|
2020-07-26 20:49:41 +02:00
|
|
|
|
Contents.ShowContents = _showContents;
|
2020-01-03 16:00:30 -08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-07-26 08:25:53 -04:00
|
|
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
|
|
|
|
public bool OccludesLight
|
|
|
|
|
|
{
|
|
|
|
|
|
get => _occludesLight;
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
_occludesLight = value;
|
2020-07-26 20:49:41 +02:00
|
|
|
|
Contents.OccludesLight = _occludesLight;
|
2020-07-26 08:25:53 -04:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-05-25 13:58:56 +02:00
|
|
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
|
|
|
|
public bool Open
|
|
|
|
|
|
{
|
|
|
|
|
|
get => _open;
|
|
|
|
|
|
private set => _open = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
|
|
|
|
public bool IsWeldedShut
|
|
|
|
|
|
{
|
|
|
|
|
|
get => _isWeldedShut;
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
_isWeldedShut = value;
|
|
|
|
|
|
|
|
|
|
|
|
if (Owner.TryGetComponent(out AppearanceComponent appearance))
|
|
|
|
|
|
{
|
|
|
|
|
|
appearance.SetData(StorageVisuals.Welded, value);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
|
|
|
|
public bool CanWeldShut { get; set; }
|
|
|
|
|
|
|
2020-01-03 13:38:58 -08:00
|
|
|
|
/// <inheritdoc />
|
2019-04-17 23:26:00 +02:00
|
|
|
|
public override void Initialize()
|
|
|
|
|
|
{
|
|
|
|
|
|
base.Initialize();
|
2020-07-26 20:49:41 +02:00
|
|
|
|
Contents = ContainerManagerComponent.Ensure<Container>(nameof(EntityStorageComponent), Owner);
|
2020-07-03 14:54:45 +02:00
|
|
|
|
_entityQuery = new IntersectingEntityQuery(Owner);
|
2020-01-03 16:00:30 -08:00
|
|
|
|
|
2020-07-26 20:49:41 +02:00
|
|
|
|
Contents.ShowContents = _showContents;
|
|
|
|
|
|
Contents.OccludesLight = _occludesLight;
|
2020-01-03 17:49:17 -08:00
|
|
|
|
|
2020-02-09 06:42:12 -03:00
|
|
|
|
if (Owner.TryGetComponent<PlaceableSurfaceComponent>(out var placeableSurfaceComponent))
|
|
|
|
|
|
{
|
|
|
|
|
|
placeableSurfaceComponent.IsPlaceable = Open;
|
|
|
|
|
|
}
|
2019-04-17 23:26:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-01-03 13:38:58 -08:00
|
|
|
|
/// <inheritdoc />
|
2019-04-17 23:26:00 +02:00
|
|
|
|
public override void ExposeData(ObjectSerializer serializer)
|
|
|
|
|
|
{
|
|
|
|
|
|
base.ExposeData(serializer);
|
|
|
|
|
|
|
2020-07-03 14:54:45 +02:00
|
|
|
|
serializer.DataField(ref _storageCapacityMax, "Capacity", 30);
|
|
|
|
|
|
serializer.DataField(ref _isCollidableWhenOpen, "IsCollidableWhenOpen", false);
|
2020-01-03 16:00:30 -08:00
|
|
|
|
serializer.DataField(ref _showContents, "showContents", false);
|
2020-07-26 08:25:53 -04:00
|
|
|
|
serializer.DataField(ref _occludesLight, "occludesLight", true);
|
2020-05-25 01:03:44 +02:00
|
|
|
|
serializer.DataField(ref _open, "open", false);
|
2020-05-25 13:58:56 +02:00
|
|
|
|
serializer.DataField(this, a => a.IsWeldedShut, "IsWeldedShut", false);
|
|
|
|
|
|
serializer.DataField(this, a => a.CanWeldShut, "CanWeldShut", true);
|
2020-05-25 01:03:44 +02:00
|
|
|
|
}
|
2019-04-17 23:26:00 +02:00
|
|
|
|
|
2020-05-25 01:03:44 +02:00
|
|
|
|
public virtual void Activate(ActivateEventArgs eventArgs)
|
2020-01-03 13:38:58 -08:00
|
|
|
|
{
|
2020-05-25 13:58:56 +02:00
|
|
|
|
ToggleOpen(eventArgs.User);
|
2020-01-03 13:38:58 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-07-26 20:49:41 +02:00
|
|
|
|
private void ToggleOpen(IEntity user)
|
2019-04-17 23:26:00 +02:00
|
|
|
|
{
|
2020-05-25 13:58:56 +02:00
|
|
|
|
if (IsWeldedShut)
|
|
|
|
|
|
{
|
|
|
|
|
|
Owner.PopupMessage(user, Loc.GetString("It's welded completely shut!"));
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2019-04-17 23:26:00 +02:00
|
|
|
|
if (Open)
|
|
|
|
|
|
{
|
|
|
|
|
|
CloseStorage();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2020-05-25 13:58:56 +02:00
|
|
|
|
TryOpenStorage(user);
|
2019-04-17 23:26:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-07-26 20:49:41 +02:00
|
|
|
|
public virtual void CloseStorage()
|
2019-04-17 23:26:00 +02:00
|
|
|
|
{
|
|
|
|
|
|
Open = false;
|
2020-07-03 14:54:45 +02:00
|
|
|
|
var entities = Owner.EntityManager.GetEntities(_entityQuery);
|
2019-05-05 18:52:06 +02:00
|
|
|
|
var count = 0;
|
2019-04-17 23:26:00 +02:00
|
|
|
|
foreach (var entity in entities)
|
|
|
|
|
|
{
|
2019-09-09 14:50:12 -07:00
|
|
|
|
// prevents taking items out of inventories, out of containers, and orphaning child entities
|
|
|
|
|
|
if(!entity.Transform.IsMapTransform)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
2020-04-17 15:40:17 +02:00
|
|
|
|
// only items that can be stored in an inventory, or a mob, can be eaten by a locker
|
Bodysystem and damagesystem rework (#1544)
* Things and stuff with grids, unfinished w/ code debug changes.
* Updated submodule and also lost some progress cause I fucked it up xd
* First unfinished draft of the BodySystem. Doesn't compile.
* More changes to make it compile, but still just a framework. Doesn't do anything at the moment.
* Many cleanup changes.
* Revert "Merge branch 'master' of https://github.com/GlassEclipse/space-station-14 into body_system"
This reverts commit ddd4aebbc76cf2a0b7b102f72b93d55a0816c88c, reversing
changes made to 12d0dd752706bdda8879393bd8191a1199a0c978.
* Commit human.yml
* Updated a lot of things to be more classy, more progress overall, etc. etc.
* Latest update with many changes
* Minor changes
* Fixed Travis build bug
* Adds first draft of Body Scanner console, apparently I also forgot to tie Mechanisms into body parts so now a heart just sits in the Torso like a good boy :)
* Commit rest of stuff
* Latest changes
* Latest changes again
* 14 naked cowboys
* Yay!
* Latest changes (probably doesnt compile)
* Surgery!!!!!!!!!~1116y
* Cleaned some stuff up
* More cleanup
* Refactoring of code. Basic surgery path now done.
* Removed readme, has been added to HackMD
* Fixes typo (and thus test errors)
* WIP changes, committing so I can pull latest master changes
* Still working on that god awful merge
* Latest changes
* Latest changes!!
* Beginning of refactor to BoundUserInterface
* Surgery!
* Latest changes - fixes pr change requests and random fixes
* oops
* Fixes bodypart recursion
* Beginning of work on revamping the damage system.
* More latest changes
* Latest changes
* Finished merge
* Commit before removing old healthcode
* Almost done with removing speciescomponent...
* It compiles!!!
* yahoo more work
* Fixes to make it work
* Merge conflict fixes
* Deleting species visualizer was a mistake
* IDE warnings are VERBOTEN
* makes the server not kill itself on startup, some cleanup (#1)
* Namespaces, comments and exception fixes
* Fix conveyor and conveyor switch serialization
SS14 in reactive when
* Move damage, acts and body to shared
Damage cleanup
Comment cleanup
* Rename SpeciesComponent to RotationComponent and cleanup
Damage cleanup
Comment cleanup
* Fix nullable warnings
* Address old reviews
Fix off welder suicide damage type, deathmatch and suspicion
* Fix new test fail with units being able to accept items when unpowered
* Remove RotationComponent, change references to IBodyManagerComponent
* Add a bloodstream to humans
* More cleanups
* Add body conduits, connections, connectors substances and valves
* Revert "Add body conduits, connections, connectors substances and valves"
This reverts commit 9ab0b50e6b15fe98852d7b0836c0cdbf4bd76d20.
* Implement the heart mechanism behavior with the circulatory network
* Added network property to mechanism behaviors
* Changed human organ sprites and added missing ones
* Fix tests
* Add individual body part sprite rendering
* Fix error where dropped mechanisms are not initialized
* Implement client/server body damage
* Make DamageContainer take care of raising events
* Reimplement medical scanner with the new body system
* Improve the medical scanner ui
* Merge conflict fixes
* Fix crash when colliding with something
* Fix microwave suicides and eyes sprite rendering
* Fix nullable reference error
* Fix up surgery client side
* Fix missing using from merge conflict
* Add breathing
*inhale
* Merge conflict fixes
* Fix accumulatedframetime being reset to 0 instead of decreased by the threshold
https://github.com/space-wizards/space-station-14/pull/1617
* Use and add to the new AtmosHelpers
* Fix feet
* Add proper coloring to dropped body parts
* Fix Urist's lungs being too strong
* Merge conflict fixes
* Merge conflict fixes
* Merge conflict fixes
Co-authored-by: GlassEclipse <tsymall5@gmail.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
Co-authored-by: AJCM-git <60196617+AJCM-git@users.noreply.github.com>
2020-08-17 01:42:42 +02:00
|
|
|
|
if (!entity.HasComponent<StorableComponent>() &&
|
2020-10-10 15:25:13 +02:00
|
|
|
|
!entity.HasComponent<IBody>())
|
2019-09-09 14:50:12 -07:00
|
|
|
|
continue;
|
2020-02-09 06:42:12 -03:00
|
|
|
|
|
2019-04-17 23:26:00 +02:00
|
|
|
|
if (!AddToContents(entity))
|
|
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
count++;
|
2020-07-03 14:54:45 +02:00
|
|
|
|
if (count >= _storageCapacityMax)
|
2019-04-17 23:26:00 +02:00
|
|
|
|
{
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2019-07-27 09:23:00 +02:00
|
|
|
|
|
2019-04-17 23:26:00 +02:00
|
|
|
|
ModifyComponents();
|
2020-07-07 13:19:00 -04:00
|
|
|
|
EntitySystem.Get<AudioSystem>().PlayFromEntity("/Audio/Machines/closetclose.ogg", Owner);
|
2020-05-25 13:58:56 +02:00
|
|
|
|
_lastInternalOpenAttempt = default;
|
2019-04-17 23:26:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void OpenStorage()
|
|
|
|
|
|
{
|
|
|
|
|
|
Open = true;
|
|
|
|
|
|
EmptyContents();
|
|
|
|
|
|
ModifyComponents();
|
2020-07-07 13:19:00 -04:00
|
|
|
|
EntitySystem.Get<AudioSystem>().PlayFromEntity("/Audio/Machines/closetopen.ogg", Owner);
|
2019-04-17 23:26:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void ModifyComponents()
|
2019-07-27 09:23:00 +02:00
|
|
|
|
{
|
2020-10-11 16:36:58 +02:00
|
|
|
|
if (!_isCollidableWhenOpen && Owner.TryGetComponent<IPhysicsComponent>(out var physics))
|
2019-04-17 23:26:00 +02:00
|
|
|
|
{
|
2020-07-02 06:31:55 -07:00
|
|
|
|
if (Open)
|
|
|
|
|
|
{
|
2020-10-11 16:36:58 +02:00
|
|
|
|
physics.Hard = false;
|
2020-07-02 06:31:55 -07:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2020-10-11 16:36:58 +02:00
|
|
|
|
physics.Hard = true;
|
2020-07-02 06:31:55 -07:00
|
|
|
|
}
|
2019-04-17 23:26:00 +02:00
|
|
|
|
}
|
2019-05-05 18:52:06 +02:00
|
|
|
|
|
2019-04-17 23:26:00 +02:00
|
|
|
|
if (Owner.TryGetComponent<PlaceableSurfaceComponent>(out var placeableSurfaceComponent))
|
|
|
|
|
|
{
|
|
|
|
|
|
placeableSurfaceComponent.IsPlaceable = Open;
|
|
|
|
|
|
}
|
2019-05-05 18:52:06 +02:00
|
|
|
|
|
|
|
|
|
|
if (Owner.TryGetComponent(out AppearanceComponent appearance))
|
|
|
|
|
|
{
|
|
|
|
|
|
appearance.SetData(StorageVisuals.Open, Open);
|
|
|
|
|
|
}
|
2019-04-17 23:26:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-05 18:52:06 +02:00
|
|
|
|
private bool AddToContents(IEntity entity)
|
2019-04-17 23:26:00 +02:00
|
|
|
|
{
|
2020-10-11 16:36:58 +02:00
|
|
|
|
var physics = Owner.GetComponent<IPhysicsComponent>();
|
|
|
|
|
|
if (entity.TryGetComponent(out IPhysicsComponent entityPhysicsComponent))
|
2019-04-17 23:26:00 +02:00
|
|
|
|
{
|
2020-10-11 16:36:58 +02:00
|
|
|
|
if(MaxSize < entityPhysicsComponent.WorldAABB.Size.X
|
|
|
|
|
|
|| MaxSize < entityPhysicsComponent.WorldAABB.Size.Y)
|
2019-04-17 23:26:00 +02:00
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-10-11 16:36:58 +02:00
|
|
|
|
if (physics.WorldAABB.Left > entityPhysicsComponent.WorldAABB.Left)
|
2019-04-17 23:26:00 +02:00
|
|
|
|
{
|
2020-10-11 16:36:58 +02:00
|
|
|
|
entity.Transform.WorldPosition += new Vector2(physics.WorldAABB.Left - entityPhysicsComponent.WorldAABB.Left, 0);
|
2019-04-17 23:26:00 +02:00
|
|
|
|
}
|
2020-10-11 16:36:58 +02:00
|
|
|
|
else if (physics.WorldAABB.Right < entityPhysicsComponent.WorldAABB.Right)
|
2019-04-17 23:26:00 +02:00
|
|
|
|
{
|
2020-10-11 16:36:58 +02:00
|
|
|
|
entity.Transform.WorldPosition += new Vector2(physics.WorldAABB.Right - entityPhysicsComponent.WorldAABB.Right, 0);
|
2019-04-17 23:26:00 +02:00
|
|
|
|
}
|
2020-10-11 16:36:58 +02:00
|
|
|
|
if (physics.WorldAABB.Bottom > entityPhysicsComponent.WorldAABB.Bottom)
|
2019-04-17 23:26:00 +02:00
|
|
|
|
{
|
2020-10-11 16:36:58 +02:00
|
|
|
|
entity.Transform.WorldPosition += new Vector2(0, physics.WorldAABB.Bottom - entityPhysicsComponent.WorldAABB.Bottom);
|
2019-04-17 23:26:00 +02:00
|
|
|
|
}
|
2020-10-11 16:36:58 +02:00
|
|
|
|
else if (physics.WorldAABB.Top < entityPhysicsComponent.WorldAABB.Top)
|
2019-04-17 23:26:00 +02:00
|
|
|
|
{
|
2020-10-11 16:36:58 +02:00
|
|
|
|
entity.Transform.WorldPosition += new Vector2(0, physics.WorldAABB.Top - entityPhysicsComponent.WorldAABB.Top);
|
2019-04-17 23:26:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2020-07-26 20:49:41 +02:00
|
|
|
|
if (Contents.CanInsert(entity))
|
2019-04-17 23:26:00 +02:00
|
|
|
|
{
|
2019-09-15 15:29:16 -07:00
|
|
|
|
// Because Insert sets the local position to (0,0), and we want to keep the contents spread out,
|
|
|
|
|
|
// we re-apply the world position after inserting.
|
2020-01-03 17:28:16 -08:00
|
|
|
|
Vector2 worldPos;
|
|
|
|
|
|
if (entity.HasComponent<IActorComponent>())
|
|
|
|
|
|
{
|
|
|
|
|
|
worldPos = Owner.Transform.WorldPosition;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
worldPos = entity.Transform.WorldPosition;
|
|
|
|
|
|
}
|
2020-07-26 20:49:41 +02:00
|
|
|
|
Contents.Insert(entity);
|
2019-09-15 15:29:16 -07:00
|
|
|
|
entity.Transform.WorldPosition = worldPos;
|
2020-10-11 16:36:58 +02:00
|
|
|
|
if (entityPhysicsComponent != null)
|
2020-04-17 15:40:17 +02:00
|
|
|
|
{
|
2020-10-11 16:36:58 +02:00
|
|
|
|
entityPhysicsComponent.CanCollide = false;
|
2020-04-17 15:40:17 +02:00
|
|
|
|
}
|
2019-04-17 23:26:00 +02:00
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void EmptyContents()
|
|
|
|
|
|
{
|
2020-07-26 20:49:41 +02:00
|
|
|
|
foreach (var contained in Contents.ContainedEntities.ToArray())
|
2019-04-17 23:26:00 +02:00
|
|
|
|
{
|
2020-07-26 20:49:41 +02:00
|
|
|
|
if(Contents.Remove(contained))
|
2020-04-17 15:40:17 +02:00
|
|
|
|
{
|
2020-10-11 16:36:58 +02:00
|
|
|
|
if (contained.TryGetComponent<IPhysicsComponent>(out var physics))
|
2020-04-17 15:40:17 +02:00
|
|
|
|
{
|
2020-10-11 16:36:58 +02:00
|
|
|
|
physics.CanCollide = true;
|
2020-04-17 15:40:17 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2019-04-17 23:26:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-01-03 13:38:58 -08:00
|
|
|
|
/// <inheritdoc />
|
2020-04-20 10:36:02 +01:00
|
|
|
|
public override void HandleMessage(ComponentMessage message, IComponent component)
|
2019-04-17 23:26:00 +02:00
|
|
|
|
{
|
2020-04-20 10:36:02 +01:00
|
|
|
|
base.HandleMessage(message, component);
|
2019-04-17 23:26:00 +02:00
|
|
|
|
|
|
|
|
|
|
switch (message)
|
|
|
|
|
|
{
|
|
|
|
|
|
case RelayMovementEntityMessage msg:
|
2019-05-05 18:52:06 +02:00
|
|
|
|
if (msg.Entity.HasComponent<HandsComponent>())
|
2019-04-17 23:26:00 +02:00
|
|
|
|
{
|
2020-09-02 01:30:03 +02:00
|
|
|
|
if (_gameTiming.CurTime <
|
2020-05-25 13:58:56 +02:00
|
|
|
|
_lastInternalOpenAttempt + InternalOpenAttemptDelay)
|
|
|
|
|
|
{
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-09-02 01:30:03 +02:00
|
|
|
|
_lastInternalOpenAttempt = _gameTiming.CurTime;
|
2020-05-25 13:58:56 +02:00
|
|
|
|
TryOpenStorage(msg.Entity);
|
2019-04-17 23:26:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2019-05-05 18:52:06 +02:00
|
|
|
|
|
2020-05-25 13:58:56 +02:00
|
|
|
|
protected virtual void TryOpenStorage(IEntity user)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (IsWeldedShut)
|
|
|
|
|
|
{
|
|
|
|
|
|
Owner.PopupMessage(user, Loc.GetString("It's welded completely shut!"));
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
OpenStorage();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-01-03 13:38:58 -08:00
|
|
|
|
/// <inheritdoc />
|
2019-05-05 18:52:06 +02:00
|
|
|
|
public bool Remove(IEntity entity)
|
|
|
|
|
|
{
|
2020-07-26 20:49:41 +02:00
|
|
|
|
return Contents.CanRemove(entity);
|
2019-05-05 18:52:06 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-01-03 13:38:58 -08:00
|
|
|
|
/// <inheritdoc />
|
2019-05-05 18:52:06 +02:00
|
|
|
|
public bool Insert(IEntity entity)
|
|
|
|
|
|
{
|
|
|
|
|
|
// Trying to add while open just dumps it on the ground below us.
|
|
|
|
|
|
if (Open)
|
|
|
|
|
|
{
|
|
|
|
|
|
entity.Transform.WorldPosition = Owner.Transform.WorldPosition;
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-07-26 20:49:41 +02:00
|
|
|
|
return Contents.Insert(entity);
|
2019-05-05 18:52:06 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-01-03 13:38:58 -08:00
|
|
|
|
/// <inheritdoc />
|
2019-05-05 18:52:06 +02:00
|
|
|
|
public bool CanInsert(IEntity entity)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (Open)
|
|
|
|
|
|
{
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-07-26 20:49:41 +02:00
|
|
|
|
if (Contents.ContainedEntities.Count >= _storageCapacityMax)
|
2019-05-05 18:52:06 +02:00
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-07-26 20:49:41 +02:00
|
|
|
|
return Contents.CanInsert(entity);
|
2019-05-05 18:52:06 +02:00
|
|
|
|
}
|
2020-01-03 13:38:58 -08:00
|
|
|
|
|
2020-08-18 14:39:08 +02:00
|
|
|
|
async Task<bool> IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs)
|
2020-07-07 00:49:14 +02:00
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
if (Open)
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
if (!CanWeldShut)
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
2020-07-26 20:49:41 +02:00
|
|
|
|
if (Contents.Contains(eventArgs.User))
|
2020-07-19 16:32:04 -04:00
|
|
|
|
{
|
|
|
|
|
|
Owner.PopupMessage(eventArgs.User, Loc.GetString("It's too Cramped!"));
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-07-07 00:49:14 +02:00
|
|
|
|
if (!eventArgs.Using.TryGetComponent(out WelderComponent tool))
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
2020-08-18 14:39:08 +02:00
|
|
|
|
if (!await tool.UseTool(eventArgs.User, Owner, 1f, ToolQuality.Welding, 1f))
|
2020-07-07 00:49:14 +02:00
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
IsWeldedShut ^= true;
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void IDestroyAct.OnDestroy(DestructionEventArgs eventArgs)
|
|
|
|
|
|
{
|
|
|
|
|
|
Open = true;
|
|
|
|
|
|
EmptyContents();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-01-03 13:38:58 -08:00
|
|
|
|
[Verb]
|
|
|
|
|
|
private sealed class OpenToggleVerb : Verb<EntityStorageComponent>
|
|
|
|
|
|
{
|
2020-05-23 03:09:44 +02:00
|
|
|
|
protected override void GetData(IEntity user, EntityStorageComponent component, VerbData data)
|
2020-01-03 13:38:58 -08:00
|
|
|
|
{
|
2020-06-22 18:54:56 +02:00
|
|
|
|
if (!ActionBlockerSystem.CanInteract(user))
|
|
|
|
|
|
{
|
|
|
|
|
|
data.Visibility = VerbVisibility.Invisible;
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2020-05-25 13:58:56 +02:00
|
|
|
|
|
2020-06-22 18:54:56 +02:00
|
|
|
|
component.OpenVerbGetData(user, component, data);
|
2020-01-03 13:38:58 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
|
protected override void Activate(IEntity user, EntityStorageComponent component)
|
|
|
|
|
|
{
|
2020-05-25 13:58:56 +02:00
|
|
|
|
component.ToggleOpen(user);
|
2020-01-03 13:38:58 -08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2020-05-25 13:58:56 +02:00
|
|
|
|
|
|
|
|
|
|
protected virtual void OpenVerbGetData(IEntity user, EntityStorageComponent component, VerbData data)
|
|
|
|
|
|
{
|
2020-06-22 18:54:56 +02:00
|
|
|
|
if (!ActionBlockerSystem.CanInteract(user))
|
|
|
|
|
|
{
|
|
|
|
|
|
data.Visibility = VerbVisibility.Invisible;
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-05-25 13:58:56 +02:00
|
|
|
|
if (IsWeldedShut)
|
|
|
|
|
|
{
|
|
|
|
|
|
data.Visibility = VerbVisibility.Disabled;
|
|
|
|
|
|
var verb = Loc.GetString(component.Open ? "Close" : "Open");
|
|
|
|
|
|
data.Text = Loc.GetString("{0} (welded shut)", verb);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-08-29 13:36:02 +02:00
|
|
|
|
data.Text = Loc.GetString(component.Open ? "Close" : "Open");
|
2020-05-25 13:58:56 +02:00
|
|
|
|
}
|
2020-08-27 08:27:49 -06:00
|
|
|
|
|
|
|
|
|
|
void IExAct.OnExplosion(ExplosionEventArgs eventArgs)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (eventArgs.Severity < ExplosionSeverity.Heavy)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var entity in Contents.ContainedEntities)
|
|
|
|
|
|
{
|
|
|
|
|
|
var exActs = entity.GetAllComponents<IExAct>().ToArray();
|
|
|
|
|
|
foreach (var exAct in exActs)
|
|
|
|
|
|
{
|
|
|
|
|
|
exAct.OnExplosion(eventArgs);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2019-04-17 23:26:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|