* removed DropHandsItemEvent from standing state system, added DropHandsItemEvent calls in slippery system and shared stun system
* added DropHandItemsEvent calls in mobstate system subscribers
* Added DropHandItemsEvent call in SharedBodySystem.Parts
* Add a standingState check in RemoveLeg so removing the legs of a downed person won't cause them to drop items
* new method for downing + dropping held items in mobstatesystem
* mild cleanup
* Bugfix
* update BuckleTest to reflect new item dropping behavior when removing legs
* light cleanup
---------
Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
// Still buckled
Assert.That(buckle.Buckled);
- // Now with no item in any hand
+ // Still with items in hand
foreach (var hand in hands.Hands.Keys)
{
- Assert.That(handsSys.GetHeldItem((human, hands), hand), Is.Null);
+ Assert.That(handsSys.GetHeldItem((human, hands), hand), Is.Not.Null);
}
buckleSystem.Unbuckle(human, human);
using Content.Shared.Damage;
using Content.Shared.Damage.Prototypes;
using Content.Shared.Movement.Components;
+using Content.Shared.Standing;
using Robust.Shared.Containers;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
if (!Resolve(bodyEnt, ref bodyEnt.Comp, logMissing: false))
return;
- if (legEnt.Comp.PartType == BodyPartType.Leg)
- {
- bodyEnt.Comp.LegEntities.Remove(legEnt);
- UpdateMovementSpeed(bodyEnt);
- Dirty(bodyEnt, bodyEnt.Comp);
+ if (legEnt.Comp.PartType != BodyPartType.Leg)
+ return;
- if (!bodyEnt.Comp.LegEntities.Any())
- {
- Standing.Down(bodyEnt);
- }
- }
+ bodyEnt.Comp.LegEntities.Remove(legEnt);
+ UpdateMovementSpeed(bodyEnt);
+ Dirty(bodyEnt, bodyEnt.Comp);
+
+ if (bodyEnt.Comp.LegEntities.Count != 0)
+ return;
+
+ if (!TryComp<StandingStateComponent>(bodyEnt, out var standingState)
+ || !standingState.Standing
+ || !Standing.Down(bodyEnt, standingState: standingState))
+ return;
+
+ var ev = new DropHandItemsEvent();
+ RaiseLocalEvent(bodyEnt, ref ev);
}
private void PartRemoveDamage(Entity<BodyComponent?> bodyEnt, Entity<BodyPartComponent> partEnt)
args.Cancelled = true;
}
+ private void Down(EntityUid target)
+ {
+ _standing.Down(target);
+ var ev = new DropHandItemsEvent();
+ RaiseLocalEvent(target, ref ev);
+ }
+
private void CheckConcious(Entity<MobStateComponent> ent, ref ConsciousAttemptEvent args)
{
switch (ent.Comp.CurrentState)
switch (state)
{
case MobState.Alive:
+ {
_standing.Stand(target);
_appearance.SetData(target, MobStateVisuals.State, MobState.Alive);
break;
+ }
case MobState.Critical:
- _standing.Down(target);
+ {
+ Down(target);
_appearance.SetData(target, MobStateVisuals.State, MobState.Critical);
break;
+ }
case MobState.Dead:
+ {
EnsureComp<CollisionWakeComponent>(target);
- _standing.Down(target);
+ Down(target);
_appearance.SetData(target, MobStateVisuals.State, MobState.Dead);
break;
+ }
case MobState.Invalid:
+ {
//unused;
break;
+ }
default:
+ {
throw new NotImplementedException();
+ }
}
}
using Content.Shared.Inventory;
using Content.Shared.Movement.Components;
using Content.Shared.Movement.Systems;
+using Content.Shared.Standing;
using Content.Shared.StatusEffectNew;
using Content.Shared.StepTrigger.Systems;
using Content.Shared.Stunnable;
// Preventing from playing the slip sound and stunning when you are already knocked down.
if (!knockedDown)
{
+ var evDropHands = new DropHandItemsEvent();
+ RaiseLocalEvent(uid, ref evDropHands);
+
// Status effects should handle a TimeSpan of 0 properly...
_stun.TryUpdateStunDuration(other, component.SlipData.StunTime);
if (!standingState.Standing)
return true;
- // This is just to avoid most callers doing this manually saving boilerplate
- // 99% of the time you'll want to drop items but in some scenarios (e.g. buckling) you don't want to.
- // We do this BEFORE downing because something like buckle may be blocking downing but we want to drop hand items anyway
- // and ultimately this is just to avoid boilerplate in Down callers + keep their behavior consistent.
- if (dropHeldItems && hands != null)
- {
- var ev = new DropHandItemsEvent();
- RaiseLocalEvent(uid, ref ev, false);
- }
-
if (!force)
{
var msg = new DownAttemptEvent();
var ev = new StunnedEvent(); // todo: rename event or change how it is raised - this event is raised each time duration of stun was externally changed
RaiseLocalEvent(uid, ref ev);
+ var evDropHands = new DropHandItemsEvent();
+ RaiseLocalEvent(uid, ref evDropHands);
+
var timeForLogs = duration.HasValue
? duration.Value.Seconds.ToString()
: "Infinite";