diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index 42776a0c..c20395db 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -1078,7 +1078,7 @@ namespace FFXIVClassic_Map_Server player.GetInventory(Inventory.NORMAL).InitList(GetInventory(player, 0, Inventory.NORMAL)); player.GetInventory(Inventory.KEYITEMS).InitList(GetInventory(player, 0, Inventory.KEYITEMS)); player.GetInventory(Inventory.CURRENCY_CRYSTALS).InitList(GetInventory(player, 0, Inventory.CURRENCY_CRYSTALS)); - player.GetInventory(Inventory.BAZAAR).InitList(GetInventory(player, 0, Inventory.BAZAAR)); + player.GetInventory(Inventory.BAZAAR).InitList(GetBazaar(player)); player.GetInventory(Inventory.MELDREQUEST).InitList(GetInventory(player, 0, Inventory.MELDREQUEST)); player.GetInventory(Inventory.LOOT).InitList(GetInventory(player, 0, Inventory.LOOT)); @@ -1227,6 +1227,7 @@ namespace FFXIVClassic_Map_Server itemId, server_items_modifiers.id AS modifierId, quantity, + isExclusive, quality, durability, @@ -1247,7 +1248,7 @@ namespace FFXIVClassic_Map_Server FROM characters_inventory INNER JOIN server_items ON serverItemId = server_items.id LEFT JOIN server_items_modifiers ON server_items.id = server_items_modifiers.id - WHERE characterId = @charId AND inventoryType = @type"; + WHERE characterId = @charId AND itemPackage = @type"; MySqlCommand cmd = new MySqlCommand(query, conn); cmd.Parameters.AddWithValue("@charId", player.actorId); @@ -1270,7 +1271,7 @@ namespace FFXIVClassic_Map_Server if (hasModifier) modifier = new InventoryItem.ItemModifier(reader); - InventoryItem item = new InventoryItem(uniqueId, itemId, quantity, new byte[4], new byte[4], qualityNumber, modifier); + InventoryItem item = new InventoryItem(uniqueId, Server.GetItemGamedata(itemId), quantity, qualityNumber, modifier); item.slot = slot; slot++; items.Add(item); @@ -1290,6 +1291,249 @@ namespace FFXIVClassic_Map_Server return items; } + public static bool CreateBazaarEntry(Player owner, InventoryItem reward, InventoryItem seek, int rewardAmount, int seekAmount, byte bazaarMode, int sellPrice = 0) + { + 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_bazaar + (characterId, rewardId, seekId, rewardAmount, seekAmount, bazaarMode, sellPrice) + VALUES + (@characterId, @rewardId, @seekId, @rewardAmount, @seekAmount, @bazaarMode, @sellPrice); + "; + + MySqlCommand cmd = new MySqlCommand(query, conn); + cmd.Parameters.AddWithValue("@characterId", owner.actorId); + cmd.Parameters.AddWithValue("@rewardId", reward.uniqueId); + cmd.Parameters.AddWithValue("@seekId", seek.uniqueId); + cmd.Parameters.AddWithValue("@rewardAmount", rewardAmount); + cmd.Parameters.AddWithValue("@seekAmount", seekAmount); + cmd.Parameters.AddWithValue("@bazaarMode", bazaarMode); + cmd.Parameters.AddWithValue("@sellPrice", sellPrice); + cmd.ExecuteNonQuery(); + } + catch (MySqlException e) + { + Program.Log.Error(e.ToString()); + return false; + } + finally + { + conn.Dispose(); + } + } + + return true; + } + + public static void ClearBazaarEntry(Player owner, InventoryItem reward) + { + using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}; Allow User Variables=True", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD))) + { + try + { + conn.Open(); + + string query = @" + DELETE FROM characters_inventory_bazaar + WHERE characterId = @charId and rewardId = @rewardId; + "; + + MySqlCommand cmd = new MySqlCommand(query, conn); + cmd.Parameters.AddWithValue("@charId", owner.actorId); + cmd.Parameters.AddWithValue("@rewardId", reward.uniqueId); + cmd.ExecuteNonQuery(); + + } + catch (MySqlException e) + { + Program.Log.Error(e.ToString()); + } + finally + { + conn.Dispose(); + } + } + } + + public static List GetBazaar(Player player) + { + List rewardItems = new List(); + Dictionary seekItems = new Dictionary(); + + 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 + rewardId, + seekId, + rewardAmount, + bazaarMode, + sellPrice, + itemId, + server_items_modifiers.id AS modifierId, + quantity, + isExclusive, + quality, + + durability, + mainQuality, + subQuality1, + subQuality2, + subQuality3, + param1, + param2, + param3, + spiritbind, + materia1, + materia2, + materia3, + materia4, + materia5 + + FROM characters_inventory_bazaar + INNER JOIN server_items ON rewardId = server_items.id + LEFT JOIN server_items_modifiers ON server_items.id = server_items_modifiers.id + WHERE characterId = @charaId"; + + MySqlCommand cmd = new MySqlCommand(query, conn); + cmd.Parameters.AddWithValue("@charaId", player.actorId); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + uint uniqueId = reader.GetUInt32("rewardId"); + uint itemId = reader.GetUInt32("itemId"); + int quantity = reader.GetInt32("quantity"); + + byte qualityNumber = reader.GetByte("quality"); + + bool hasModifier = !reader.IsDBNull(reader.GetOrdinal("modifierId")); + InventoryItem.ItemModifier modifier = null; + + if (hasModifier) + modifier = new InventoryItem.ItemModifier(reader); + + InventoryItem item = new InventoryItem(uniqueId, Server.GetItemGamedata(itemId), quantity, qualityNumber, modifier); + + byte bazaarMode = reader.GetByte("bazaarMode"); + + if (bazaarMode == InventoryItem.TYPE_SINGLE || bazaarMode == InventoryItem.TYPE_STACK) + { + uint price = (uint) reader.GetInt32("sellPrice"); + item.SetDealing(bazaarMode, price); + } + else + { + uint seekId = reader.GetUInt32("seekId"); + item.SetDealingAttached(bazaarMode, seekId); + } + + rewardItems.Add(item); + } + } + + string query2 = @" + SELECT + seekId, + seekAmount, + sellPrice, + itemId, + server_items_modifiers.id AS modifierId, + quantity, + isExclusive, + quality, + + durability, + mainQuality, + subQuality1, + subQuality2, + subQuality3, + param1, + param2, + param3, + spiritbind, + materia1, + materia2, + materia3, + materia4, + materia5 + + FROM characters_inventory_bazaar + INNER JOIN server_items ON seekId = server_items.id + LEFT JOIN server_items_modifiers ON server_items.id = server_items_modifiers.id + WHERE characterId = @charaId"; + + MySqlCommand cmd2 = new MySqlCommand(query2, conn); + cmd2.Parameters.AddWithValue("@charaId", player.actorId); + + using (MySqlDataReader reader = cmd2.ExecuteReader()) + { + while (reader.Read()) + { + uint uniqueId = reader.GetUInt32("seekId"); + uint itemId = reader.GetUInt32("itemId"); + int quantity = reader.GetInt32("quantity"); + + byte qualityNumber = reader.GetByte("quality"); + + bool hasModifier = !reader.IsDBNull(reader.GetOrdinal("modifierId")); + InventoryItem.ItemModifier modifier = null; + + if (hasModifier) + modifier = new InventoryItem.ItemModifier(reader); + + InventoryItem item = new InventoryItem(uniqueId, Server.GetItemGamedata(itemId), quantity, qualityNumber, modifier); + item.SetHasAttached(true); + seekItems.Add(uniqueId, item); + } + } + } + catch (MySqlException e) + { + Program.Log.Error(e.ToString()); + } + finally + { + conn.Dispose(); + } + } + + List items = new List(); + ushort slot = 0; + foreach (InventoryItem reward in rewardItems) + { + if (reward.dealingMode == InventoryItem.DEALINGMODE_PRICED) + { + reward.slot = slot++; + items.Add(reward); + } + else + { + if (seekItems.ContainsKey(reward.GetAttached())) + { + reward.slot = slot++; + items.Add(reward); + InventoryItem seek = seekItems[reward.GetAttached()]; + seek.slot = slot++; + items.Add(seek); + reward.SetAttachedIndex(7, seek.slot); + } + } + } + + return items; + } + public static List GetInventory(Retainer retainer, uint type) { List items = new List(); @@ -1326,7 +1570,7 @@ namespace FFXIVClassic_Map_Server FROM retainers_inventory INNER JOIN server_items ON serverItemId = server_items.id LEFT JOIN server_items_modifiers ON server_items.id = server_items_modifiers.id - WHERE characterId = @charId AND inventoryType = @type"; + WHERE characterId = @charId AND itemPackage = @type"; MySqlCommand cmd = new MySqlCommand(query, conn); cmd.Parameters.AddWithValue("@retainerId", retainer.getRetainerId()); @@ -1350,7 +1594,7 @@ namespace FFXIVClassic_Map_Server if (hasModifier) modifier = new InventoryItem.ItemModifier(reader); - InventoryItem item = new InventoryItem(uniqueId, itemId, quantity, new byte[4], new byte[4], qualityNumber, modifier); + InventoryItem item = new InventoryItem(uniqueId, Server.GetItemGamedata(itemId), quantity, qualityNumber, modifier); item.slot = slot; slot++; items.Add(item); @@ -1370,7 +1614,7 @@ namespace FFXIVClassic_Map_Server return items; } - public static InventoryItem CreateItem(uint itemId, int quantity, byte[] tags, byte[] values, byte quality, InventoryItem.ItemModifier modifiers) + public static InventoryItem CreateItem(uint itemId, int quantity, byte quality, InventoryItem.ItemModifier modifiers = null) { InventoryItem insertedItem = null; @@ -1401,7 +1645,7 @@ namespace FFXIVClassic_Map_Server cmd.Parameters.AddWithValue("@quality", quality); cmd.ExecuteNonQuery(); - insertedItem = new InventoryItem((uint)cmd.LastInsertedId, itemId, quantity, tags, values, quality, modifiers); + insertedItem = new InventoryItem((uint)cmd.LastInsertedId, Server.GetItemGamedata(itemId), quantity, quality, modifiers); if (modifiers != null) { @@ -1434,16 +1678,16 @@ namespace FFXIVClassic_Map_Server string query = @" INSERT INTO characters_inventory - (characterId, inventoryType, serverItemId, quantity) + (characterId, itemPackage, serverItemId, quantity) VALUES - (@charId, @inventoryType, @serverItemId, @quantity) + (@charId, @itemPackage, @serverItemId, @quantity) "; MySqlCommand cmd = new MySqlCommand(query, conn); cmd.Parameters.AddWithValue("@serverItemId", addedItem.uniqueId); cmd.Parameters.AddWithValue("@charId", player.actorId); - cmd.Parameters.AddWithValue("@inventoryType", type); + cmd.Parameters.AddWithValue("@itemPackage", type); cmd.Parameters.AddWithValue("@quantity", addedItem.quantity); cmd.ExecuteNonQuery(); @@ -1520,7 +1764,6 @@ namespace FFXIVClassic_Map_Server conn.Dispose(); } } - } public static void AddItem(Retainer retainer, InventoryItem addedItem, uint type) @@ -1533,16 +1776,16 @@ namespace FFXIVClassic_Map_Server string query = @" INSERT INTO retainers_inventory - (retainerId, inventoryType, serverItemId, quantity) + (retainerId, itemPackage, serverItemId, quantity) VALUES - (@retainerId, @inventoryType, @serverItemId, @quantity) + (@retainerId, @itemPackage, @serverItemId, @quantity) "; MySqlCommand cmd = new MySqlCommand(query, conn); cmd.Parameters.AddWithValue("@serverItemId", addedItem.uniqueId); cmd.Parameters.AddWithValue("@retainerId", retainer.getRetainerId()); - cmd.Parameters.AddWithValue("@inventoryType", type); + cmd.Parameters.AddWithValue("@itemPackage", type); cmd.Parameters.AddWithValue("@quantity", addedItem.quantity); cmd.ExecuteNonQuery(); diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs index 16267ea2..edb149f4 100644 --- a/FFXIVClassic Map Server/WorldManager.cs +++ b/FFXIVClassic Map Server/WorldManager.cs @@ -23,6 +23,7 @@ using FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group; using System.Threading; using System.Diagnostics; using FFXIVClassic_Map_Server.actors.director; +using FFXIVClassic_Map_Server.actors.chara.player; namespace FFXIVClassic_Map_Server { @@ -1043,6 +1044,117 @@ namespace FFXIVClassic_Map_Server } } + public InventoryItem CreateItem(uint itemId, int amount, byte quality = 1) + { + return Database.CreateItem(itemId, amount, quality); + } + + public void AddToBazaarRewardGil(Player player, InventoryItem seek, int seekAmount, int gilAmount, byte bazaarMode) + { + bool succ = Database.CreateBazaarEntry(player, gilReward, seek, gilAmount, seekAmount, bazaarMode); + + if (succ) + { + player.GetInventory(Inventory.CURRENCY_CRYSTALS).RemoveItem(1000001, gilAmount); + player.GetInventory(Inventory.BAZAAR).StartSendUpdate(); + player.GetInventory(Inventory.BAZAAR).AddItem(gilReward); + player.GetInventory(Inventory.BAZAAR).AddItem(seek); + player.GetInventory(Inventory.BAZAAR).DoneSendUpdate(); + } + } + + public void AddToBazaarSeekGil(Player player, InventoryItem reward, int rewardAmount, int gilAmount, byte bazaarMode) + { + InventoryItem gilSeek = Database.CreateItem(1000001, gilAmount, 1); + bool succ = false; + + if (bazaarMode == InventoryItem.TYPE_SINGLE || bazaarMode == InventoryItem.TYPE_STACK) + succ = Database.CreateBazaarEntry(player, reward, gilSeek, rewardAmount, 0, bazaarMode, gilAmount); + else + succ = Database.CreateBazaarEntry(player, reward, gilSeek, rewardAmount, gilAmount, bazaarMode); + + if (succ) + { + player.GetInventory(Inventory.NORMAL).RemoveItem(reward); + player.GetInventory(Inventory.BAZAAR).StartSendUpdate(); + player.GetInventory(Inventory.BAZAAR).AddItem(reward); + player.GetInventory(Inventory.BAZAAR).AddItem(gilSeek); + player.GetInventory(Inventory.BAZAAR).DoneSendUpdate(); + } + } + + 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); + + if (succ) + { + if (reward.GetItemData().IsMoney()) + + player.GetInventory(Inventory.NORMAL).RemoveItem(reward); + player.GetInventory(Inventory.NORMAL).RemoveItem(seek); + player.GetInventory(Inventory.BAZAAR).StartSendUpdate(); + player.GetInventory(Inventory.BAZAAR).AddItem(reward); + player.GetInventory(Inventory.BAZAAR).AddItem(seek); + player.GetInventory(Inventory.BAZAAR).DoneSendUpdate(); + } + } + /* + public void RemoveFromBazaar(Player player, ushort position) + { + InventoryItem reward = player.GetInventory(Inventory.BAZAAR).GetItemAtSlot(position); + InventoryItem seek = null; + + seek = player.GetInventory(Inventory.BAZAAR). + + Database.ClearBazaarEntry(player, reward); + + player.GetInventory(Inventory.BAZAAR).RemoveItem(reward); + player.GetInventory(Inventory.BAZAAR).RemoveItem(seek); + + player.GetInventory(Inventory.NORMAL).StartSendUpdate(); + player.GetInventory(Inventory.CURRENCY_CRYSTALS).StartSendUpdate(); + + if (reward.itemId == 1000001) + player.GetInventory(Inventory.CURRENCY_CRYSTALS).AddItem(reward.itemId, reward.quantity); + else + player.GetInventory(Inventory.NORMAL).AddItem(reward); + + if (reward.itemId == 1000001) + player.GetInventory(Inventory.CURRENCY_CRYSTALS).AddItem(seek.itemId, seek.quantity); + else + player.GetInventory(Inventory.NORMAL).AddItem(seek); + + player.GetInventory(Inventory.NORMAL).DoneSendUpdate(); + player.GetInventory(Inventory.CURRENCY_CRYSTALS).DoneSendUpdate(); + } + + public void TransactionBazaar(Player owner, Player other, InventoryItem reward, InventoryItem seek, int rewardAmount, int seekAmount) + { + Database.ClearBazaarEntry(owner, reward, seek); + + //Remove Bazaar Items from owner + owner.GetInventory(Inventory.BAZAAR).RemoveItem(reward); + owner.GetInventory(Inventory.BAZAAR).RemoveItem(seek); + + //Remove Seek item from other + if (seek.GetItemData().IsMoney()) + other.GetInventory(Inventory.CURRENCY_CRYSTALS).RemoveItem(seek.itemId, seekAmount); + else + other.GetInventory(Inventory.NORMAL).RemoveItem(seek.itemId, seekAmount); + + //Add reward to other, seek to owner + if (reward.GetItemData().IsMoney()) + other.GetInventory(Inventory.CURRENCY_CRYSTALS).AddItem(reward.itemId, rewardAmount); + else + other.GetInventory(Inventory.NORMAL).AddItem(reward); + + if (seek.GetItemData().IsMoney()) + owner.GetInventory(Inventory.CURRENCY_CRYSTALS).AddItem(seek.itemId, seekAmount); + else + other.GetInventory(Inventory.NORMAL).AddItem(seek); + }*/ + public bool SendGroupInit(Session session, ulong groupId) { if (mContentGroups.ContainsKey(groupId)) diff --git a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs index bea63381..aadcf9bd 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs @@ -110,6 +110,29 @@ namespace FFXIVClassic_Map_Server.actors.chara.player public INV_ERROR AddItem(uint itemId, int quantity) { return AddItem(itemId, quantity, 1); + } + + + public INV_ERROR AddItem(InventoryItem itemRef) + { + if (!IsSpaceForAdd(itemRef.itemId, itemRef.quantity, itemRef.quality)) + return INV_ERROR.INVENTORY_FULL; + + ItemData gItem = Server.GetItemGamedata(itemRef.itemId); + + if (gItem == null) + { + Program.Log.Error("Inventory.AddItem: unable to find item %u", itemRef.itemId); + return INV_ERROR.SYSTEM_ERROR; + } + + isDirty[endOfListIndex] = true; + list[endOfListIndex++] = itemRef; + DoDatabaseAdd(itemRef); + + SendUpdatePackets(); + + return INV_ERROR.SUCCESS; } public INV_ERROR AddItem(uint itemId, int quantity, byte quality) @@ -154,12 +177,6 @@ namespace FFXIVClassic_Map_Server.actors.chara.player //New item that spilled over while (quantityCount > 0) { - byte[] tags = new byte[4]; - byte[] values = new byte[4]; - - if (gItem.isExclusive) - tags[1] = 3; - InventoryItem.ItemModifier modifiers = null; if (gItem.durability != 0) { @@ -167,7 +184,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player modifiers.durability = (uint)gItem.durability; } - InventoryItem addedItem = Database.CreateItem(itemId, Math.Min(quantityCount, gItem.maxStack), tags, values, quality, modifiers); + InventoryItem addedItem = Database.CreateItem(itemId, Math.Min(quantityCount, gItem.maxStack), quality, modifiers); addedItem.slot = (ushort)endOfListIndex; isDirty[endOfListIndex] = true; list[endOfListIndex++] = addedItem; @@ -244,6 +261,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.player DoRealign(); SendUpdatePackets(); + } + + public void RemoveItem(InventoryItem item) + { + RemoveItemByUniqueId(item.uniqueId); } public void RemoveItemByUniqueId(ulong itemDBId) @@ -641,7 +663,12 @@ namespace FFXIVClassic_Map_Server.actors.chara.player endOfListIndex = lastNullSlot; } - #endregion - + #endregion + + + public int GetCount() + { + return endOfListIndex; + } } } diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index bf7ff311..5d10846c 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -141,6 +141,13 @@ namespace FFXIVClassic_Map_Server.Actors public uint homepoint = 0; public byte homepointInn = 0; + //Nameplate Stuff + public uint currentLSPlate = 0; + public bool isBazaarRetail = false; + public bool isBazaarRepair = false; + public bool isMateriaRequest = false; + public byte repairType = 0; + //Retainer RetainerMeetingRelationGroup retainerMeetingGroup = null; public Retainer currentSpawnedRetainer = null; @@ -501,7 +508,17 @@ namespace FFXIVClassic_Map_Server.Actors propPacketUtil.AddProperty(String.Format("work.guildleveChecked[{0}]", i)); } - //NPC Linkshell + //Bazaar + if (charaWork.eventSave.repairType != 0) + propPacketUtil.AddProperty("charaWork.eventSave.repairType"); + if (charaWork.eventTemp.bazaarRetail) + propPacketUtil.AddProperty("charaWork.eventTemp.bazaarRetail"); + if (charaWork.eventTemp.bazaarRepair) + propPacketUtil.AddProperty("charaWork.eventTemp.bazaarRepair"); + if (charaWork.eventTemp.bazaarMateria) + propPacketUtil.AddProperty("charaWork.eventTemp.bazaarMateria"); + + //NPC Linkshell for (int i = 0; i < playerWork.npcLinkshellChatCalling.Length; i++) { if (playerWork.npcLinkshellChatCalling[i] != false) @@ -1046,6 +1063,47 @@ namespace FFXIVClassic_Map_Server.Actors BroadcastPacket(CreateAppearancePacket(), true); } + public void SetRepairRequest(byte type) + { + charaWork.eventSave.repairType = type; + ActorPropertyPacketUtil propPacketUtil = new ActorPropertyPacketUtil("charaWork/bazaar", this); + propPacketUtil.AddProperty("charaWork.eventSave.repairType"); + QueuePackets(propPacketUtil.Done()); + } + + public void CheckBazaarFlags() + { + bool isDealing = false, isRepairing = false, seekingItem = false; + lock (GetInventory(Inventory.BAZAAR)) + { + foreach (InventoryItem item in GetInventory(Inventory.BAZAAR).GetRawList()) + { + if (item == null) + break; + + if (item.GetBazaarMode() == InventoryItem.TYPE_SINGLE || item.GetBazaarMode() == InventoryItem.TYPE_STACK) + isDealing = true; + if (item.GetBazaarMode() == InventoryItem.TYPE_SEEK_REPAIR) + isRepairing = true; + if (item.GetBazaarMode() == InventoryItem.TYPE_SEEK_ITEM) + seekingItem = true; + + if (isDealing && isRepairing && seekingItem) + break; + } + } + + charaWork.eventTemp.bazaarRetail = isDealing; + charaWork.eventTemp.bazaarRepair = isRepairing; + charaWork.eventTemp.bazaarMateria = GetInventory(Inventory.MELDREQUEST).GetCount() == 0; + + ActorPropertyPacketUtil propPacketUtil = new ActorPropertyPacketUtil("charaWork/bazaar", this); + propPacketUtil.AddProperty("charaWork.eventTemp.bazaarRetail"); + propPacketUtil.AddProperty("charaWork.eventTemp.bazaarRepair"); + propPacketUtil.AddProperty("charaWork.eventTemp.bazaarMateria"); + QueuePackets(propPacketUtil.Done()); + } + public Inventory GetInventory(ushort type) { if (inventories.ContainsKey(type)) diff --git a/FFXIVClassic Map Server/dataobjects/InventoryItem.cs b/FFXIVClassic Map Server/dataobjects/InventoryItem.cs index b7f311ca..71c66a44 100644 --- a/FFXIVClassic Map Server/dataobjects/InventoryItem.cs +++ b/FFXIVClassic Map Server/dataobjects/InventoryItem.cs @@ -34,8 +34,12 @@ namespace FFXIVClassic_Map_Server.dataobjects public byte quality = 1; + private ulong attachedTo = 0; + public ItemModifier modifiers; + public readonly ItemData itemData; + public class ItemModifier { public uint durability = 0; @@ -115,10 +119,11 @@ namespace FFXIVClassic_Map_Server.dataobjects } //Bare Minimum - public InventoryItem(uint id, uint itemId) + public InventoryItem(uint id, ItemData data) { this.uniqueId = id; - this.itemId = itemId; + this.itemId = data.catalogID; + this.itemData = data; this.quantity = 1; ItemData gItem = Server.GetItemGamedata(itemId); @@ -129,6 +134,7 @@ namespace FFXIVClassic_Map_Server.dataobjects public InventoryItem(InventoryItem item, ushort equipSlot) { this.uniqueId = item.uniqueId; + this.itemData = item.itemData; this.itemId = item.itemId; this.quantity = item.quantity; this.slot = equipSlot; @@ -141,17 +147,12 @@ namespace FFXIVClassic_Map_Server.dataobjects this.modifiers = item.modifiers; } - public InventoryItem(uint uniqueId, uint itemId, int quantity, byte[] tags, byte[] tagValues, byte qualityNumber, ItemModifier modifiers = null) + public InventoryItem(uint uniqueId, ItemData itemData, int quantity, byte qualityNumber, ItemModifier modifiers = null) { this.uniqueId = uniqueId; - this.itemId = itemId; + this.itemId = itemData.catalogID; + this.itemData = itemData; this.quantity = quantity; - - if (tags != null) - this.tags = tags; - if (tagValues != null) - this.tagValues = tagValues; - this.quality = qualityNumber; this.modifiers = modifiers; } @@ -196,7 +197,7 @@ namespace FFXIVClassic_Map_Server.dataobjects public void SetExclusive(bool isExclusive) { - tags[0] = isExclusive ? TAG_EXCLUSIVE : (byte)0; + tags[1] = isExclusive ? TAG_EXCLUSIVE : (byte)0; } public void SetHasAttached(bool isAttached) @@ -205,31 +206,55 @@ namespace FFXIVClassic_Map_Server.dataobjects } public void SetDealing(byte mode, uint price) - { - if (tags[0] == TAG_EXCLUSIVE) - return; - + { tags[0] = TAG_DEALING; - tagValues[0] = mode; - - if (dealingMode != DEALINGMODE_REFERENCED) + tagValues[0] = mode; + + if (mode == TYPE_SINGLE || mode == TYPE_STACK) { dealingVal = 1; dealingMode = DEALINGMODE_PRICED; dealingAttached1 = 1; - dealingAttached2 = itemId; + dealingAttached2 = 1000001; dealingAttached3 = price; } } - public void SetAttachedToSlot(ushort package, ushort slot) + public void SetDealingAttached(byte mode, ulong attached) + { + tags[0] = TAG_DEALING; + tagValues[0] = mode; + attachedTo = attached; + } + + public ulong GetAttached() + { + return attachedTo; + } + + public void SetAttachedIndex(ushort package, ushort index) { dealingVal = 1; dealingMode = DEALINGMODE_REFERENCED; - dealingAttached1 = (uint)((ushort)package << 16) | slot; + dealingAttached1 = (uint)((package << 16) | index); dealingAttached2 = 0; - dealingAttached3 = 0; - } + dealingAttached3 = 0; + } + public ItemData GetItemData() + { + return itemData; + } + + public byte GetBazaarMode() + { + for (int i = 0; i < tags.Length; i++) + { + if (tags[i] == 0xC9) + return tagValues[i]; + } + + return 0; + } } }