Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions Robust.Client/GameObjects/ClientEntityManager.Spawn.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,33 @@ public override bool PredictedTrySpawnInContainer(
return true;
}

public override bool PredictedTrySpawnInContainer(
string? protoName,
BaseContainer container,
[NotNullWhen(true)] out EntityUid? uid,
ComponentRegistry? overrides = null)
{
if (!TrySpawnInContainer(protoName, container, out uid, overrides))
return false;

FlagPredicted(uid.Value);
return true;
}

public override bool PredictedTrySpawnInContainer(
string? protoName,
BaseContainer container,
[NotNullWhen(true)] out EntityUid? uid,
EntityUid? mapUid,
ComponentRegistry? overrides = null)
{
if (!TrySpawnInContainer(protoName, container, out uid, mapUid, overrides))
return false;

FlagPredicted(uid.Value);
return true;
}

public override EntityUid PredictedSpawnNextToOrDrop(string? protoName, EntityUid target, TransformComponent? xform = null, ComponentRegistry? overrides = null)
{
var ent = SpawnNextToOrDrop(protoName, target, xform, overrides);
Expand Down Expand Up @@ -117,6 +144,38 @@ public override EntityUid PredictedSpawnInContainerOrDrop(
return ent;
}

public override EntityUid PredictedSpawnInContainerOrDrop(
string? protoName,
BaseContainer container,
TransformComponent? xform = null,
ContainerManagerComponent? containerComp = null,
ComponentRegistry? overrides = null)
{
var ent = SpawnInContainerOrDrop(protoName, container, xform, containerComp, overrides);

FlagPredicted(ent);
return ent;
}

public override EntityUid PredictedSpawnInContainerOrDrop(
string? protoName,
BaseContainer container,
out bool inserted,
TransformComponent? xform = null,
ContainerManagerComponent? containerComp = null,
ComponentRegistry? overrides = null)
{
var ent = SpawnInContainerOrDrop(protoName,
container,
out inserted,
xform,
containerComp,
overrides);

FlagPredicted(ent);
return ent;
}

public override void FlagPredicted(Entity<MetaDataComponent?> ent)
{
if (!MetaQuery.Resolve(ent.Owner, ref ent.Comp))
Expand Down
11 changes: 11 additions & 0 deletions Robust.Shared/Containers/SharedContainerSystem.Insert.cs
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,17 @@ public bool Insert(Entity<TransformComponent?, MetaDataComponent?, PhysicsCompon
return true;
}

/// <inheritdoc cref="InsertOrDrop(Entity{TransformComponent?,MetaDataComponent?,PhysicsComponent?},BaseContainer,TransformComponent?)"/>
public bool InsertOrDrop(Entity<ContainerManagerComponent?, TransformComponent?> container, Entity<TransformComponent?, MetaDataComponent?, PhysicsComponent?> toInsert,
string containerId)
{
if (TryGetContainer(container, containerId, out var baseContainer, container))
return InsertOrDrop(toInsert, baseContainer, container.Comp2);

_transform.DropNextTo(toInsert, (container.Owner, container.Comp2));
return false;
}
Comment thread
Princess-Cheeseballs marked this conversation as resolved.

/// <summary>
/// Attempts to insert an entity into a container. If it fails, it will instead drop the entity next to the
/// container entity.
Expand Down
165 changes: 126 additions & 39 deletions Robust.Shared/GameObjects/EntityManager.Spawn.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
using Robust.Shared.Collections;
using Robust.Shared.Containers;
using Robust.Shared.Maths;
using Robust.Shared.Serialization;

namespace Robust.Shared.GameObjects;

Expand Down Expand Up @@ -145,20 +144,11 @@ public bool TrySpawnNextTo(
if (!xform.ParentUid.IsValid())
return false;

if (!_containers.TryGetContainingContainer(target, out var container))
{
uid = SpawnNextToOrDrop(protoName, target, xform, overrides);
return true;
}

var doMapInit = _mapSystem.IsInitialized(xform.MapUid);
uid = Spawn(protoName, overrides, doMapInit);
if (_containers.Insert(uid.Value, container))
return true;
if (_containers.TryGetContainingContainer(target, out var container))
return TrySpawnInContainer(protoName, container, out uid, xform.MapUid, overrides);

DeleteEntity(uid.Value);
uid = null;
return false;
uid = SpawnNextToOrDrop(protoName, target, xform, overrides);
return true;
}

public bool TrySpawnInContainer(
Expand All @@ -170,21 +160,45 @@ public bool TrySpawnInContainer(
ComponentRegistry? overrides = null)
{
uid = null;
if (containerComp == null && !TryGetComponent(containerUid, out containerComp))
return false;
return _containers.TryGetContainer(containerUid, containerId, out var container, containerComp)
&& TrySpawnInContainer(protoName, container, out uid, overrides);
}

if (!containerComp.Containers.TryGetValue(containerId, out var container))
return false;
public bool TrySpawnInContainer(
string? protoName,
BaseContainer container,
[NotNullWhen(true)] out EntityUid? uid,
ComponentRegistry? overrides = null)
{
return TrySpawnInContainer(protoName, container, out uid, TransformQuery.Comp(container.Owner).MapUid, overrides);
}

var doMapInit = _mapSystem.IsInitialized(TransformQuery.GetComponent(containerUid).MapUid);
uid = Spawn(protoName, overrides, doMapInit);
/// <summary>
/// Attempts to spawn an entity prototype in a container then initialize it once it has been successfully inserted into the container.
/// Deletes the entity if it fails to insert.
/// </summary>
/// <returns>True if entity was spawned and inserted successfully</returns>
public bool TrySpawnInContainer(
string? protoName,
BaseContainer container,
[NotNullWhen(true)] out EntityUid? uid,
EntityUid? mapUid,
ComponentRegistry? overrides = null)
{
uid = CreateEntityUninitialized(protoName, out var meta, overrides);
InitializeAndStartEntity((uid.Value, meta), doMapInit: false);

if (_containers.Insert(uid.Value, container))
return true;
if (!_containers.Insert(uid.Value, container))
{
DeleteEntity(uid);
uid = null;
return false;
}

DeleteEntity(uid.Value);
uid = null;
return false;
if (_mapSystem.IsInitialized(mapUid))
RunMapInit(uid.Value, meta);

return true;
}

public EntityUid SpawnNextToOrDrop(string? protoName, EntityUid target, TransformComponent? xform = null, ComponentRegistry? overrides = null)
Expand All @@ -193,9 +207,13 @@ public EntityUid SpawnNextToOrDrop(string? protoName, EntityUid target, Transfor
if (!xform.ParentUid.IsValid())
return Spawn(protoName);

var doMapInit = _mapSystem.IsInitialized(xform.MapUid);
var uid = Spawn(protoName, overrides, doMapInit);
var uid = CreateEntityUninitialized(protoName, out var meta, overrides);
InitializeAndStartEntity((uid, meta), doMapInit: false);
_xforms.DropNextTo(uid, target);

if (_mapSystem.IsInitialized(xform.MapUid))
RunMapInit(uid, meta);

return uid;
}

Expand All @@ -219,19 +237,43 @@ public EntityUid SpawnInContainerOrDrop(
ContainerManagerComponent? containerComp = null,
ComponentRegistry? overrides = null)
{
inserted = true;
xform ??= TransformQuery.GetComponent(containerUid);
var doMapInit = _mapSystem.IsInitialized(xform.MapUid);
var uid = Spawn(protoName, overrides, doMapInit);
xform ??= TransformQuery.Comp(containerUid);
var uid = CreateEntityUninitialized(protoName, out var meta, overrides);
InitializeAndStartEntity((uid, meta), doMapInit: false);

if ((containerComp == null && !TryGetComponent(containerUid, out containerComp))
|| !containerComp.Containers.TryGetValue(containerId, out var container)
|| !_containers.Insert(uid, container))
{
inserted = false;
if (xform.ParentUid.IsValid())
_xforms.DropNextTo(uid, (containerUid, xform));
}
inserted = _containers.InsertOrDrop((containerUid, containerComp, xform), uid, containerId);

if (_mapSystem.IsInitialized(xform.MapUid))
RunMapInit(uid, meta);

return uid;
}

public EntityUid SpawnInContainerOrDrop(
string? protoName,
BaseContainer container,
TransformComponent? xform = null,
ContainerManagerComponent? containerComp = null,
ComponentRegistry? overrides = null)
{
return SpawnInContainerOrDrop(protoName, container, out _, xform, containerComp, overrides);
}

public EntityUid SpawnInContainerOrDrop(
string? protoName,
BaseContainer container,
out bool inserted,
TransformComponent? xform = null,
ContainerManagerComponent? containerComp = null,
ComponentRegistry? overrides = null)
{
xform ??= TransformQuery.Comp(container.Owner);
var uid = CreateEntityUninitialized(protoName, out var meta, overrides);
InitializeAndStartEntity((uid, meta), doMapInit: false);

inserted = _containers.InsertOrDrop(uid, container);
if (_mapSystem.IsInitialized(xform.MapUid))
RunMapInit(uid, meta);

return uid;
}
Expand Down Expand Up @@ -284,6 +326,25 @@ public virtual bool PredictedTrySpawnInContainer(
return TrySpawnInContainer(protoName, containerUid, containerId, out uid, containerComp, overrides);
}

public virtual bool PredictedTrySpawnInContainer(
string? protoName,
BaseContainer container,
[NotNullWhen(true)] out EntityUid? uid,
ComponentRegistry? overrides = null)
{
return TrySpawnInContainer(protoName, container, out uid, overrides);
}

public virtual bool PredictedTrySpawnInContainer(
string? protoName,
BaseContainer container,
[NotNullWhen(true)] out EntityUid? uid,
EntityUid? mapUid,
ComponentRegistry? overrides = null)
{
return TrySpawnInContainer(protoName, container, out uid, mapUid, overrides);
}

public virtual EntityUid PredictedSpawnNextToOrDrop(string? protoName, EntityUid target, TransformComponent? xform = null, ComponentRegistry? overrides = null)
{
return SpawnNextToOrDrop(protoName, target, xform, overrides);
Expand Down Expand Up @@ -318,6 +379,32 @@ public virtual EntityUid PredictedSpawnInContainerOrDrop(
overrides);
}

public virtual EntityUid PredictedSpawnInContainerOrDrop(
string? protoName,
BaseContainer container,
TransformComponent? xform = null,
ContainerManagerComponent? containerComp = null,
ComponentRegistry? overrides = null)
{
return SpawnInContainerOrDrop(protoName, container, xform, containerComp, overrides);
}

public virtual EntityUid PredictedSpawnInContainerOrDrop(
string? protoName,
BaseContainer container,
out bool inserted,
TransformComponent? xform = null,
ContainerManagerComponent? containerComp = null,
ComponentRegistry? overrides = null)
{
return SpawnInContainerOrDrop(protoName,
container,
out inserted,
xform,
containerComp,
overrides);
}

/// <summary>
/// Flags an entity as being a predicted spawn and should be deleted when its corresponding tick comes in.
/// </summary>
Expand Down
Loading
Loading