Fix some tabletop prediction jank (#12758)
This commit is contained in:
@@ -16,7 +16,6 @@ using Robust.Shared.Input.Binding;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Timing;
|
||||
using static Robust.Shared.Input.Binding.PointerInputCmdHandler;
|
||||
using DrawDepth = Content.Shared.DrawDepth.DrawDepth;
|
||||
|
||||
namespace Content.Client.Tabletop
|
||||
{
|
||||
@@ -27,7 +26,6 @@ namespace Content.Client.Tabletop
|
||||
[Dependency] private readonly IUserInterfaceManager _uiManger = default!;
|
||||
[Dependency] private readonly IPlayerManager _playerManager = default!;
|
||||
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||
|
||||
// Time in seconds to wait until sending the location of a dragged entity to the server again
|
||||
private const float Delay = 1f / 10; // 10 Hz
|
||||
@@ -40,10 +38,11 @@ namespace Content.Client.Tabletop
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
UpdatesOutsidePrediction = true;
|
||||
|
||||
CommandBinds.Builder
|
||||
.Bind(EngineKeyFunctions.Use, new PointerInputCmdHandler(OnUse, false))
|
||||
.Bind(EngineKeyFunctions.Use, new PointerInputCmdHandler(OnUse, false, true))
|
||||
.Register<TabletopSystem>();
|
||||
|
||||
SubscribeNetworkEvent<TabletopPlayEvent>(OnTabletopPlay);
|
||||
@@ -57,12 +56,8 @@ namespace Content.Client.Tabletop
|
||||
StopDragging(false);
|
||||
}
|
||||
|
||||
public override void Update(float frameTime)
|
||||
public override void FrameUpdate(float frameTime)
|
||||
{
|
||||
// don't send network messages when doing prediction.
|
||||
if (!_gameTiming.IsFirstTimePredicted)
|
||||
return;
|
||||
|
||||
if (_window == null)
|
||||
return;
|
||||
|
||||
@@ -110,7 +105,7 @@ namespace Content.Client.Tabletop
|
||||
// Only send new position to server when Delay is reached
|
||||
if (_timePassed >= Delay && _table != null)
|
||||
{
|
||||
RaiseNetworkEvent(new TabletopMoveEvent(_draggedEntity.Value, clampedCoords, _table.Value));
|
||||
RaisePredictiveEvent(new TabletopMoveEvent(_draggedEntity.Value, clampedCoords, _table.Value));
|
||||
_timePassed -= Delay;
|
||||
}
|
||||
}
|
||||
@@ -169,6 +164,9 @@ namespace Content.Client.Tabletop
|
||||
|
||||
private bool OnUse(in PointerInputCmdArgs args)
|
||||
{
|
||||
if (!_gameTiming.IsFirstTimePredicted)
|
||||
return false;
|
||||
|
||||
return args.State switch
|
||||
{
|
||||
BoundKeyState.Down => OnMouseDown(args),
|
||||
@@ -216,13 +214,7 @@ namespace Content.Client.Tabletop
|
||||
/// <param name="viewport">The viewport in which we are dragging.</param>
|
||||
private void StartDragging(EntityUid draggedEntity, ScalingViewport viewport)
|
||||
{
|
||||
RaiseNetworkEvent(new TabletopDraggingPlayerChangedEvent(draggedEntity, true));
|
||||
|
||||
if (EntityManager.TryGetComponent<AppearanceComponent>(draggedEntity, out var appearance))
|
||||
{
|
||||
_appearance.SetData(draggedEntity, TabletopItemVisuals.Scale, new Vector2(1.25f, 1.25f), appearance);
|
||||
_appearance.SetData(draggedEntity, TabletopItemVisuals.DrawDepth, (int) DrawDepth.Items + 1, appearance);
|
||||
}
|
||||
RaisePredictiveEvent(new TabletopDraggingPlayerChangedEvent(draggedEntity, true));
|
||||
|
||||
_draggedEntity = draggedEntity;
|
||||
_viewport = viewport;
|
||||
@@ -237,7 +229,8 @@ namespace Content.Client.Tabletop
|
||||
// Set the dragging player on the component to noone
|
||||
if (broadcast && _draggedEntity != null && EntityManager.HasComponent<TabletopDraggableComponent>(_draggedEntity.Value))
|
||||
{
|
||||
RaiseNetworkEvent(new TabletopDraggingPlayerChangedEvent(_draggedEntity.Value, false));
|
||||
RaisePredictiveEvent(new TabletopMoveEvent(_draggedEntity.Value, Transform(_draggedEntity.Value).MapPosition, _table!.Value));
|
||||
RaisePredictiveEvent(new TabletopDraggingPlayerChangedEvent(_draggedEntity.Value, false));
|
||||
}
|
||||
|
||||
_draggedEntity = null;
|
||||
|
||||
Reference in New Issue
Block a user