From 86dc83d448c5dd31bd5f87c20c7921a95a756796 Mon Sep 17 00:00:00 2001 From: rafi1212122 Date: Thu, 1 Jun 2023 23:26:58 +0700 Subject: [PATCH] goofy Goodfeel implementation & SetWarshipAvatar --- Common/Database/Login.cs | 48 +++++++++++++++++++ GameServer/Game/Player.cs | 8 ++++ GameServer/Handlers/AddGoodfeelReqHandler.cs | 24 ++++++++++ .../Handlers/GetAvatarDataReqHandler.cs | 12 +++-- .../Handlers/GetLoginActivityReqHandler.cs | 5 +- GameServer/Handlers/PlayerLoginReqHandler.cs | 5 ++ .../Handlers/SetWarshipAvatarReqHandler.cs | 31 ++++++++++++ GameServer/Session.cs | 7 +-- 8 files changed, 130 insertions(+), 10 deletions(-) create mode 100644 Common/Database/Login.cs create mode 100644 GameServer/Handlers/AddGoodfeelReqHandler.cs create mode 100644 GameServer/Handlers/SetWarshipAvatarReqHandler.cs diff --git a/Common/Database/Login.cs b/Common/Database/Login.cs new file mode 100644 index 0000000..ab9fa6c --- /dev/null +++ b/Common/Database/Login.cs @@ -0,0 +1,48 @@ +using MongoDB.Bson; +using MongoDB.Driver; + +namespace Common.Database +{ + public class Login + { + public static readonly IMongoCollection collection = Global.db.GetCollection("Logins"); + + public static bool UserLogin(uint Uid) + { + LoginScheme? LastLogin = GetUserLastLogin(Uid); + if (LastLogin is not null && LastLogin.Id.CreationTime.Date < DateTime.Now.Date) + { + collection.InsertOne(new() { OwnerUid = Uid }); + return true; + } + collection.InsertOne(new() { OwnerUid = Uid }); + return false; + } + + public static List GetUserLogins(uint Uid) + { + return collection.AsQueryable().Where(login => login.OwnerUid == Uid).ToList(); + } + + public static LoginScheme? GetUserLastLogin(uint Uid) + { + return GetUserLogins(Uid).LastOrDefault(); + } + + public static uint GetUserLoginDays(uint Uid) + { + return (uint)GetUserLogins(Uid).DistinctBy(login => login.Id.CreationTime.Date).Count(); + } + } + + public class LoginScheme + { + public ObjectId Id { get; set; } + public uint OwnerUid { get; set; } + + public uint GetCreationTime() + { + return (uint)((DateTimeOffset)Id.CreationTime).ToUnixTimeSeconds(); + } + } +} diff --git a/GameServer/Game/Player.cs b/GameServer/Game/Player.cs index 12809f9..cb11957 100644 --- a/GameServer/Game/Player.cs +++ b/GameServer/Game/Player.cs @@ -25,5 +25,13 @@ namespace PemukulPaku.GameServer.Game Avatar.Save(); } } + + public void ResetAvatarsTodayGoodfeel() + { + foreach (AvatarScheme avatar in AvatarList) + { + avatar.TodayHasAddGoodfeel = 0; + } + } } } diff --git a/GameServer/Handlers/AddGoodfeelReqHandler.cs b/GameServer/Handlers/AddGoodfeelReqHandler.cs new file mode 100644 index 0000000..4d6c378 --- /dev/null +++ b/GameServer/Handlers/AddGoodfeelReqHandler.cs @@ -0,0 +1,24 @@ +using Common.Database; +using Common.Resources.Proto; + +namespace PemukulPaku.GameServer.Handlers +{ + [PacketCmdId(CmdId.AddGoodfeelReq)] + internal class AddGoodfeelReqHandler : IPacketHandler + { + public void Handle(Session session, Packet packet) + { + AddGoodfeelReq Data = packet.GetDecodedBody(); + AvatarScheme? avatar = session.Player.AvatarList.Where(avatar => avatar.AvatarId == Data.AvatarId).FirstOrDefault(); + + if(avatar != null) + { + avatar.TodayHasAddGoodfeel += (uint)Data.AddGoodfeel; + avatar.TouchGoodfeel += (uint)Data.AddGoodfeel; + + session.ProcessPacket(Packet.FromProto(new GetAvatarDataReq() { AvatarIdLists = new uint[] { avatar.AvatarId } }, CmdId.GetAvatarDataReq)); + } + session.Send(Packet.FromProto(new AddGoodfeelRsp() { retcode = AddGoodfeelRsp.Retcode.Succ }, CmdId.AddGoodfeelRsp)); + } + } +} diff --git a/GameServer/Handlers/GetAvatarDataReqHandler.cs b/GameServer/Handlers/GetAvatarDataReqHandler.cs index b368cd9..d3bf157 100644 --- a/GameServer/Handlers/GetAvatarDataReqHandler.cs +++ b/GameServer/Handlers/GetAvatarDataReqHandler.cs @@ -1,4 +1,5 @@ -using Common.Resources.Proto; +using Common.Database; +using Common.Resources.Proto; namespace PemukulPaku.GameServer.Handlers { @@ -8,6 +9,7 @@ namespace PemukulPaku.GameServer.Handlers public void Handle(Session session, Packet packet) { GetAvatarDataReq Packet = packet.GetDecodedBody(); + LoginScheme LastLogin = Login.GetUserLastLogin(session.Player.User.Uid); GetAvatarDataRsp Rsp = new() { @@ -16,9 +18,9 @@ namespace PemukulPaku.GameServer.Handlers if (Packet.AvatarIdLists.Contains((uint)0)) { - IEnumerable Avatars = session.Player.AvatarList.Select(avatar => + IEnumerable Avatars = session.Player.AvatarList.Select(avatar => { - Avatar a = new() + Common.Resources.Proto.Avatar a = new() { AvatarId = avatar.AvatarId, AvatarArtifact = avatar.AvatarArtifact, @@ -48,9 +50,9 @@ namespace PemukulPaku.GameServer.Handlers } else { - IEnumerable Avatars = session.Player.AvatarList.Where(avatar => Packet.AvatarIdLists.Contains(avatar.AvatarId)).Select(avatar => + IEnumerable Avatars = session.Player.AvatarList.Where(avatar => Packet.AvatarIdLists.Contains(avatar.AvatarId)).Select(avatar => { - Avatar a = new() + Common.Resources.Proto.Avatar a = new() { AvatarId = avatar.AvatarId, AvatarArtifact = avatar.AvatarArtifact, diff --git a/GameServer/Handlers/GetLoginActivityReqHandler.cs b/GameServer/Handlers/GetLoginActivityReqHandler.cs index 66b597c..e16f167 100644 --- a/GameServer/Handlers/GetLoginActivityReqHandler.cs +++ b/GameServer/Handlers/GetLoginActivityReqHandler.cs @@ -1,4 +1,5 @@ -using Common.Resources.Proto; +using Common.Database; +using Common.Resources.Proto; namespace PemukulPaku.GameServer.Handlers { @@ -12,7 +13,7 @@ namespace PemukulPaku.GameServer.Handlers Rsp.LoginLists.Add(new LoginActivityData { Id = 581, - LoginDays = 1, + LoginDays = Login.GetUserLoginDays(session.Player.User.Uid), AcceptTime = session.Player.User.GetCreationTime(), DurationEndTime = session.Player.User.GetCreationTime() + 604800 * 2 }); diff --git a/GameServer/Handlers/PlayerLoginReqHandler.cs b/GameServer/Handlers/PlayerLoginReqHandler.cs index 3af58ce..a8c7daf 100644 --- a/GameServer/Handlers/PlayerLoginReqHandler.cs +++ b/GameServer/Handlers/PlayerLoginReqHandler.cs @@ -11,6 +11,11 @@ namespace PemukulPaku.GameServer.Handlers { UserScheme User = session.Player.User; + if(Login.UserLogin(User.Uid)) + { + session.Player.ResetAvatarsTodayGoodfeel(); + } + PlayerLoginRsp Rsp = new() { retcode = PlayerLoginRsp.Retcode.Succ, diff --git a/GameServer/Handlers/SetWarshipAvatarReqHandler.cs b/GameServer/Handlers/SetWarshipAvatarReqHandler.cs new file mode 100644 index 0000000..c9b6f47 --- /dev/null +++ b/GameServer/Handlers/SetWarshipAvatarReqHandler.cs @@ -0,0 +1,31 @@ +using Common.Resources.Proto; + +namespace PemukulPaku.GameServer.Handlers +{ + [PacketCmdId(CmdId.SetWarshipAvatarReq)] + internal class SetWarshipAvatarReqHandler : IPacketHandler + { + public void Handle(Session session, Packet packet) + { + SetWarshipAvatarReq Data = packet.GetDecodedBody(); + + // extra redundancy + if (Data.FirstAvatarId == 0) + Data.FirstAvatarId = 101; + + session.Player.User.WarshipAvatar = new() + { + WarshipFirstAvatarId = Data.FirstAvatarId, + WarshipSecondAvatarId = Data.SecondAvatarId + }; + + GetMainDataRsp MainDataRsp = new() + { + retcode = GetMainDataRsp.Retcode.Succ, + WarshipAvatar = session.Player.User.WarshipAvatar + }; + + session.Send(Packet.FromProto(MainDataRsp, CmdId.GetMainDataRsp), Packet.FromProto(new SetWarshipAvatarRsp() { retcode = SetWarshipAvatarRsp.Retcode.Succ }, CmdId.SetWarshipAvatarRsp)); + } + } +} diff --git a/GameServer/Session.cs b/GameServer/Session.cs index 234663d..c957664 100644 --- a/GameServer/Session.cs +++ b/GameServer/Session.cs @@ -68,7 +68,7 @@ namespace PemukulPaku.GameServer { if (Packet.IsValid(packet)) { - ProcessPacket(new Packet(packet)); + ProcessPacket(new Packet(packet), true); } else { @@ -103,7 +103,7 @@ namespace PemukulPaku.GameServer Server.GetInstance().LogClients(); } - public void ProcessPacket(Packet _packet) + public void ProcessPacket(Packet _packet, bool log = false) { string PacketName = Enum.GetName(typeof(CmdId), _packet.CmdId)!; if(PacketName == "KeepAliveNotify") { LastClientKeepAlive = Global.GetUnixInSeconds(); c.Log(PacketName); return; } @@ -118,7 +118,8 @@ namespace PemukulPaku.GameServer return; } - c.Log(PacketName); + if(log) + c.Log(PacketName); handler.Handle(this, _packet); }