更新文件命名

This commit is contained in:
Longfeng Qin 2024-09-16 02:56:02 +08:00
parent be5d3618ef
commit dc45c19cbe
56 changed files with 755 additions and 559 deletions

View File

@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x03, 0x03)]
public class InitialLoad : PacketHandler
{
// Ninji note: 3-3 may not be the correct place to do this
// Once we have better state tracking, we should make sure that
// 3-3 only does anything at the points where the client is supposed
// to be sending it, etc etc
// This seems to only ever be called once after logging in, yet is also handled by 11-3E in other places
// Moved the actual handling into 11-3E until I can actually confirm this
// Just insantiate a new CharacterSpawn and push it through until then
// - Kyle
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
// Set Player ID
var setPlayerId = new PacketWriter();
setPlayerId.WritePlayerHeader((uint)context.User.PlayerId);
context.SendPacket(6, 0, 0, setPlayerId.ToArray());
// Spawn Player
new CharacterSpawn().HandlePacket(context, flags, data, position, size);
}
#endregion
}
}

View File

@ -0,0 +1,20 @@
using System;
using System.IO;
using PSO2SERVER.Packets.PSOPackets;
using PSO2SERVER.Database;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x03, 0x0C)]
public class PingResponse : PacketHandler
{
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
Logger.Write("[HI!] 收到 {0} Ping回应 ", context.User.Username);
}
#endregion
}
}

View File

@ -0,0 +1,25 @@
using PSO2SERVER.Packets.PSOPackets;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x03, 0x10)]
public class DoItMaybe : 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 || context.Character == null)
return;
context.SendPacket(new NoPayloadPacket(0x03, 0x23));
}
#endregion
}
}

View File

@ -7,7 +7,7 @@ using PSO2SERVER.Zone;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x3, 0x12)]
[PacketHandlerAttr(0x03, 0x12)]
class CampshipTeleport : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)

View File

@ -1,16 +1,16 @@
using PSO2SERVER.Models;
using PSO2SERVER.Object;
using PSO2SERVER.Packets.PSOPackets;
using PSO2SERVER.Zone;
using System;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using PSO2SERVER.Models;
using PSO2SERVER.Object;
using PSO2SERVER.Packets.PSOPackets;
using PSO2SERVER.Zone;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x3, 0x34)]
[PacketHandlerAttr(0x03, 0x34)]
class ReturnToLobbyHandler : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)

View File

@ -9,7 +9,7 @@ using System.Text;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x3, 0x35)]
[PacketHandlerAttr(0x03, 0x35)]
class CasinoTeleportHandler : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)

View File

@ -27,7 +27,7 @@ namespace PSO2SERVER.Packets.Handlers
//Logger.WriteInternal("[移动] Movement 数据包来自 {0} 包含 {1} 数据.", context.Character.Name, theFlags);
// TODO: Maybe do this better someday
FullMovementData dstData = new FullMovementData();
MovementPacket.FullMovementData dstData = new MovementPacket.FullMovementData();
if (theFlags.HasFlag(PackedData.ENT1_ID))
{
@ -144,113 +144,6 @@ namespace PSO2SERVER.Packets.Handlers
#endregion
}
[PacketHandlerAttr(0x04, 0x71)]
public class MovementEndHandler : PacketHandler
{
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
PacketReader reader = new PacketReader(data);
FullMovementData movData = reader.ReadStruct<FullMovementData>();
if (movData.entity1.ID == 0 && movData.entity2.ID != 0)
movData.entity1 = movData.entity2;
movData.timestamp = 0;
// This could be simplified
PacketWriter writer = new PacketWriter();
writer.WriteStruct(movData);
//Logger.WriteInternal("[移动] 玩家 {0} 停止移动 (坐标:{1}, {2}, {3})", context.Character.Name,
// Helper.FloatFromHalfPrecision(movData.currentPos.x), Helper.FloatFromHalfPrecision(movData.currentPos.y),
// Helper.FloatFromHalfPrecision(movData.currentPos.z));
foreach (var c in Server.Instance.Clients)
{
if (c == context || c.Character == null || c.CurrentZone != context.CurrentZone)
continue;
c.SendPacket(0x04, 0x71, 0x40, writer.ToArray());
}
}
#endregion
}
[PacketHandlerAttr(0x4, 0x8)]
public class MovementActionHandler : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
PacketReader reader = new PacketReader(data);
reader.ReadStruct<ObjectHeader>(); // Skip blank entity header.
var preformer = reader.ReadStruct<ObjectHeader>(); // Preformer
byte[] preData = reader.ReadBytes(40);
string command = reader.ReadAscii(0x922D, 0x45);
byte[] rest = reader.ReadBytes(4);
uint thingCount = reader.ReadMagic(0x922D, 0x45);
byte[] things;
PacketWriter thingWriter = new PacketWriter();
for (int i = 0; i < thingCount; i++)
{
thingWriter.Write(reader.ReadBytes(4));
}
things = thingWriter.ToArray();
byte[] final = reader.ReadBytes(4);
//Logger.WriteInternal("[动作] {0} 发送动作 {1}", context.Character.Name, command);
foreach (var c in Server.Instance.Clients)
{
if (c == context || c.Character == null || c.CurrentZone != context.CurrentZone)
continue;
PacketWriter output = new PacketWriter();
output.WriteStruct(new ObjectHeader((uint)context.User.PlayerId, EntityType.Player));
output.WriteStruct(preformer);
output.Write(preData);
output.WriteAscii(command, 0x4315, 0x7A);
output.Write(rest);
output.WriteMagic(thingCount, 0x4315, 0x7A);
output.Write(things);
output.Write(final);
c.SendPacket(0x4, 0x80, 0x44, output.ToArray());
}
}
}
[PacketHandlerAttr(0x4, 0x3C)]
public class ActionUpdateHandler : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
PacketReader reader = new PacketReader(data);
reader.ReadStruct<ObjectHeader>(); // Read the blank
ObjectHeader actor = reader.ReadStruct<ObjectHeader>(); // Read the actor
byte[] rest = reader.ReadBytes(32); // TODO Map this out and do stuff with it!
foreach (var c in Server.Instance.Clients)
{
if (c == context || c.Character == null || c.CurrentZone != context.CurrentZone)
continue;
PacketWriter writer = new PacketWriter();
writer.WriteStruct(new ObjectHeader((uint)c.User.PlayerId, EntityType.Player));
writer.WriteStruct(actor);
writer.Write(rest);
c.SendPacket(0x4, 0x81, 0x40, writer.ToArray());
}
}
}
[Flags]
public enum PackedData : Int32
{
@ -278,52 +171,4 @@ namespace PSO2SERVER.Packets.Handlers
}
public struct PackedVec4
{
public UInt16 x, y, z, w;
public PackedVec4(PSOLocation location)
{
this.x = Helper.FloatToHalfPrecision(location.RotX);
this.y = Helper.FloatToHalfPrecision(location.RotY);
this.z = Helper.FloatToHalfPrecision(location.RotZ);
this.w = Helper.FloatToHalfPrecision(location.RotW);
}
}
public struct PackedVec3
{
public UInt16 x, y, z;
public PackedVec3(PSOLocation location)
{
this.x = Helper.FloatToHalfPrecision(location.PosX);
this.y = Helper.FloatToHalfPrecision(location.PosY);
this.z = Helper.FloatToHalfPrecision(location.PosZ);
}
}
[StructLayout(LayoutKind.Explicit, Size = 0x38)]
public struct FullMovementData
{
[FieldOffset(0x0)]
public ObjectHeader entity1;
[FieldOffset(0xC)]
public ObjectHeader entity2;
[FieldOffset(0x18)]
public UInt32 timestamp;
[FieldOffset(0x1C)]
public PackedVec4 rotation;
[FieldOffset(0x24)]
public PackedVec3 currentPos;
[FieldOffset(0x2A)]
public UInt16 Unknown2; // This MAY be part of lastPos, as lastPos may be a Vec4?
[FieldOffset(0x2C)]
public PackedVec3 unknownPos;
[FieldOffset(0x32)]
public UInt16 Unknown3; // This MAY be part of currentPos, as lastPos may be a Vec4?
[FieldOffset(0x34)]
public UInt32 Unknown4;
}
}

View File

@ -0,0 +1,55 @@
using PSO2SERVER.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x04, 0x08)]
public class MovementActionHandler : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
PacketReader reader = new PacketReader(data);
reader.ReadStruct<ObjectHeader>(); // Skip blank entity header.
var preformer = reader.ReadStruct<ObjectHeader>(); // Preformer
byte[] preData = reader.ReadBytes(40);
string command = reader.ReadAscii(0x922D, 0x45);
byte[] rest = reader.ReadBytes(4);
uint thingCount = reader.ReadMagic(0x922D, 0x45);
byte[] things;
PacketWriter thingWriter = new PacketWriter();
for (int i = 0; i < thingCount; i++)
{
thingWriter.Write(reader.ReadBytes(4));
}
things = thingWriter.ToArray();
byte[] final = reader.ReadBytes(4);
//Logger.WriteInternal("[动作] {0} 发送动作 {1}", context.Character.Name, command);
foreach (var c in Server.Instance.Clients)
{
if (c == context || c.Character == null || c.CurrentZone != context.CurrentZone)
continue;
PacketWriter output = new PacketWriter();
output.WriteStruct(new ObjectHeader((uint)context.User.PlayerId, EntityType.Player));
output.WriteStruct(preformer);
output.Write(preData);
output.WriteAscii(command, 0x4315, 0x7A);
output.Write(rest);
output.WriteMagic(thingCount, 0x4315, 0x7A);
output.Write(things);
output.Write(final);
c.SendPacket(0x4, 0x80, 0x44, output.ToArray());
}
}
}
}

View File

@ -9,7 +9,7 @@ using System.Text;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x4, 0x14)]
[PacketHandlerAttr(0x04, 0x14)]
class ObjectInteract : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)

View File

@ -0,0 +1,34 @@
using PSO2SERVER.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x04, 0x3C)]
public class ActionUpdateHandler : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
PacketReader reader = new PacketReader(data);
reader.ReadStruct<ObjectHeader>(); // Read the blank
ObjectHeader actor = reader.ReadStruct<ObjectHeader>(); // Read the actor
byte[] rest = reader.ReadBytes(32); // TODO Map this out and do stuff with it!
foreach (var c in Server.Instance.Clients)
{
if (c == context || c.Character == null || c.CurrentZone != context.CurrentZone)
continue;
PacketWriter writer = new PacketWriter();
writer.WriteStruct(new ObjectHeader((uint)c.User.PlayerId, EntityType.Player));
writer.WriteStruct(actor);
writer.Write(rest);
c.SendPacket(0x4, 0x81, 0x40, writer.ToArray());
}
}
}
}

View File

@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PSO2SERVER.Packets.PSOPackets;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x04, 0x71)]
public class MovementEndHandler : PacketHandler
{
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
PacketReader reader = new PacketReader(data);
MovementPacket.FullMovementData movData = reader.ReadStruct<MovementPacket.FullMovementData>();
if (movData.entity1.ID == 0 && movData.entity2.ID != 0)
movData.entity1 = movData.entity2;
movData.timestamp = 0;
// This could be simplified
PacketWriter writer = new PacketWriter();
writer.WriteStruct(movData);
//Logger.WriteInternal("[移动] 玩家 {0} 停止移动 (坐标:{1}, {2}, {3})", context.Character.Name,
// Helper.FloatFromHalfPrecision(movData.currentPos.x), Helper.FloatFromHalfPrecision(movData.currentPos.y),
// Helper.FloatFromHalfPrecision(movData.currentPos.z));
foreach (var c in Server.Instance.Clients)
{
if (c == context || c.Character == null || c.CurrentZone != context.CurrentZone)
continue;
c.SendPacket(0x04, 0x71, 0x40, writer.ToArray());
}
}
#endregion
}
}

View File

@ -0,0 +1,16 @@
using System;
using PSO2SERVER.Models;
using PSO2SERVER.Packets.PSOPackets;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x0B, 0x09)]
class _0B_09_UNK : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
var info = string.Format("[接收] 接收到的数据 (hex): ");
Logger.WriteHex(info, data);
}
}
}

View File

@ -0,0 +1,21 @@
using PSO2SERVER.Packets.PSOPackets;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x0B, 0x15)]
class QuestCounterAvailableHander : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
PacketWriter writer = new PacketWriter();
context.SendPacket(new QuestAvailablePacket());
}
}
}

View File

@ -0,0 +1,38 @@
using PSO2SERVER.Models;
using PSO2SERVER.Packets.PSOPackets;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0xB, 0x17)]
class QuestListRequestHandler : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
// What am I doing
QuestDefiniton[] defs = new QuestDefiniton[1];
for (int i = 0; i < defs.Length; i++)
{
defs[i].dateOrSomething = "2012/01/05";
defs[i].needsToBeNonzero = 0x00000020;
defs[i].getsSetToWord = 0x0000000B;
defs[i].questNameString = 30010;
defs[i].playTime = (byte)QuestListPacket.EstimatedTime.Short;
defs[i].partyType = (byte)QuestListPacket.PartyType.SinglePartyQuest;
defs[i].difficulties = (byte)QuestListPacket.Difficulties.Normal | (byte)QuestListPacket.Difficulties.hard | (byte)QuestListPacket.Difficulties.VeryHard | (byte)QuestListPacket.Difficulties.SuperHard;
defs[i].requiredLevel = 1;
// Not sure why but these need to be set for the quest to be enabled
defs[i].field_FF = 0xF1;
defs[i].field_101 = 1;
}
context.SendPacket(new QuestListPacket(defs));
context.SendPacket(new NoPayloadPacket(0xB, 0x1B));
}
}
}

View File

@ -0,0 +1,34 @@
using PSO2SERVER.Packets.PSOPackets;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0xB, 0x19)]
class QuestDifficultyRequestHandler : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
QuestDifficultyPacket.QuestDifficulty[] diffs = new QuestDifficultyPacket.QuestDifficulty[1];
for (int i = 0; i < diffs.Length; i++)
{
diffs[i].dateOrSomething = "2012/01/05";
diffs[i].something = 0x20;
diffs[i].something2 = 0x0B;
diffs[i].questNameString = 30010;
// These are likely bitfields
diffs[i].something3 = 0x00030301;
}
context.SendPacket(new QuestDifficultyPacket(diffs));
// [K873] I believe this is the correct packet, but it causes an infinite send/recieve loop, we're probably just missing something else
context.SendPacket(new NoPayloadPacket(0xB, 0x1C));
}
}
}

View File

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x0B, 0x30)]
class QuestCounterHandler : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
// Not sure what this does yet
byte[] allTheQuests = new byte[408];
for (int i = 0; i < allTheQuests.Length; i++)
allTheQuests[i] = 0xFF;
context.SendPacket(0xB, 0x22, 0x0, allTheQuests);
}
}
}

View File

@ -0,0 +1,49 @@
using System;
using PSO2SERVER.Models;
using PSO2SERVER.Packets.PSOPackets;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0xE, 0xC)]
class QuestDifficultyStartHandler : PacketHandler
{
// Go go maximum code duplication (for now)
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
QuestDefiniton def = new QuestDefiniton
{
dateOrSomething = "2012/01/05",
needsToBeNonzero = 0x00000020,
getsSetToWord = 0x0000000B,
questNameString = 30010,
playTime = (byte)QuestListPacket.EstimatedTime.Short,
partyType = (byte)QuestListPacket.PartyType.SinglePartyQuest,
difficulties = (byte)QuestListPacket.Difficulties.Normal | (byte)QuestListPacket.Difficulties.hard | (byte)QuestListPacket.Difficulties.VeryHard | (byte)QuestListPacket.Difficulties.SuperHard,
requiredLevel = 1,
// Not sure why but these need to be set for the quest to be enabled
field_FF = 0xF1,
field_101 = 1
};
QuestDifficultyPacket.QuestDifficulty diff = new QuestDifficultyPacket.QuestDifficulty
{
dateOrSomething = "2012/01/05",
something = 0x20,
something2 = 0x0B,
questNameString = 30010,
// These are likely bitfields
something3 = 0x00030301
};
var quest = new Quest("arks_010120")
{
questDef = def
};
context.currentParty.currentQuest = quest;
context.SendPacket(new SetQuestPacket(def, context.User));
context.SendPacket(new QuestStartPacket(def, diff));
}
}
}

View File

@ -0,0 +1,16 @@
using System;
using PSO2SERVER.Models;
using PSO2SERVER.Packets.PSOPackets;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x0E, 0x19)]
class _0E_19_UNK : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
var info = string.Format("[接收] 接收到的数据 (hex): ");
Logger.WriteHex(info, data);
}
}
}

View File

@ -7,7 +7,7 @@ using PSO2SERVER.Models;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x11, 0x0)]
[PacketHandlerAttr(0x11, 0x00)]
public class Login : PacketHandler
{
#region implemented abstract members of PacketHandler

View File

@ -54,48 +54,4 @@ namespace PSO2SERVER.Packets.Handlers
#endregion
}
[PacketHandlerAttr(0x03, 0x03)]
public class InitialLoad : PacketHandler
{
// Ninji note: 3-3 may not be the correct place to do this
// Once we have better state tracking, we should make sure that
// 3-3 only does anything at the points where the client is supposed
// to be sending it, etc etc
// This seems to only ever be called once after logging in, yet is also handled by 11-3E in other places
// Moved the actual handling into 11-3E until I can actually confirm this
// Just insantiate a new CharacterSpawn and push it through until then
// - Kyle
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
// Set Player ID
var setPlayerId = new PacketWriter();
setPlayerId.WritePlayerHeader((uint)context.User.PlayerId);
context.SendPacket(6, 0, 0, setPlayerId.ToArray());
// Spawn Player
new CharacterSpawn().HandlePacket(context, flags, data, position, size);
}
#endregion
}
[PacketHandlerAttr(0x03, 0x10)]
public class DoItMaybe : 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 || context.Character == null)
return;
context.SendPacket(new NoPayloadPacket(0x03, 0x23));
}
#endregion
}
}

View File

@ -0,0 +1,45 @@
using System;
using System.IO;
using PSO2SERVER.Packets.PSOPackets;
using PSO2SERVER.Database;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x11, 0x06)]
public class DeleteCharacter : PacketHandler
{
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
var reader = new PacketReader(data);
var id = reader.ReadInt32();
Logger.Write("[CHR] {0} 正在删除ID {1} 的角色", context.User.Username, id);
// Delete Character
using (var db = new ServerEf())
{
foreach (var character in db.Characters)
if (character.CharacterId == id)
{
db.Characters.Remove(character);
db.ChangeTracker.DetectChanges();
break;
}
// Detect the deletion and save the Database
if (db.ChangeTracker.HasChanges())
db.SaveChanges();
}
// Disconnect for now
// TODO: What do we do after a deletion?
context.Socket.Close();
}
#endregion
}
}

View File

@ -5,7 +5,7 @@ using PSO2SERVER.Crypto;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x11, 0xB)]
[PacketHandlerAttr(0x11, 0x0B)]
public class KeyExchange : PacketHandler
{
#region implemented abstract members of PacketHandler

View File

@ -0,0 +1,25 @@
using System;
using System.IO;
using PSO2SERVER.Packets.PSOPackets;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x11, 0x0D)]
public class PingTimestampResponse : PacketHandler
{
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
var reader = new PacketReader(data, position, size);
var clientTime = reader.ReadUInt64();
var writer = new PacketWriter();
writer.Write(clientTime);
writer.Write(Helper.Timestamp(DateTime.UtcNow));
context.SendPacket(0x11, 0xE, 0, writer.ToArray());
}
#endregion
}
}

View File

@ -0,0 +1,38 @@
using PSO2SERVER.Packets.PSOPackets;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x11, 0x1D)]
public class GuildInfoRequest : PacketHandler
{
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
var reader = new PacketReader(data);
reader.BaseStream.Seek(0xC, SeekOrigin.Begin);
var id = reader.ReadUInt32();
foreach (var client in ServerApp.Instance.Server.Clients)
{
if (client.Character.CharacterId == id)
{
var infoPacket = new GuildInfoPacket(context.Character);
context.SendPacket(infoPacket);
Logger.Write("[NFO] Sent guild info to " + client.Character.CharacterId);
break;
}
}
}
#endregion
}
}

View File

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x11, 0x2B)]
public class LogOutRequest : PacketHandler
{
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
context.Socket.Close();
}
#endregion
}
}

View File

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x11, 0x41)]
public class CreateCharacterOne : PacketHandler
{
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
var writer = new PacketWriter();
writer.Write((uint)0);
writer.Write((uint)0);
writer.Write((uint)0);
writer.Write((uint)0);
context.SendPacket(0x11, 0x42, 0x0, writer.ToArray());
}
#endregion
}
}

View File

@ -0,0 +1,25 @@
using System;
using System.IO;
using PSO2SERVER.Packets.PSOPackets;
using PSO2SERVER.Database;
// This file is to hold all packet handlers that require no logic to respond to, or require less than 5 lines of logic.
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x11, 0x54)]
public class CreateCharacterTwo : PacketHandler
{
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
var writer = new PacketWriter();
writer.Write((uint) 0);
context.SendPacket(0x11, 0x55, 0x0, writer.ToArray());
}
#endregion
}
}

View File

@ -1,120 +0,0 @@
using System;
using PSO2SERVER.Models;
using PSO2SERVER.Packets.PSOPackets;
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0xB, 0x30)]
class QuestCounterHandler : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
// Not sure what this does yet
byte[] allTheQuests = new byte[408];
for (int i = 0; i < allTheQuests.Length; i++)
allTheQuests[i] = 0xFF;
context.SendPacket(0xB, 0x22, 0x0, allTheQuests);
}
}
[PacketHandlerAttr(0xB, 0x15)]
class QuestCounterAvailableHander : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
PacketWriter writer = new PacketWriter();
context.SendPacket(new QuestAvailablePacket());
}
}
[PacketHandlerAttr(0xB, 0x17)]
class QuestListRequestHandler : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
// What am I doing
QuestDefiniton[] defs = new QuestDefiniton[1];
for (int i = 0; i < defs.Length; i++)
{
defs[i].dateOrSomething = "2012/01/05";
defs[i].needsToBeNonzero = 0x00000020;
defs[i].getsSetToWord = 0x0000000B;
defs[i].questNameString = 30010;
defs[i].playTime = (byte)QuestListPacket.EstimatedTime.Short;
defs[i].partyType = (byte)QuestListPacket.PartyType.SinglePartyQuest;
defs[i].difficulties = (byte)QuestListPacket.Difficulties.Normal | (byte)QuestListPacket.Difficulties.hard | (byte)QuestListPacket.Difficulties.VeryHard | (byte)QuestListPacket.Difficulties.SuperHard;
defs[i].requiredLevel = 1;
// Not sure why but these need to be set for the quest to be enabled
defs[i].field_FF = 0xF1;
defs[i].field_101 = 1;
}
context.SendPacket(new QuestListPacket(defs));
context.SendPacket(new NoPayloadPacket(0xB, 0x1B));
}
}
[PacketHandlerAttr(0xB, 0x19)]
class QuestDifficultyRequestHandler : PacketHandler
{
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
QuestDifficultyPacket.QuestDifficulty[] diffs = new QuestDifficultyPacket.QuestDifficulty[1];
for (int i = 0; i < diffs.Length; i++)
{
diffs[i].dateOrSomething = "2012/01/05";
diffs[i].something = 0x20;
diffs[i].something2 = 0x0B;
diffs[i].questNameString = 30010;
// These are likely bitfields
diffs[i].something3 = 0x00030301;
}
context.SendPacket(new QuestDifficultyPacket(diffs));
// [K873] I believe this is the correct packet, but it causes an infinite send/recieve loop, we're probably just missing something else
context.SendPacket(new NoPayloadPacket(0xB, 0x1C));
}
}
[PacketHandlerAttr(0xE, 0xC)]
class QuestDifficultyStartHandler : PacketHandler
{
// Go go maximum code duplication (for now)
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
QuestDefiniton def = new QuestDefiniton();
def.dateOrSomething = "2012/01/05";
def.needsToBeNonzero = 0x00000020;
def.getsSetToWord = 0x0000000B;
def.questNameString = 30010;
def.playTime = (byte)QuestListPacket.EstimatedTime.Short;
def.partyType = (byte)QuestListPacket.PartyType.SinglePartyQuest;
def.difficulties = (byte)QuestListPacket.Difficulties.Normal | (byte)QuestListPacket.Difficulties.hard | (byte)QuestListPacket.Difficulties.VeryHard | (byte)QuestListPacket.Difficulties.SuperHard;
def.requiredLevel = 1;
// Not sure why but these need to be set for the quest to be enabled
def.field_FF = 0xF1;
def.field_101 = 1;
QuestDifficultyPacket.QuestDifficulty diff = new QuestDifficultyPacket.QuestDifficulty();
diff.dateOrSomething = "2012/01/05";
diff.something = 0x20;
diff.something2 = 0x0B;
diff.questNameString = 30010;
// These are likely bitfields
diff.something3 = 0x00030301;
var quest = new Quest("arks_010120");
quest.questDef = def;
context.currentParty.currentQuest = quest;
context.SendPacket(new SetQuestPacket(def, context.User));
context.SendPacket(new QuestStartPacket(def, diff));
}
}
}

View File

@ -1,152 +0,0 @@
using System;
using System.IO;
using PSO2SERVER.Packets.PSOPackets;
using PSO2SERVER.Database;
// This file is to hold all packet handlers that require no logic to respond to, or require less than 5 lines of logic.
namespace PSO2SERVER.Packets.Handlers
{
[PacketHandlerAttr(0x03, 0x0C)]
public class PingResponse : PacketHandler
{
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
Logger.Write("[HI!] 收到 {0} Ping回应 ", context.User.Username);
}
#endregion
}
[PacketHandlerAttr(0x11, 0x06)]
public class DeleteCharacter : PacketHandler
{
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
var reader = new PacketReader(data);
var id = reader.ReadInt32();
Logger.Write("[CHR] {0} 正在删除ID {1} 的角色", context.User.Username, id);
// Delete Character
using (var db = new ServerEf())
{
foreach (var character in db.Characters)
if (character.CharacterId == id)
{
db.Characters.Remove(character);
db.ChangeTracker.DetectChanges();
break;
}
// Detect the deletion and save the Database
if (db.ChangeTracker.HasChanges())
db.SaveChanges();
}
// Disconnect for now
// TODO: What do we do after a deletion?
context.Socket.Close();
}
#endregion
}
[PacketHandlerAttr(0x11, 0x0D)]
public class PingTimestampResponse : PacketHandler
{
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
var reader = new PacketReader(data, position, size);
var clientTime = reader.ReadUInt64();
var writer = new PacketWriter();
writer.Write(clientTime);
writer.Write(Helper.Timestamp(DateTime.UtcNow));
context.SendPacket(0x11, 0xE, 0, writer.ToArray());
}
#endregion
}
[PacketHandlerAttr(0x11, 0x1D)]
public class GuildInfoRequest : PacketHandler
{
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
var reader = new PacketReader(data);
reader.BaseStream.Seek(0xC, SeekOrigin.Begin);
var id = reader.ReadUInt32();
foreach (var client in ServerApp.Instance.Server.Clients)
{
if (client.Character.CharacterId == id)
{
var infoPacket = new GuildInfoPacket(context.Character);
context.SendPacket(infoPacket);
Logger.Write("[NFO] Sent guild info to " + client.Character.CharacterId);
break;
}
}
}
#endregion
}
[PacketHandlerAttr(0x11, 0x2B)]
public class LogOutRequest : PacketHandler
{
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
context.Socket.Close();
}
#endregion
}
[PacketHandlerAttr(0x11, 0x41)]
public class CreateCharacterOne : PacketHandler
{
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
var writer = new PacketWriter();
writer.Write((uint) 0);
writer.Write((uint) 0);
writer.Write((uint) 0);
writer.Write((uint) 0);
context.SendPacket(0x11, 0x42, 0x0, writer.ToArray());
}
#endregion
}
[PacketHandlerAttr(0x11, 0x54)]
public class CreateCharacterTwo : PacketHandler
{
#region implemented abstract members of PacketHandler
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
var writer = new PacketWriter();
writer.Write((uint) 0);
context.SendPacket(0x11, 0x55, 0x0, writer.ToArray());
}
#endregion
}
}

View File

@ -0,0 +1,80 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using PSO2SERVER.Models;
using PSO2SERVER.Packets.Handlers;
namespace PSO2SERVER.Packets.PSOPackets
{
class MovementPacket : Packet
{
public struct PackedVec4
{
public UInt16 x, y, z, w;
public PackedVec4(PSOLocation location)
{
this.x = Helper.FloatToHalfPrecision(location.RotX);
this.y = Helper.FloatToHalfPrecision(location.RotY);
this.z = Helper.FloatToHalfPrecision(location.RotZ);
this.w = Helper.FloatToHalfPrecision(location.RotW);
}
}
public struct PackedVec3
{
public UInt16 x, y, z;
public PackedVec3(PSOLocation location)
{
this.x = Helper.FloatToHalfPrecision(location.PosX);
this.y = Helper.FloatToHalfPrecision(location.PosY);
this.z = Helper.FloatToHalfPrecision(location.PosZ);
}
}
[StructLayout(LayoutKind.Explicit, Size = 0x38)]
public struct FullMovementData
{
[FieldOffset(0x0)]
public ObjectHeader entity1;
[FieldOffset(0xC)]
public ObjectHeader entity2;
[FieldOffset(0x18)]
public UInt32 timestamp;
[FieldOffset(0x1C)]
public PackedVec4 rotation;
[FieldOffset(0x24)]
public PackedVec3 currentPos;
[FieldOffset(0x2A)]
public UInt16 Unknown2; // This MAY be part of lastPos, as lastPos may be a Vec4?
[FieldOffset(0x2C)]
public PackedVec3 unknownPos;
[FieldOffset(0x32)]
public UInt16 Unknown3; // This MAY be part of currentPos, as lastPos may be a Vec4?
[FieldOffset(0x34)]
public UInt32 Unknown4;
}
FullMovementData data;
public MovementPacket(FullMovementData data)
{
this.data = data;
}
public override byte[] Build()
{
PacketWriter pw = new PacketWriter();
pw.WriteStruct(data);
return pw.ToArray();
}
public override PacketHeader GetHeader()
{
return new PacketHeader(0x04, 0x07, PacketFlags.OBJECT_RELATED);
}
}
}

View File

@ -40,7 +40,7 @@ namespace PSO2SERVER.Packets.PSOPackets
public override PacketHeader GetHeader()
{
return new PacketHeader(0x4, 0x15, (PacketFlags.OBJECT_RELATED | PacketFlags.PACKED));
return new PacketHeader(0x04, 0x15, (PacketFlags.OBJECT_RELATED | PacketFlags.PACKED));
}
}
}

View File

@ -123,7 +123,7 @@ namespace PSO2SERVER.Packets.PSOPackets
public override PacketHeader GetHeader()
{
return new PacketHeader(0xB, 0x16);
return new PacketHeader(0x0B, 0x16);
}
}
}

View File

@ -25,7 +25,7 @@ namespace PSO2SERVER.Packets.PSOPackets
public override PacketHeader GetHeader()
{
return new PacketHeader(0xB, 0x18, 0x4);
return new PacketHeader(0x0B, 0x18, 0x04);
}
// Hoo boy, this is 468 bytes!

View File

@ -49,7 +49,7 @@ namespace PSO2SERVER.Packets.PSOPackets
public override PacketHeader GetHeader()
{
return new PacketHeader(0xB, 0x1A, 0x4);
return new PacketHeader(0x0B, 0x1A, 0x4);
}
//Size: 308 bytes, confirmed in unpacker

View File

@ -79,7 +79,7 @@ namespace PSO2SERVER.Packets.PSOPackets
public override PacketHeader GetHeader()
{
return new PacketHeader(0xE, 0x2, PacketFlags.PACKED);
return new PacketHeader(0x0E, 0x02, PacketFlags.PACKED);
}
}
}

View File

@ -30,7 +30,7 @@ namespace PSO2SERVER.Packets.PSOPackets
public override PacketHeader GetHeader()
{
return new PacketHeader(0xE, 0x31);
return new PacketHeader(0x0E, 0x31);
}
}
}

View File

@ -71,7 +71,7 @@ namespace PSO2SERVER.Packets.PSOPackets
public override PacketHeader GetHeader()
{
return new PacketHeader(0x11, 0x1, PacketFlags.PACKED);
return new PacketHeader(0x11, 0x01, PacketFlags.PACKED);
}
}
}

View File

@ -28,7 +28,7 @@ namespace PSO2SERVER.Packets.PSOPackets
public override PacketHeader GetHeader()
{
return new PacketHeader(0x2F, 0x7, PacketFlags.PACKED);
return new PacketHeader(0x2F, 0x07, PacketFlags.PACKED);
}
}
}

View File

@ -1,31 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PSO2SERVER.Models;
using PSO2SERVER.Packets.Handlers;
namespace PSO2SERVER.Packets.PSOPackets
{
class MovementPacket : Packet
{
FullMovementData data;
public MovementPacket(FullMovementData data)
{
this.data = data;
}
public override byte[] Build()
{
PacketWriter pw = new PacketWriter();
pw.WriteStruct(data);
return pw.ToArray();
}
public override PacketHeader GetHeader()
{
return new PacketHeader(0x4, 0x7, PacketFlags.OBJECT_RELATED);
}
}
}

View File

@ -34,8 +34,8 @@ namespace PSO2SERVER.Packets.Handlers
where attrs.Length > 0
select new
{
Type = attrs[0].Type,
Subtype = attrs[0].Subtype,
attrs[0].Type,
attrs[0].Subtype,
HandlerType = t
}).ToList();

View File

@ -170,29 +170,46 @@
<Compile Include="Models\Quest.cs" />
<Compile Include="Network\PortChecker.cs" />
<Compile Include="Object\ObjectManager.cs" />
<Compile Include="Packets\Handlers\CampshipTeleport.cs" />
<Compile Include="Packets\Handlers\CasinoTeleportHandler.cs" />
<Compile Include="Packets\Handlers\CharacterSpawn.cs" />
<Compile Include="Packets\Handlers\ObjectInteract.cs" />
<Compile Include="Packets\Handlers\QuestCounterHandler.cs" />
<Compile Include="Packets\Handlers\ReturnToLobbyHandler.cs" />
<Compile Include="Packets\Handlers\SymbolArtHandler.cs" />
<Compile Include="Packets\PSOPackets\GuildInfoPacket.cs" />
<Compile Include="Packets\PSOPackets\LoginDataPacket.cs" />
<Compile Include="Packets\PSOPackets\MovementPacket.cs" />
<Compile Include="Packets\PSOPackets\ObjectActionPacket.cs" />
<Compile Include="Packets\PSOPackets\PalettePacket.cs" />
<Compile Include="Packets\PSOPackets\PartyInitPacket.cs" />
<Compile Include="Packets\PSOPackets\QuestStartPacket.cs" />
<Compile Include="Packets\PSOPackets\QuestDifficultyPacket.cs" />
<Compile Include="Packets\PSOPackets\QuestAvailablePacket.cs" />
<Compile Include="Packets\PSOPackets\QuestListPacket.cs" />
<Compile Include="Packets\PSOPackets\SetCurrencyPacket.cs" />
<Compile Include="Packets\PSOPackets\SetMesetaPacket.cs" />
<Compile Include="Packets\PSOPackets\SetQuestPacket.cs" />
<Compile Include="Packets\PSOPackets\SetScenePacket.cs" />
<Compile Include="Packets\PSOPackets\SymbolArtList.cs" />
<Compile Include="Packets\PSOPackets\TeleportTransferPacket.cs" />
<Compile Include="Packets\Handlers\03-03-InitialLoad.cs" />
<Compile Include="Packets\Handlers\03-0C-PingResponse.cs" />
<Compile Include="Packets\Handlers\03-10-DoItMaybe.cs" />
<Compile Include="Packets\Handlers\03-12-CampshipTeleport.cs" />
<Compile Include="Packets\Handlers\03-35-CasinoTeleportHandler.cs" />
<Compile Include="Packets\Handlers\04-08-MovementActionHandler.cs" />
<Compile Include="Packets\Handlers\04-3C-ActionUpdateHandler.cs" />
<Compile Include="Packets\Handlers\04-71-MovementEndHandler.cs" />
<Compile Include="Packets\Handlers\0B-09-UNK.cs" />
<Compile Include="Packets\Handlers\0B-15-QuestCounterAvailableHander.cs" />
<Compile Include="Packets\Handlers\0B-17-QuestListRequestHandler.cs" />
<Compile Include="Packets\Handlers\0B-19-QuestDifficultyRequestHandler.cs" />
<Compile Include="Packets\Handlers\0B-30-QuestCounterHandler.cs" />
<Compile Include="Packets\Handlers\0E-19-UNK.cs" />
<Compile Include="Packets\Handlers\11-06-DeleteCharacter.cs" />
<Compile Include="Packets\Handlers\11-0D-PingTimestampResponse.cs" />
<Compile Include="Packets\Handlers\11-1D-GuildInfoRequest.cs" />
<Compile Include="Packets\Handlers\11-2B-LogOutRequest.cs" />
<Compile Include="Packets\Handlers\11-3E-CharacterSpawn.cs" />
<Compile Include="Packets\Handlers\04-14-ObjectInteract.cs" />
<Compile Include="Packets\Handlers\0E-0C-QuestCounterHandler.cs" />
<Compile Include="Packets\Handlers\03-34-ReturnToLobbyHandler.cs" />
<Compile Include="Packets\Handlers\11-41-CreateCharacterOne.cs" />
<Compile Include="Packets\Handlers\2F-06-SymbolArtHandler.cs" />
<Compile Include="Packets\PSOPackets\1C-1F-GuildInfoPacket.cs" />
<Compile Include="Packets\PSOPackets\11-01-LoginDataPacket.cs" />
<Compile Include="Packets\PSOPackets\04-07-MovementPacket.cs" />
<Compile Include="Packets\PSOPackets\04-15-ObjectActionPacket.cs" />
<Compile Include="Packets\PSOPackets\21-01-PalettePacket.cs" />
<Compile Include="Packets\PSOPackets\0E-02-PartyInitPacket.cs" />
<Compile Include="Packets\PSOPackets\0E-31-QuestStartPacket.cs" />
<Compile Include="Packets\PSOPackets\0B-1A-QuestDifficultyPacket.cs" />
<Compile Include="Packets\PSOPackets\0B-16-QuestAvailablePacket.cs" />
<Compile Include="Packets\PSOPackets\0B-18-QuestListPacket.cs" />
<Compile Include="Packets\PSOPackets\11-1C-SetCurrencyPacket.cs" />
<Compile Include="Packets\PSOPackets\0F-14-SetMesetaPacket.cs" />
<Compile Include="Packets\PSOPackets\0E-25-SetQuestPacket.cs" />
<Compile Include="Packets\PSOPackets\UN-UN-SetScenePacket.cs" />
<Compile Include="Packets\PSOPackets\2F-07-SymbolArtList.cs" />
<Compile Include="Packets\PSOPackets\04-02-TeleportTransferPacket.cs" />
<Compile Include="Party\Party.cs" />
<Compile Include="Party\PartyManager.cs" />
<Compile Include="Program.cs" />
@ -201,11 +218,11 @@
<Compile Include="Network\SocketClient.cs" />
<Compile Include="Network\SocketServer.cs" />
<Compile Include="Server.cs" />
<Compile Include="Packets\Handlers\PacketHandler.cs" />
<Compile Include="Packets\Handlers\KeyExchange.cs" />
<Compile Include="Packets\Handlers\Login.cs" />
<Compile Include="Packets\PacketHandler.cs" />
<Compile Include="Packets\Handlers\11-0B-KeyExchange.cs" />
<Compile Include="Packets\Handlers\11-00-Login.cs" />
<Compile Include="Models\Character.cs" />
<Compile Include="Packets\Handlers\SimplePackets.cs" />
<Compile Include="Packets\Handlers\11-54-CreateCharacterTwo.cs" />
<Compile Include="Packets\PacketWriter.cs" />
<Compile Include="Models\FixedPackets.cs" />
<Compile Include="QueryServer.cs" />
@ -215,15 +232,15 @@
<Compile Include="Crypto\ARC4Managed.cs" />
<Compile Include="Helper.cs" />
<Compile Include="Packets\PacketReader.cs" />
<Compile Include="Packets\Handlers\CharacterCreate.cs" />
<Compile Include="Packets\Handlers\CharacterList.cs" />
<Compile Include="Packets\Handlers\11-05-CharacterCreate.cs" />
<Compile Include="Packets\Handlers\11-02-CharacterList.cs" />
<Compile Include="Packets\Packet.cs" />
<Compile Include="Packets\PSOPackets\SystemMessagePacket.cs" />
<Compile Include="Packets\Handlers\StartGame.cs" />
<Compile Include="Packets\PSOPackets\NoPayloadPacket.cs" />
<Compile Include="Packets\PSOPackets\CharacterSpawnPacket.cs" />
<Compile Include="Packets\Handlers\MovementHandlers.cs" />
<Compile Include="Packets\Handlers\ChatHandler.cs" />
<Compile Include="Packets\PSOPackets\19-01-SystemMessagePacket.cs" />
<Compile Include="Packets\Handlers\11-04-StartGame.cs" />
<Compile Include="Packets\NoPayloadPacket.cs" />
<Compile Include="Packets\PSOPackets\08-04-CharacterSpawnPacket.cs" />
<Compile Include="Packets\Handlers\04-07-MovementHandlers.cs" />
<Compile Include="Packets\Handlers\07-00-ChatHandler.cs" />
<Compile Include="Zone\Map.cs" />
<Compile Include="Zone\ZoneManager.cs" />
</ItemGroup>
@ -263,6 +280,7 @@
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup />
<PropertyGroup>
<PostBuildEvent>
</PostBuildEvent>