More refactoring. Adding to bazaar now works for selling and seeking by gil.

This commit is contained in:
Filip Maj 2017-11-11 17:05:07 -05:00
parent bbac4b0fce
commit e8c9904e1d
9 changed files with 109 additions and 75 deletions

View File

@ -1075,12 +1075,12 @@ namespace FFXIVClassic_Map_Server
} }
} }
player.GetInventory(Inventory.NORMAL).InitList(GetInventory(player, 0, Inventory.NORMAL)); player.GetItemPackage(Inventory.NORMAL).InitList(GetItemPackage(player, 0, Inventory.NORMAL));
player.GetInventory(Inventory.KEYITEMS).InitList(GetInventory(player, 0, Inventory.KEYITEMS)); player.GetItemPackage(Inventory.KEYITEMS).InitList(GetItemPackage(player, 0, Inventory.KEYITEMS));
player.GetInventory(Inventory.CURRENCY_CRYSTALS).InitList(GetInventory(player, 0, Inventory.CURRENCY_CRYSTALS)); player.GetItemPackage(Inventory.CURRENCY_CRYSTALS).InitList(GetItemPackage(player, 0, Inventory.CURRENCY_CRYSTALS));
player.GetInventory(Inventory.BAZAAR).InitList(GetBazaar(player)); player.GetItemPackage(Inventory.BAZAAR).InitList(GetBazaar(player));
player.GetInventory(Inventory.MELDREQUEST).InitList(GetInventory(player, 0, Inventory.MELDREQUEST)); player.GetItemPackage(Inventory.MELDREQUEST).InitList(GetItemPackage(player, 0, Inventory.MELDREQUEST));
player.GetInventory(Inventory.LOOT).InitList(GetInventory(player, 0, Inventory.LOOT)); player.GetItemPackage(Inventory.LOOT).InitList(GetItemPackage(player, 0, Inventory.LOOT));
player.GetEquipment().SetEquipment(GetEquipment(player, player.charaWork.parameterSave.state_mainSkill[0])); player.GetEquipment().SetEquipment(GetEquipment(player, player.charaWork.parameterSave.state_mainSkill[0]));
} }
@ -1123,7 +1123,7 @@ namespace FFXIVClassic_Map_Server
{ {
ushort equipSlot = reader.GetUInt16(0); ushort equipSlot = reader.GetUInt16(0);
ulong uniqueItemId = reader.GetUInt16(1); ulong uniqueItemId = reader.GetUInt16(1);
InventoryItem item = player.GetInventory(Inventory.NORMAL).GetItemByUniqueId(uniqueItemId); InventoryItem item = player.GetItemPackage(Inventory.NORMAL).GetItemByUniqueId(uniqueItemId);
equipment[equipSlot] = item; equipment[equipSlot] = item;
} }
} }
@ -1211,7 +1211,7 @@ namespace FFXIVClassic_Map_Server
} }
public static List<InventoryItem> GetInventory(Player player, uint slotOffset, uint type) public static List<InventoryItem> GetItemPackage(Player player, uint slotOffset, uint type)
{ {
List<InventoryItem> items = new List<InventoryItem>(); List<InventoryItem> items = new List<InventoryItem>();
@ -1425,12 +1425,12 @@ namespace FFXIVClassic_Map_Server
InventoryItem item = new InventoryItem(uniqueId, Server.GetItemGamedata(itemId), quantity, qualityNumber, modifier); 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"); uint price = (uint) reader.GetInt32("sellPrice");
item.SetDealing(bazaarMode, price); item.SetDealing(bazaarMode, (int) price);
} }
else else
{ {

View File

@ -1054,21 +1054,30 @@ namespace FFXIVClassic_Map_Server
bool succ = Database.CreateBazaarEntry(player, reward, seek, rewardAmount, seekAmount, bazaarMode); bool succ = Database.CreateBazaarEntry(player, reward, seek, rewardAmount, seekAmount, bazaarMode);
if (succ) if (succ)
{ {
if (reward.GetItemData().IsMoney()) if (bazaarMode != InventoryItem.TYPE_SINGLE && bazaarMode != InventoryItem.TYPE_MULTI && bazaarMode != InventoryItem.TYPE_STACK)
player.RemoveItem(1000001, rewardAmount); {
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 else
player.RemoveItem(reward, rewardAmount); {
reward.SetDealing(bazaarMode, seekAmount);
if (!reward.GetItemData().IsMoney()) player.GetItemPackage(Inventory.BAZAAR).StartSendUpdate();
player.RemoveItem(seek, seekAmount); player.GetItemPackage(Inventory.BAZAAR).AddItem(reward);
player.GetItemPackage(Inventory.BAZAAR).DoneSendUpdate();
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) public void RemoveFromBazaar(Player player, ushort position)
{ {

View File

@ -61,7 +61,7 @@ namespace FFXIVClassic_Map_Server.Actors
//Inventory //Inventory
protected Dictionary<ushort, Inventory> itemPackages = new Dictionary<ushort, Inventory>(); protected Dictionary<ushort, Inventory> itemPackages = new Dictionary<ushort, Inventory>();
private Equipment equipment; protected Equipment equipment;
public Character(uint actorID) : base(actorID) public Character(uint actorID) : base(actorID)
{ {
@ -157,7 +157,7 @@ namespace FFXIVClassic_Map_Server.Actors
{ {
if (itemPackages.ContainsKey(itemPackage)) 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; return null;
} }
public Inventory GetItemPackage(ushort package)
{
if (itemPackages.ContainsKey(package))
return itemPackages[package];
else
return null;
}
public ushort GetPackageForItem(uint catalogID) public ushort GetPackageForItem(uint catalogID)
{ {
ItemData data = Server.GetItemGamedata(catalogID); ItemData data = Server.GetItemGamedata(catalogID);

View File

@ -32,8 +32,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
}; };
private Character owner; private Character owner;
private ushort inventoryCapacity; private ushort itemPackageCapacity;
private ushort inventoryCode; private ushort itemPackageCode;
private bool isTemporary; private bool isTemporary;
private InventoryItem[] list; private InventoryItem[] list;
private bool[] isDirty; 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) public Inventory(Character ownerPlayer, ushort capacity, ushort code, bool temporary = false)
{ {
owner = ownerPlayer; owner = ownerPlayer;
inventoryCapacity = capacity; itemPackageCapacity = capacity;
inventoryCode = code; itemPackageCode = code;
isTemporary = temporary; isTemporary = temporary;
list = new InventoryItem[capacity]; list = new InventoryItem[capacity];
isDirty = new bool[capacity]; isDirty = new bool[capacity];
@ -101,18 +101,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
return AddItem(itemId, 1, 1); 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) public INV_ERROR AddItem(uint itemId, int quantity)
{ {
return AddItem(itemId, quantity, 1); return AddItem(itemId, quantity, 1);
} }
public INV_ERROR AddItem(InventoryItem itemRef) public INV_ERROR AddItem(InventoryItem itemRef)
{ {
if (!IsSpaceForAdd(itemRef.itemId, itemRef.quantity, itemRef.quality)) if (!IsSpaceForAdd(itemRef.itemId, itemRef.quantity, itemRef.quality))
@ -126,7 +119,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
return INV_ERROR.SYSTEM_ERROR; return INV_ERROR.SYSTEM_ERROR;
} }
itemRef.RefreshPositioning(inventoryCode, (ushort) endOfListIndex); itemRef.RefreshPositioning(itemPackageCode, (ushort) endOfListIndex);
isDirty[endOfListIndex] = true; isDirty[endOfListIndex] = true;
list[endOfListIndex++] = itemRef; list[endOfListIndex++] = itemRef;
@ -200,7 +193,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
return INV_ERROR.SUCCESS; return INV_ERROR.SUCCESS;
} }
public void AddItemSpecial(ushort slot, InventoryItem item) public void SetItem(ushort slot, InventoryItem item)
{ {
list[slot] = item; list[slot] = item;
SendUpdatePackets(); SendUpdatePackets();
@ -304,7 +297,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
else else
{ {
list[slot].quantity -= quantity; list[slot].quantity -= quantity;
//DoDatabaseUpdateQuantity(toDelete.uniqueId); DoDatabaseQuantity(list[slot].uniqueId, list[slot].quantity);
} }
isDirty[slot] = true; isDirty[slot] = true;
@ -387,7 +380,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
#region Packet Functions #region Packet Functions
public void SendFullInventory(Player player) public void SendFullInventory(Player player)
{ {
player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, inventoryCapacity, inventoryCode)); player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode));
SendInventoryPackets(player, 0); SendInventoryPackets(player, 0);
player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId));
} }
@ -483,21 +476,21 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
public void RefreshItem(Player player, InventoryItem item) 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); SendInventoryPackets(player, item);
player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId));
} }
public void RefreshItem(Player player, params InventoryItem[] items) 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()); SendInventoryPackets(player, items.ToList());
player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId));
} }
public void RefreshItem(Player player, List<InventoryItem> items) public void RefreshItem(Player player, List<InventoryItem> items)
{ {
player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, inventoryCapacity, inventoryCode)); player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode));
SendInventoryPackets(player, items); SendInventoryPackets(player, items);
player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId));
} }
@ -512,9 +505,9 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
return; return;
if (owner is Player) if (owner is Player)
Database.AddItem((Player)owner, addedItem, inventoryCode); Database.AddItem((Player)owner, addedItem, itemPackageCode);
else if (owner is Retainer) else if (owner is Retainer)
Database.AddItem((Retainer)owner, addedItem, inventoryCode); Database.AddItem((Retainer)owner, addedItem, itemPackageCode);
} }
private void DoDatabaseQuantity(ulong itemDBId, int quantity) private void DoDatabaseQuantity(ulong itemDBId, int quantity)
@ -523,9 +516,9 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
return; return;
if (owner is Player) if (owner is Player)
Database.SetQuantity((Player)owner, itemDBId, inventoryCode); Database.SetQuantity((Player)owner, itemDBId, itemPackageCode);
else if (owner is Retainer) else if (owner is Retainer)
Database.SetQuantity((Retainer)owner, itemDBId, inventoryCode); Database.SetQuantity((Retainer)owner, itemDBId, itemPackageCode);
} }
private void DoDatabaseRemove(ulong itemDBId) private void DoDatabaseRemove(ulong itemDBId)
@ -570,7 +563,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
DoneSendUpdate(); DoneSendUpdate();
player.QueuePacket(InventoryBeginChangePacket.BuildPacket(owner.actorId)); 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 //Send Updated Slots
SendInventoryPackets(player, items); SendInventoryPackets(player, items);
//Send Remove packets for tail end //Send Remove packets for tail end
@ -596,7 +589,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
public bool IsFull() public bool IsFull()
{ {
return endOfListIndex >= inventoryCapacity; return endOfListIndex >= itemPackageCapacity;
} }
public bool IsSpaceForAdd(uint itemId, int quantity, int quality) public bool IsSpaceForAdd(uint itemId, int quantity, int quality)

View File

@ -1070,14 +1070,14 @@ namespace FFXIVClassic_Map_Server.Actors
public void CheckBazaarFlags() public void CheckBazaarFlags()
{ {
bool isDealing = false, isRepairing = false, seekingItem = false; 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) if (item == null)
break; 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; isDealing = true;
if (item.GetBazaarMode() == InventoryItem.TYPE_SEEK_REPAIR) if (item.GetBazaarMode() == InventoryItem.TYPE_SEEK_REPAIR)
isRepairing = true; isRepairing = true;
@ -1091,27 +1091,19 @@ namespace FFXIVClassic_Map_Server.Actors
charaWork.eventTemp.bazaarRetail = isDealing; charaWork.eventTemp.bazaarRetail = isDealing;
charaWork.eventTemp.bazaarRepair = isRepairing; 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); ActorPropertyPacketUtil propPacketUtil = new ActorPropertyPacketUtil("charaWork/bazaar", this);
propPacketUtil.AddProperty("charaWork.eventTemp.bazaarRetail"); propPacketUtil.AddProperty("charaWork.eventTemp.bazaarRetail");
propPacketUtil.AddProperty("charaWork.eventTemp.bazaarRepair"); propPacketUtil.AddProperty("charaWork.eventTemp.bazaarRepair");
propPacketUtil.AddProperty("charaWork.eventTemp.bazaarMateria"); propPacketUtil.AddProperty("charaWork.eventTemp.bazaarMateria");
QueuePackets(propPacketUtil.Done()); QueuePackets(propPacketUtil.Done());
} }
public Inventory GetInventory(ushort type)
{
if (itemPackages.ContainsKey(type))
return itemPackages[type];
else
return null;
}
public int GetCurrentGil() public int GetCurrentGil()
{ {
if (GetInventory(Inventory.CURRENCY_CRYSTALS).HasItem(1000001)) if (HasItem(1000001))
return GetInventory(Inventory.CURRENCY_CRYSTALS).GetItemByCatelogId(1000001).quantity; return GetItemPackage(Inventory.CURRENCY_CRYSTALS).GetItemByCatelogId(1000001).quantity;
else else
return 0; return 0;
} }

View File

@ -13,7 +13,8 @@ namespace FFXIVClassic_Map_Server.dataobjects
public const byte TAG_DEALING = 0xC9; public const byte TAG_DEALING = 0xC9;
public const byte TAG_ATTACHED = 0xCA; 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_STACK = 13;
public const byte TYPE_SEEK_ITEM = 20; public const byte TYPE_SEEK_ITEM = 20;
public const byte TYPE_SEEK_REPAIR = 30; public const byte TYPE_SEEK_REPAIR = 30;
@ -212,18 +213,18 @@ namespace FFXIVClassic_Map_Server.dataobjects
tags[0] = isAttached ? TAG_ATTACHED : (byte)0; 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; tags[0] = TAG_DEALING;
tagValues[0] = mode; tagValues[0] = mode;
if (mode == TYPE_SINGLE || mode == TYPE_STACK) if (mode == TYPE_SINGLE || mode == TYPE_MULTI || mode == TYPE_STACK)
{ {
dealingVal = 1; dealingVal = 1;
dealingMode = DEALINGMODE_PRICED; dealingMode = DEALINGMODE_PRICED;
dealingAttached1 = 1; dealingAttached1 = 1;
dealingAttached2 = 1000001; dealingAttached2 = (uint) price;
dealingAttached3 = price; dealingAttached3 = 0;
} }
} }

View File

@ -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) 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(); player:EndEvent();

View File

@ -27,7 +27,7 @@ function onTrigger(player, argc, qty, name, lastName)
qty = tonumber(qty) or 1; qty = tonumber(qty) or 1;
location = INVENTORY_CURRENCY; 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 messageID = MESSAGE_TYPE_SYSTEM_ERROR;
local message = "unable to add gil"; local message = "unable to add gil";

View File

@ -40,7 +40,7 @@ function onTrigger(player, argc, item, qty, location, name, lastName)
location = INVENTORY_NORMAL; location = INVENTORY_NORMAL;
end; end;
local added = player:getInventory(location):addItem(item, qty, 1); local added = player:getItemPackage(location):addItem(item, qty, 1);
if added then if added then
message = string.format("Added item %u of kind %u to %s", item, location, player:GetName()); message = string.format("Added item %u of kind %u to %s", item, location, player:GetName());