PSO2SERVER/Server/Models/PSO2Item.cs
2024-09-11 17:13:00 +08:00

139 lines
2.9 KiB
C#

using System;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
namespace PSO2SERVER.Models
{
/*
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public unsafe struct PSO2ItemConsumable
{
long guid;
int ID;
int subID;
short unused1;
short quantity;
fixed int unused2[9];
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public unsafe struct PSO2ItemWeapon
{
long guid;
int ID;
int subID;
byte flags;
byte element;
byte force;
byte grind;
byte grindPercent;
byte unknown1;
short unknown2;
fixed short affixes[8];
int potential;
byte extend;
byte unknown3;
short unknown4;
int unknown5;
int unknown6;
}
*/
public enum ItemType
{
Consumable,
Weapon,
Costume,
Unit,
Room
}
[Flags]
public enum ItemFlags
{
Locked = 0x01,
BoundToOwner = 0x02
}
public enum ItemElement
{
None,
Fire,
Ice,
Lightning,
Wind,
Light,
Dark
}
public class PSO2Item
{
public const int Size = 0x38;
MemoryStream stream;
//TODO
ItemType type = ItemType.Consumable;
byte[] data = new byte[Size];
public override string ToString()
{
return string.Format("Data: {0:X}", BitConverter.ToString(data)).Replace('-', ' ');
}
public PSO2Item(byte[] data)
{
SetData(data);
}
public byte[] GetData()
{
return data;
}
public void SetData(byte[] data)
{
this.data = data;
stream = new MemoryStream(data, true);
}
public long GetGUID()
{
byte[] guid = new byte[sizeof(long)];
stream.Seek(0, SeekOrigin.Begin);
stream.Read(guid, 0, sizeof(long));
return BitConverter.ToInt64(guid, 0);
}
public void SetGUID(long guid)
{
stream.Seek(0, SeekOrigin.Begin);
stream.Write(BitConverter.GetBytes(guid), 0, 8);
}
public int[] GetID()
{
byte[] ID = new byte[sizeof(int)];
byte[] subID = new byte[sizeof(int)];
stream.Seek(0, SeekOrigin.Begin);
stream.Read(ID, 0x08, sizeof(int));
stream.Read(subID, 0x0C, sizeof(int));
return new int[] { BitConverter.ToInt32(ID, 0), BitConverter.ToInt32(subID, 0) };
}
public void SetID(int ID, int subID)
{
stream.Seek(0, SeekOrigin.Begin);
stream.Write(BitConverter.GetBytes(ID), 0x08, sizeof(int));
stream.Write(BitConverter.GetBytes(subID), 0x0C, sizeof(int));
}
// ...
}
}