物品读取修正

移除部分DEBUG信息
This commit is contained in:
Longfeng Qin 2024-12-11 02:24:51 +08:00
parent 535dbfc12b
commit 37106641a7
18 changed files with 435 additions and 123 deletions

View File

@ -104,7 +104,7 @@ namespace PSO2SERVER
} }
// Display all settings // Display all settings
DisplaySettings(); //DisplaySettings();
// Some settings require manual refreshing // Some settings require manual refreshing
SettingsChanged(); SettingsChanged();

View File

@ -41,13 +41,6 @@ namespace PSO2SERVER.Models
public StorageInventory Extend1; public StorageInventory Extend1;
} }
/// Player equiped item.
public struct EquipedItem
{
public PSO2Items item;
public uint unk;
}
internal class Inventory internal class Inventory
{ {
} }

View File

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PSO2SERVER.Models
{
public enum ItemTypes
{
NoItem,
Weapon,
Clothing,
Consumable,
Camo,
Unit,
Unknown
}
[Flags]
public enum ItemFlags
{
Locked = 0x01,
BoundToOwner = 0x02
}
public enum ItemElement
{
None,
Fire,
Ice,
Lightning,
Wind,
Light,
Dark
}
}

View File

@ -1,5 +1,6 @@
using PSO2SERVER.Protocol; using PSO2SERVER.Protocol;
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text; using System.Text;
@ -37,10 +38,10 @@ namespace PSO2SERVER.Models
public PSO2ItemCamo Camo; public PSO2ItemCamo Camo;
[FieldOffset(0)] [FieldOffset(0)]
public PSO2ItemUnit Unit; public PSO2ItemUnit Unit;
//[FieldOffset(0)] [FieldOffset(0)]
//public byte[] Unknown; public byte[] Unknown;
//[FieldOffset(0)] [FieldOffset(0)]
//public PSO2ItemNone None; public PSO2ItemNone None;
} }
[StructLayout(LayoutKind.Sequential)] [StructLayout(LayoutKind.Sequential)]
@ -246,77 +247,171 @@ namespace PSO2SERVER.Models
} }
} }
public enum ItemTypes [StructLayout(LayoutKind.Sequential)]
public struct NamedId
{ {
NoItem, public string Name { get; set; }
Weapon, public ItemId Id { get; set; }
Clothing,
Consumable,
Camo,
Unit,
Unknown
} }
[Flags] [StructLayout(LayoutKind.Sequential)]
public enum ItemFlags public struct CampaignItemDefinition
{ {
Locked = 0x01, /// <summary>
BoundToOwner = 0x02 /// Campaign ID.
/// </summary>
public uint CampaignId; // Equivalent to u32
/// <summary>
/// Number of items in the following array.
/// </summary>
public uint ItemAmount; // Equivalent to u32
/// <summary>
/// Campaign items.
/// </summary>
public List<CampaignItem> Items; // Using List instead of fixed-size array
} }
public enum ItemElement [StructLayout(LayoutKind.Sequential)]
public struct CampaignItem
{ {
None, /// <summary>
Fire, /// Item ID.
Ice, /// </summary>
Lightning, public ItemId Id; // Assuming ItemId is a type, use it as-is
Wind,
Light, /// <summary>
Dark /// Item amount.
} /// </summary>
public uint Amount; // Equivalent to u32
/// <summary>
/// Unknown field.
/// </summary>
public uint Unk; // Equivalent to u32
} }
public static class AffixUtils [StructLayout(LayoutKind.Sequential)]
public struct StorageInfo
{ {
public static ushort[] ReadPackedAffixes(Stream reader) /// <summary>
{ /// Total space in the storage.
byte[] packed = new byte[12]; /// </summary>
reader.Read(packed, 0, packed.Length); public uint TotalSpace; // Equivalent to u32
ushort[] affixes = new ushort[8]; /// <summary>
for (int i = 0; i < 4; i++) /// Used space in the storage.
{ /// </summary>
affixes[i * 2] = BitConverter.ToUInt16(new byte[] { packed[i * 3], (byte)((packed[i * 3 + 2] & 0xF0) >> 4) }, 0); public uint UsedSpace; // Equivalent to u32
affixes[i * 2 + 1] = BitConverter.ToUInt16(new byte[] { packed[i * 3 + 1], (byte)(packed[i * 3 + 2] & 0xF) }, 0);
} /// <summary>
return affixes; /// Storage ID.
/// </summary>
public byte StorageId; // Equivalent to u8
/// <summary>
/// Storage type (?).
/// </summary>
public byte StorageType; // Equivalent to u8
/// <summary>
/// Is the storage locked (?).
/// </summary>
public byte IsLocked; // Equivalent to u8
/// <summary>
/// Is the storage enabled (?).
/// </summary>
public byte IsEnabled; // Equivalent to u8
} }
public static void WritePackedAffixes(ushort[] affixes, Stream writer) [StructLayout(LayoutKind.Sequential)]
public struct MaterialStorageItem
{ {
byte[] packed = new byte[12]; /// <summary>
for (int i = 0; i < 4; i++) /// Item category.
{ /// </summary>
byte[] affix1 = BitConverter.GetBytes(affixes[i * 2]); public ushort Id; // Equivalent to u16
byte[] affix2 = BitConverter.GetBytes(affixes[i * 2 + 1]);
packed[i * 3] = affix1[0]; /// <summary>
packed[i * 3 + 1] = affix2[0]; /// Item ID.
packed[i * 3 + 2] = (byte)((affix1[1] << 4) | (affix2[1] & 0xF)); /// </summary>
} public ushort Subid; // Equivalent to u16
writer.Write(packed, 0, packed.Length);
} /// <summary>
/// Item amount.
/// </summary>
public ushort Amount; // Equivalent to u16
/// <summary>
/// Unknown field.
/// </summary>
public ushort Unk4; // Equivalent to u16
} }
public class PacketError : Exception [StructLayout(LayoutKind.Sequential)]
public struct UUIDAmount
{ {
public string PacketName { get; } public ulong Uuid { get; set; }
public string FieldName { get; } public ushort Amount { get; set; }
public ushort Unk { get; set; }
}
public PacketError(string packetName, string fieldName, Exception innerException) [StructLayout(LayoutKind.Sequential)]
: base($"Error in packet '{packetName}', field '{fieldName}'", innerException) public struct EquipedItem
{ {
PacketName = packetName; public PSO2Items Item { get; set; }
FieldName = fieldName; public uint Unk { get; set; }
} }
[StructLayout(LayoutKind.Sequential)]
public struct MoveStorageItemRequest
{
public ulong Uuid { get; set; }
public byte Amount { get; set; }
public byte Unk { get; set; }
public ushort StorageId { get; set; }
}
[StructLayout(LayoutKind.Sequential)]
public struct NewStorageItem
{
public PSO2Items Item { get; set; }
public uint StorageId { get; set; }
}
[StructLayout(LayoutKind.Sequential)]
public struct NewInventoryItem
{
public PSO2Items Item { get; set; }
public ushort Amount { get; set; }
public ushort IsNew { get; set; }
}
[StructLayout(LayoutKind.Sequential)]
public struct UpdatedItem
{
public ulong Uuid { get; set; }
public uint NewAmount { get; set; }
public uint StorageId { get; set; }
}
[StructLayout(LayoutKind.Sequential)]
public struct UpdatedInventoryItem
{
public ulong Uuid { get; set; }
public ushort NewAmount { get; set; }
public ushort Moved { get; set; }
}
[StructLayout(LayoutKind.Sequential)]
public struct UpdatedStorageItem
{
public ulong Uuid { get; set; }
public ushort NewAmount { get; set; }
public ushort Moved { get; set; }
public uint StorageId { get; set; }
}
} }

View File

@ -92,7 +92,7 @@ namespace PSO2SERVER
Console.CancelKeyPress += Exit; Console.CancelKeyPress += Exit;
AppDomain.CurrentDomain.ProcessExit += Exit; AppDomain.CurrentDomain.ProcessExit += Exit;
JsonTest.JsonReadTest(); //JsonTest.JsonReadTest();
try try
{ {

View File

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using PSO2SERVER.Models;
using PSO2SERVER.Protocol.Packets;
namespace PSO2SERVER.Protocol.Handlers
{
[PacketHandlerAttr(0x0F, 0xE0)]
public class MoveToMatStorageRequest : PacketHandler
{
public struct MoveToMatStorageRequestPacket
{
/// Information about items being moved.
public List<MaterialStorageItem> Items;
}
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
{
var info = string.Format("[<--] 接收到的数据 (hex): {0} 字节", data.Length);
Logger.WriteHex(info, data);
var reader = new PacketReader(data, position, size);
var items_count = reader.ReadMagic(0x9087, 0xEA);
var pkt = new MoveToMatStorageRequestPacket();
for (int i = 0; i < items_count; i++)
{
var item = reader.ReadStruct<MaterialStorageItem>();
pkt.Items.Add(item);
}
//TODO
var newinv = new List<UpdatedInventoryItem>();
context.SendPacket(new MoveToMatStoragePacket(newinv, pkt.Items));
}
}
}

View File

@ -1,4 +1,5 @@
using PSO2SERVER.Models; using PSO2SERVER.Models;
using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace PSO2SERVER.Protocol namespace PSO2SERVER.Protocol
@ -29,4 +30,17 @@ namespace PSO2SERVER.Protocol
return totalPacket.ToArray(); // 返回整个数据包字节数组 return totalPacket.ToArray(); // 返回整个数据包字节数组
} }
} }
public class PacketError : Exception
{
public string PacketName { get; }
public string FieldName { get; }
public PacketError(string packetName, string fieldName, Exception innerException)
: base($"Error in packet '{packetName}', field '{fieldName}'", innerException)
{
PacketName = packetName;
FieldName = fieldName;
}
}
} }

View File

@ -26,6 +26,12 @@ namespace PSO2SERVER.Protocol
Write(encoded); Write(encoded);
} }
public void WriteMagic(int magic, uint xor, uint sub)
{
uint newmagic = (uint)magic;
WriteMagic(newmagic, xor, sub);
}
public void WriteAscii(string str, uint xor, uint sub) public void WriteAscii(string str, uint xor, uint sub)
{ {
if((str == null) || (str == "") || (str.Length == 0)) if((str == null) || (str == "") || (str.Length == 0))

View File

@ -84,7 +84,7 @@ namespace PSO2SERVER.Protocol.Packets
{ {
var pkt = new PacketWriter(); var pkt = new PacketWriter();
// Accounts header // Accounts header
ObjHeader.WriteObjectHeaderToStream(pkt); pkt.WriteObjectHeader(ObjHeader);
// Spawn position // Spawn position
pkt.WritePosition(ObjPosition); pkt.WritePosition(ObjPosition);
pkt.Write(Unk1); pkt.Write(Unk1);

View File

@ -6,6 +6,7 @@ using PSO2SERVER.Models;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.IO; using System.IO;
using PSO2SERVER.Json; using PSO2SERVER.Json;
using PSO2SERVER.Database;
namespace PSO2SERVER.Protocol.Packets namespace PSO2SERVER.Protocol.Packets
{ {
@ -202,14 +203,46 @@ namespace PSO2SERVER.Protocol.Packets
else else
{ {
// 可以在此处处理未定义的 QuestType例如记录警告或错误 // 可以在此处处理未定义的 QuestType例如记录警告或错误
Logger.WriteWarning($"Unknown QuestType {questType} at index {i}. Skipping."); Logger.WriteWarning($"未知 QuestType {questType} 索引 {i}. 跳过.");
} }
} }
} }
//public short[] amount = new short[Enum.GetValues(typeof(QuestType)).Length];
public override byte[] Build() public override byte[] Build()
{ {
PacketWriter pkt = new PacketWriter(); PacketWriter pkt = new PacketWriter();
//// 使用反射获取所有枚举值,并合并它们
//ulong combinedFlags = 0;
//foreach (var value in Enum.GetValues(typeof(AvailableQuestType)))
//{
// combinedFlags |= (ulong)value;
//}
//// Filler/Padding?
//pkt.Write((UInt16)0);
//// Amounts
//for (int i = 0; i < amount.Length; i++)
//{
// amount[i] = 1; // Just for testing
// pkt.Write(amount[i]);
//}
//// Padding/Blank entries?
//for (int i = 0; i < 2; i++)
// pkt.Write((int)0);
//// Available Bitfield
//pkt.Write((UInt64)combinedFlags);
//// Filler/Padding?
//for (int i = 0; i < 2; i++)
// pkt.Write((int)0);
//return pkt.ToArray();
pkt.Write(Unk1); pkt.Write(Unk1);
pkt.Write(ExtremeCount); pkt.Write(ExtremeCount);
pkt.Write(Unk2); pkt.Write(Unk2);
@ -298,28 +331,6 @@ namespace PSO2SERVER.Protocol.Packets
pkt.Write(RoundBoost); pkt.Write(RoundBoost);
pkt.Write(Unk21); pkt.Write(Unk21);
//// Filler/Padding?
//pkt.Write((UInt16)0);
//// Amounts
//for (int i = 0; i < amount.Length; i++)
//{
// amount[i] = 1; // Just for testing
// pkt.Write(amount[i]);
//}
//// Padding/Blank entries?
//for (int i = 0; i < 2; i++)
// pkt.Write((int)0);
//// Available Bitfield
//pkt.Write((UInt64)available);
//// Filler/Padding?
//for (int i = 0; i < 2; i++)
// pkt.Write((int)0);
return pkt.ToArray(); return pkt.ToArray();
} }

View File

@ -20,7 +20,6 @@ namespace PSO2SERVER.Protocol.Packets
pkt.WriteMagic((uint)questdefs.Count, 0x1DB0, 0xC5); pkt.WriteMagic((uint)questdefs.Count, 0x1DB0, 0xC5);
foreach (QuestData d in questdefs) foreach (QuestData d in questdefs)
{ {
//pkt.WriteStruct(d.QuestDefiniton);
var qd = d.QuestDefiniton; var qd = d.QuestDefiniton;
pkt.WriteFixedLengthASCII(qd.Date, 0x20); pkt.WriteFixedLengthASCII(qd.Date, 0x20);
pkt.WriteObjectHeader(qd.QuestObj); pkt.WriteObjectHeader(qd.QuestObj);
@ -56,22 +55,5 @@ namespace PSO2SERVER.Protocol.Packets
{ {
return new PacketHeader(0x0B, 0x18, PacketFlags.PACKED); return new PacketHeader(0x0B, 0x18, PacketFlags.PACKED);
} }
// Hoo boy, this is 468 bytes!
// TODO: Map out this struct.
// Most of this is WRONG!!! Needs serious investigation.
/*
[K873] What I've currently mapped out
24 -> Start
38 -> PartyQuest name/Type Index?
100 -> Bitfield 1
102 -> Estimated Play Time
103 -> Party Type
104 -> Difficulties Available
105 -> Difficulties Completed
108 -> Starting Level
120 -> Item Data 1?
12C -> Item Data 2?
*/
} }
} }

View File

@ -116,8 +116,8 @@ namespace PSO2SERVER.Protocol.Packets
// xor: 0xD863, sub: 0xA9 // xor: 0xD863, sub: 0xA9
PacketWriter pkt = new PacketWriter(); PacketWriter pkt = new PacketWriter();
party_object.WriteObjectHeaderToStream(pkt); pkt.WriteObjectHeader(party_object);
leader.WriteObjectHeaderToStream(pkt); // Accounts receiving the thing pkt.WriteObjectHeader(leader); // Accounts receiving the thing
pkt.Write(people_amount); // Likely partymembercount pkt.Write(people_amount); // Likely partymembercount
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {

View File

@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using PSO2SERVER.Models;
namespace PSO2SERVER.Protocol.Packets
{
public class ChangeWeaponPalettePacket : Packet
{
/// Player switching the palette.
public ObjectHeader Player { get; set; } = new ObjectHeader();
public FixedList<ushort> unk { get; set; } = new FixedList<ushort>(0x12, 0);
public uint Unk1 { get; set; } = 0;
/// New palette ID.
public uint cur_palette { get; set; } = 0;
#region implemented abstract members of Packet
public ChangeWeaponPalettePacket(Client client)
{
Player = new ObjectHeader((uint)client._account.AccountId, ObjectType.Player);
cur_palette = client.Palette.CurPalette;
}
public override byte[] Build()
{
var pkt = new PacketWriter();
pkt.WriteObjectHeader(Player);
pkt.WriteList(unk);
pkt.Write(Unk1);
pkt.Write(cur_palette);
return pkt.ToArray();
}
public override PacketHeader GetHeader()
{
return new PacketHeader(0x0F, 0xBC, PacketFlags.None);
}
#endregion
}
}

View File

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using PSO2SERVER.Models;
namespace PSO2SERVER.Protocol.Packets
{
public class LoadMaterialStoragePacket : Packet
{
public uint player_id { get; set; } = new uint();
public List<MaterialStorageItem> items { get; set; } = new List<MaterialStorageItem> ();
public StorageInfo info { get; set; } = new StorageInfo ();
#region implemented abstract members of Packet
public LoadMaterialStoragePacket(Client client)
{
player_id = (uint)client._account.AccountId;
}
public override byte[] Build()
{
var pkt = new PacketWriter();
pkt.Write(player_id);
pkt.WriteMagic((uint)items.Count, 0xAC9, 0x9F);
foreach (var item in items) {pkt.WriteStruct(item);}
pkt.WriteStruct(info);
return pkt.ToArray();
}
public override PacketHeader GetHeader()
{
return new PacketHeader(0x0F, 0xDF, PacketFlags.PACKED);
}
#endregion
}
}

View File

@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using PSO2SERVER.Models;
namespace PSO2SERVER.Protocol.Packets
{
public class MoveToMatStoragePacket : Packet
{
/// <summary>
/// Items updated in the inventory.
/// </summary>
public List<UpdatedInventoryItem> UpdatedInventory; // Equivalent to Vec<UpdatedInventoryItem>
/// <summary>
/// Items updated in the material storage.
/// </summary>
public List<MaterialStorageItem> UpdatedMaterialStorage; // Assuming this exists
#region implemented abstract members of Packet
public MoveToMatStoragePacket(List<UpdatedInventoryItem> updatedInventoryItems, List<MaterialStorageItem> materialStorageItems)
{
this.UpdatedInventory = updatedInventoryItems;
this.UpdatedMaterialStorage = materialStorageItems;
}
public override byte[] Build()
{
var pkt = new PacketWriter();
pkt.WriteMagic(UpdatedInventory.Count, 0x1644, 0x35);
foreach (var item in UpdatedInventory) {pkt.WriteStruct(item);}
pkt.WriteMagic(UpdatedMaterialStorage.Count, 0x1644, 0x35);
foreach(var item in UpdatedMaterialStorage) {pkt.WriteStruct(item);}
return pkt.ToArray();
}
public override PacketHeader GetHeader()
{
return new PacketHeader(0x0F, 0xE1, PacketFlags.PACKED);
}
#endregion
}
}

View File

@ -32,7 +32,7 @@ namespace PSO2SERVER
_port = port; _port = port;
var queryTask = Task.Run(() => RunAsync()); var queryTask = Task.Run(() => RunAsync());
RunningServers.Add(queryTask); RunningServers.Add(queryTask);
Logger.WriteInternal("[监听] 监听" + desc + "端口 " + port); //Logger.WriteInternal("[监听] 监听" + desc + "端口 " + port);
} }
private async Task RunAsync() private async Task RunAsync()

View File

@ -104,6 +104,9 @@
<Reference Include="K4os.Hash.xxHash, Version=1.0.8.0, Culture=neutral, PublicKeyToken=32cd54395057cec3, processorArchitecture=MSIL"> <Reference Include="K4os.Hash.xxHash, Version=1.0.8.0, Culture=neutral, PublicKeyToken=32cd54395057cec3, processorArchitecture=MSIL">
<HintPath>..\packages\K4os.Hash.xxHash.1.0.8\lib\net462\K4os.Hash.xxHash.dll</HintPath> <HintPath>..\packages\K4os.Hash.xxHash.1.0.8\lib\net462\K4os.Hash.xxHash.dll</HintPath>
</Reference> </Reference>
<Reference Include="KeraLua, Version=1.4.1.0, Culture=neutral, PublicKeyToken=6a194c04b9c89217, processorArchitecture=MSIL">
<HintPath>..\packages\KeraLua.1.4.1\lib\net46\KeraLua.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> <Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.8.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath> <HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.8.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
</Reference> </Reference>
@ -122,6 +125,9 @@
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath> <HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>
<Reference Include="NLua, Version=1.7.3.0, Culture=neutral, PublicKeyToken=6a194c04b9c89217, processorArchitecture=MSIL">
<HintPath>..\packages\NLua.1.7.3\lib\net46\NLua.dll</HintPath>
</Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.AppContext, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="System.AppContext, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll</HintPath> <HintPath>..\packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll</HintPath>
@ -314,6 +320,7 @@
<Compile Include="Models\Flags.cs" /> <Compile Include="Models\Flags.cs" />
<Compile Include="Models\Inventory.cs" /> <Compile Include="Models\Inventory.cs" />
<Compile Include="Models\ItemAttributes.cs" /> <Compile Include="Models\ItemAttributes.cs" />
<Compile Include="Models\ItemsAdditional.cs" />
<Compile Include="Models\Mission.cs" /> <Compile Include="Models\Mission.cs" />
<Compile Include="Models\NetInterface.cs" /> <Compile Include="Models\NetInterface.cs" />
<Compile Include="Models\Orders.cs" /> <Compile Include="Models\Orders.cs" />
@ -332,6 +339,7 @@
<Compile Include="Protocol\Handlers\04-ObjectHandler\04-75-ActionEnd.cs" /> <Compile Include="Protocol\Handlers\04-ObjectHandler\04-75-ActionEnd.cs" />
<Compile Include="Protocol\Handlers\06-PlayerStatusHandler\06-01-DealDamage.cs" /> <Compile Include="Protocol\Handlers\06-PlayerStatusHandler\06-01-DealDamage.cs" />
<Compile Include="Protocol\Handlers\0B-QuestHandler\0B-20-AcceptQuest.cs" /> <Compile Include="Protocol\Handlers\0B-QuestHandler\0B-20-AcceptQuest.cs" />
<Compile Include="Protocol\Handlers\0F-ItemHandler\0F-E0-MoveToMatStorageRequest.cs" />
<Compile Include="Protocol\Handlers\0F-ItemHandler\0F-28-UNK.cs" /> <Compile Include="Protocol\Handlers\0F-ItemHandler\0F-28-UNK.cs" />
<Compile Include="Protocol\Handlers\11-ClientHandler\11-14-BlockLogin.cs" /> <Compile Include="Protocol\Handlers\11-ClientHandler\11-14-BlockLogin.cs" />
<Compile Include="Protocol\Handlers\11-ClientHandler\11-90-CharacterUndeletionRequest.cs" /> <Compile Include="Protocol\Handlers\11-ClientHandler\11-90-CharacterUndeletionRequest.cs" />
@ -410,6 +418,9 @@
<Compile Include="Protocol\Handlers\4D-ClassicMissionPassHandler\4D-00-MissionPassInfoRequest.cs" /> <Compile Include="Protocol\Handlers\4D-ClassicMissionPassHandler\4D-00-MissionPassInfoRequest.cs" />
<Compile Include="Protocol\Packets\04-ObjectRelatedPacket\04-75-ActionEndPacket.cs" /> <Compile Include="Protocol\Packets\04-ObjectRelatedPacket\04-75-ActionEndPacket.cs" />
<Compile Include="Protocol\Packets\0B-QuestPacket\0B-1B-QuestCategoryStopperPacket.cs" /> <Compile Include="Protocol\Packets\0B-QuestPacket\0B-1B-QuestCategoryStopperPacket.cs" />
<Compile Include="Protocol\Packets\0F-ItemPacket\0F-BC-ChangeWeaponPalettePacket.cs" />
<Compile Include="Protocol\Packets\0F-ItemPacket\0F-DF-LoadMaterialStoragePacket.cs" />
<Compile Include="Protocol\Packets\0F-ItemPacket\0F-E1-MoveToMatStoragePacket.cs" />
<Compile Include="Protocol\Packets\0F-ItemPacket\0F-0D-LoadPlayerInventoryPacket.cs" /> <Compile Include="Protocol\Packets\0F-ItemPacket\0F-0D-LoadPlayerInventoryPacket.cs" />
<Compile Include="Protocol\Packets\11-ClientPacket\11-0A-Unk110A.cs" /> <Compile Include="Protocol\Packets\11-ClientPacket\11-0A-Unk110A.cs" />
<Compile Include="Protocol\Packets\19-LobbyPacket\19-08-SendSystemMessagePacket.cs" /> <Compile Include="Protocol\Packets\19-LobbyPacket\19-08-SendSystemMessagePacket.cs" />
@ -650,6 +661,8 @@
</PropertyGroup> </PropertyGroup>
<Error Condition="!Exists('..\packages\EntityFramework.6.5.1\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.5.1\build\EntityFramework.props'))" /> <Error Condition="!Exists('..\packages\EntityFramework.6.5.1\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.5.1\build\EntityFramework.props'))" />
<Error Condition="!Exists('..\packages\EntityFramework.6.5.1\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.5.1\build\EntityFramework.targets'))" /> <Error Condition="!Exists('..\packages\EntityFramework.6.5.1\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.5.1\build\EntityFramework.targets'))" />
<Error Condition="!Exists('..\packages\KeraLua.1.4.1\build\net46\KeraLua.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\KeraLua.1.4.1\build\net46\KeraLua.targets'))" />
</Target> </Target>
<Import Project="..\packages\EntityFramework.6.5.1\build\EntityFramework.targets" Condition="Exists('..\packages\EntityFramework.6.5.1\build\EntityFramework.targets')" /> <Import Project="..\packages\EntityFramework.6.5.1\build\EntityFramework.targets" Condition="Exists('..\packages\EntityFramework.6.5.1\build\EntityFramework.targets')" />
<Import Project="..\packages\KeraLua.1.4.1\build\net46\KeraLua.targets" Condition="Exists('..\packages\KeraLua.1.4.1\build\net46\KeraLua.targets')" />
</Project> </Project>

View File

@ -8,6 +8,7 @@
<package id="K4os.Compression.LZ4" version="1.3.8" targetFramework="net48" /> <package id="K4os.Compression.LZ4" version="1.3.8" targetFramework="net48" />
<package id="K4os.Compression.LZ4.Streams" version="1.3.8" targetFramework="net48" /> <package id="K4os.Compression.LZ4.Streams" version="1.3.8" targetFramework="net48" />
<package id="K4os.Hash.xxHash" version="1.0.8" targetFramework="net48" /> <package id="K4os.Hash.xxHash" version="1.0.8" targetFramework="net48" />
<package id="KeraLua" version="1.4.1" targetFramework="net48" />
<package id="Microsoft.Bcl.AsyncInterfaces" version="8.0.0" targetFramework="net48" /> <package id="Microsoft.Bcl.AsyncInterfaces" version="8.0.0" targetFramework="net48" />
<package id="Microsoft.NETCore.Platforms" version="1.1.0" targetFramework="net48" /> <package id="Microsoft.NETCore.Platforms" version="1.1.0" targetFramework="net48" />
<package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="net48" /> <package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="net48" />
@ -15,6 +16,7 @@
<package id="MySql.Data.EntityFramework" version="9.0.0" targetFramework="net48" /> <package id="MySql.Data.EntityFramework" version="9.0.0" targetFramework="net48" />
<package id="NETStandard.Library" version="1.6.1" targetFramework="net48" /> <package id="NETStandard.Library" version="1.6.1" targetFramework="net48" />
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net48" /> <package id="Newtonsoft.Json" version="13.0.3" targetFramework="net48" />
<package id="NLua" version="1.7.3" targetFramework="net48" />
<package id="System.AppContext" version="4.3.0" targetFramework="net48" /> <package id="System.AppContext" version="4.3.0" targetFramework="net48" />
<package id="System.Buffers" version="4.5.1" targetFramework="net48" /> <package id="System.Buffers" version="4.5.1" targetFramework="net48" />
<package id="System.Collections" version="4.3.0" targetFramework="net48" /> <package id="System.Collections" version="4.3.0" targetFramework="net48" />