Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion SlipeServer.Console/Logic/ServerTestLogic.cs
Original file line number Diff line number Diff line change
Expand Up @@ -547,7 +547,7 @@ void Player_Disconnected(Player sender, PlayerQuitEventArgs e)
};

this.commandService.AddCommand("increment").Triggered += (source, args)
=> args.Player.GetAndIncrementTimeContext();
=> args.Player.TimeContext.GetAndIncrement();

this.commandService.AddCommand("resendmodpackets").Triggered += (source, args)
=> args.Player.ResendModPackets();
Expand Down
12 changes: 11 additions & 1 deletion SlipeServer.Packets/Definitions/Entities/AddEntityPacket.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using SlipeServer.Packets.Builder;
using SlipeServer.Packets.Definitions.Entities.Structs;
using SlipeServer.Packets.Enums;
using SlipeServer.Packets.Reader;
using SlipeServer.Packets.Structs;
using System;
using System.Drawing;
Expand All @@ -18,6 +19,8 @@ public class AddEntityPacket : Packet
private readonly PacketBuilder builder;
private uint entityCount;

public bool HasAnyEntity => entityCount > 0;

public AddEntityPacket()
{
this.builder = new PacketBuilder();
Expand Down Expand Up @@ -785,7 +788,14 @@ public void AddWater(

public override void Read(byte[] bytes)
{
throw new NotSupportedException();
var reader = new PacketReader(bytes);
this.entityCount = reader.GetCompressedUInt32();

for (int i = 0; i < entityCount; i++)
{

}
;
}

public override byte[] Write()
Expand Down
61 changes: 51 additions & 10 deletions SlipeServer.Packets/Definitions/Join/PlayerListPacket.cs
Original file line number Diff line number Diff line change
@@ -1,27 +1,58 @@
using SlipeServer.Packets.Builder;
using SlipeServer.Packets.Enums;
using SlipeServer.Packets.Reader;
using SlipeServer.Packets.Structs;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Numerics;

namespace SlipeServer.Packets.Definitions.Join;

public record PacketPlayer(ElementId playerId,
byte timeContext,
string nickname,
ushort bitsreamVersion,
uint buildNumber,

bool isDead,
bool isInVehicle,
bool hasJetpack,
bool isNametagShowing,
bool isHeadless,
bool isFrozen,

string nametagText,
Color? nametagColor,
byte moveAnimation,

ushort model,
ElementId? teamId,

ElementId? vehicleId,
byte? seat,

Vector3? position,
float? rotation,

ushort dimension,
byte fightingStyle,
byte alpha,
byte interior,

byte[] weapons);

public class PlayerListPacket : Packet
{
public override PacketId PacketId => PacketId.PACKET_ID_PLAYER_LIST;
public override PacketReliability Reliability => PacketReliability.ReliableSequenced;
public override PacketPriority Priority => PacketPriority.High;

private PacketBuilder builder = new();
public List<PacketPlayer>? Players { get; private set; }

private readonly PacketBuilder builder;

public PlayerListPacket(bool showInChat)
{
this.builder = new PacketBuilder();

this.builder.Write(showInChat);
}
public bool ShowInChat { get; set; }
public PlayerListPacket() { }

public void AddPlayer(
ElementId playerId,
Expand Down Expand Up @@ -129,11 +160,21 @@ byte[] weapons

public override void Read(byte[] bytes)
{
throw new NotSupportedException();
this.Players = new();
var reader = new PacketReader(bytes);
this.ShowInChat = reader.GetBit();
while (!reader.IsFinishedReading)
{
var playerId = reader.GetElementId();
var timeContext = reader.GetByte();
var nickname = reader.GetStringWithByteAsLength();
;

}
}

public override byte[] Write()
{
return this.builder.Build();
return this.builder!.Build();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using SlipeServer.Packets.Builder;
using SlipeServer.Packets.Enums;
using SlipeServer.Packets.Reader;
using SlipeServer.Packets.Structs;
using System;
using System.Numerics;
Expand All @@ -15,7 +16,7 @@ public class SetElementPositionRpcPacket : Packet
public ElementId ElementId { get; set; }
public byte TimeContext { get; set; }
public Vector3 Position { get; set; }
public bool IsWarp { get; }
public bool IsWarp { get; set; }

public SetElementPositionRpcPacket()
{
Expand All @@ -32,7 +33,16 @@ public SetElementPositionRpcPacket(ElementId elementId, byte timeContext, Vector

public override void Read(byte[] bytes)
{
throw new NotSupportedException();
var reader = new PacketReader(bytes);

var rpcFunction = (ElementRpcFunction)reader.GetByte();
if (rpcFunction != ElementRpcFunction.SET_ELEMENT_POSITION)
throw new InvalidOperationException($"Invalid rpcFunction, expected SET_ELEMENT_POSITION, got: {rpcFunction}");

this.ElementId = reader.GetElementId();
this.Position = reader.GetVector3();
this.TimeContext = reader.GetByte();
this.IsWarp = reader.IsFinishedReading ? true : false;
}

public override byte[] Write()
Expand Down
14 changes: 4 additions & 10 deletions SlipeServer.Packets/Definitions/Player/ChangeNicknamePacket.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using SlipeServer.Packets.Builder;
using SlipeServer.Packets.Enums;
using SlipeServer.Packets.Reader;
using SlipeServer.Packets.Structs;
using System;

Expand All @@ -14,18 +15,11 @@ public class ChangeNicknamePacket : Packet
public ElementId PlayerId { get; set; }
public string Name { get; set; }

public ChangeNicknamePacket(
ElementId playerId,
string name
)
{
this.PlayerId = playerId;
this.Name = name;
}

public override void Read(byte[] bytes)
{
throw new NotSupportedException();
var reader = new PacketReader(bytes);
this.PlayerId = reader.GetElementId();
this.Name = reader.GetStringCharacters(reader.RemainingBytes);
}

public override byte[] Write()
Expand Down
11 changes: 8 additions & 3 deletions SlipeServer.Packets/Definitions/Rpc/RpcPacket.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using SlipeServer.Packets.Enums;
using SlipeServer.Packets.Builder;
using SlipeServer.Packets.Enums;
using SlipeServer.Packets.Reader;
using System;

Expand All @@ -10,7 +11,7 @@ public class RpcPacket : Packet
public override PacketReliability Reliability => PacketReliability.ReliableSequenced;
public override PacketPriority Priority => PacketPriority.High;

public RpcFunctions FunctionId { get; private set; }
public RpcFunctions FunctionId { get; set; }

public PacketReader Reader { get; private set; }

Expand All @@ -28,6 +29,10 @@ public override void Read(byte[] bytes)

public override byte[] Write()
{
throw new NotSupportedException();
var builder = new PacketBuilder();

builder.Write((byte)this.FunctionId);

return builder.Build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using SlipeServer.Packets.Reader;
using SlipeServer.Packets.Constants;
using SlipeServer.Packets.Structs;
using System.Reflection.PortableExecutable;

namespace SlipeServer.Packets.Definitions.Sync;

Expand Down Expand Up @@ -113,9 +114,9 @@ public override byte[] Write()
{
var builder = new PacketBuilder();

builder.Write(this.PlayerId);
//builder.Write(this.PlayerId);
builder.Write(this.TimeContext);
builder.WriteCompressed(this.Latency);
//builder.WriteCompressed(this.Latency);

this.KeySync.Write(builder);
this.SyncFlags.Write(builder);
Expand All @@ -135,7 +136,9 @@ public override byte[] Write()
builder.WritePlayerHealth(this.Health);
builder.WritePlayerArmor(this.Armor);

builder.WriteFloatFromBits(this.CameraRotation, 12, -MathF.PI, MathF.PI, true, false);
builder.WriteFloatFromBits(this.CameraRotation, 12, -MathF.PI, MathF.PI, false, true);
this.CameraOrientation = new CameraOrientationStructure(this.Position);
this.CameraOrientation.Write(builder);

if (this.SyncFlags.HasAWeapon)
{
Expand Down
10 changes: 9 additions & 1 deletion SlipeServer.Packets/Reader/PacketReader.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using SlipeServer.Packets.Structs;
using System;
using System.Linq;
using System.Numerics;
using System.Text;

namespace SlipeServer.Packets.Reader;
Expand All @@ -14,6 +15,7 @@ public class PacketReader
public int Counter { get; private set; }
public int Size { get; private set; }
public bool IsFinishedReading => this.Counter == this.Size;
public int RemainingBytes => (this.Size - this.Counter) / 8;

public PacketReader(byte[] data)
{
Expand Down Expand Up @@ -145,7 +147,13 @@ public string GetString()
int length = GetUint16();
return GetStringCharacters(length);
}


public string GetStringWithByteAsLength()
{
var length = GetByte();
return GetStringCharacters(length);
}

public ElementId GetElementId()
{
var id = BitConverter.ToUInt32(GetBytesCapped(17).Concat(new byte[] { 0 }).ToArray(), 0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,14 @@ public void Read(PacketReader reader)

public void Write(PacketBuilder builder)
{

builder.WriteFloatFromBits(this.CameraForward.Z, 8, -MathF.PI, MathF.PI, false);
builder.WriteFloatFromBits(this.CameraForward.X, 8, -MathF.PI, MathF.PI, false);
builder.Write(true);
builder.WriteCapped(3, 2);
uint bitCount = bitCountLookup[3];
float range = MathF.Pow(2, bitCount);
builder.WriteFloatFromBits(this.CameraForward.X, (int)bitCount, -range, range, false);
builder.WriteFloatFromBits(this.CameraForward.Y, (int)bitCount, -range, range, false);
builder.WriteFloatFromBits(this.CameraForward.Z, (int)bitCount, -range, range, false);
}
}
54 changes: 54 additions & 0 deletions SlipeServer.Server.TestTools/TestPacketQueueHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using SlipeServer.Packets;
using SlipeServer.Server.PacketHandling.Handlers.QueueHandlers;
using SlipeServer.Server.PacketHandling.Handlers;
using SlipeServer.Server.PacketHandling;
using System;

namespace SlipeServer.Server.TestTools;

public class TestPacketQueueHandlerDispatcher
{
public event Action? Flushed;

public void Flush()
{
Flushed?.Invoke();
}
}

public class TestPacketQueueHandler<T> : BasePacketQueueHandler<T> where T : Packet
{
private readonly TestPacketQueueHandlerDispatcher testPacketQueueHandlerDispatcher;
private readonly IPacketHandler<T> packetHandler;

public TestPacketQueueHandler(TestPacketQueueHandlerDispatcher testPacketQueueHandlerDispatcher, IPacketHandler<T> packetHandler)
{
this.testPacketQueueHandlerDispatcher = testPacketQueueHandlerDispatcher;
this.packetHandler = packetHandler;

testPacketQueueHandlerDispatcher.Flushed += HandleFlushed;
}

private void HandleFlushed()
{
while (this.packetQueue.TryDequeue(out var queueEntry))
{
try
{
ClientContext.Current = queueEntry.Client;
this.packetHandler.HandlePacket(queueEntry.Client, queueEntry.Packet);
TriggerPacketHandled(queueEntry.Packet);
}
finally
{
ClientContext.Current = null;
}
}
}

public override void Dispose()
{
testPacketQueueHandlerDispatcher.Flushed -= HandleFlushed;
base.Dispose();
}
}
Loading