End playing song when mob can't interact or player disconnects

This commit is contained in:
zumorica
2020-05-22 11:13:34 +02:00
parent 15beb2b87a
commit da128f13c4

View File

@@ -9,6 +9,8 @@ using Robust.Server.GameObjects;
using Robust.Server.GameObjects.Components.UserInterface; using Robust.Server.GameObjects.Components.UserInterface;
using Robust.Server.Interfaces.GameObjects; using Robust.Server.Interfaces.GameObjects;
using Robust.Server.Interfaces.Player; using Robust.Server.Interfaces.Player;
using Robust.Server.Player;
using Robust.Shared.Enums;
using Robust.Shared.GameObjects; using Robust.Shared.GameObjects;
using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.GameObjects;
using Robust.Shared.Interfaces.Network; using Robust.Shared.Interfaces.Network;
@@ -37,7 +39,7 @@ namespace Content.Server.GameObjects.Components.Instruments
/// The client channel currently playing the instrument, or null if there's none. /// The client channel currently playing the instrument, or null if there's none.
/// </summary> /// </summary>
[ViewVariables] [ViewVariables]
private ICommonSession _instrumentPlayer; private IPlayerSession _instrumentPlayer;
private bool _handheld; private bool _handheld;
[ViewVariables] [ViewVariables]
@@ -78,6 +80,29 @@ namespace Content.Server.GameObjects.Components.Instruments
} }
} }
public IPlayerSession InstrumentPlayer
{
get => _instrumentPlayer;
private set
{
Playing = false;
if(_instrumentPlayer != null)
_instrumentPlayer.PlayerStatusChanged -= OnPlayerStatusChanged;
_instrumentPlayer = value;
if(value != null)
_instrumentPlayer.PlayerStatusChanged += OnPlayerStatusChanged;
}
}
private void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e)
{
if (e.NewStatus == SessionStatus.Disconnected)
InstrumentPlayer = null;
}
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
@@ -100,12 +125,10 @@ namespace Content.Server.GameObjects.Components.Instruments
{ {
base.HandleNetworkMessage(message, channel, session); base.HandleNetworkMessage(message, channel, session);
// If the client that sent the message isn't the client playing this instrument, we ignore it.
if (session != _instrumentPlayer) return;
switch (message) switch (message)
{ {
case InstrumentMidiEventMessage midiEventMsg: case InstrumentMidiEventMessage midiEventMsg:
if (!Playing) if (!Playing || session != _instrumentPlayer)
return; return;
if (++_midiEventCount <= MaxMidiEventsPerSecond && if (++_midiEventCount <= MaxMidiEventsPerSecond &&
@@ -130,7 +153,7 @@ namespace Content.Server.GameObjects.Components.Instruments
{ {
Playing = false; Playing = false;
SendNetworkMessage(new InstrumentStopMidiMessage()); SendNetworkMessage(new InstrumentStopMidiMessage());
_instrumentPlayer = null; InstrumentPlayer = null;
_userInterface.CloseAll(); _userInterface.CloseAll();
} }
@@ -138,7 +161,7 @@ namespace Content.Server.GameObjects.Components.Instruments
{ {
Playing = false; Playing = false;
SendNetworkMessage(new InstrumentStopMidiMessage()); SendNetworkMessage(new InstrumentStopMidiMessage());
_instrumentPlayer = null; InstrumentPlayer = null;
_userInterface.CloseAll(); _userInterface.CloseAll();
} }
@@ -148,7 +171,7 @@ namespace Content.Server.GameObjects.Components.Instruments
if (session == null) return; if (session == null) return;
_instrumentPlayer = session; InstrumentPlayer = session;
} }
public void HandDeselected(HandDeselectedEventArgs eventArgs) public void HandDeselected(HandDeselectedEventArgs eventArgs)
@@ -163,10 +186,10 @@ namespace Content.Server.GameObjects.Components.Instruments
if (Handheld || !eventArgs.User.TryGetComponent(out IActorComponent actor)) if (Handheld || !eventArgs.User.TryGetComponent(out IActorComponent actor))
return; return;
if (_instrumentPlayer != null) if (InstrumentPlayer != null)
return; return;
_instrumentPlayer = actor.playerSession; InstrumentPlayer = actor.playerSession;
OpenUserInterface(actor.playerSession); OpenUserInterface(actor.playerSession);
} }
@@ -175,16 +198,16 @@ namespace Content.Server.GameObjects.Components.Instruments
if (!eventArgs.User.TryGetComponent(out IActorComponent actor)) if (!eventArgs.User.TryGetComponent(out IActorComponent actor))
return false; return false;
if(_instrumentPlayer == actor.playerSession) if(InstrumentPlayer == actor.playerSession)
OpenUserInterface(actor.playerSession); OpenUserInterface(actor.playerSession);
return false; return false;
} }
private void UserInterfaceOnClosed(IPlayerSession player) private void UserInterfaceOnClosed(IPlayerSession player)
{ {
if (!Handheld && player == _instrumentPlayer) if (!Handheld && player == InstrumentPlayer)
{ {
_instrumentPlayer = null; InstrumentPlayer = null;
SendNetworkMessage(new InstrumentStopMidiMessage()); SendNetworkMessage(new InstrumentStopMidiMessage());
Playing = false; Playing = false;
} }
@@ -199,15 +222,23 @@ namespace Content.Server.GameObjects.Components.Instruments
{ {
base.Update(delta); base.Update(delta);
if (_batchesDropped > MaxMidiBatchDropped && _instrumentPlayer != null) if (_instrumentPlayer != null && !ActionBlockerSystem.CanInteract(_instrumentPlayer.AttachedEntity))
InstrumentPlayer = null;
if (_batchesDropped > MaxMidiBatchDropped && InstrumentPlayer != null)
{ {
_batchesDropped = 0; _batchesDropped = 0;
var mob = _instrumentPlayer.AttachedEntity; var mob = InstrumentPlayer.AttachedEntity;
_userInterface.CloseAll();
if (mob.TryGetComponent(out StunnableComponent stun)) if (mob.TryGetComponent(out StunnableComponent stun))
stun.Stun(1); stun.Stun(1);
else else
StandingStateHelper.DropAllItemsInHands(mob); StandingStateHelper.DropAllItemsInHands(mob);
InstrumentPlayer = null;
_notifyManager.PopupMessage(Owner, mob, "Your fingers cramp up from playing!"); _notifyManager.PopupMessage(Owner, mob, "Your fingers cramp up from playing!");
} }