Implement PlayerAttrs as intended
This commit is contained in:
parent
aa2bab9645
commit
934ef7d74a
4 changed files with 122 additions and 46 deletions
|
@ -1,7 +1,6 @@
|
||||||
using GameServer.Controllers.Attributes;
|
using GameServer.Controllers.Attributes;
|
||||||
using GameServer.Models;
|
using GameServer.Models;
|
||||||
using GameServer.Network;
|
using GameServer.Network;
|
||||||
using GameServer.Network.Messages;
|
|
||||||
using GameServer.Systems.Event;
|
using GameServer.Systems.Event;
|
||||||
using Protocol;
|
using Protocol;
|
||||||
|
|
||||||
|
@ -22,40 +21,8 @@ internal class PlayerInfoController : Controller
|
||||||
{
|
{
|
||||||
RandomSeed = 1337,
|
RandomSeed = 1337,
|
||||||
Id = player.Id,
|
Id = player.Id,
|
||||||
Birthday = 0,
|
Birthday = player.BirthDay,
|
||||||
Attributes =
|
Attributes = { player.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
|
|
||||||
}
|
|
||||||
},
|
|
||||||
RoleShowList =
|
RoleShowList =
|
||||||
{
|
{
|
||||||
new RoleShowEntry
|
new RoleShowEntry
|
||||||
|
@ -78,6 +45,47 @@ internal class PlayerInfoController : Controller
|
||||||
await Session.Push(MessageId.BasicInfoNotify, basicInfo);
|
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)]
|
[NetEvent(MessageId.PlayerBasicInfoGetRequest)]
|
||||||
public RpcResult OnPlayerBasicInfoGetRequest()
|
public RpcResult OnPlayerBasicInfoGetRequest()
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,39 +1,103 @@
|
||||||
using Protocol;
|
using GameServer.Settings;
|
||||||
using GameServer.Settings;
|
using Protocol;
|
||||||
|
|
||||||
namespace GameServer.Models;
|
namespace GameServer.Models;
|
||||||
internal class PlayerModel
|
internal class PlayerModel
|
||||||
{
|
{
|
||||||
private const int MaxPlayerLevel = 80;
|
private const int MaxPlayerLevel = 80;
|
||||||
|
|
||||||
|
public List<PlayerAttr> Attributes { get; } = [];
|
||||||
|
|
||||||
public int Id { get; private set; }
|
public int Id { get; private set; }
|
||||||
public string Name { get; set; }
|
public int BirthDay { get; set; }
|
||||||
public int Level { get; private set; }
|
|
||||||
public int[] Characters { get; private set; }
|
public int[] Characters { get; private set; }
|
||||||
public Vector Position { get; private set; }
|
public Vector Position { get; private set; }
|
||||||
|
|
||||||
|
public string Name => GetStringAttribute(PlayerAttrKey.Name);
|
||||||
|
|
||||||
public PlayerModel()
|
public PlayerModel()
|
||||||
{
|
{
|
||||||
Name = string.Empty;
|
|
||||||
Characters = [];
|
Characters = [];
|
||||||
Position = new Vector();
|
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()
|
public void LevelUp()
|
||||||
{
|
{
|
||||||
if (Level == MaxPlayerLevel) return;
|
int level = GetIntAttribute(PlayerAttrKey.Level);
|
||||||
Level++;
|
|
||||||
|
if (level == MaxPlayerLevel) return;
|
||||||
|
SetAttribute(PlayerAttrKey.Level, level + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static PlayerModel CreateDefaultPlayer(PlayerStartingValues startingValues)
|
public static PlayerModel CreateDefaultPlayer(PlayerStartingValues startingValues)
|
||||||
{
|
{
|
||||||
return new PlayerModel
|
PlayerModel playerModel = new()
|
||||||
{
|
{
|
||||||
Id = 1337,
|
Id = 1337,
|
||||||
Name = startingValues.Name,
|
|
||||||
Level = startingValues.PlayerLevel,
|
|
||||||
Characters = startingValues.Characters,
|
Characters = startingValues.Characters,
|
||||||
Position = startingValues.Position.Clone()
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,8 @@ internal class PlayerStartingValues
|
||||||
{
|
{
|
||||||
public required string Name { get; set; }
|
public required string Name { get; set; }
|
||||||
public required int PlayerLevel { 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 int[] Characters { get; set; }
|
||||||
public required Vector Position { get; set; }
|
public required Vector Position { get; set; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
{
|
{
|
||||||
"StartingValues": {
|
"StartingValues": {
|
||||||
"Name": "ReversedRooms",
|
"Name": "ReversedRooms",
|
||||||
"Level": 8,
|
"PlayerLevel": 8,
|
||||||
|
"HeadPhoto": 1402,
|
||||||
|
"HeadFrame": 80060009,
|
||||||
"Characters": [ 1402, 1302, 1203 ],
|
"Characters": [ 1402, 1302, 1203 ],
|
||||||
"Position": {
|
"Position": {
|
||||||
"X": -35823,
|
"X": -35823,
|
||||||
|
|
Loading…
Reference in a new issue