diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index c20395db..b6e65149 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -1075,12 +1075,12 @@ 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(GetBazaar(player)); - player.GetInventory(Inventory.MELDREQUEST).InitList(GetInventory(player, 0, Inventory.MELDREQUEST)); - player.GetInventory(Inventory.LOOT).InitList(GetInventory(player, 0, Inventory.LOOT)); + player.GetItemPackage(Inventory.NORMAL).InitList(GetItemPackage(player, 0, Inventory.NORMAL)); + player.GetItemPackage(Inventory.KEYITEMS).InitList(GetItemPackage(player, 0, Inventory.KEYITEMS)); + player.GetItemPackage(Inventory.CURRENCY_CRYSTALS).InitList(GetItemPackage(player, 0, Inventory.CURRENCY_CRYSTALS)); + player.GetItemPackage(Inventory.BAZAAR).InitList(GetBazaar(player)); + player.GetItemPackage(Inventory.MELDREQUEST).InitList(GetItemPackage(player, 0, Inventory.MELDREQUEST)); + player.GetItemPackage(Inventory.LOOT).InitList(GetItemPackage(player, 0, Inventory.LOOT)); player.GetEquipment().SetEquipment(GetEquipment(player, player.charaWork.parameterSave.state_mainSkill[0])); } @@ -1123,7 +1123,7 @@ namespace FFXIVClassic_Map_Server { ushort equipSlot = reader.GetUInt16(0); ulong uniqueItemId = reader.GetUInt16(1); - InventoryItem item = player.GetInventory(Inventory.NORMAL).GetItemByUniqueId(uniqueItemId); + InventoryItem item = player.GetItemPackage(Inventory.NORMAL).GetItemByUniqueId(uniqueItemId); equipment[equipSlot] = item; } } @@ -1211,7 +1211,7 @@ namespace FFXIVClassic_Map_Server } - public static List GetInventory(Player player, uint slotOffset, uint type) + public static List GetItemPackage(Player player, uint slotOffset, uint type) { List items = new List(); @@ -1425,12 +1425,12 @@ namespace FFXIVClassic_Map_Server InventoryItem item = new InventoryItem(uniqueId, Server.GetItemGamedata(itemId), quantity, qualityNumber, modifier); - byte bazaarMode = reader.GetByte("bazaarMode"); + byte bazaarMode = reader.GetByte("bazaarMode"); - if (bazaarMode == InventoryItem.TYPE_SINGLE || bazaarMode == InventoryItem.TYPE_STACK) + if (bazaarMode == InventoryItem.TYPE_SINGLE || bazaarMode == InventoryItem.TYPE_MULTI || bazaarMode == InventoryItem.TYPE_STACK) { uint price = (uint) reader.GetInt32("sellPrice"); - item.SetDealing(bazaarMode, price); + item.SetDealing(bazaarMode, (int) price); } else { diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs index 06fbd4e6..25d3321f 100644 --- a/FFXIVClassic Map Server/WorldManager.cs +++ b/FFXIVClassic Map Server/WorldManager.cs @@ -1054,21 +1054,30 @@ namespace FFXIVClassic_Map_Server bool succ = Database.CreateBazaarEntry(player, reward, seek, rewardAmount, seekAmount, bazaarMode); if (succ) - { - if (reward.GetItemData().IsMoney()) - player.RemoveItem(1000001, rewardAmount); + { + if (bazaarMode != InventoryItem.TYPE_SINGLE && bazaarMode != InventoryItem.TYPE_MULTI && bazaarMode != InventoryItem.TYPE_STACK) + { + reward.SetDealingAttached(bazaarMode, seek.uniqueId); + player.GetItemPackage(Inventory.BAZAAR).StartSendUpdate(); + player.GetItemPackage(Inventory.BAZAAR).AddItem(reward); + player.GetItemPackage(Inventory.BAZAAR).AddItem(seek); + + reward.SetAttachedIndex(Inventory.BAZAAR, seek.slot); + seek.SetHasAttached(true); + + player.GetItemPackage(Inventory.BAZAAR).DoneSendUpdate(); + } else - player.RemoveItem(reward, rewardAmount); - - if (!reward.GetItemData().IsMoney()) - player.RemoveItem(seek, seekAmount); - - player.GetInventory(Inventory.BAZAAR).StartSendUpdate(); - player.GetInventory(Inventory.BAZAAR).AddItem(reward); - player.GetInventory(Inventory.BAZAAR).AddItem(seek); - player.GetInventory(Inventory.BAZAAR).DoneSendUpdate(); + { + reward.SetDealing(bazaarMode, seekAmount); + player.GetItemPackage(Inventory.BAZAAR).StartSendUpdate(); + player.GetItemPackage(Inventory.BAZAAR).AddItem(reward); + player.GetItemPackage(Inventory.BAZAAR).DoneSendUpdate(); + } + } } + /* public void RemoveFromBazaar(Player player, ushort position) { diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs index e9057033..0dc77ef3 100644 --- a/FFXIVClassic Map Server/actors/chara/Character.cs +++ b/FFXIVClassic Map Server/actors/chara/Character.cs @@ -61,7 +61,7 @@ namespace FFXIVClassic_Map_Server.Actors //Inventory protected Dictionary itemPackages = new Dictionary(); - private Equipment equipment; + protected Equipment equipment; public Character(uint actorID) : base(actorID) { @@ -157,7 +157,7 @@ namespace FFXIVClassic_Map_Server.Actors { if (itemPackages.ContainsKey(itemPackage)) { - itemPackages[itemPackage].AddItemSpecial(slot, item); + itemPackages[itemPackage].SetItem(slot, item); } } @@ -254,6 +254,14 @@ namespace FFXIVClassic_Map_Server.Actors return null; } + public Inventory GetItemPackage(ushort package) + { + if (itemPackages.ContainsKey(package)) + return itemPackages[package]; + else + return null; + } + public ushort GetPackageForItem(uint catalogID) { ItemData data = Server.GetItemGamedata(catalogID); diff --git a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs index 76c19af9..a793162e 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs @@ -32,8 +32,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player }; private Character owner; - private ushort inventoryCapacity; - private ushort inventoryCode; + private ushort itemPackageCapacity; + private ushort itemPackageCode; private bool isTemporary; private InventoryItem[] list; private bool[] isDirty; @@ -44,8 +44,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player public Inventory(Character ownerPlayer, ushort capacity, ushort code, bool temporary = false) { owner = ownerPlayer; - inventoryCapacity = capacity; - inventoryCode = code; + itemPackageCapacity = capacity; + itemPackageCode = code; isTemporary = temporary; list = new InventoryItem[capacity]; isDirty = new bool[capacity]; @@ -101,18 +101,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.player return AddItem(itemId, 1, 1); } - public void AddItem(uint[] itemId) - { - for (int i = 0; i < itemId.Length; i++) - AddItem(itemId[i]); - } - 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)) @@ -126,7 +119,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player return INV_ERROR.SYSTEM_ERROR; } - itemRef.RefreshPositioning(inventoryCode, (ushort) endOfListIndex); + itemRef.RefreshPositioning(itemPackageCode, (ushort) endOfListIndex); isDirty[endOfListIndex] = true; list[endOfListIndex++] = itemRef; @@ -200,7 +193,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player return INV_ERROR.SUCCESS; } - public void AddItemSpecial(ushort slot, InventoryItem item) + public void SetItem(ushort slot, InventoryItem item) { list[slot] = item; SendUpdatePackets(); @@ -304,7 +297,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player else { list[slot].quantity -= quantity; - //DoDatabaseUpdateQuantity(toDelete.uniqueId); + DoDatabaseQuantity(list[slot].uniqueId, list[slot].quantity); } isDirty[slot] = true; @@ -387,7 +380,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player #region Packet Functions public void SendFullInventory(Player player) { - player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, inventoryCapacity, inventoryCode)); + player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode)); SendInventoryPackets(player, 0); player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); } @@ -483,21 +476,21 @@ namespace FFXIVClassic_Map_Server.actors.chara.player public void RefreshItem(Player player, InventoryItem item) { - player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, inventoryCapacity, inventoryCode)); + player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode)); SendInventoryPackets(player, item); player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); } public void RefreshItem(Player player, params InventoryItem[] items) { - player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, inventoryCapacity, inventoryCode)); + player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode)); SendInventoryPackets(player, items.ToList()); player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); } public void RefreshItem(Player player, List items) { - player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, inventoryCapacity, inventoryCode)); + player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode)); SendInventoryPackets(player, items); player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); } @@ -512,9 +505,9 @@ namespace FFXIVClassic_Map_Server.actors.chara.player return; if (owner is Player) - Database.AddItem((Player)owner, addedItem, inventoryCode); + Database.AddItem((Player)owner, addedItem, itemPackageCode); else if (owner is Retainer) - Database.AddItem((Retainer)owner, addedItem, inventoryCode); + Database.AddItem((Retainer)owner, addedItem, itemPackageCode); } private void DoDatabaseQuantity(ulong itemDBId, int quantity) @@ -523,9 +516,9 @@ namespace FFXIVClassic_Map_Server.actors.chara.player return; if (owner is Player) - Database.SetQuantity((Player)owner, itemDBId, inventoryCode); + Database.SetQuantity((Player)owner, itemDBId, itemPackageCode); else if (owner is Retainer) - Database.SetQuantity((Retainer)owner, itemDBId, inventoryCode); + Database.SetQuantity((Retainer)owner, itemDBId, itemPackageCode); } private void DoDatabaseRemove(ulong itemDBId) @@ -570,7 +563,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player DoneSendUpdate(); player.QueuePacket(InventoryBeginChangePacket.BuildPacket(owner.actorId)); - player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, inventoryCapacity, inventoryCode)); + player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode)); //Send Updated Slots SendInventoryPackets(player, items); //Send Remove packets for tail end @@ -596,7 +589,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player public bool IsFull() { - return endOfListIndex >= inventoryCapacity; + return endOfListIndex >= itemPackageCapacity; } public bool IsSpaceForAdd(uint itemId, int quantity, int quality) diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index c151b25a..9f362fc2 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -1070,14 +1070,14 @@ namespace FFXIVClassic_Map_Server.Actors public void CheckBazaarFlags() { bool isDealing = false, isRepairing = false, seekingItem = false; - lock (GetInventory(Inventory.BAZAAR)) + lock (GetItemPackage(Inventory.BAZAAR)) { - foreach (InventoryItem item in GetInventory(Inventory.BAZAAR).GetRawList()) + foreach (InventoryItem item in GetItemPackage(Inventory.BAZAAR).GetRawList()) { if (item == null) break; - if (item.GetBazaarMode() == InventoryItem.TYPE_SINGLE || item.GetBazaarMode() == InventoryItem.TYPE_STACK) + if (item.GetBazaarMode() == InventoryItem.TYPE_SINGLE || item.GetBazaarMode() == InventoryItem.TYPE_MULTI || item.GetBazaarMode() == InventoryItem.TYPE_STACK) isDealing = true; if (item.GetBazaarMode() == InventoryItem.TYPE_SEEK_REPAIR) isRepairing = true; @@ -1091,27 +1091,19 @@ namespace FFXIVClassic_Map_Server.Actors charaWork.eventTemp.bazaarRetail = isDealing; charaWork.eventTemp.bazaarRepair = isRepairing; - charaWork.eventTemp.bazaarMateria = GetInventory(Inventory.MELDREQUEST).GetCount() == 0; + charaWork.eventTemp.bazaarMateria = GetItemPackage(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 (itemPackages.ContainsKey(type)) - return itemPackages[type]; - else - return null; - } + } public int GetCurrentGil() { - if (GetInventory(Inventory.CURRENCY_CRYSTALS).HasItem(1000001)) - return GetInventory(Inventory.CURRENCY_CRYSTALS).GetItemByCatelogId(1000001).quantity; + if (HasItem(1000001)) + return GetItemPackage(Inventory.CURRENCY_CRYSTALS).GetItemByCatelogId(1000001).quantity; else return 0; } diff --git a/FFXIVClassic Map Server/dataobjects/InventoryItem.cs b/FFXIVClassic Map Server/dataobjects/InventoryItem.cs index dfbdd894..31c8964d 100644 --- a/FFXIVClassic Map Server/dataobjects/InventoryItem.cs +++ b/FFXIVClassic Map Server/dataobjects/InventoryItem.cs @@ -13,7 +13,8 @@ namespace FFXIVClassic_Map_Server.dataobjects public const byte TAG_DEALING = 0xC9; public const byte TAG_ATTACHED = 0xCA; - public const byte TYPE_SINGLE = 12; + public const byte TYPE_SINGLE = 11; + public const byte TYPE_MULTI = 12; public const byte TYPE_STACK = 13; public const byte TYPE_SEEK_ITEM = 20; public const byte TYPE_SEEK_REPAIR = 30; @@ -212,18 +213,18 @@ namespace FFXIVClassic_Map_Server.dataobjects tags[0] = isAttached ? TAG_ATTACHED : (byte)0; } - public void SetDealing(byte mode, uint price) + public void SetDealing(byte mode, int price) { tags[0] = TAG_DEALING; tagValues[0] = mode; - if (mode == TYPE_SINGLE || mode == TYPE_STACK) + if (mode == TYPE_SINGLE || mode == TYPE_MULTI || mode == TYPE_STACK) { dealingVal = 1; dealingMode = DEALINGMODE_PRICED; dealingAttached1 = 1; - dealingAttached2 = 1000001; - dealingAttached3 = price; + dealingAttached2 = (uint) price; + dealingAttached3 = 0; } } diff --git a/data/scripts/commands/BazaarDealCommand.lua b/data/scripts/commands/BazaarDealCommand.lua index 83f94bea..81c6abf2 100644 --- a/data/scripts/commands/BazaarDealCommand.lua +++ b/data/scripts/commands/BazaarDealCommand.lua @@ -10,13 +10,44 @@ All bazaar args have a Reward (The item the person who fufills the request gets) function onEventStarted(player, actor, triggerName, rewardItem, seekItem, bazaarMode, arg1, bazaarActor, rewardAmount, seekAmount, arg2, arg3, type9ItemIds) - --Get reward reference or itemId + local originalReward = nil; + local originalSeek = nil; + + --Handle Reward + if (type(rewardItem) == "number") then + rewardItem = GetWorldManager():CreateItem(rewardItem, rewardAmount); + else + rewardItem = player:GetItem(rewardItem); + originalReward = rewardItem; + if (bazaarMode ~= 11) then + rewardItem = GetWorldManager():CreateItem(rewardItem.itemId, rewardAmount, rewardItem.quality); + end + end - --Get seek reference or itemid + --Handle Seek + if (type(seekItem) == "number") then + seekItem = GetWorldManager():CreateItem(seekItem, rewardAmount); + else + seekItem = player:GetItem(seekItem); + originalSeek = seekItem; + if (bazaarMode ~= 11) then + seekItem = GetWorldManager():CreateItem(seekItem.itemId, seekAmount, seekItem.quality); + end + end - --Tell worldmaster to add bazaar entry with reward, seek, rewardAmount, seekAmount, and bazaarMode + --If not selling, remove the seek item + if (bazaarMode ~= 11 and bazaarMode ~= 12 and bazaarMode ~= 13) then + if (originalSeek ~= nil) then + player:RemoveItem(originalSeek, seekAmount); + end + end - --Remove reward items from inventory + --Remove the reward item + if (originalReward ~= nil) then + player:RemoveItem(originalReward, rewardAmount); + end + + GetWorldManager():AddToBazaar(player, rewardItem, seekItem, rewardAmount, seekAmount, bazaarMode); player:EndEvent(); diff --git a/data/scripts/commands/gm/givegil.lua b/data/scripts/commands/gm/givegil.lua index b4d3a9c1..b92d0ab4 100644 --- a/data/scripts/commands/gm/givegil.lua +++ b/data/scripts/commands/gm/givegil.lua @@ -27,7 +27,7 @@ function onTrigger(player, argc, qty, name, lastName) qty = tonumber(qty) or 1; location = INVENTORY_CURRENCY; - local added = player:GetInventory(location):AddItem(currency, qty, 1); + local added = player:GetItemPackage(location):AddItem(currency, qty, 1); local messageID = MESSAGE_TYPE_SYSTEM_ERROR; local message = "unable to add gil"; diff --git a/data/scripts/commands/gm/giveitem.lua b/data/scripts/commands/gm/giveitem.lua index 0b16b329..8c918d5a 100644 --- a/data/scripts/commands/gm/giveitem.lua +++ b/data/scripts/commands/gm/giveitem.lua @@ -40,7 +40,7 @@ function onTrigger(player, argc, item, qty, location, name, lastName) location = INVENTORY_NORMAL; end; - local added = player:getInventory(location):addItem(item, qty, 1); + local added = player:getItemPackage(location):addItem(item, qty, 1); if added then message = string.format("Added item %u of kind %u to %s", item, location, player:GetName());