mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-04-20 11:47:48 +00:00
Finished fixing bugs in the bazaar code.
This commit is contained in:
parent
e8c9904e1d
commit
b2e273d7cf
7 changed files with 175 additions and 83 deletions
|
@ -139,6 +139,12 @@ namespace FFXIVClassic.Common
|
||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ushort SwapEndian(ushort input)
|
||||||
|
{
|
||||||
|
return (ushort)(((input << 8) & 0xff00) |
|
||||||
|
((input >> 8) & 0x00ff));
|
||||||
|
}
|
||||||
|
|
||||||
public static uint MurmurHash2(string key, uint seed)
|
public static uint MurmurHash2(string key, uint seed)
|
||||||
{
|
{
|
||||||
// 'm' and 'r' are mixing constants generated offline.
|
// 'm' and 'r' are mixing constants generated offline.
|
||||||
|
|
|
@ -1272,8 +1272,6 @@ namespace FFXIVClassic_Map_Server
|
||||||
modifier = new InventoryItem.ItemModifier(reader);
|
modifier = new InventoryItem.ItemModifier(reader);
|
||||||
|
|
||||||
InventoryItem item = new InventoryItem(uniqueId, Server.GetItemGamedata(itemId), quantity, qualityNumber, modifier);
|
InventoryItem item = new InventoryItem(uniqueId, Server.GetItemGamedata(itemId), quantity, qualityNumber, modifier);
|
||||||
item.slot = slot;
|
|
||||||
slot++;
|
|
||||||
items.Add(item);
|
items.Add(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1471,7 +1469,7 @@ namespace FFXIVClassic_Map_Server
|
||||||
FROM characters_inventory_bazaar
|
FROM characters_inventory_bazaar
|
||||||
INNER JOIN server_items ON seekId = server_items.id
|
INNER JOIN server_items ON seekId = server_items.id
|
||||||
LEFT JOIN server_items_modifiers ON server_items.id = server_items_modifiers.id
|
LEFT JOIN server_items_modifiers ON server_items.id = server_items_modifiers.id
|
||||||
WHERE characterId = @charaId";
|
WHERE characterId = @charaId and bazaarMode != 11 and bazaarMode != 12 and bazaarMode != 13";
|
||||||
|
|
||||||
MySqlCommand cmd2 = new MySqlCommand(query2, conn);
|
MySqlCommand cmd2 = new MySqlCommand(query2, conn);
|
||||||
cmd2.Parameters.AddWithValue("@charaId", player.actorId);
|
cmd2.Parameters.AddWithValue("@charaId", player.actorId);
|
||||||
|
@ -1595,8 +1593,6 @@ namespace FFXIVClassic_Map_Server
|
||||||
modifier = new InventoryItem.ItemModifier(reader);
|
modifier = new InventoryItem.ItemModifier(reader);
|
||||||
|
|
||||||
InventoryItem item = new InventoryItem(uniqueId, Server.GetItemGamedata(itemId), quantity, qualityNumber, modifier);
|
InventoryItem item = new InventoryItem(uniqueId, Server.GetItemGamedata(itemId), quantity, qualityNumber, modifier);
|
||||||
item.slot = slot;
|
|
||||||
slot++;
|
|
||||||
items.Add(item);
|
items.Add(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1678,9 +1674,9 @@ namespace FFXIVClassic_Map_Server
|
||||||
|
|
||||||
string query = @"
|
string query = @"
|
||||||
INSERT INTO characters_inventory
|
INSERT INTO characters_inventory
|
||||||
(characterId, itemPackage, serverItemId, quantity)
|
(characterId, itemPackage, serverItemId)
|
||||||
VALUES
|
VALUES
|
||||||
(@charId, @itemPackage, @serverItemId, @quantity)
|
(@charId, @itemPackage, @serverItemId)
|
||||||
";
|
";
|
||||||
|
|
||||||
MySqlCommand cmd = new MySqlCommand(query, conn);
|
MySqlCommand cmd = new MySqlCommand(query, conn);
|
||||||
|
@ -1688,7 +1684,6 @@ namespace FFXIVClassic_Map_Server
|
||||||
cmd.Parameters.AddWithValue("@serverItemId", addedItem.uniqueId);
|
cmd.Parameters.AddWithValue("@serverItemId", addedItem.uniqueId);
|
||||||
cmd.Parameters.AddWithValue("@charId", player.actorId);
|
cmd.Parameters.AddWithValue("@charId", player.actorId);
|
||||||
cmd.Parameters.AddWithValue("@itemPackage", type);
|
cmd.Parameters.AddWithValue("@itemPackage", type);
|
||||||
cmd.Parameters.AddWithValue("@quantity", addedItem.quantity);
|
|
||||||
|
|
||||||
cmd.ExecuteNonQuery();
|
cmd.ExecuteNonQuery();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1044,27 +1044,30 @@ namespace FFXIVClassic_Map_Server
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public InventoryItem CreateItem(uint itemId, int amount, byte quality = 1)
|
public InventoryItem CreateItem(uint itemId, int amount, byte quality = 1, InventoryItem.ItemModifier modifiers = null)
|
||||||
{
|
{
|
||||||
return Database.CreateItem(itemId, amount, quality);
|
return Database.CreateItem(itemId, amount, quality, modifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddToBazaar(Player player, InventoryItem reward, InventoryItem seek, int rewardAmount, int seekAmount, byte bazaarMode)
|
public void AddToBazaar(Player player, InventoryItem reward, InventoryItem seek, int rewardAmount, int seekAmount, byte bazaarMode)
|
||||||
{
|
{
|
||||||
bool succ = Database.CreateBazaarEntry(player, reward, seek, rewardAmount, seekAmount, bazaarMode);
|
bool succ = false;
|
||||||
|
|
||||||
|
if (bazaarMode == InventoryItem.TYPE_SINGLE || bazaarMode == InventoryItem.TYPE_MULTI || bazaarMode == InventoryItem.TYPE_STACK)
|
||||||
|
succ = Database.CreateBazaarEntry(player, reward, seek, rewardAmount, 0, bazaarMode, seekAmount);
|
||||||
|
else
|
||||||
|
succ = Database.CreateBazaarEntry(player, reward, seek, rewardAmount, seekAmount, bazaarMode);
|
||||||
|
|
||||||
if (succ)
|
if (succ)
|
||||||
{
|
{
|
||||||
if (bazaarMode != InventoryItem.TYPE_SINGLE && bazaarMode != InventoryItem.TYPE_MULTI && bazaarMode != InventoryItem.TYPE_STACK)
|
if (bazaarMode != InventoryItem.TYPE_SINGLE && bazaarMode != InventoryItem.TYPE_MULTI && bazaarMode != InventoryItem.TYPE_STACK)
|
||||||
{
|
{
|
||||||
reward.SetDealingAttached(bazaarMode, seek.uniqueId);
|
reward.SetDealingAttached(bazaarMode, seek.uniqueId);
|
||||||
|
seek.SetHasAttached(true);
|
||||||
player.GetItemPackage(Inventory.BAZAAR).StartSendUpdate();
|
player.GetItemPackage(Inventory.BAZAAR).StartSendUpdate();
|
||||||
player.GetItemPackage(Inventory.BAZAAR).AddItem(reward);
|
player.GetItemPackage(Inventory.BAZAAR).AddItem(reward);
|
||||||
player.GetItemPackage(Inventory.BAZAAR).AddItem(seek);
|
player.GetItemPackage(Inventory.BAZAAR).AddItem(seek);
|
||||||
|
|
||||||
reward.SetAttachedIndex(Inventory.BAZAAR, seek.slot);
|
reward.SetAttachedIndex(Inventory.BAZAAR, seek.slot);
|
||||||
seek.SetHasAttached(true);
|
|
||||||
|
|
||||||
player.GetItemPackage(Inventory.BAZAAR).DoneSendUpdate();
|
player.GetItemPackage(Inventory.BAZAAR).DoneSendUpdate();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1078,36 +1081,33 @@ namespace FFXIVClassic_Map_Server
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
public void RemoveFromBazaar(Player player, ushort position)
|
public void RemoveFromBazaar(Player player, InventoryItem rewardRef)
|
||||||
{
|
{
|
||||||
InventoryItem reward = player.GetInventory(Inventory.BAZAAR).GetItemAtSlot(position);
|
ushort attachedItemPackage = (ushort)((rewardRef.dealingAttached1 >> 16) & 0xFF);
|
||||||
InventoryItem seek = null;
|
ushort attachedSlot = (ushort) (rewardRef.dealingAttached1 & 0xFF);
|
||||||
|
|
||||||
seek = player.GetInventory(Inventory.BAZAAR).
|
InventoryItem seekRef = rewardRef.IsSelling() ? null : player.GetItemPackage(attachedItemPackage).GetItemAtSlot(attachedSlot);
|
||||||
|
|
||||||
Database.ClearBazaarEntry(player, reward);
|
Database.ClearBazaarEntry(player, rewardRef);
|
||||||
|
|
||||||
player.GetInventory(Inventory.BAZAAR).RemoveItem(reward);
|
player.GetItemPackage(Inventory.BAZAAR).RemoveItem(rewardRef);
|
||||||
player.GetInventory(Inventory.BAZAAR).RemoveItem(seek);
|
|
||||||
|
|
||||||
player.GetInventory(Inventory.NORMAL).StartSendUpdate();
|
bool isSelling = rewardRef.IsSelling();
|
||||||
player.GetInventory(Inventory.CURRENCY_CRYSTALS).StartSendUpdate();
|
rewardRef.SetNormal();
|
||||||
|
|
||||||
if (reward.itemId == 1000001)
|
if (seekRef != null)
|
||||||
player.GetInventory(Inventory.CURRENCY_CRYSTALS).AddItem(reward.itemId, reward.quantity);
|
player.GetItemPackage(Inventory.BAZAAR).RemoveItem(seekRef);
|
||||||
else
|
|
||||||
player.GetInventory(Inventory.NORMAL).AddItem(reward);
|
|
||||||
|
|
||||||
if (reward.itemId == 1000001)
|
player.AddItem(rewardRef);
|
||||||
player.GetInventory(Inventory.CURRENCY_CRYSTALS).AddItem(seek.itemId, seek.quantity);
|
|
||||||
else
|
|
||||||
player.GetInventory(Inventory.NORMAL).AddItem(seek);
|
|
||||||
|
|
||||||
player.GetInventory(Inventory.NORMAL).DoneSendUpdate();
|
if (!isSelling)
|
||||||
player.GetInventory(Inventory.CURRENCY_CRYSTALS).DoneSendUpdate();
|
{
|
||||||
|
seekRef.SetNormal();
|
||||||
|
player.AddItem(seekRef);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
public void TransactionBazaar(Player owner, Player other, InventoryItem reward, InventoryItem seek, int rewardAmount, int seekAmount)
|
public void TransactionBazaar(Player owner, Player other, InventoryItem reward, InventoryItem seek, int rewardAmount, int seekAmount)
|
||||||
{
|
{
|
||||||
Database.ClearBazaarEntry(owner, reward, seek);
|
Database.ClearBazaarEntry(owner, reward, seek);
|
||||||
|
|
|
@ -10,7 +10,7 @@ using System.Collections.Generic;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.Actors
|
namespace FFXIVClassic_Map_Server.Actors
|
||||||
{
|
{
|
||||||
class Character:Actor
|
class Character : Actor
|
||||||
{
|
{
|
||||||
public const int SIZE = 0;
|
public const int SIZE = 0;
|
||||||
public const int COLORINFO = 1;
|
public const int COLORINFO = 1;
|
||||||
|
@ -63,7 +63,8 @@ namespace FFXIVClassic_Map_Server.Actors
|
||||||
protected Dictionary<ushort, Inventory> itemPackages = new Dictionary<ushort, Inventory>();
|
protected Dictionary<ushort, Inventory> itemPackages = new Dictionary<ushort, Inventory>();
|
||||||
protected Equipment equipment;
|
protected Equipment equipment;
|
||||||
|
|
||||||
public Character(uint actorID) : base(actorID)
|
public Character(uint actorID)
|
||||||
|
: base(actorID)
|
||||||
{
|
{
|
||||||
//Init timer array to "notimer"
|
//Init timer array to "notimer"
|
||||||
for (int i = 0; i < charaWork.statusShownTime.Length; i++)
|
for (int i = 0; i < charaWork.statusShownTime.Length; i++)
|
||||||
|
@ -187,7 +188,7 @@ namespace FFXIVClassic_Map_Server.Actors
|
||||||
ushort itemPackage = GetPackageForItem(catalogID);
|
ushort itemPackage = GetPackageForItem(catalogID);
|
||||||
if (itemPackages.ContainsKey(itemPackage))
|
if (itemPackages.ContainsKey(itemPackage))
|
||||||
{
|
{
|
||||||
itemPackages[itemPackage].RemoveItem(catalogID, quantity, quantity);
|
itemPackages[itemPackage].RemoveItem(catalogID, quantity, quality);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
foreach (InventoryItem item in itemsFromDB)
|
foreach (InventoryItem item in itemsFromDB)
|
||||||
|
{
|
||||||
|
item.RefreshPositioning(itemPackageCode, (ushort) i);
|
||||||
list[i++] = item;
|
list[i++] = item;
|
||||||
|
}
|
||||||
endOfListIndex = i;
|
endOfListIndex = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,6 +111,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
|
|
||||||
public INV_ERROR AddItem(InventoryItem itemRef)
|
public INV_ERROR AddItem(InventoryItem itemRef)
|
||||||
{
|
{
|
||||||
|
//If it isn't a single item (ie: armor) just add like normal (not valid for BAZAAR)
|
||||||
|
if (itemPackageCode != BAZAAR && itemRef.GetItemData().maxStack > 1)
|
||||||
|
return AddItem(itemRef.itemId, itemRef.quantity, itemRef.quality);
|
||||||
|
|
||||||
if (!IsSpaceForAdd(itemRef.itemId, itemRef.quantity, itemRef.quality))
|
if (!IsSpaceForAdd(itemRef.itemId, itemRef.quantity, itemRef.quality))
|
||||||
return INV_ERROR.INVENTORY_FULL;
|
return INV_ERROR.INVENTORY_FULL;
|
||||||
|
|
||||||
|
@ -137,6 +144,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
|
|
||||||
ItemData gItem = Server.GetItemGamedata(itemId);
|
ItemData gItem = Server.GetItemGamedata(itemId);
|
||||||
|
|
||||||
|
//If it's unique, abort
|
||||||
|
if (HasItem(itemId) && gItem.isExclusive)
|
||||||
|
return INV_ERROR.ALREADY_HAS_UNIQUE;
|
||||||
|
|
||||||
if (gItem == null)
|
if (gItem == null)
|
||||||
{
|
{
|
||||||
Program.Log.Error("Inventory.AddItem: unable to find item %u", itemId);
|
Program.Log.Error("Inventory.AddItem: unable to find item %u", itemId);
|
||||||
|
@ -165,10 +176,6 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//If it's unique, abort
|
|
||||||
if (quantityCount > 0 && gItem.isExclusive)
|
|
||||||
return INV_ERROR.ALREADY_HAS_UNIQUE;
|
|
||||||
|
|
||||||
//New item that spilled over
|
//New item that spilled over
|
||||||
while (quantityCount > 0)
|
while (quantityCount > 0)
|
||||||
{
|
{
|
||||||
|
@ -180,7 +187,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
}
|
}
|
||||||
|
|
||||||
InventoryItem addedItem = Database.CreateItem(itemId, Math.Min(quantityCount, gItem.maxStack), quality, modifiers);
|
InventoryItem addedItem = Database.CreateItem(itemId, Math.Min(quantityCount, gItem.maxStack), quality, modifiers);
|
||||||
addedItem.slot = (ushort)endOfListIndex;
|
addedItem.RefreshPositioning(itemPackageCode, (ushort)endOfListIndex);
|
||||||
isDirty[endOfListIndex] = true;
|
isDirty[endOfListIndex] = true;
|
||||||
list[endOfListIndex++] = addedItem;
|
list[endOfListIndex++] = addedItem;
|
||||||
quantityCount -= gItem.maxStack;
|
quantityCount -= gItem.maxStack;
|
||||||
|
@ -197,6 +204,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
{
|
{
|
||||||
list[slot] = item;
|
list[slot] = item;
|
||||||
SendUpdatePackets();
|
SendUpdatePackets();
|
||||||
|
item.RefreshPositioning(itemPackageCode, slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveItem(uint itemId)
|
public void RemoveItem(uint itemId)
|
||||||
|
@ -260,7 +268,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
|
|
||||||
public void RemoveItem(InventoryItem item)
|
public void RemoveItem(InventoryItem item)
|
||||||
{
|
{
|
||||||
RemoveItemByUniqueId(item.uniqueId, 1);
|
RemoveItemByUniqueId(item.uniqueId, item.quantity);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveItem(InventoryItem item, int quantity)
|
public void RemoveItem(InventoryItem item, int quantity)
|
||||||
|
@ -272,7 +280,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
{
|
{
|
||||||
ushort slot = 0;
|
ushort slot = 0;
|
||||||
InventoryItem toDelete = null;
|
InventoryItem toDelete = null;
|
||||||
for (int i = endOfListIndex - 1; i >= 0; i--)
|
for (int i = 0; i < endOfListIndex; i++)
|
||||||
{
|
{
|
||||||
InventoryItem item = list[i];
|
InventoryItem item = list[i];
|
||||||
|
|
||||||
|
@ -292,6 +300,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
if (quantity >= toDelete.quantity)
|
if (quantity >= toDelete.quantity)
|
||||||
{
|
{
|
||||||
DoDatabaseRemove(toDelete.uniqueId);
|
DoDatabaseRemove(toDelete.uniqueId);
|
||||||
|
list[slot].RefreshPositioning(0xFFFF, 0xFFFF);
|
||||||
list[slot] = null;
|
list[slot] = null;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -313,6 +322,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
|
|
||||||
DoDatabaseRemove(list[slot].uniqueId);
|
DoDatabaseRemove(list[slot].uniqueId);
|
||||||
|
|
||||||
|
list[slot].RefreshPositioning(0xFFFF, 0xFFFF);
|
||||||
list[slot] = null;
|
list[slot] = null;
|
||||||
isDirty[slot] = true;
|
isDirty[slot] = true;
|
||||||
|
|
||||||
|
@ -333,6 +343,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
{
|
{
|
||||||
DoDatabaseRemove(list[slot].uniqueId);
|
DoDatabaseRemove(list[slot].uniqueId);
|
||||||
|
|
||||||
|
list[slot].RefreshPositioning(0xFFFF, 0xFFFF);
|
||||||
list[slot] = null;
|
list[slot] = null;
|
||||||
DoRealign();
|
DoRealign();
|
||||||
}
|
}
|
||||||
|
@ -348,6 +359,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
{
|
{
|
||||||
for (int i = 0; i < endOfListIndex; i++)
|
for (int i = 0; i < endOfListIndex; i++)
|
||||||
{
|
{
|
||||||
|
list[i].RefreshPositioning(0xFFFF, 0xFFFF);
|
||||||
list[i] = null;
|
list[i] = null;
|
||||||
isDirty[i] = true;
|
isDirty[i] = true;
|
||||||
}
|
}
|
||||||
|
@ -504,6 +516,9 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
if (isTemporary)
|
if (isTemporary)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (itemPackageCode == BAZAAR)
|
||||||
|
return;
|
||||||
|
|
||||||
if (owner is Player)
|
if (owner is Player)
|
||||||
Database.AddItem((Player)owner, addedItem, itemPackageCode);
|
Database.AddItem((Player)owner, addedItem, itemPackageCode);
|
||||||
else if (owner is Retainer)
|
else if (owner is Retainer)
|
||||||
|
@ -515,6 +530,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
if (isTemporary)
|
if (isTemporary)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
if (itemPackageCode == BAZAAR)
|
||||||
|
return;
|
||||||
|
|
||||||
if (owner is Player)
|
if (owner is Player)
|
||||||
Database.SetQuantity((Player)owner, itemDBId, itemPackageCode);
|
Database.SetQuantity((Player)owner, itemDBId, itemPackageCode);
|
||||||
else if (owner is Retainer)
|
else if (owner is Retainer)
|
||||||
|
@ -526,6 +545,9 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
if (isTemporary)
|
if (isTemporary)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (itemPackageCode == BAZAAR)
|
||||||
|
return;
|
||||||
|
|
||||||
if (owner is Player)
|
if (owner is Player)
|
||||||
Database.RemoveItem((Player)owner, itemDBId);
|
Database.RemoveItem((Player)owner, itemDBId);
|
||||||
else if (owner is Retainer)
|
else if (owner is Retainer)
|
||||||
|
@ -534,7 +556,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
|
|
||||||
private void SendUpdatePackets()
|
private void SendUpdatePackets()
|
||||||
{
|
{
|
||||||
if (owner is Player)
|
if (owner is Player && !holdingUpdates)
|
||||||
{
|
{
|
||||||
SendUpdatePackets((Player)owner);
|
SendUpdatePackets((Player)owner);
|
||||||
}
|
}
|
||||||
|
@ -560,7 +582,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!holdingUpdates)
|
if (!holdingUpdates)
|
||||||
DoneSendUpdate();
|
Array.Clear(isDirty, 0, isDirty.Length);
|
||||||
|
|
||||||
player.QueuePacket(InventoryBeginChangePacket.BuildPacket(owner.actorId));
|
player.QueuePacket(InventoryBeginChangePacket.BuildPacket(owner.actorId));
|
||||||
player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode));
|
player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode));
|
||||||
|
@ -580,6 +602,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||||
public void DoneSendUpdate()
|
public void DoneSendUpdate()
|
||||||
{
|
{
|
||||||
holdingUpdates = false;
|
holdingUpdates = false;
|
||||||
|
SendUpdatePackets();
|
||||||
Array.Clear(isDirty, 0, isDirty.Length);
|
Array.Clear(isDirty, 0, isDirty.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,8 +39,8 @@ namespace FFXIVClassic_Map_Server.dataobjects
|
||||||
public ItemModifier modifiers;
|
public ItemModifier modifiers;
|
||||||
|
|
||||||
public readonly ItemData itemData;
|
public readonly ItemData itemData;
|
||||||
public ushort slot;
|
public ushort slot = 0xFFFF;
|
||||||
public ushort itemPackage;
|
public ushort itemPackage = 0xFFFF;
|
||||||
|
|
||||||
public class ItemModifier
|
public class ItemModifier
|
||||||
{
|
{
|
||||||
|
@ -213,6 +213,24 @@ namespace FFXIVClassic_Map_Server.dataobjects
|
||||||
tags[0] = isAttached ? TAG_ATTACHED : (byte)0;
|
tags[0] = isAttached ? TAG_ATTACHED : (byte)0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetNormal()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
if (tags[i] == TAG_DEALING || tags[i] == TAG_ATTACHED)
|
||||||
|
{
|
||||||
|
tags[i] = 0;
|
||||||
|
tagValues[i] = 0;
|
||||||
|
attachedTo = 0;
|
||||||
|
dealingVal = 0;
|
||||||
|
dealingMode = 0;
|
||||||
|
dealingAttached1 = 0;
|
||||||
|
dealingAttached2 = 0;
|
||||||
|
dealingAttached3 = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void SetDealing(byte mode, int price)
|
public void SetDealing(byte mode, int price)
|
||||||
{
|
{
|
||||||
tags[0] = TAG_DEALING;
|
tags[0] = TAG_DEALING;
|
||||||
|
@ -264,5 +282,10 @@ namespace FFXIVClassic_Map_Server.dataobjects
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsSelling()
|
||||||
|
{
|
||||||
|
return GetBazaarMode() == TYPE_SINGLE || GetBazaarMode() == TYPE_MULTI || GetBazaarMode() == TYPE_STACK;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,24 @@ namespace FFXIVClassic_Map_Server
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class ItemOfferParam
|
||||||
|
{
|
||||||
|
public uint actorId;
|
||||||
|
public ushort offerSlot;
|
||||||
|
public ushort unknown1;
|
||||||
|
public ushort seekSlot;
|
||||||
|
public ushort unknown2;
|
||||||
|
|
||||||
|
public ItemOfferParam(uint actorId, ushort unknown1, ushort offerSlot, ushort seekSlot, ushort unknown2)
|
||||||
|
{
|
||||||
|
this.actorId = actorId;
|
||||||
|
this.unknown1 = unknown1;
|
||||||
|
this.offerSlot = offerSlot;
|
||||||
|
this.seekSlot = seekSlot;
|
||||||
|
this.unknown2 = unknown2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class Type9Param
|
public class Type9Param
|
||||||
{
|
{
|
||||||
public ulong item1;
|
public ulong item1;
|
||||||
|
@ -81,12 +99,24 @@ namespace FFXIVClassic_Map_Server
|
||||||
case 0x6: //Actor (By Id)
|
case 0x6: //Actor (By Id)
|
||||||
value = Utils.SwapEndian(reader.ReadUInt32());
|
value = Utils.SwapEndian(reader.ReadUInt32());
|
||||||
break;
|
break;
|
||||||
case 0x7: //Weird one used for inventory
|
case 0x7: //Item Reference to Inventory Spot
|
||||||
|
{
|
||||||
uint type7ActorId = Utils.SwapEndian(reader.ReadUInt32());
|
uint type7ActorId = Utils.SwapEndian(reader.ReadUInt32());
|
||||||
byte type7Unknown = reader.ReadByte();
|
byte type7Unknown = reader.ReadByte();
|
||||||
byte type7Slot = reader.ReadByte();
|
byte type7Slot = reader.ReadByte();
|
||||||
byte type7InventoryType = reader.ReadByte();
|
byte type7InventoryType = reader.ReadByte();
|
||||||
value = new ItemRefParam(type7ActorId, type7Unknown, type7Slot, type7InventoryType);
|
value = new ItemRefParam(type7ActorId, type7Unknown, type7Slot, type7InventoryType);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x8: //Used for offering
|
||||||
|
{
|
||||||
|
uint actorId = Utils.SwapEndian(reader.ReadUInt32());
|
||||||
|
ushort unk1 = Utils.SwapEndian(reader.ReadUInt16());
|
||||||
|
ushort offerSlot = Utils.SwapEndian(reader.ReadUInt16());
|
||||||
|
ushort seekSlot = Utils.SwapEndian(reader.ReadUInt16());
|
||||||
|
ushort unk2 = Utils.SwapEndian(reader.ReadUInt16());
|
||||||
|
value = new ItemOfferParam(actorId, unk1, offerSlot, seekSlot, unk2);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 0x9: //Two Longs (only storing first one)
|
case 0x9: //Two Longs (only storing first one)
|
||||||
value = new Type9Param(Utils.SwapEndian(reader.ReadUInt64()), Utils.SwapEndian(reader.ReadUInt64()));
|
value = new Type9Param(Utils.SwapEndian(reader.ReadUInt64()), Utils.SwapEndian(reader.ReadUInt64()));
|
||||||
|
@ -105,7 +135,13 @@ namespace FFXIVClassic_Map_Server
|
||||||
if (isDone)
|
if (isDone)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (value != null)
|
//Special case cause fuck Type8
|
||||||
|
if (value != null && value is ItemOfferParam)
|
||||||
|
{
|
||||||
|
luaParams.Add(new LuaParam(code, value));
|
||||||
|
luaParams.Add(new LuaParam(5, null));
|
||||||
|
}
|
||||||
|
else if (value != null)
|
||||||
luaParams.Add(new LuaParam(code, value));
|
luaParams.Add(new LuaParam(code, value));
|
||||||
else if (wasNil)
|
else if (wasNil)
|
||||||
luaParams.Add(new LuaParam(code, value));
|
luaParams.Add(new LuaParam(code, value));
|
||||||
|
@ -357,6 +393,10 @@ namespace FFXIVClassic_Map_Server
|
||||||
{
|
{
|
||||||
luaParams.Add(new LuaParam(0x7, (ItemRefParam)o));
|
luaParams.Add(new LuaParam(0x7, (ItemRefParam)o));
|
||||||
}
|
}
|
||||||
|
else if (o is ItemOfferParam)
|
||||||
|
{
|
||||||
|
luaParams.Add(new LuaParam(0x8, (ItemOfferParam)o));
|
||||||
|
}
|
||||||
else if (o is Type9Param)
|
else if (o is Type9Param)
|
||||||
{
|
{
|
||||||
luaParams.Add(new LuaParam(0x9, (Type9Param)o));
|
luaParams.Add(new LuaParam(0x9, (Type9Param)o));
|
||||||
|
@ -413,13 +453,17 @@ namespace FFXIVClassic_Map_Server
|
||||||
ItemRefParam type7Param = ((ItemRefParam)lParams[i].value);
|
ItemRefParam type7Param = ((ItemRefParam)lParams[i].value);
|
||||||
dumpString += String.Format("Type7 Param: (0x{0:X}, 0x{1:X}, 0x{2:X}, 0x{3:X})", type7Param.actorId, type7Param.unknown, type7Param.slot, type7Param.itemPackage);
|
dumpString += String.Format("Type7 Param: (0x{0:X}, 0x{1:X}, 0x{2:X}, 0x{3:X})", type7Param.actorId, type7Param.unknown, type7Param.slot, type7Param.itemPackage);
|
||||||
break;
|
break;
|
||||||
case 0xC: //Byte
|
case 0x8: //Weird one used for inventory
|
||||||
dumpString += String.Format("0x{0:X}", (byte)lParams[i].value);
|
ItemOfferParam itemOfferParam = ((ItemOfferParam)lParams[i].value);
|
||||||
|
dumpString += String.Format("Type8 Param: (0x{0:X}, 0x{1:X}, 0x{2:X}, 0x{3:X}, 0x{4:X})", itemOfferParam.actorId, itemOfferParam.unknown1, itemOfferParam.offerSlot, itemOfferParam.seekSlot, itemOfferParam.unknown2);
|
||||||
break;
|
break;
|
||||||
case 0x9: //Long (+ 8 bytes ignored)
|
case 0x9: //Long (+ 8 bytes ignored)
|
||||||
Type9Param type9Param = ((Type9Param)lParams[i].value);
|
Type9Param type9Param = ((Type9Param)lParams[i].value);
|
||||||
dumpString += String.Format("Type9 Param: (0x{0:X}, 0x{1:X})", type9Param.item1, type9Param.item2);
|
dumpString += String.Format("Type9 Param: (0x{0:X}, 0x{1:X})", type9Param.item1, type9Param.item2);
|
||||||
break;
|
break;
|
||||||
|
case 0xC: //Byte
|
||||||
|
dumpString += String.Format("0x{0:X}", (byte)lParams[i].value);
|
||||||
|
break;
|
||||||
case 0x1B: //Short?
|
case 0x1B: //Short?
|
||||||
dumpString += String.Format("0x{0:X}", (ushort)lParams[i].value);
|
dumpString += String.Format("0x{0:X}", (ushort)lParams[i].value);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Reference in a new issue