Skip to content

Commit

Permalink
Improve game code, now possible to start / end games
Browse files Browse the repository at this point in the history
  • Loading branch information
AeonLucid committed Sep 20, 2020
1 parent 5db481e commit 665dd19
Show file tree
Hide file tree
Showing 5 changed files with 255 additions and 58 deletions.
81 changes: 65 additions & 16 deletions src/AmongUs.Server/Net/Client.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
using System;
using AmongUs.Server.Data;
using AmongUs.Server.Exceptions;
using AmongUs.Server.Extensions;
using AmongUs.Server.Net.Request;
using AmongUs.Server.Net.Response;
using AmongUs.Shared.Innersloth;
using AmongUs.Shared.Innersloth.Data;
Expand Down Expand Up @@ -36,6 +34,40 @@ public Client(ClientManager clientManager, GameManager gameManager, int id, stri
public Connection Connection { get; }
public ClientPlayer Player { get; }

public void Send(MessageWriter writer)
{
Connection.Send(writer);
}

private bool IsPacketAllowed(MessageReader message, bool hostOnly)
{
var game = Player.Game;
if (game == null)
{
return false;
}

// GameCode must match code of the current game assigned to the player.
if (message.ReadInt32() != game.Code)
{
return false;
}

// Some packets should only be sent by the host of the game.
if (hostOnly)
{
if (game.HostId == Id)
{
return true;
}

Logger.Warning("[{0}] Client sent packet only allowed by the host ({1}).", Id, game.HostId);
return false;
}

return true;
}

private void OnDataReceived(DataReceivedEventArgs e)
{
try
Expand Down Expand Up @@ -105,31 +137,41 @@ private void OnMessageReceived(MessageReader message, SendOption sendOption)
game.HandleJoinGame(Player);
break;
}

// 101A3960

case RequestFlag.StartGame:
{
if (!IsPacketAllowed(message, true))
{
return;
}

Player.Game.HandleStartGame(message);
break;
}

// 101A39EC
case RequestFlag.RemoveGame:
break;

case RequestFlag.RemovePlayer:
{
if (!IsPacketAllowed(message, true))
{
return;
}

var playerId = message.ReadPackedInt32();
var reason = message.ReadByte();

Player.Game.HandleRemovePlayer(playerId, reason);
break;
}

case RequestFlag.GameData:
case RequestFlag.GameDataTo:
{
var game = Player.Game;
if (game == null)
if (!IsPacketAllowed(message, false))
{
throw new NullReferenceException("Game was not set for the client.");
}

var code = message.ReadInt32();
if (code != game.Code)
{
// Packet was meant for another game.
return;
}

Expand All @@ -140,12 +182,12 @@ private void OnMessageReceived(MessageReader message, SendOption sendOption)
{
var target = message.ReadPackedInt32();
writer.CopyFrom(message);
game.SendTo(writer, target);
Player.Game.SendTo(writer, target);
}
else
{
writer.CopyFrom(message);
game.SendToAllExcept(writer, Player);
Player.Game.SendToAllExcept(writer, Player);
}
}
break;
Expand All @@ -155,9 +197,16 @@ private void OnMessageReceived(MessageReader message, SendOption sendOption)
case RequestFlag.JoinedGame:
break;

// 101A3BD0
case RequestFlag.EndGame:
{
if (!IsPacketAllowed(message, true))
{
return;
}

Player.Game.HandleEndGame(message);
break;
}

default:
Logger.Warning("Server received unknown flag {0}.", flag);
Expand Down
Loading

0 comments on commit 665dd19

Please sign in to comment.