- Fix the unbuckle mispredicts.
- Fix unbuckle offset existing.
- Fix interaction range not aligning with interactionoutline system.
{
base.Initialize();
- SubscribeLocalEvent<BuckleComponent, ComponentHandleState>(OnHandleState);
SubscribeLocalEvent<BuckleComponent, AppearanceChangeEvent>(OnAppearanceChange);
SubscribeLocalEvent<StrapComponent, MoveEvent>(OnStrapMoveEvent);
}
}
}
- private void OnHandleState(Entity<BuckleComponent> ent, ref ComponentHandleState args)
- {
- if (args.Current is not BuckleState state)
- return;
-
- ent.Comp.DontCollide = state.DontCollide;
- ent.Comp.BuckleTime = state.BuckleTime;
- var strapUid = EnsureEntity<BuckleComponent>(state.BuckledTo, ent);
-
- SetBuckledTo(ent, strapUid == null ? null : new (strapUid.Value, null));
-
- var (uid, component) = ent;
-
- }
-
private void OnAppearanceChange(EntityUid uid, BuckleComponent component, ref AppearanceChangeEvent args)
{
if (!TryComp<RotationVisualsComponent>(uid, out var rotVisuals))
/// <summary>
/// This component allows an entity to be buckled to an entity with a <see cref="StrapComponent"/>.
/// </summary>
-[RegisterComponent, NetworkedComponent]
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause]
[Access(typeof(SharedBuckleSystem))]
public sealed partial class BuckleComponent : Component
{
/// across a table two tiles away" problem.
/// </summary>
[DataField]
- public float Range = SharedInteractionSystem.InteractionRange / 1.4f;
+ public float Range = SharedInteractionSystem.InteractionRange;
/// <summary>
/// True if the entity is buckled, false otherwise.
/// <summary>
/// Whether or not collisions should be possible with the entity we are strapped to
/// </summary>
- [DataField]
+ [DataField, AutoNetworkedField]
public bool DontCollide;
/// <summary>
/// <summary>
/// The time that this entity buckled at.
/// </summary>
- [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
+ [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField, AutoNetworkedField]
public TimeSpan? BuckleTime;
/// <summary>
/// The strap that this component is buckled to.
/// </summary>
- [DataField]
+ [DataField, AutoNetworkedField]
public EntityUid? BuckledTo;
/// <summary>
[ViewVariables] public int? OriginalDrawDepth;
}
-[Serializable, NetSerializable]
-public sealed class BuckleState(NetEntity? buckledTo, bool dontCollide, TimeSpan? buckleTime) : ComponentState
-{
- public readonly NetEntity? BuckledTo = buckledTo;
- public readonly bool DontCollide = dontCollide;
- public readonly TimeSpan? BuckleTime = buckleTime;
-}
-
public sealed partial class UnbuckleAlertEvent : BaseAlertEvent;
/// <summary>
/// <summary>
/// The entities that are currently buckled to this strap.
/// </summary>
- [ViewVariables]
+ [DataField, AutoNetworkedField]
public HashSet<EntityUid> BuckledEntities = new();
/// <summary>
[DataField, AutoNetworkedField]
public bool Enabled = true;
- /// <summary>
- /// You can specify the offset the entity will have after unbuckling.
- /// </summary>
- [DataField]
- public Vector2 UnbuckleOffset = Vector2.Zero;
-
/// <summary>
/// The sound to be played when a mob is buckled
/// </summary>
{
BuckleDoafterEarly((uid, comp), ev.Event, ev);
});
-
- SubscribeLocalEvent<BuckleComponent, ComponentGetState>(OnGetState);
- }
-
- private void OnGetState(Entity<BuckleComponent> ent, ref ComponentGetState args)
- {
- args.State = new BuckleState(GetNetEntity(ent.Comp.BuckledTo), ent.Comp.DontCollide, ent.Comp.BuckleTime);
}
private void OnBuckleComponentShutdown(Entity<BuckleComponent> ent, ref ComponentShutdown args)
protected void SetBuckledTo(Entity<BuckleComponent> buckle, Entity<StrapComponent?>? strap)
{
if (TryComp(buckle.Comp.BuckledTo, out StrapComponent? old))
+ {
old.BuckledEntities.Remove(buckle);
+ Dirty(buckle.Comp.BuckledTo.Value, old);
+ }
if (strap is {} strapEnt && Resolve(strapEnt.Owner, ref strapEnt.Comp))
{
strapEnt.Comp.BuckledEntities.Add(buckle);
+ Dirty(strapEnt);
_alerts.ShowAlert(buckle, strapEnt.Comp.BuckledAlertType);
}
else
if (buckleXform.ParentUid == strap.Owner && !Terminating(buckleXform.ParentUid))
{
- _container.AttachParentToContainerOrGrid((buckle, buckleXform));
+ _transform.PlaceNextTo((buckle, buckleXform), (strap.Owner, oldBuckledXform));
+ buckleXform.ActivelyLerping = false;
var oldBuckledToWorldRot = _transform.GetWorldRotation(strap);
- _transform.SetWorldRotation(buckleXform, oldBuckledToWorldRot);
+ _transform.SetWorldRotationNoLerp((buckle, buckleXform), oldBuckledToWorldRot);
- if (strap.Comp.UnbuckleOffset != Vector2.Zero)
- buckleXform.Coordinates = oldBuckledXform.Coordinates.Offset(strap.Comp.UnbuckleOffset);
+ // TODO: This is doing 4 moveevents this is why I left the warning in, if you're going to remove it make it only do 1 moveevent.
+ if (strap.Comp.BuckleOffset != Vector2.Zero)
+ {
+ buckleXform.Coordinates = oldBuckledXform.Coordinates.Offset(strap.Comp.BuckleOffset);
+ }
}
_rotationVisuals.ResetHorizontalAngle(buckle.Owner);
position: Down
rotation: -90
buckleOffset: "0,0.15"
- unbuckleOffset: "0,0.15"
buckleOnInteractHand: False
- type: Appearance
- type: GenericVisualizer