PSO2SERVER/Server/Packets/Handlers/CharacterCreate.cs
2024-09-11 17:13:00 +08:00

63 lines
2.0 KiB
C#

using System.IO;
using System.Data.Entity;
using PSO2SERVER.Models;
using PSO2SERVER.Packets.PSOPackets;
using PSO2SERVER.Database;
namespace PSO2SERVER.Packets.Handlers
{
[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);
reader.ReadBytes(12); // 12 unknown bytes
reader.ReadByte(); // VoiceType
reader.ReadBytes(5); // 5 unknown bytes
reader.ReadUInt16(); // VoiceData
var name = reader.ReadFixedLengthUtf16(16);
reader.BaseStream.Seek(0x4, SeekOrigin.Current); // Padding
var looks = reader.ReadStruct<Character.LooksParam>();
var jobs = reader.ReadStruct<Character.JobParam>();
Logger.WriteInternal("[CHR] {0} 创建了名为 {1} 的新角色.", context.User.Username, name);
var newCharacter = new Character
{
Name = name,
Jobs = jobs,
Looks = looks,
Player = context.User
};
// Add to database
using (var db = new ServerEf())
{
db.Characters.Add(newCharacter);
db.Entry(newCharacter.Player).State = EntityState.Modified;
db.SaveChanges();
}
// Assign character to player
context.Character = newCharacter;
// Set Player ID
var writer = new PacketWriter();
writer.Write(0);
writer.Write((uint) context.User.PlayerId);
context.SendPacket(0x11, 0x07, 0, writer.ToArray());
// Spawn
context.SendPacket(new NoPayloadPacket(0x11, 0x3E));
}
#endregion
}
}