diff --git a/AscNet.Common/Database/Character.cs b/AscNet.Common/Database/Character.cs index 2a45ed4..d8cbd8c 100644 --- a/AscNet.Common/Database/Character.cs +++ b/AscNet.Common/Database/Character.cs @@ -104,6 +104,11 @@ namespace AscNet.Common.Database Equips.Add(equipData); } + public void Save() + { + collection.ReplaceOne(Builders.Filter.Eq(x => x.Id, Id), this); + } + [BsonId] public ObjectId Id { get; set; } diff --git a/AscNet.Common/Database/Player.cs b/AscNet.Common/Database/Player.cs index a0074b6..8b7590d 100644 --- a/AscNet.Common/Database/Player.cs +++ b/AscNet.Common/Database/Player.cs @@ -2,7 +2,6 @@ using MongoDB.Bson; using MongoDB.Driver; using AscNet.Common.MsgPack; -using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization.Options; namespace AscNet.Common.Database @@ -89,6 +88,11 @@ namespace AscNet.Common.Database }); } + public void Save() + { + collection.ReplaceOne(Builders.Filter.Eq(x => x.Id, Id), this); + } + [BsonId] public ObjectId Id { get; set; } diff --git a/AscNet.Common/Database/Stage.cs b/AscNet.Common/Database/Stage.cs index d4b6687..763e6a5 100644 --- a/AscNet.Common/Database/Stage.cs +++ b/AscNet.Common/Database/Stage.cs @@ -53,7 +53,12 @@ namespace AscNet.Common.Database { Stages.Add(stageData.StageId, stageData); } - + + public void Save() + { + collection.ReplaceOne(Builders.Filter.Eq(x => x.Id, Id), this); + } + [BsonId] public ObjectId Id { get; set; } diff --git a/AscNet.GameServer/Handlers/GuideModule.cs b/AscNet.GameServer/Handlers/GuideModule.cs index da25a97..947a637 100644 --- a/AscNet.GameServer/Handlers/GuideModule.cs +++ b/AscNet.GameServer/Handlers/GuideModule.cs @@ -15,6 +15,25 @@ namespace AscNet.GameServer.Handlers public int Code; public List? RewardGoodsList; } + + [MessagePackObject(true)] + public class GuideCompleteRequest + { + public int GuideGroupId; + } + + [MessagePackObject(true)] + public class NotifyGuide + { + public int GuideGroupId; + } + + [MessagePackObject(true)] + public class GuideCompleteResponse + { + public int Code; + public List? RewardGoodsList; + } internal class GuideModule { @@ -30,5 +49,15 @@ namespace AscNet.GameServer.Handlers { session.SendResponse(new GuideGroupFinishResponse(), packet.Id); } + + [RequestPacketHandler("GuideCompleteRequest")] + public static void GuideCompleteRequestHandler(Session session, Packet.Request packet) + { + GuideCompleteRequest request = MessagePackSerializer.Deserialize(packet.Content); + + session.player.PlayerData.GuideData.Add(request.GuideGroupId); + session.SendPush(new NotifyGuide() { GuideGroupId = request.GuideGroupId }); + session.SendResponse(new GuideCompleteResponse(), packet.Id); + } } } diff --git a/AscNet.GameServer/Session.cs b/AscNet.GameServer/Session.cs index ad71908..aa54b54 100644 --- a/AscNet.GameServer/Session.cs +++ b/AscNet.GameServer/Session.cs @@ -204,6 +204,12 @@ namespace AscNet.GameServer if (Server.Instance.Sessions.GetValueOrDefault(id) is null) return; + // DB save on disconnect + log.Info($"saving session state..."); + player?.Save(); + character?.Save(); + stage?.Save(); + log.Warn($"{id} disconnected"); client.Close(); Server.Instance.Sessions.Remove(id);