PSO2SERVER/Server/Packets/Handlers/11-ClientHandler/11-05-CharacterCreate.cs

86 lines
3.2 KiB
C#
Raw Normal View History

2024-09-10 00:31:40 +08:00
using System.IO;
using System.Data.Entity;
2024-09-10 01:13:20 +08:00
using PSO2SERVER.Models;
using PSO2SERVER.Packets.PSOPackets;
using PSO2SERVER.Database;
2024-09-12 15:06:07 +08:00
using System.Linq;
using System;
2024-09-17 11:29:41 +08:00
using System.Runtime.InteropServices;
2024-09-10 00:31:40 +08:00
2024-09-10 01:13:20 +08:00
namespace PSO2SERVER.Packets.Handlers
2024-09-10 00:31:40 +08:00
{
[PacketHandlerAttr(0x11, 0x05)]
public class CharacterCreate : PacketHandler
{
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
if (context.User == null)
return;
var reader = new PacketReader(data, position, size);
2024-09-15 12:10:26 +08:00
//var info = string.Format("[接收] 接收到的数据 (hex): ");
//Logger.WriteHex(info, data);
2024-09-17 11:29:41 +08:00
var setting = reader.ReadStruct<Character.CharParam>();
//reader.ReadBytes(12); // 12 unknown bytes
//reader.ReadByte(); // VoiceType
//reader.ReadBytes(5); // 5 unknown bytes
//reader.ReadUInt16(); // VoiceData
2024-09-10 00:31:40 +08:00
2024-09-12 15:06:07 +08:00
var name = reader.ReadFixedLengthUtf16(16);//玩家名称 宽字符
2024-09-10 00:31:40 +08:00
2024-09-17 11:29:41 +08:00
//reader.BaseStream.Seek(0x04, SeekOrigin.Current); // Padding
2024-09-10 00:31:40 +08:00
var looks = reader.ReadStruct<Character.LooksParam>();
var jobs = reader.ReadStruct<Character.JobParam>();
//Logger.WriteInternal("[CHR] {0} 创建了名为 {1} 的新角色.", context.User.Username, name);
2024-09-10 00:31:40 +08:00
var newCharacter = new Character
{
2024-09-17 11:29:41 +08:00
CharSet = setting,
2024-09-10 00:31:40 +08:00
Name = name,
Jobs = jobs,
Looks = looks,
Player = context.User
};
// Add to database
2024-09-10 01:13:20 +08:00
using (var db = new ServerEf())
2024-09-12 15:06:07 +08:00
{
// Check if any characters exist for this player
var existingCharacters = db.Characters.Where(c => c.Player.PlayerId == context.User.PlayerId).ToList();
if (existingCharacters.Count > 0)
{
// Increment ID if characters already exist
newCharacter.CharacterId = existingCharacters.Max(c => c.CharacterId) + 1;
}
else
{
// Start with ID 1 if no characters exist
newCharacter.CharacterId = 1;
}
//Logger.Write("newCharacter.CharacterId {0} {1}", newCharacter.CharacterId, context.User.PlayerId);
2024-09-12 15:06:07 +08:00
2024-09-10 00:31:40 +08:00
db.Characters.Add(newCharacter);
db.Entry(newCharacter.Player).State = EntityState.Modified;
db.SaveChanges();
}
// Assign character to player
context.Character = newCharacter;
// Set Player ID
2024-09-17 11:29:41 +08:00
//var writer = new PacketWriter();
//writer.Write(0);
//writer.Write((uint) context.User.PlayerId);
//context.SendPacket(0x11, 0x07, 0, writer.ToArray());
context.SendPacket(new CharacterCreateResponsePacket(CharacterCreateResponsePacket.CharacterCreationStatus.Success, (uint)context.User.PlayerId));
2024-09-10 00:31:40 +08:00
// Spawn
context.SendPacket(new NoPayloadPacket(0x11, 0x3E));
}
#endregion
}
}