mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-04-02 19:42:05 -04:00
Renamed the "Item" object to InventoryItem. Began writing the Item object that will be used to store game data items.
This commit is contained in:
parent
c2f0b9d999
commit
d2ac603efa
@ -459,6 +459,7 @@ namespace FFXIVClassic_Lobby_Server
|
||||
player.getInventory(Inventory.MELDREQUEST).initList(getInventory(player, 0, Inventory.MELDREQUEST));
|
||||
player.getInventory(Inventory.LOOT).initList(getInventory(player, 0, Inventory.LOOT));
|
||||
|
||||
player.getEquipment().SetEquipment(getEquipment(player));
|
||||
}
|
||||
catch (MySqlException e)
|
||||
{ Console.WriteLine(e); }
|
||||
@ -470,9 +471,115 @@ namespace FFXIVClassic_Lobby_Server
|
||||
|
||||
}
|
||||
|
||||
public static List<Item> getInventory(Player player, uint slotOffset, uint type)
|
||||
public static List<Tuple<ushort, InventoryItem>> getEquipment(Player player)
|
||||
{
|
||||
List<Item> items = new List<Item>();
|
||||
List<Tuple<ushort, InventoryItem>> equipment = new List<Tuple<ushort, InventoryItem>>();
|
||||
|
||||
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
|
||||
{
|
||||
try
|
||||
{
|
||||
conn.Open();
|
||||
|
||||
string query = @"
|
||||
SELECT
|
||||
equipSlot,
|
||||
itemSlot
|
||||
FROM characters_inventory_equipment
|
||||
WHERE characterId = @charId ORDER BY equipSlot";
|
||||
|
||||
MySqlCommand cmd = new MySqlCommand(query, conn);
|
||||
cmd.Parameters.AddWithValue("@charId", player.actorId);
|
||||
|
||||
using (MySqlDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
ushort equipSlot = reader.GetUInt16(0);
|
||||
ushort itemSlot = reader.GetUInt16(1);
|
||||
InventoryItem item = player.getInventory(Inventory.NORMAL).getItem(itemSlot);
|
||||
equipment.Add(new Tuple<ushort, InventoryItem>(equipSlot, item));
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (MySqlException e)
|
||||
{ Console.WriteLine(e); }
|
||||
finally
|
||||
{
|
||||
conn.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
return equipment;
|
||||
}
|
||||
|
||||
public static void equipItem(Player player, ushort equipSlot, ushort itemSlot)
|
||||
{
|
||||
|
||||
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
|
||||
{
|
||||
try
|
||||
{
|
||||
conn.Open();
|
||||
|
||||
string query = @"
|
||||
INSERT INTO characters_inventory_equipment
|
||||
(characterId, equipSlot, itemSlot)
|
||||
VALUES
|
||||
(@characterId, @equipSlot, @itemSlot)
|
||||
ON DUPLICATE KEY UPDATE itemSlot=@itemSlot;
|
||||
";
|
||||
|
||||
MySqlCommand cmd = new MySqlCommand(query, conn);
|
||||
cmd.Parameters.AddWithValue("@characterId", player.actorId);
|
||||
cmd.Parameters.AddWithValue("@equipSlot", equipSlot);
|
||||
cmd.Parameters.AddWithValue("@itemSlot", itemSlot);
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
catch (MySqlException e)
|
||||
{ Console.WriteLine(e); }
|
||||
finally
|
||||
{
|
||||
conn.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void unequipItem(Player player, ushort equipSlot)
|
||||
{
|
||||
|
||||
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
|
||||
{
|
||||
try
|
||||
{
|
||||
conn.Open();
|
||||
|
||||
string query = @"
|
||||
DELETE FROM characters_inventory_equipment
|
||||
WHERE characterId = @characterId AND equipSlot = @equipSlot;
|
||||
";
|
||||
|
||||
MySqlCommand cmd = new MySqlCommand(query, conn);
|
||||
cmd.Parameters.AddWithValue("@characterId", player.actorId);
|
||||
cmd.Parameters.AddWithValue("@equipSlot", equipSlot);
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
catch (MySqlException e)
|
||||
{ Console.WriteLine(e); }
|
||||
finally
|
||||
{
|
||||
conn.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static List<InventoryItem> getInventory(Player player, uint slotOffset, uint type)
|
||||
{
|
||||
List<InventoryItem> items = new List<InventoryItem>();
|
||||
|
||||
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
|
||||
{
|
||||
@ -525,7 +632,7 @@ namespace FFXIVClassic_Lobby_Server
|
||||
byte materia4 = reader.GetByte(11);
|
||||
byte materia5 = reader.GetByte(12);
|
||||
|
||||
items.Add(new Item(uniqueId, itemId, quantity, slot, isUntradeable, qualityNumber, durability, spiritBind, materia1, materia2, materia3, materia4, materia5));
|
||||
items.Add(new InventoryItem(uniqueId, itemId, quantity, slot, isUntradeable, qualityNumber, durability, spiritBind, materia1, materia2, materia3, materia4, materia5));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -540,9 +647,9 @@ namespace FFXIVClassic_Lobby_Server
|
||||
return items;
|
||||
}
|
||||
|
||||
public static Item addItem(Player player, uint itemId, int quantity, byte quality, bool isUntradeable, uint durability, ushort type)
|
||||
public static InventoryItem addItem(Player player, uint itemId, int quantity, byte quality, bool isUntradeable, uint durability, ushort type)
|
||||
{
|
||||
Item insertedItem = null;
|
||||
InventoryItem insertedItem = null;
|
||||
|
||||
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
|
||||
{
|
||||
@ -581,7 +688,7 @@ namespace FFXIVClassic_Lobby_Server
|
||||
cmd.ExecuteNonQuery();
|
||||
cmd2.ExecuteNonQuery();
|
||||
|
||||
insertedItem = new Item((uint)cmd.LastInsertedId, itemId, quantity, (ushort)player.getInventory(type).getNextEmptySlot(), isUntradeable, quality, durability, 0, 0, 0, 0, 0, 0);
|
||||
insertedItem = new InventoryItem((uint)cmd.LastInsertedId, itemId, quantity, (ushort)player.getInventory(type).getNextEmptySlot(), isUntradeable, quality, durability, 0, 0, 0, 0, 0, 0);
|
||||
}
|
||||
catch (MySqlException e)
|
||||
{ Console.WriteLine(e); }
|
||||
|
@ -98,7 +98,7 @@
|
||||
<Compile Include="actors\chara\ParameterSave.cs" />
|
||||
<Compile Include="actors\chara\player\PlayerWork.cs" />
|
||||
<Compile Include="dataobjects\DBWorld.cs" />
|
||||
<Compile Include="dataobjects\Item.cs" />
|
||||
<Compile Include="dataobjects\InventoryItem.cs" />
|
||||
<Compile Include="dataobjects\ConnectedPlayer.cs" />
|
||||
<Compile Include="dataobjects\RecruitmentDetails.cs" />
|
||||
<Compile Include="dataobjects\SearchEntry.cs" />
|
||||
|
@ -1,4 +1,5 @@
|
||||
using FFXIVClassic_Map_Server.Actors;
|
||||
using FFXIVClassic_Lobby_Server;
|
||||
using FFXIVClassic_Map_Server.Actors;
|
||||
using FFXIVClassic_Map_Server.dataobjects;
|
||||
using FFXIVClassic_Map_Server.packets.send.actor.inventory;
|
||||
using FFXIVClassic_Map_Server.packets.send.Actor.inventory;
|
||||
@ -34,7 +35,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
private Player owner;
|
||||
private ushort inventoryCapacity;
|
||||
private ushort inventoryCode;
|
||||
private Item[] list;
|
||||
private InventoryItem[] list;
|
||||
private Inventory normalInventory;
|
||||
|
||||
public Equipment(Player ownerPlayer, Inventory normalInventory, ushort capacity, ushort code)
|
||||
@ -42,11 +43,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
owner = ownerPlayer;
|
||||
inventoryCapacity = capacity;
|
||||
inventoryCode = code;
|
||||
list = new Item[inventoryCapacity];
|
||||
list = new InventoryItem[inventoryCapacity];
|
||||
this.normalInventory = normalInventory;
|
||||
}
|
||||
|
||||
public Item GetItemAtSlot(ushort slot)
|
||||
public InventoryItem GetItemAtSlot(ushort slot)
|
||||
{
|
||||
if (slot < list.Length)
|
||||
return list[slot];
|
||||
@ -65,10 +66,12 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
slotsToUpdate.Add(i);
|
||||
}
|
||||
|
||||
owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode));
|
||||
SendEquipmentPackets(slotsToUpdate);
|
||||
owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId));
|
||||
}
|
||||
|
||||
public void SetEquipment(List<Tuple<ushort, Item>> toEquip)
|
||||
public void SetEquipment(List<Tuple<ushort, InventoryItem>> toEquip)
|
||||
{
|
||||
List<ushort> slotsToUpdate = new List<ushort>();
|
||||
for (int i = 0; i < toEquip.Count; i++)
|
||||
@ -76,15 +79,15 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
slotsToUpdate.Add(toEquip[i].Item1);
|
||||
list[toEquip[i].Item1] = toEquip[i].Item2;
|
||||
}
|
||||
|
||||
SendEquipmentPackets(slotsToUpdate);
|
||||
}
|
||||
|
||||
public void Equip(ushort slot, Item item)
|
||||
public void Equip(ushort slot, InventoryItem item)
|
||||
{
|
||||
if (slot >= list.Length)
|
||||
return;
|
||||
|
||||
Database.equipItem(owner, slot, item.slot);
|
||||
|
||||
owner.queuePacket(InventoryBeginChangePacket.buildPacket(owner.actorId));
|
||||
|
||||
if (list[slot] != null)
|
||||
@ -106,6 +109,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
if (slot >= list.Length)
|
||||
return;
|
||||
|
||||
Database.unequipItem(owner, slot);
|
||||
|
||||
owner.queuePacket(InventoryBeginChangePacket.buildPacket(owner.actorId));
|
||||
|
||||
normalInventory.RefreshItem(list[slot]);
|
||||
@ -119,7 +124,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
list[slot] = null;
|
||||
}
|
||||
|
||||
private void SendEquipmentPackets(ushort equipSlot, Item item)
|
||||
private void SendEquipmentPackets(ushort equipSlot, InventoryItem item)
|
||||
{
|
||||
if (item == null)
|
||||
owner.queuePacket(InventoryRemoveX01Packet.buildPacket(owner.actorId, equipSlot));
|
||||
@ -129,7 +134,6 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
|
||||
private void SendEquipmentPackets(List<ushort> slotsToUpdate)
|
||||
{
|
||||
owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode));
|
||||
|
||||
int currentIndex = 0;
|
||||
|
||||
@ -145,14 +149,13 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
owner.queuePacket(EquipmentListX08Packet.buildPacket(owner.actorId, list, slotsToUpdate, ref currentIndex));
|
||||
else if (slotsToUpdate.Count - currentIndex == 1)
|
||||
{
|
||||
owner.queuePacket(EquipmentListX01Packet.buildPacket(owner.actorId, slotsToUpdate[currentIndex], list[currentIndex].slot));
|
||||
owner.queuePacket(EquipmentListX01Packet.buildPacket(owner.actorId, slotsToUpdate[currentIndex], list[slotsToUpdate[currentIndex]].slot));
|
||||
currentIndex++;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -21,11 +21,12 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
public const ushort CURRANCY = 0x0063; //Max 0x140
|
||||
public const ushort KEYITEMS = 0x0064; //Max 0x500
|
||||
public const ushort EQUIPMENT = 0x00FE; //Max 0x23
|
||||
public const ushort EQUIPMENT_OTHERPLAYER = 0x00F9; //Max 0x23
|
||||
|
||||
private Player owner;
|
||||
private ushort inventoryCapacity;
|
||||
private ushort inventoryCode;
|
||||
private List<Item> list;
|
||||
private List<InventoryItem> list;
|
||||
|
||||
public Inventory(Player ownerPlayer, ushort capacity, ushort code)
|
||||
{
|
||||
@ -35,12 +36,12 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
}
|
||||
|
||||
#region Inventory Management
|
||||
public void initList(List<Item> itemsFromDB)
|
||||
public void initList(List<InventoryItem> itemsFromDB)
|
||||
{
|
||||
list = itemsFromDB;
|
||||
}
|
||||
|
||||
public Item getItem(ushort slot)
|
||||
public InventoryItem getItem(ushort slot)
|
||||
{
|
||||
if (slot < list.Count)
|
||||
return list[slot];
|
||||
@ -48,21 +49,21 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
return null;
|
||||
}
|
||||
|
||||
public void RefreshItem(Item item)
|
||||
public void RefreshItem(InventoryItem item)
|
||||
{
|
||||
owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode));
|
||||
sendInventoryPackets(item);
|
||||
owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId));
|
||||
}
|
||||
|
||||
public void RefreshItem(params Item[] items)
|
||||
public void RefreshItem(params InventoryItem[] items)
|
||||
{
|
||||
owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode));
|
||||
sendInventoryPackets(items.ToList());
|
||||
owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId));
|
||||
}
|
||||
|
||||
public void RefreshItem(List<Item> items)
|
||||
public void RefreshItem(List<InventoryItem> items)
|
||||
{
|
||||
owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode));
|
||||
sendInventoryPackets(items);
|
||||
@ -81,7 +82,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
int quantityCount = quantity;
|
||||
for (int i = 0; i < list.Count; i++)
|
||||
{
|
||||
Item item = list[i];
|
||||
InventoryItem item = list[i];
|
||||
if (item.itemId == itemId && item.quantity < item.maxStack)
|
||||
{
|
||||
slotsToUpdate.Add(item.slot);
|
||||
@ -117,7 +118,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
//New item that spilled over
|
||||
while (quantityCount > 0)
|
||||
{
|
||||
Item addedItem = Database.addItem(owner, itemId, Math.Min(quantityCount, 5), quality, false, 100, inventoryCode);
|
||||
InventoryItem addedItem = Database.addItem(owner, itemId, Math.Min(quantityCount, 5), quality, false, 100, inventoryCode);
|
||||
list.Add(addedItem);
|
||||
|
||||
if (inventoryCode != CURRANCY && inventoryCode != KEYITEMS)
|
||||
@ -139,7 +140,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
return;
|
||||
|
||||
List<ushort> slotsToUpdate = new List<ushort>();
|
||||
List<Item> itemsToRemove = new List<Item>();
|
||||
List<InventoryItem> itemsToRemove = new List<InventoryItem>();
|
||||
List<ushort> slotsToRemove = new List<ushort>();
|
||||
List<SubPacket> addItemPackets = new List<SubPacket>();
|
||||
|
||||
@ -148,7 +149,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
ushort lowestSlot = 0;
|
||||
for (int i = list.Count - 1; i >= 0; i--)
|
||||
{
|
||||
Item item = list[i];
|
||||
InventoryItem item = list[i];
|
||||
if (item.itemId == itemId)
|
||||
{
|
||||
int oldQuantity = item.quantity;
|
||||
@ -212,8 +213,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
public void removeItem(ulong itemDBId)
|
||||
{
|
||||
ushort slot = 0;
|
||||
Item toDelete = null;
|
||||
foreach (Item item in list)
|
||||
InventoryItem toDelete = null;
|
||||
foreach (InventoryItem item in list)
|
||||
{
|
||||
if (item.uniqueId == itemDBId)
|
||||
{
|
||||
@ -304,12 +305,12 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId));
|
||||
}
|
||||
|
||||
private void sendInventoryPackets(Item item)
|
||||
private void sendInventoryPackets(InventoryItem item)
|
||||
{
|
||||
owner.queuePacket(InventoryListX01Packet.buildPacket(owner.actorId, item));
|
||||
}
|
||||
|
||||
private void sendInventoryPackets(List<Item> items)
|
||||
private void sendInventoryPackets(List<InventoryItem> items)
|
||||
{
|
||||
int currentIndex = 0;
|
||||
|
||||
@ -403,7 +404,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
int quantityCount = quantity;
|
||||
for (int i = 0; i < list.Count; i++)
|
||||
{
|
||||
Item item = list[i];
|
||||
InventoryItem item = list[i];
|
||||
if (item.itemId == itemId && item.quantity < item.maxStack)
|
||||
{
|
||||
quantityCount -= (item.maxStack - item.quantity);
|
||||
@ -424,7 +425,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
foreach (Item item in list)
|
||||
foreach (InventoryItem item in list)
|
||||
{
|
||||
if (item.itemId == itemId)
|
||||
count += item.quantity;
|
||||
|
107
FFXIVClassic Map Server/dataobjects/InventoryItem.cs
Normal file
107
FFXIVClassic Map Server/dataobjects/InventoryItem.cs
Normal file
@ -0,0 +1,107 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.dataobjects
|
||||
{
|
||||
class InventoryItem
|
||||
{
|
||||
public uint uniqueId;
|
||||
public uint itemId;
|
||||
public int quantity = 1;
|
||||
public ushort slot;
|
||||
|
||||
public int maxStack = 99999;
|
||||
|
||||
public bool isUntradeable = false;
|
||||
public byte quality = 1;
|
||||
|
||||
public uint durability = 0;
|
||||
public ushort spiritbind = 0;
|
||||
|
||||
public byte materia1 = 0;
|
||||
public byte materia2 = 0;
|
||||
public byte materia3 = 0;
|
||||
public byte materia4 = 0;
|
||||
public byte materia5 = 0;
|
||||
|
||||
//Bare Minimum
|
||||
public InventoryItem(uint id, uint itemId, ushort slot)
|
||||
{
|
||||
this.uniqueId = id;
|
||||
this.itemId = itemId;
|
||||
this.quantity = quantity;
|
||||
this.slot = slot;
|
||||
}
|
||||
|
||||
public InventoryItem(uint uniqueId, uint itemId, int quantity, ushort slot, bool isUntradeable, byte qualityNumber, uint durability, ushort spiritbind, byte materia1, byte materia2, byte materia3, byte materia4, byte materia5)
|
||||
{
|
||||
this.uniqueId = uniqueId;
|
||||
this.itemId = itemId;
|
||||
this.quantity = quantity;
|
||||
this.slot = slot;
|
||||
this.isUntradeable = isUntradeable;
|
||||
this.quality = qualityNumber;
|
||||
this.durability = durability;
|
||||
this.spiritbind = spiritbind;
|
||||
this.materia1 = materia1;
|
||||
this.materia2 = materia2;
|
||||
this.materia3 = materia3;
|
||||
this.materia4 = materia4;
|
||||
this.materia5 = materia5;
|
||||
}
|
||||
|
||||
public byte[] toPacketBytes()
|
||||
{
|
||||
byte[] data = new byte[0x70];
|
||||
|
||||
using (MemoryStream mem = new MemoryStream(data))
|
||||
{
|
||||
using (BinaryWriter binWriter = new BinaryWriter(mem))
|
||||
{
|
||||
binWriter.Write((UInt32)uniqueId);
|
||||
binWriter.Write((UInt32)0x00000000);
|
||||
binWriter.Write((Int32)quantity);
|
||||
binWriter.Write((UInt32)itemId);
|
||||
binWriter.Write((UInt16)slot);
|
||||
|
||||
binWriter.Write((UInt16)0x0000);
|
||||
binWriter.Write((UInt32)0x00000000);
|
||||
binWriter.Write((UInt32)0x00000000);
|
||||
binWriter.Write((UInt32)0x00000000);
|
||||
|
||||
binWriter.Write(isUntradeable ? (UInt32)0x3 : (UInt32)0x0);
|
||||
|
||||
binWriter.Write((UInt32)0x00000000);
|
||||
|
||||
binWriter.Write((byte)quality);
|
||||
binWriter.Write((byte)0x01);
|
||||
binWriter.Write((uint)durability);
|
||||
|
||||
binWriter.BaseStream.Seek(0x10-0x06, SeekOrigin.Current);
|
||||
|
||||
binWriter.Write((byte)0x01);
|
||||
binWriter.Write((byte)0x01);
|
||||
binWriter.Write((byte)0x01);
|
||||
binWriter.Write((byte)0x01);
|
||||
|
||||
binWriter.BaseStream.Seek(0x10, SeekOrigin.Current);
|
||||
|
||||
binWriter.Write((ushort)spiritbind);
|
||||
|
||||
binWriter.Write((byte)materia1);
|
||||
binWriter.Write((byte)materia2);
|
||||
binWriter.Write((byte)materia3);
|
||||
binWriter.Write((byte)materia4);
|
||||
binWriter.Write((byte)materia5);
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
@ -9,99 +8,140 @@ namespace FFXIVClassic_Map_Server.dataobjects
|
||||
{
|
||||
class Item
|
||||
{
|
||||
public uint uniqueId;
|
||||
public uint itemId;
|
||||
public int quantity = 1;
|
||||
public ushort slot;
|
||||
//Basic
|
||||
public readonly string id;
|
||||
public readonly string name;
|
||||
|
||||
public int maxStack = 99999;
|
||||
//_item sheet
|
||||
public readonly string category;
|
||||
public readonly int maxStack;
|
||||
public readonly bool isRare;
|
||||
public readonly bool isExclusive;
|
||||
|
||||
public bool isUntradeable = false;
|
||||
public byte quality = 1;
|
||||
//itemData sheet
|
||||
public readonly int durability;
|
||||
public readonly int icon;
|
||||
public readonly int king;
|
||||
public readonly int color;
|
||||
public readonly int material;
|
||||
public readonly int decoration;
|
||||
public readonly int use;
|
||||
public readonly int mainSkill;
|
||||
public readonly int unknown1;
|
||||
public readonly int level;
|
||||
public readonly int compatibility;
|
||||
public readonly float effectMagnitude;
|
||||
public readonly float effectRate;
|
||||
public readonly float shieldBlocking;
|
||||
public readonly float effectDuration;
|
||||
public readonly float recastTime;
|
||||
public readonly float unknown2;
|
||||
public readonly byte recastGroup;
|
||||
public readonly int repairSkill;
|
||||
public readonly int repairItem;
|
||||
public readonly int repairItemNum;
|
||||
public readonly int repairLevel;
|
||||
public readonly int repairLicense;
|
||||
|
||||
public uint durability = 0;
|
||||
public ushort spiritbind = 0;
|
||||
|
||||
public byte materia1 = 0;
|
||||
public byte materia2 = 0;
|
||||
public byte materia3 = 0;
|
||||
public byte materia4 = 0;
|
||||
public byte materia5 = 0;
|
||||
|
||||
//Bare Minimum
|
||||
public Item(uint id, uint itemId, ushort slot)
|
||||
}
|
||||
class EquipmentItem : Item
|
||||
{
|
||||
this.uniqueId = id;
|
||||
this.itemId = itemId;
|
||||
this.quantity = quantity;
|
||||
this.slot = slot;
|
||||
//equipment sheet
|
||||
public readonly int equipPoint;
|
||||
public readonly short equipTribe1;
|
||||
public readonly ushort unknown1;
|
||||
public readonly short equipTribe2;
|
||||
public readonly ushort unknown2;
|
||||
public readonly short equipTribe3;
|
||||
public readonly ushort unknown3;
|
||||
public readonly short equipTribe4;
|
||||
public readonly ushort unknown4;
|
||||
|
||||
public readonly int paramBonusType1;
|
||||
public readonly short paramBonusValue1;
|
||||
public readonly int paramBonusType2;
|
||||
public readonly short paramBonusValue2;
|
||||
public readonly int paramBonusType3;
|
||||
public readonly short paramBonusValue3;
|
||||
public readonly int paramBonusType4;
|
||||
public readonly short paramBonusValue4;
|
||||
|
||||
public readonly int paramBonusAtSlotType;
|
||||
public readonly short paramBonusAtSlotValue;
|
||||
|
||||
public readonly int elementalBonusType;
|
||||
public readonly short elementalBonusValue;
|
||||
}
|
||||
|
||||
public Item(uint uniqueId, uint itemId, int quantity, ushort slot, bool isUntradeable, byte qualityNumber, uint durability, ushort spiritbind, byte materia1, byte materia2, byte materia3, byte materia4, byte materia5)
|
||||
class WeaponItem : EquipmentItem
|
||||
{
|
||||
this.uniqueId = uniqueId;
|
||||
this.itemId = itemId;
|
||||
this.quantity = quantity;
|
||||
this.slot = slot;
|
||||
this.isUntradeable = isUntradeable;
|
||||
this.quality = qualityNumber;
|
||||
this.durability = durability;
|
||||
this.spiritbind = spiritbind;
|
||||
this.materia1 = materia1;
|
||||
this.materia2 = materia2;
|
||||
this.materia3 = materia3;
|
||||
this.materia4 = materia4;
|
||||
this.materia5 = materia5;
|
||||
//graphics
|
||||
public readonly int graphicsWeaponId;
|
||||
public readonly int graphicsEquipId;
|
||||
public readonly int graphicsVariantId;
|
||||
public readonly int graphicsColorId;
|
||||
|
||||
//weapon sheet
|
||||
public readonly short attack;
|
||||
public readonly short magicAttack;
|
||||
public readonly short craftProcessing;
|
||||
public readonly short craftMagicProcessing;
|
||||
public readonly short harvestPotency;
|
||||
public readonly short harvestLimit;
|
||||
public readonly byte frequency;
|
||||
public readonly short rate;
|
||||
public readonly short magicRate;
|
||||
public readonly short craftProcessControl;
|
||||
public readonly short harvestRate;
|
||||
public readonly short critical;
|
||||
public readonly short magicCritical;
|
||||
public readonly short parry;
|
||||
|
||||
public readonly int damageAttributeType1;
|
||||
public readonly float damageAttributeValue1;
|
||||
public readonly int damageAttributeType2;
|
||||
public readonly float damageAttributeValue2;
|
||||
public readonly int damageAttributeType3;
|
||||
public readonly float damageAttributeValue3;
|
||||
}
|
||||
|
||||
public byte[] toPacketBytes()
|
||||
class ArmorItem : EquipmentItem
|
||||
{
|
||||
byte[] data = new byte[0x70];
|
||||
//graphics
|
||||
public readonly int graphicsArmorId;
|
||||
public readonly int graphicsEquipId;
|
||||
public readonly int graphicsVariantId;
|
||||
public readonly int graphicsColorId;
|
||||
|
||||
using (MemoryStream mem = new MemoryStream(data))
|
||||
//armor sheet
|
||||
public readonly short defence;
|
||||
public readonly short magicDefence;
|
||||
public readonly short criticalDefense;
|
||||
public readonly short evasion;
|
||||
public readonly short magicResistance;
|
||||
|
||||
public readonly int damageDefenseType1;
|
||||
public readonly short damageDefenseValue1;
|
||||
public readonly int damageDefenseType2;
|
||||
public readonly short damageDefenseValue2;
|
||||
public readonly int damageDefenseType3;
|
||||
public readonly short damageDefenseValue3;
|
||||
public readonly int damageDefenseType4;
|
||||
public readonly short damageDefenseValue4;
|
||||
}
|
||||
|
||||
class AccessoryItem : EquipmentItem
|
||||
{
|
||||
using (BinaryWriter binWriter = new BinaryWriter(mem))
|
||||
{
|
||||
binWriter.Write((UInt32)uniqueId);
|
||||
binWriter.Write((UInt32)0x00000000);
|
||||
binWriter.Write((Int32)quantity);
|
||||
binWriter.Write((UInt32)itemId);
|
||||
binWriter.Write((UInt16)slot);
|
||||
//graphics
|
||||
public readonly int graphicsAccessoryId;
|
||||
public readonly int graphicsEquipId;
|
||||
public readonly int graphicsVariantId;
|
||||
public readonly int graphicsColorId;
|
||||
|
||||
binWriter.Write((UInt16)0x0000);
|
||||
binWriter.Write((UInt32)0x00000000);
|
||||
binWriter.Write((UInt32)0x00000000);
|
||||
binWriter.Write((UInt32)0x00000000);
|
||||
|
||||
binWriter.Write(isUntradeable ? (UInt32)0x3 : (UInt32)0x0);
|
||||
|
||||
binWriter.Write((UInt32)0x00000000);
|
||||
|
||||
binWriter.Write((byte)quality);
|
||||
binWriter.Write((byte)0x01);
|
||||
binWriter.Write((uint)durability);
|
||||
|
||||
binWriter.BaseStream.Seek(0x10-0x06, SeekOrigin.Current);
|
||||
|
||||
binWriter.Write((byte)0x01);
|
||||
binWriter.Write((byte)0x01);
|
||||
binWriter.Write((byte)0x01);
|
||||
binWriter.Write((byte)0x01);
|
||||
|
||||
binWriter.BaseStream.Seek(0x10, SeekOrigin.Current);
|
||||
|
||||
binWriter.Write((ushort)spiritbind);
|
||||
|
||||
binWriter.Write((byte)materia1);
|
||||
binWriter.Write((byte)materia2);
|
||||
binWriter.Write((byte)materia3);
|
||||
binWriter.Write((byte)materia4);
|
||||
binWriter.Write((byte)materia5);
|
||||
}
|
||||
//accessory sheet
|
||||
public readonly byte power;
|
||||
public readonly byte size;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -14,7 +14,7 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory
|
||||
public const ushort OPCODE = 0x14E;
|
||||
public const uint PACKET_SIZE = 0x58;
|
||||
|
||||
public static SubPacket buildPacket(uint playerActorId, Item[] equipment, List<ushort> slotsToUpdate, ref int listOffset)
|
||||
public static SubPacket buildPacket(uint playerActorId, InventoryItem[] equipment, List<ushort> slotsToUpdate, ref int listOffset)
|
||||
{
|
||||
byte[] data = new byte[PACKET_SIZE - 0x20];
|
||||
|
||||
|
@ -14,7 +14,7 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory
|
||||
public const ushort OPCODE = 0x14F;
|
||||
public const uint PACKET_SIZE = 0x80;
|
||||
|
||||
public static SubPacket buildPacket(uint playerActorId, Item[] equipment, List<ushort> slotsToUpdate, ref int listOffset)
|
||||
public static SubPacket buildPacket(uint playerActorId, InventoryItem[] equipment, List<ushort> slotsToUpdate, ref int listOffset)
|
||||
{
|
||||
byte[] data = new byte[PACKET_SIZE - 0x20];
|
||||
|
||||
|
@ -14,7 +14,7 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory
|
||||
public const ushort OPCODE = 0x150;
|
||||
public const uint PACKET_SIZE = 0xE0;
|
||||
|
||||
public static SubPacket buildPacket(uint playerActorId, Item[] equipment, List<ushort> slotsToUpdate, ref int listOffset)
|
||||
public static SubPacket buildPacket(uint playerActorId, InventoryItem[] equipment, List<ushort> slotsToUpdate, ref int listOffset)
|
||||
{
|
||||
byte[] data = new byte[PACKET_SIZE - 0x20];
|
||||
|
||||
|
@ -14,7 +14,7 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory
|
||||
public const ushort OPCODE = 0x151;
|
||||
public const uint PACKET_SIZE = 0x194;
|
||||
|
||||
public static SubPacket buildPacket(uint playerActorId, Item[] equipment, List<ushort> slotsToUpdate, ref int listOffset)
|
||||
public static SubPacket buildPacket(uint playerActorId, InventoryItem[] equipment, List<ushort> slotsToUpdate, ref int listOffset)
|
||||
{
|
||||
byte[] data = new byte[PACKET_SIZE - 0x20];
|
||||
|
||||
|
@ -15,7 +15,7 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory
|
||||
public const ushort OPCODE = 0x0149;
|
||||
public const uint PACKET_SIZE = 0x90;
|
||||
|
||||
public static SubPacket buildPacket(uint playerActorID, List<Item> items, ref int listOffset)
|
||||
public static SubPacket buildPacket(uint playerActorID, List<InventoryItem> items, ref int listOffset)
|
||||
{
|
||||
byte[] data;
|
||||
|
||||
|
@ -15,7 +15,7 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory
|
||||
public const ushort OPCODE = 0x014A;
|
||||
public const uint PACKET_SIZE = 0x90;
|
||||
|
||||
public static SubPacket buildPacket(uint playerActorID, List<Item> items, ref int listOffset)
|
||||
public static SubPacket buildPacket(uint playerActorID, List<InventoryItem> items, ref int listOffset)
|
||||
{
|
||||
byte[] data;
|
||||
|
||||
|
@ -14,7 +14,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.inventory
|
||||
public const ushort OPCODE = 0x0148;
|
||||
public const uint PACKET_SIZE = 0x90;
|
||||
|
||||
public static SubPacket buildPacket(uint playerActorID, Item item)
|
||||
public static SubPacket buildPacket(uint playerActorID, InventoryItem item)
|
||||
{
|
||||
byte[] data = new byte[PACKET_SIZE - 0x20];
|
||||
|
||||
|
@ -14,7 +14,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.inventory
|
||||
public const ushort OPCODE = 0x0149;
|
||||
public const uint PACKET_SIZE = 0x3A8;
|
||||
|
||||
public static SubPacket buildPacket(uint playerActorID, List<Item> items, ref int listOffset)
|
||||
public static SubPacket buildPacket(uint playerActorID, List<InventoryItem> items, ref int listOffset)
|
||||
{
|
||||
byte[] data = new byte[PACKET_SIZE - 0x20];
|
||||
|
||||
|
@ -14,7 +14,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.inventory
|
||||
public const ushort OPCODE = 0x014A;
|
||||
public const uint PACKET_SIZE = 0x720;
|
||||
|
||||
public static SubPacket buildPacket(uint playerActorID, List<Item> items, ref int listOffset)
|
||||
public static SubPacket buildPacket(uint playerActorID, List<InventoryItem> items, ref int listOffset)
|
||||
{
|
||||
byte[] data = new byte[PACKET_SIZE - 0x20];
|
||||
|
||||
|
@ -14,7 +14,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.inventory
|
||||
public const ushort OPCODE = 0x014B;
|
||||
public const uint PACKET_SIZE = 0xE20;
|
||||
|
||||
public static SubPacket buildPacket(uint playerActorID, List<Item> items, ref int listOffset)
|
||||
public static SubPacket buildPacket(uint playerActorID, List<InventoryItem> items, ref int listOffset)
|
||||
{
|
||||
byte[] data = new byte[PACKET_SIZE - 0x20];
|
||||
|
||||
|
@ -14,7 +14,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.inventory
|
||||
public const ushort OPCODE = 0x014C;
|
||||
public const uint PACKET_SIZE = 0x1C20;
|
||||
|
||||
public static SubPacket buildPacket(uint playerActorID, List<Item> items, ref int listOffset)
|
||||
public static SubPacket buildPacket(uint playerActorID, List<InventoryItem> items, ref int listOffset)
|
||||
{
|
||||
byte[] data = new byte[PACKET_SIZE - 0x20];
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user