Skip to content
Merged
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
9 changes: 7 additions & 2 deletions Maple2.Server.Core/Network/PacketRouter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,14 @@ public PacketRouter(IEnumerable<PacketHandler<T>> packetHandlers) {
public void OnPacket(object? sender, IByteReader reader) {
var op = reader.Read<RecvOp>();
PacketHandler<T>? handler = handlers.GetValueOrDefault(op);
if (sender is T session) {
handler?.Handle(session, reader);
if (sender is not T session) return;

// Let another system schedule when to call Handle
if (handler?.TryHandleDeferred(session, reader) ?? false) {
return;
}

handler?.Handle(session, reader);
}

private void Register(ImmutableDictionary<RecvOp, PacketHandler<T>>.Builder builder, PacketHandler<T> packetHandler) {
Expand Down
4 changes: 4 additions & 0 deletions Maple2.Server.Core/PacketHandlers/PacketHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ public abstract class PacketHandler<T> where T : Session {

protected PacketHandler() { }

public virtual bool TryHandleDeferred(T session, IByteReader reader) {
return false;
}

public abstract void Handle(T session, IByteReader packet);

public override string ToString() => $"[0x{(ushort) OpCode:X4}] {GetType().Name}";
Expand Down
54 changes: 43 additions & 11 deletions Maple2.Server.Game/Manager/Field/FieldManager/FieldManager.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System.Collections.Concurrent;
using System.Buffers;
using System.Diagnostics.CodeAnalysis;
using System.Numerics;
using System.Runtime.CompilerServices;
Expand All @@ -20,6 +20,7 @@
using Maple2.Server.Game.Model;
using Maple2.Server.Game.Model.Field;
using Maple2.Server.Game.Model.Skill;
using Maple2.Server.Game.PacketHandlers.Field;
using Maple2.Server.Game.Packets;
using Maple2.Server.Game.Session;
using Maple2.Server.Game.Util;
Expand Down Expand Up @@ -68,6 +69,7 @@ public partial class FieldManager : IField {
internal readonly FieldActor FieldActor;
private readonly CancellationTokenSource cancel;
private readonly Thread thread;
private readonly List<(FieldPacketHandler handler, GameSession session, ByteReader reader)> queuedPackets;
private bool initialized;
public bool Disposed { get; private set; }

Expand Down Expand Up @@ -95,6 +97,7 @@ public FieldManager(MapMetadata metadata, UgcMapMetadata ugcMetadata, MapEntityM
FieldActor = new FieldActor(this, NextLocalId(), metadata, npcMetadata); // pulls from argument because member NpcMetadata is null here
cancel = new CancellationTokenSource();
thread = new Thread(UpdateLoop);
queuedPackets = new();
Ai = new AiManager(this);
RoomId = NextGlobalId();

Expand Down Expand Up @@ -254,6 +257,29 @@ public virtual void Init() {
// Use this to keep systems in sync. Do not use Environment.TickCount directly
public long FieldTick { get; private set; }

public void QueuePacket(FieldPacketHandler handler, GameSession session, ByteReader reader) {
lock (queuedPackets) {
queuedPackets.Add((handler, session, reader));
}
}

private void ProcessPackets() {
lock (queuedPackets) {
foreach ((FieldPacketHandler handler, GameSession session, ByteReader reader) packet in queuedPackets) {
try {
if (packet.session.State is SessionState.Disconnected) {
continue;
}
packet.handler.Handle(packet.session, packet.reader);
} finally {
ArrayPool<byte>.Shared.Return(packet.reader.Buffer);
}
}

queuedPackets.Clear();
}
}

private void UpdateLoop() {
while (!cancel.IsCancellationRequested) {
if (!(DebugRenderer?.IsActive ?? false)) {
Expand All @@ -266,6 +292,8 @@ private void UpdateLoop() {
}

public void Update() {
ProcessPackets();

if (Players.IsEmpty) {
return;
}
Expand Down Expand Up @@ -488,17 +516,15 @@ public bool UsePortal(GameSession session, int portalId, string password) {
case CubePortalDestination.SelectedMap:
session.MigrateOutOfInstance(srcPortal.TargetMapId);
return true;
case CubePortalDestination.FriendHome: {
using GameStorage.Request db = session.GameStorage.Context();
Home? home = db.GetHome(fieldPortal.HomeId);
if (home is null) {
session.Send(FieldEnterPacket.Error(MigrationError.s_move_err_no_server));
return false;
}

session.MigrateToInstance(home.Indoor.MapId, home.Indoor.OwnerId);
return true;
case CubePortalDestination.FriendHome:
Home? home = GetHome(session, fieldPortal);
if (home is null) {
session.Send(FieldEnterPacket.Error(MigrationError.s_move_err_no_server));
return false;
}

session.MigrateToInstance(home.Indoor.MapId, home.Indoor.OwnerId);
return true;
}
return false;
case PortalType.LeaveDungeon:
Expand Down Expand Up @@ -609,6 +635,12 @@ public void VibrateObjects(DamageRecord record, Vector3 position) {
}
}

private static Home? GetHome(GameSession session, FieldPortal fieldPortal) {
using GameStorage.Request db = session.GameStorage.Context();
Home? home = db.GetHome(fieldPortal.HomeId);
return home;
}

#region DebugUtils
public void BroadcastAiMessage(ByteWriter packet) {
foreach ((int objectId, FieldPlayer player) in Players) {
Expand Down
46 changes: 20 additions & 26 deletions Maple2.Server.Game/Maple2.Server.Game.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,40 +15,34 @@
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\Maple2.Database\Maple2.Database.csproj"/>
<ProjectReference Include="..\Maple2.Server.Core\Maple2.Server.Core.csproj"/>
<ProjectReference Include="..\Maple2.Database\Maple2.Database.csproj" />
<ProjectReference Include="..\Maple2.Server.Core\Maple2.Server.Core.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="8.0.0"/>
<PackageReference Include="Grpc.AspNetCore.Server" Version="2.67.0"/>
<PackageReference Include="Grpc.Net.Client" Version="2.67.0"/>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0"/>
<PackageReference Include="Serilog.Enrichers.Thread" Version="3.1.0"/>
<PackageReference Include="Serilog.Expressions" Version="3.4.1"/>
<PackageReference Include="Serilog.Extensions.Logging" Version="7.0.0"/>
<PackageReference Include="Serilog.Settings.Configuration" Version="7.0.1"/>
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0"/>
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0"/>
<PackageReference Include="System.CommandLine" Version="2.0.0-beta3.22114.1"/>
<PackageReference Include="DijkstraAlgorithm" Version="1.1.0"/>
<PackageReference Include="DotRecast.Core" Version="2024.2.3"/>
<PackageReference Include="DotRecast.Detour" Version="2024.2.3"/>
<PackageReference Include="DotRecast.Recast" Version="2024.2.3"/>
<PackageReference Include="DotRecast.Recast.Toolset" Version="2024.2.3"/>
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Grpc.AspNetCore.Server" Version="2.67.0" />
<PackageReference Include="Grpc.Net.Client" Version="2.67.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0" />
<PackageReference Include="Serilog.Enrichers.Thread" Version="3.1.0" />
<PackageReference Include="Serilog.Expressions" Version="3.4.1" />
<PackageReference Include="Serilog.Extensions.Logging" Version="7.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="7.0.1" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="System.CommandLine" Version="2.0.0-beta3.22114.1" />
<PackageReference Include="DijkstraAlgorithm" Version="1.1.0" />
<PackageReference Include="DotRecast.Core" Version="2024.2.3" />
<PackageReference Include="DotRecast.Detour" Version="2024.2.3" />
<PackageReference Include="DotRecast.Recast" Version="2024.2.3" />
<PackageReference Include="DotRecast.Recast.Toolset" Version="2024.2.3" />
</ItemGroup>

<ItemGroup Condition="'$(IsDockerBuild)' == 'true'">
<None Remove="Scripting/Scripts/Trigger/**/*.py"/>
<None Remove="Navmeshes/**/*.navmesh"/>
<None Remove="Navmeshes/**/*.navmesh" />
</ItemGroup>

<ItemGroup Condition="'$(IsDockerBuild)' != 'true'">
<None Update="Scripting/Scripts/Trigger/**/*.py">
<ParentDir>$([System.IO.Path]::GetFileName($([System.String]::Copy('%(RecursiveDir)').Replace('\', '/').TrimEnd('/'))))</ParentDir>
<TargetPath>Scripts/Trigger/%(ParentDir)/%(Filename)%(Extension)</TargetPath>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Navmeshes/**/*.navmesh">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
Expand All @@ -59,4 +53,4 @@
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
</Project>
4 changes: 2 additions & 2 deletions Maple2.Server.Game/PacketHandlers/AchievementHandler.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
using Maple2.Model.Game;
using Maple2.PacketLib.Tools;
using Maple2.Server.Core.Constants;
using Maple2.Server.Core.PacketHandlers;
using Maple2.Server.Game.PacketHandlers.Field;
Comment thread
AngeloTadeucci marked this conversation as resolved.
using Maple2.Server.Game.Session;

namespace Maple2.Server.Game.PacketHandlers;

public class AchievementHandler : PacketHandler<GameSession> {
public class AchievementHandler : FieldPacketHandler {
public override RecvOp OpCode => RecvOp.Achieve;

private enum Command : byte {
Expand Down
4 changes: 2 additions & 2 deletions Maple2.Server.Game/PacketHandlers/AttendanceHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@
using Maple2.Model.Metadata;
using Maple2.PacketLib.Tools;
using Maple2.Server.Core.Constants;
using Maple2.Server.Core.PacketHandlers;
using Maple2.Server.Game.PacketHandlers.Field;
using Maple2.Server.Game.Packets;
using Maple2.Server.Game.Session;

namespace Maple2.Server.Game.PacketHandlers;

public class AttendanceHandler : PacketHandler<GameSession> {
public class AttendanceHandler : FieldPacketHandler {
public override RecvOp OpCode => RecvOp.Attendance;

#region Autofac Autowired
Expand Down
4 changes: 2 additions & 2 deletions Maple2.Server.Game/PacketHandlers/AttributePointHandler.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
using Maple2.Model.Enum;
using Maple2.PacketLib.Tools;
using Maple2.Server.Core.Constants;
using Maple2.Server.Core.PacketHandlers;
using Maple2.Server.Game.PacketHandlers.Field;
Comment thread
AngeloTadeucci marked this conversation as resolved.
using Maple2.Server.Game.Session;

namespace Maple2.Server.Game.PacketHandlers;

public class AttributePointHandler : PacketHandler<GameSession> {
public class AttributePointHandler : FieldPacketHandler {
public override RecvOp OpCode => RecvOp.AttributePoint;

private enum Command : byte {
Expand Down
4 changes: 2 additions & 2 deletions Maple2.Server.Game/PacketHandlers/BadgeEquipHandler.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
using Maple2.Model.Enum;
using Maple2.PacketLib.Tools;
using Maple2.Server.Core.Constants;
using Maple2.Server.Core.PacketHandlers;
using Maple2.Server.Game.PacketHandlers.Field;
using Maple2.Server.Game.Session;
using Maple2.Server.Game.Packets;
using Maple2.Model.Game;

namespace Maple2.Server.Game.PacketHandlers;

public class BadgeEquipHandler : PacketHandler<GameSession> {
public class BadgeEquipHandler : FieldPacketHandler {
public override RecvOp OpCode => RecvOp.BadgeEquip;

private enum Command : byte {
Expand Down
4 changes: 2 additions & 2 deletions Maple2.Server.Game/PacketHandlers/BeautyHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
using Maple2.Model.Metadata;
using Maple2.PacketLib.Tools;
using Maple2.Server.Core.Constants;
using Maple2.Server.Core.PacketHandlers;
using Maple2.Server.Game.PacketHandlers.Field;
using Maple2.Server.Core.Packets;
using Maple2.Server.Game.Packets;
using Maple2.Server.Game.Session;
Expand All @@ -18,7 +18,7 @@

namespace Maple2.Server.Game.PacketHandlers;

public class BeautyHandler : PacketHandler<GameSession> {
public class BeautyHandler : FieldPacketHandler {
public override RecvOp OpCode => RecvOp.Beauty;

#region Autofac Autowired
Expand Down
4 changes: 2 additions & 2 deletions Maple2.Server.Game/PacketHandlers/BlackMarketHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@
using Maple2.Model.Game;
using Maple2.PacketLib.Tools;
using Maple2.Server.Core.Constants;
using Maple2.Server.Core.PacketHandlers;
using Maple2.Server.Game.PacketHandlers.Field;
using Maple2.Server.Game.Packets;
using Maple2.Server.Game.Session;
using Maple2.Server.World.Service;
using WorldClient = Maple2.Server.World.Service.World.WorldClient;

namespace Maple2.Server.Game.PacketHandlers;

public class BlackMarketHandler : PacketHandler<GameSession> {
public class BlackMarketHandler : FieldPacketHandler {
public override RecvOp OpCode => RecvOp.BlackMarket;

private enum Command : byte {
Expand Down
4 changes: 2 additions & 2 deletions Maple2.Server.Game/PacketHandlers/BonusGameHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
using Maple2.Model.Metadata;
using Maple2.PacketLib.Tools;
using Maple2.Server.Core.Constants;
using Maple2.Server.Core.PacketHandlers;
using Maple2.Server.Game.PacketHandlers.Field;
using Maple2.Server.Game.Packets;
using Maple2.Server.Game.Session;
using Maple2.Tools;

namespace Maple2.Server.Game.PacketHandlers;

public class BonusGameHandler : PacketHandler<GameSession> {
public class BonusGameHandler : FieldPacketHandler {
public override RecvOp OpCode => RecvOp.BonusGame;

private enum Command : byte {
Expand Down
4 changes: 2 additions & 2 deletions Maple2.Server.Game/PacketHandlers/BreakableHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@
using Maple2.Model.Metadata;
using Maple2.PacketLib.Tools;
using Maple2.Server.Core.Constants;
using Maple2.Server.Core.PacketHandlers;
using Maple2.Server.Game.PacketHandlers.Field;
using Maple2.Server.Game.Model;
using Maple2.Server.Game.Model.Skill;
using Maple2.Server.Game.Packets;
using Maple2.Server.Game.Session;

namespace Maple2.Server.Game.PacketHandlers;

public class BreakableHandler : PacketHandler<GameSession> {
public class BreakableHandler : FieldPacketHandler {
public override RecvOp OpCode => RecvOp.Breakable;

#region Autofac Autowired
Expand Down
4 changes: 2 additions & 2 deletions Maple2.Server.Game/PacketHandlers/BuddyBadgeHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
using Maple2.Model.Game;
using Maple2.PacketLib.Tools;
using Maple2.Server.Core.Constants;
using Maple2.Server.Core.PacketHandlers;
using Maple2.Server.Game.PacketHandlers.Field;
using Maple2.Server.Game.Model;
using Maple2.Server.Game.Packets;
using Maple2.Server.Game.Session;

namespace Maple2.Server.Game.PacketHandlers;

public class BuddyBadgeHandler : PacketHandler<GameSession> {
public class BuddyBadgeHandler : FieldPacketHandler {
public override RecvOp OpCode => RecvOp.BuddyBadge;

private enum Command : byte {
Expand Down
4 changes: 2 additions & 2 deletions Maple2.Server.Game/PacketHandlers/BuddyEmoteHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@
using Maple2.Model.Error;
using Maple2.PacketLib.Tools;
using Maple2.Server.Core.Constants;
using Maple2.Server.Core.PacketHandlers;
using Maple2.Server.Game.PacketHandlers.Field;
using Maple2.Server.Game.Model;
using Maple2.Server.Game.Packets;
using Maple2.Server.Game.Session;
using static Maple2.Model.Error.BuddyEmoteError;

namespace Maple2.Server.Game.PacketHandlers;

public class BuddyEmoteHandler : PacketHandler<GameSession> {
public class BuddyEmoteHandler : FieldPacketHandler {
public override RecvOp OpCode => RecvOp.BuddyEmote;

private enum Command : byte {
Expand Down
4 changes: 2 additions & 2 deletions Maple2.Server.Game/PacketHandlers/BuddyHandler.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
using Maple2.PacketLib.Tools;
using Maple2.Server.Core.Constants;
using Maple2.Server.Core.PacketHandlers;
using Maple2.Server.Game.PacketHandlers.Field;
using Maple2.Server.Game.Session;

namespace Maple2.Server.Game.PacketHandlers;

public class BuddyHandler : PacketHandler<GameSession> {
public class BuddyHandler : FieldPacketHandler {
Comment thread
AngeloTadeucci marked this conversation as resolved.
public override RecvOp OpCode => RecvOp.Buddy;

private enum Command : byte {
Expand Down
Loading