/// /// <param name="logMissingGibable">Should we log if we are missing a gibbableComp when we call this function</param>
/// <param name="launchImpulseVariance">The variation in giblet launch impulse (if we are launching them!)</param>
/// <returns>True if successful, false if not</returns>
- public bool TryGibEntity(EntityUid outerEntity, Entity<GibbableComponent?> gibbable, GibType gibType,
+ public bool TryGibEntity(Entity<TransformComponent?> outerEntity, Entity<GibbableComponent?> gibbable, GibType gibType,
GibContentsOption gibContentsOption,
out HashSet<EntityUid> droppedEntities, bool launchGibs = true,
Vector2 launchDirection = default, float launchImpulse = 0f, float launchImpulseVariance = 0f,
/// <param name="logMissingGibable">Should we log if we are missing a gibbableComp when we call this function</param>
/// <returns>True if successful, false if not</returns>
public bool TryGibEntityWithRef(
- EntityUid outerEntity,
+ Entity<TransformComponent?> outerEntity,
Entity<GibbableComponent?> gibbable,
GibType gibType,
GibContentsOption gibContentsOption,
{
if (!Resolve(gibbable, ref gibbable.Comp, logMissing: false))
{
- DropEntity(gibbable, Transform(outerEntity), randomSpreadMod, ref droppedEntities,
+ DropEntity(gibbable, (outerEntity, Transform(outerEntity)), randomSpreadMod, ref droppedEntities,
launchGibs, launchDirection, launchImpulse, launchImpulseVariance, launchCone);
if (logMissingGibable)
{
randomSpreadMod = 0;
}
- var parentXform = Transform(outerEntity);
HashSet<BaseContainer> validContainers = new();
var gibContentsAttempt =
new AttemptEntityContentsGibEvent(gibbable, gibContentsOption, allowedContainers, excludedContainers);
{
foreach (var ent in container.ContainedEntities)
{
- DropEntity(new Entity<GibbableComponent?>(ent, null), parentXform, randomSpreadMod,
+ DropEntity(new Entity<GibbableComponent?>(ent, null), outerEntity, randomSpreadMod,
ref droppedEntities, launchGibs,
launchDirection, launchImpulse, launchImpulseVariance, launchCone);
}
{
foreach (var ent in container.ContainedEntities)
{
- GibEntity(new Entity<GibbableComponent?>(ent, null), parentXform, randomSpreadMod,
+ GibEntity(new Entity<GibbableComponent?>(ent, null), outerEntity, randomSpreadMod,
ref droppedEntities, launchGibs,
launchDirection, launchImpulse, launchImpulseVariance, launchCone);
}
break;
case GibType.Drop:
{
- DropEntity(gibbable, parentXform, randomSpreadMod, ref droppedEntities, launchGibs,
+ DropEntity(gibbable, outerEntity, randomSpreadMod, ref droppedEntities, launchGibs,
launchDirection, launchImpulse, launchImpulseVariance, launchCone);
break;
}
case GibType.Gib:
{
- GibEntity(gibbable, parentXform, randomSpreadMod, ref droppedEntities, launchGibs,
+ GibEntity(gibbable, outerEntity, randomSpreadMod, ref droppedEntities, launchGibs,
launchDirection, launchImpulse, launchImpulseVariance, launchCone);
break;
}
if (playAudio)
{
- _audioSystem.PlayPredicted(gibbable.Comp.GibSound, parentXform.Coordinates, null);
+ _audioSystem.PlayPredicted(gibbable.Comp.GibSound, outerEntity, null);
}
if (gibType == GibType.Gib)
return true;
}
- private void DropEntity(Entity<GibbableComponent?> gibbable, TransformComponent parentXform, float randomSpreadMod,
+ private void DropEntity(Entity<GibbableComponent?> gibbable, Entity<TransformComponent?> parent, float randomSpreadMod,
ref HashSet<EntityUid> droppedEntities, bool flingEntity, Vector2? scatterDirection, float scatterImpulse,
float scatterImpulseVariance, Angle scatterCone)
{
gibCount = gibbable.Comp.GibCount;
}
+ if (!Resolve(parent, ref parent.Comp, logMissing: false))
+ return;
+
var gibAttemptEvent = new AttemptEntityGibEvent(gibbable, gibCount, GibType.Drop);
RaiseLocalEvent(gibbable, ref gibAttemptEvent);
switch (gibAttemptEvent.GibType)
case GibType.Skip:
return;
case GibType.Gib:
- GibEntity(gibbable, parentXform, randomSpreadMod, ref droppedEntities, flingEntity, scatterDirection,
+ GibEntity(gibbable, parent, randomSpreadMod, ref droppedEntities, flingEntity, scatterDirection,
scatterImpulse, scatterImpulseVariance, scatterCone, deleteTarget: false);
return;
}
- _transformSystem.AttachToGridOrMap(gibbable);
- _transformSystem.SetCoordinates(gibbable, parentXform.Coordinates);
+ _transformSystem.DropNextTo(gibbable.Owner, parent);
_transformSystem.SetWorldRotation(gibbable, _random.NextAngle());
droppedEntities.Add(gibbable);
if (flingEntity)
RaiseLocalEvent(gibbable, ref gibbedEvent);
}
- private List<EntityUid> GibEntity(Entity<GibbableComponent?> gibbable, TransformComponent parentXform,
+ private List<EntityUid> GibEntity(Entity<GibbableComponent?> gibbable, Entity<TransformComponent?> parent,
float randomSpreadMod,
ref HashSet<EntityUid> droppedEntities, bool flingEntity, Vector2? scatterDirection, float scatterImpulse,
float scatterImpulseVariance, Angle scatterCone, bool deleteTarget = true)
gibProtoCount = gibbable.Comp.GibPrototypes.Count;
}
+ if (!Resolve(parent, ref parent.Comp, logMissing: false))
+ return [];
+
var gibAttemptEvent = new AttemptEntityGibEvent(gibbable, gibCount, GibType.Drop);
RaiseLocalEvent(gibbable, ref gibAttemptEvent);
switch (gibAttemptEvent.GibType)
case GibType.Skip:
return localGibs;
case GibType.Drop:
- DropEntity(gibbable, parentXform, randomSpreadMod, ref droppedEntities, flingEntity,
+ DropEntity(gibbable, parent, randomSpreadMod, ref droppedEntities, flingEntity,
scatterDirection, scatterImpulse, scatterImpulseVariance, scatterCone);
localGibs.Add(gibbable);
return localGibs;
{
for (var i = 0; i < gibAttemptEvent.GibletCount; i++)
{
- if (!TryCreateRandomGiblet(gibbable.Comp, parentXform.Coordinates, false, out var giblet,
+ if (!TryCreateRandomGiblet(gibbable.Comp, parent.Comp.Coordinates, false, out var giblet,
randomSpreadMod))
continue;
FlingDroppedEntity(giblet.Value, scatterDirection, scatterImpulse, scatterImpulseVariance,
{
for (var i = 0; i < gibAttemptEvent.GibletCount; i++)
{
- if (TryCreateRandomGiblet(gibbable.Comp, parentXform.Coordinates, false, out var giblet,
+ if (TryCreateRandomGiblet(gibbable.Comp, parent.Comp.Coordinates, false, out var giblet,
randomSpreadMod))
droppedEntities.Add(giblet.Value);
}