From 934ef7d74ab28434ffafff69836010913765716d Mon Sep 17 00:00:00 2001 From: xeon Date: Thu, 22 Feb 2024 23:09:07 +0300 Subject: [PATCH] Implement PlayerAttrs as intended --- .../Controllers/PlayerInfoController.cs | 78 +++++++++-------- GameServer/Models/PlayerModel.cs | 84 ++++++++++++++++--- GameServer/Settings/PlayerStartingValues.cs | 2 + GameServer/gameplay.json | 4 +- 4 files changed, 122 insertions(+), 46 deletions(-) diff --git a/GameServer/Controllers/PlayerInfoController.cs b/GameServer/Controllers/PlayerInfoController.cs index 75dec4a..df0f81f 100644 --- a/GameServer/Controllers/PlayerInfoController.cs +++ b/GameServer/Controllers/PlayerInfoController.cs @@ -1,7 +1,6 @@ using GameServer.Controllers.Attributes; using GameServer.Models; using GameServer.Network; -using GameServer.Network.Messages; using GameServer.Systems.Event; using Protocol; @@ -22,40 +21,8 @@ internal class PlayerInfoController : Controller { RandomSeed = 1337, Id = player.Id, - Birthday = 0, - Attributes = - { - new PlayerAttr - { - Key = (int)PlayerAttrKey.Name, - ValueType = (int)PlayerAttrType.String, - StringValue = player.Name - }, - new PlayerAttr - { - Key = (int)PlayerAttrKey.Level, - ValueType = (int)PlayerAttrType.Int32, - Int32Value = 10 - }, - new PlayerAttr - { - Key = (int)PlayerAttrKey.HeadPhoto, - ValueType = (int)PlayerAttrType.Int32, - Int32Value = 1402 - }, - new PlayerAttr - { - Key = (int)PlayerAttrKey.HeadFrame, - ValueType = (int)PlayerAttrType.Int32, - Int32Value = 80060009 - }, - new PlayerAttr - { - Key = (int)PlayerAttrKey.Sex, - ValueType = (int)PlayerAttrType.Int32, - Int32Value = 1 - } - }, + Birthday = player.BirthDay, + Attributes = { player.Attributes }, RoleShowList = { new RoleShowEntry @@ -78,6 +45,47 @@ internal class PlayerInfoController : Controller await Session.Push(MessageId.BasicInfoNotify, basicInfo); } + [NetEvent(MessageId.ChangeHeadPhotoRequest)] + public RpcResult OnChangeHeadPhotoRequest(ChangeHeadPhotoRequest request, ModelManager modelManager) + { + modelManager.Player.SetAttribute(PlayerAttrKey.HeadPhoto, request.HeadPhotoId); + + return Response(MessageId.ChangeHeadPhotoResponse, new ChangeHeadPhotoResponse + { + HeadPhotoId = request.HeadPhotoId + }); + } + + [NetEvent(MessageId.BirthdayInitRequest)] + public RpcResult OnBirthdayInitRequest(BirthdayInitRequest request, ModelManager modelManager) + { + modelManager.Player.BirthDay = request.Birthday; + + return Response(MessageId.BirthdayInitResponse, new BirthdayInitResponse()); + } + + [NetEvent(MessageId.ModifySignatureRequest)] + public RpcResult OnModifySignatureRequest(ModifySignatureRequest request, ModelManager modelManager) + { + modelManager.Player.SetAttribute(PlayerAttrKey.Sign, request.Signature); + + return Response(MessageId.ModifySignatureResponse, new ModifySignatureResponse + { + Signature = request.Signature + }); + } + + [NetEvent(MessageId.ModifyNameRequest)] + public RpcResult OnModifyNameRequest(ModifyNameRequest request, ModelManager modelManager) + { + modelManager.Player.SetAttribute(PlayerAttrKey.Name, request.Name); + + return Response(MessageId.ModifyNameResponse, new ModifyNameResponse + { + Name = request.Name + }); + } + [NetEvent(MessageId.PlayerBasicInfoGetRequest)] public RpcResult OnPlayerBasicInfoGetRequest() { diff --git a/GameServer/Models/PlayerModel.cs b/GameServer/Models/PlayerModel.cs index 03d085f..58a68eb 100644 --- a/GameServer/Models/PlayerModel.cs +++ b/GameServer/Models/PlayerModel.cs @@ -1,39 +1,103 @@ -using Protocol; -using GameServer.Settings; +using GameServer.Settings; +using Protocol; namespace GameServer.Models; internal class PlayerModel { private const int MaxPlayerLevel = 80; + public List Attributes { get; } = []; + public int Id { get; private set; } - public string Name { get; set; } - public int Level { get; private set; } + public int BirthDay { get; set; } public int[] Characters { get; private set; } public Vector Position { get; private set; } + public string Name => GetStringAttribute(PlayerAttrKey.Name); + public PlayerModel() { - Name = string.Empty; Characters = []; Position = new Vector(); } + public void SetAttribute(PlayerAttrKey key, int value) + { + SetAttribute(key, PlayerAttrType.Int32, value, null); + } + + public void SetAttribute(PlayerAttrKey key, string value) + { + SetAttribute(key, PlayerAttrType.String, 0, value); + } + + public int GetIntAttribute(PlayerAttrKey key) + { + return GetAttributeOfType(key, PlayerAttrType.Int32)?.Int32Value ?? 0; + } + + public string GetStringAttribute(PlayerAttrKey key) + { + return GetAttributeOfType(key, PlayerAttrType.String)?.StringValue ?? string.Empty; + } + + private void SetAttribute(PlayerAttrKey key, PlayerAttrType type, int intValue, string? stringValue) + { + PlayerAttr? attr = GetAttributeOfType(key, type); + if (attr == null) + { + attr = new PlayerAttr + { + Key = (int)key, + ValueType = (int)type, + }; + + Attributes.Add(attr); + } + + switch (type) + { + case PlayerAttrType.Int32: + attr.Int32Value = intValue; break; + case PlayerAttrType.String: + attr.StringValue = stringValue; break; + } + } + + private PlayerAttr? GetAttributeOfType(PlayerAttrKey key, PlayerAttrType type) + { + PlayerAttr? attr = Attributes.SingleOrDefault(attr => attr.Key == (int)key); + if (attr != null) + { + if (attr.ValueType != (int)type) + throw new ArgumentException($"PlayerAttr type mismatch! Key: {key}, type: {(PlayerAttrType)attr.ValueType}, argument type: {type}"); + } + + return attr; + } + public void LevelUp() { - if (Level == MaxPlayerLevel) return; - Level++; + int level = GetIntAttribute(PlayerAttrKey.Level); + + if (level == MaxPlayerLevel) return; + SetAttribute(PlayerAttrKey.Level, level + 1); } public static PlayerModel CreateDefaultPlayer(PlayerStartingValues startingValues) { - return new PlayerModel + PlayerModel playerModel = new() { Id = 1337, - Name = startingValues.Name, - Level = startingValues.PlayerLevel, Characters = startingValues.Characters, Position = startingValues.Position.Clone() }; + + playerModel.SetAttribute(PlayerAttrKey.Name, startingValues.Name); + playerModel.SetAttribute(PlayerAttrKey.Level, startingValues.PlayerLevel); + playerModel.SetAttribute(PlayerAttrKey.HeadPhoto, startingValues.HeadPhoto); + playerModel.SetAttribute(PlayerAttrKey.HeadFrame, startingValues.HeadFrame); + + return playerModel; } } diff --git a/GameServer/Settings/PlayerStartingValues.cs b/GameServer/Settings/PlayerStartingValues.cs index 4288715..802e0f2 100644 --- a/GameServer/Settings/PlayerStartingValues.cs +++ b/GameServer/Settings/PlayerStartingValues.cs @@ -5,6 +5,8 @@ internal class PlayerStartingValues { public required string Name { get; set; } public required int PlayerLevel { get; set; } + public required int HeadPhoto { get; set; } + public required int HeadFrame { get; set; } public required int[] Characters { get; set; } public required Vector Position { get; set; } } diff --git a/GameServer/gameplay.json b/GameServer/gameplay.json index cad7fd1..4148415 100644 --- a/GameServer/gameplay.json +++ b/GameServer/gameplay.json @@ -1,7 +1,9 @@ { "StartingValues": { "Name": "ReversedRooms", - "Level": 8, + "PlayerLevel": 8, + "HeadPhoto": 1402, + "HeadFrame": 80060009, "Characters": [ 1402, 1302, 1203 ], "Position": { "X": -35823,