Skip to content

Commit

Permalink
Kick problem players that are not informing the server of there entit…
Browse files Browse the repository at this point in the history
…lement after 30 seconds/have not downloaded the beatmap within 30 seconds
  • Loading branch information
cubicgraphics committed Apr 8, 2024
1 parent 6ea9913 commit 1d05c2b
Show file tree
Hide file tree
Showing 9 changed files with 19 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ public interface IDedicatedInstance
InstanceConfiguration _configuration { get; }
bool IsRunning { get; }
long RunTime { get; }
//public int LiteNetPort { get; }
public int Port { get; }
MultiplayerGameState State { get; }

Expand All @@ -35,7 +34,7 @@ public interface IDedicatedInstance
Task Stop(CancellationToken cancellationToken = default);


void DisconnectPlayer(string UserId);
void DisconnectPlayer(IPlayer player);
int GetNextSortIndex();
void ReleaseSortIndex(int sortIndex);
byte GetNextConnectionId();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public interface IPlayer
Platform Platform { get; set; }
string PlatformUserId { get; set; }

uint? ENetPeerId { get; set; }
uint ENetPeerId { get; set; }

RollingAverage Latency { get; }
long SyncTime { get; }
Expand Down
15 changes: 6 additions & 9 deletions BeatTogether.DedicatedServer.Kernel/DedicatedInstance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -358,8 +358,6 @@ public override void OnConnect(EndPoint endPoint)
"Failed to retrieve player " +
$"(RemoteEndPoint='{endPoint}')."
);
//Disconnect(endPoint);
//TODO impliment for enet, enet peers cannot be located at this point as a peer ID is required to kick them
return;
}
PlayerConnectedEvent?.Invoke(player);
Expand Down Expand Up @@ -526,14 +524,13 @@ public override void OnConnect(EndPoint endPoint)

}

public void DisconnectPlayer(string UserId) //Used by master servers kick player event
public void DisconnectPlayer(IPlayer player)
{

if(_playerRegistry.TryGetPlayer(UserId, out var player))
PacketDispatcher.SendToPlayer(player, new KickPlayerPacket
{
DisconnectedReason = DisconnectedReason.Kicked
}, IgnoranceChannelTypes.Reliable);
PacketDispatcher.SendToPlayer(player, new KickPlayerPacket
{
DisconnectedReason = DisconnectedReason.Kicked
}, IgnoranceChannelTypes.Reliable);
KickPeer(player.ENetPeerId);
}

public override void OnDisconnect(EndPoint endPoint)
Expand Down
6 changes: 1 addition & 5 deletions BeatTogether.DedicatedServer.Kernel/ENet/ENetServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -246,11 +246,7 @@ public void KickAllPeers()

public void Send(IPlayer player, ReadOnlySpan<byte> message, IgnoranceChannelTypes deliveryMethod)
{
if (!player.ENetPeerId.HasValue)
// Not an ENet peer
return;

Send(player.ENetPeerId.Value, message, deliveryMethod);
Send(player.ENetPeerId, message, deliveryMethod);
}

public void Send(uint peerId, ReadOnlySpan<byte> message, IgnoranceChannelTypes deliveryMethod)
Expand Down
7 changes: 4 additions & 3 deletions BeatTogether.DedicatedServer.Kernel/Managers/LobbyManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -235,14 +235,15 @@ private void CountingDown(bool isReady, bool NotStartable)
}
if (CountdownEndTime + _configuration.SendPlayersWithoutEntitlementToSpectateTimeout <= _instance.RunTime) //If takes too long to start then players are sent to spectate by telling them the beatmap already started
{
_logger.Debug($"Took too long to start, sending problem players to spectate");
_logger.Debug($"Took too long to start, kicking problem players");
IPlayer[] MissingEntitlement = _playerRegistry.Players.Where(p => p.GetEntitlement(SelectedBeatmap!.LevelId) is not EntitlementStatus.Ok && !p.IsSpectating && p.WantsToPlayNextLevel && !p.IsBackgrounded).ToArray();
foreach (IPlayer p in MissingEntitlement)
{
//Force the player to join late
/* //Force the player to join late
p.ForceLateJoin = true;
_packetDispatcher.SendToPlayer(p, new CancelLevelStartPacket(), IgnoranceChannelTypes.Reliable);
_packetDispatcher.SendToPlayer(p, new SetIsReadyPacket() { IsReady = false }, IgnoranceChannelTypes.Reliable);
_packetDispatcher.SendToPlayer(p, new SetIsReadyPacket() { IsReady = false }, IgnoranceChannelTypes.Reliable);*/
_instance.DisconnectPlayer(p);
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion BeatTogether.DedicatedServer.Kernel/Player.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public sealed class Player : IPlayer
public string UserName { get; }
public string PlayerSessionId { get; }

public uint? ENetPeerId { get; set; }
public uint ENetPeerId { get; set; }

public RollingAverage Latency { get; } = new(30);
public long SyncTime =>
Expand Down
1 change: 0 additions & 1 deletion BeatTogether.DedicatedServer.Node/InstanceFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ bool AllowNE
private void HandleStopEvent(IDedicatedInstance Instance)
{
_instanceRegistry.RemoveInstance(Instance);
//_portAllocator.ReleasePort(Instance.LiteNetPort);
_portAllocator.ReleasePort(Instance.Port);
}
}
Expand Down
1 change: 0 additions & 1 deletion BeatTogether.DedicatedServer.Node/InstanceRegistry.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using BeatTogether.DedicatedServer.Kernel.Abstractions;
using BeatTogether.DedicatedServer.Node.Abstractions;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;

namespace BeatTogether.DedicatedServer.Node
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,11 @@ private Task HandleCheckNode(CheckNodesEvent checkNodesEvent)

private Task HandleDisconnectPlayer(DisconnectPlayerFromMatchmakingServerEvent disconnectEvent)
{
TryGetDedicatedInstance(disconnectEvent.Secret)?.DisconnectPlayer(disconnectEvent.UserId);
var instance = TryGetDedicatedInstance(disconnectEvent.Secret);
if (instance != null && instance.GetPlayerRegistry().TryGetPlayer(disconnectEvent.UserId, out var player))
{
instance.DisconnectPlayer(player);
}

return Task.CompletedTask;
}
Expand Down

0 comments on commit 1d05c2b

Please sign in to comment.