1
Fork 0
mirror of https://bitbucket.org/Ioncannon/project-meteor-server.git synced 2025-04-25 22:27:45 +00:00

If kickEvent is fired, the current event is popped. Commited Inventory changes.

This commit is contained in:
Filip Maj 2017-12-17 14:43:38 -05:00
parent 1e9d61c838
commit 7e2246e8d8
2 changed files with 517 additions and 445 deletions

View file

@ -57,7 +57,7 @@ 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); item.RefreshPositioning(owner, itemPackageCode, (ushort) i);
list[i++] = item; list[i++] = item;
} }
endOfListIndex = i; endOfListIndex = i;
@ -99,6 +99,20 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
return null; return null;
} }
public InventoryItem GetItemAttachedTo(InventoryItem attachedTo)
{
for (int i = 0; i < endOfListIndex; i++)
{
InventoryItem item = list[i];
Debug.Assert(item != null, "Item slot was null!!!");
if (attachedTo.GetAttached() == item.uniqueId)
return item;
}
return null;
}
public INV_ERROR AddItem(uint itemId) public INV_ERROR AddItem(uint itemId)
{ {
return AddItem(itemId, 1, 1); return AddItem(itemId, 1, 1);
@ -110,6 +124,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
} }
public INV_ERROR AddItem(InventoryItem itemRef) public INV_ERROR AddItem(InventoryItem itemRef)
{
lock (inventoryLock)
{ {
//If it isn't a single item (ie: armor) just add like normal (not valid for BAZAAR) //If it isn't a single item (ie: armor) just add like normal (not valid for BAZAAR)
if (itemPackageCode != BAZAAR && itemRef.GetItemData().maxStack > 1) if (itemPackageCode != BAZAAR && itemRef.GetItemData().maxStack > 1)
@ -126,7 +142,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
return INV_ERROR.SYSTEM_ERROR; return INV_ERROR.SYSTEM_ERROR;
} }
itemRef.RefreshPositioning(itemPackageCode, (ushort) endOfListIndex); itemRef.RefreshPositioning(owner, itemPackageCode, (ushort)endOfListIndex);
isDirty[endOfListIndex] = true; isDirty[endOfListIndex] = true;
list[endOfListIndex++] = itemRef; list[endOfListIndex++] = itemRef;
@ -136,8 +152,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
return INV_ERROR.SUCCESS; return INV_ERROR.SUCCESS;
} }
}
public INV_ERROR AddItem(uint itemId, int quantity, byte quality) public INV_ERROR AddItem(uint itemId, int quantity, byte quality)
{
lock (inventoryLock)
{ {
if (!IsSpaceForAdd(itemId, quantity, quality)) if (!IsSpaceForAdd(itemId, quantity, quality))
return INV_ERROR.INVENTORY_FULL; return INV_ERROR.INVENTORY_FULL;
@ -187,7 +206,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.RefreshPositioning(itemPackageCode, (ushort)endOfListIndex); addedItem.RefreshPositioning(owner, itemPackageCode, (ushort)endOfListIndex);
isDirty[endOfListIndex] = true; isDirty[endOfListIndex] = true;
list[endOfListIndex++] = addedItem; list[endOfListIndex++] = addedItem;
quantityCount -= gItem.maxStack; quantityCount -= gItem.maxStack;
@ -199,12 +218,16 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
return INV_ERROR.SUCCESS; return INV_ERROR.SUCCESS;
} }
}
public void SetItem(ushort slot, InventoryItem item) public void SetItem(ushort slot, InventoryItem item)
{
lock (inventoryLock)
{ {
list[slot] = item; list[slot] = item;
SendUpdatePackets(); SendUpdatePackets();
item.RefreshPositioning(itemPackageCode, slot); item.RefreshPositioning(owner, itemPackageCode, slot);
}
} }
public void RemoveItem(uint itemId) public void RemoveItem(uint itemId)
@ -218,6 +241,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
} }
public void RemoveItem(uint itemId, int quantity, int quality) public void RemoveItem(uint itemId, int quantity, int quality)
{
lock (inventoryLock)
{ {
if (!HasItem(itemId, quantity, quality)) if (!HasItem(itemId, quantity, quality))
return; return;
@ -265,6 +290,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
DoRealign(); DoRealign();
SendUpdatePackets(); SendUpdatePackets();
} }
}
public void RemoveItem(InventoryItem item) public void RemoveItem(InventoryItem item)
{ {
@ -277,6 +303,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
} }
public void RemoveItemByUniqueId(ulong itemDBId, int quantity) public void RemoveItemByUniqueId(ulong itemDBId, int quantity)
{
lock (inventoryLock)
{ {
ushort slot = 0; ushort slot = 0;
InventoryItem toDelete = null; InventoryItem toDelete = null;
@ -300,7 +328,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].RefreshPositioning(null, 0xFFFF, 0xFFFF);
list[slot] = null; list[slot] = null;
} }
else else
@ -314,23 +342,29 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
DoRealign(); DoRealign();
SendUpdatePackets(); SendUpdatePackets();
} }
}
public void RemoveItemAtSlot(ushort slot) public void RemoveItemAtSlot(ushort slot)
{
lock (inventoryLock)
{ {
if (slot >= endOfListIndex) if (slot >= endOfListIndex)
return; return;
DoDatabaseRemove(list[slot].uniqueId); DoDatabaseRemove(list[slot].uniqueId);
list[slot].RefreshPositioning(0xFFFF, 0xFFFF); list[slot].RefreshPositioning(null, 0xFFFF, 0xFFFF);
list[slot] = null; list[slot] = null;
isDirty[slot] = true; isDirty[slot] = true;
DoRealign(); DoRealign();
SendUpdatePackets(); SendUpdatePackets();
} }
}
public void RemoveItemAtSlot(ushort slot, int quantity) public void RemoveItemAtSlot(ushort slot, int quantity)
{
lock (inventoryLock)
{ {
if (slot >= endOfListIndex) if (slot >= endOfListIndex)
return; return;
@ -343,7 +377,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
{ {
DoDatabaseRemove(list[slot].uniqueId); DoDatabaseRemove(list[slot].uniqueId);
list[slot].RefreshPositioning(0xFFFF, 0xFFFF); list[slot].RefreshPositioning(null, 0xFFFF, 0xFFFF);
list[slot] = null; list[slot] = null;
DoRealign(); DoRealign();
} }
@ -354,12 +388,15 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
SendUpdatePackets(); SendUpdatePackets();
} }
} }
}
public void Clear() public void Clear()
{
lock (inventoryLock)
{ {
for (int i = 0; i < endOfListIndex; i++) for (int i = 0; i < endOfListIndex; i++)
{ {
list[i].RefreshPositioning(0xFFFF, 0xFFFF); list[i].RefreshPositioning(null, 0xFFFF, 0xFFFF);
list[i] = null; list[i] = null;
isDirty[i] = true; isDirty[i] = true;
} }
@ -367,6 +404,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
SendUpdatePackets(); SendUpdatePackets();
} }
}
public InventoryItem[] GetRawList() public InventoryItem[] GetRawList()
{ {
@ -391,18 +429,26 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
#region Packet Functions #region Packet Functions
public void SendFullInventory(Player player) public void SendFullInventory(Player player)
{
lock (inventoryLock)
{ {
player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode)); 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));
} }
}
private void SendInventoryPackets(Player player, InventoryItem item) private void SendInventoryPackets(Player player, InventoryItem item)
{
lock (inventoryLock)
{ {
player.QueuePacket(InventoryListX01Packet.BuildPacket(owner.actorId, item)); player.QueuePacket(InventoryListX01Packet.BuildPacket(owner.actorId, item));
} }
}
private void SendInventoryPackets(Player player, List<InventoryItem> items) private void SendInventoryPackets(Player player, List<InventoryItem> items)
{
lock (inventoryLock)
{ {
int currentIndex = 0; int currentIndex = 0;
@ -424,10 +470,12 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
else else
break; break;
} }
}
} }
private void SendInventoryPackets(Player player, int startOffset) private void SendInventoryPackets(Player player, int startOffset)
{
lock (inventoryLock)
{ {
int currentIndex = startOffset; int currentIndex = startOffset;
@ -453,15 +501,20 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
else else
break; break;
} }
}
} }
private void SendInventoryRemovePackets(Player player, ushort index) private void SendInventoryRemovePackets(Player player, ushort index)
{
lock (inventoryLock)
{ {
player.QueuePacket(InventoryRemoveX01Packet.BuildPacket(owner.actorId, index)); player.QueuePacket(InventoryRemoveX01Packet.BuildPacket(owner.actorId, index));
} }
}
private void SendInventoryRemovePackets(Player player, List<ushort> indexes) private void SendInventoryRemovePackets(Player player, List<ushort> indexes)
{
lock (inventoryLock)
{ {
int currentIndex = 0; int currentIndex = 0;
@ -483,29 +536,38 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
else else
break; break;
} }
}
} }
public void RefreshItem(Player player, InventoryItem item) public void RefreshItem(Player player, InventoryItem item)
{
lock (inventoryLock)
{ {
player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode)); 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)
{
lock (inventoryLock)
{ {
player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode)); 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)
{
lock (inventoryLock)
{ {
player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode)); 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));
} }
}
#endregion #endregion
@ -534,10 +596,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
if (itemPackageCode == BAZAAR) if (itemPackageCode == BAZAAR)
return; return;
if (owner is Player) Database.SetQuantity(itemDBId, quantity);
Database.SetQuantity((Player)owner, itemDBId, itemPackageCode);
else if (owner is Retainer)
Database.SetQuantity((Retainer)owner, itemDBId, itemPackageCode);
} }
private void DoDatabaseRemove(ulong itemDBId) private void DoDatabaseRemove(ulong itemDBId)
@ -563,6 +622,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
} }
public void SendUpdatePackets(Player player) public void SendUpdatePackets(Player player)
{
lock (inventoryLock)
{ {
List<InventoryItem> items = new List<InventoryItem>(); List<InventoryItem> items = new List<InventoryItem>();
List<ushort> slotsToRemove = new List<ushort>(); List<ushort> slotsToRemove = new List<ushort>();
@ -593,6 +654,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId));
player.QueuePacket(InventoryEndChangePacket.BuildPacket(owner.actorId)); player.QueuePacket(InventoryEndChangePacket.BuildPacket(owner.actorId));
} }
}
public void StartSendUpdate() public void StartSendUpdate()
{ {
@ -616,6 +678,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
} }
public bool IsSpaceForAdd(uint itemId, int quantity, int quality) public bool IsSpaceForAdd(uint itemId, int quantity, int quality)
{
lock (inventoryLock)
{ {
int quantityCount = quantity; int quantityCount = quantity;
for (int i = 0; i < endOfListIndex; i++) for (int i = 0; i < endOfListIndex; i++)
@ -632,6 +696,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
return quantityCount <= 0 || (quantityCount > 0 && !IsFull()); return quantityCount <= 0 || (quantityCount > 0 && !IsFull());
} }
}
public bool HasItem(uint itemId) public bool HasItem(uint itemId)
{ {
@ -644,6 +709,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
} }
public bool HasItem(uint itemId, int minQuantity, int quality) public bool HasItem(uint itemId, int minQuantity, int quality)
{
lock (inventoryLock)
{ {
int count = 0; int count = 0;
@ -662,6 +729,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
return false; return false;
} }
}
public int GetNextEmptySlot() public int GetNextEmptySlot()
{ {

View file

@ -1691,6 +1691,8 @@ namespace FFXIVClassic_Map_Server.Actors
if (actor == null) if (actor == null)
return; return;
runningEvents.Pop();
List<LuaParam> lParams = LuaUtils.CreateLuaParamList(parameters); List<LuaParam> lParams = LuaUtils.CreateLuaParamList(parameters);
SubPacket spacket = KickEventPacket.BuildPacket(actorId, actor.actorId, 0x75dc1, conditionName, lParams); SubPacket spacket = KickEventPacket.BuildPacket(actorId, actor.actorId, 0x75dc1, conditionName, lParams);
spacket.DebugPrintSubPacket(); spacket.DebugPrintSubPacket();
@ -1702,6 +1704,8 @@ namespace FFXIVClassic_Map_Server.Actors
if (actor == null) if (actor == null)
return; return;
runningEvents.Pop();
List<LuaParam> lParams = LuaUtils.CreateLuaParamList(parameters); List<LuaParam> lParams = LuaUtils.CreateLuaParamList(parameters);
SubPacket spacket = KickEventPacket.BuildPacket(actorId, actor.actorId, unknown, conditionName, lParams); SubPacket spacket = KickEventPacket.BuildPacket(actorId, actor.actorId, unknown, conditionName, lParams);
spacket.DebugPrintSubPacket(); spacket.DebugPrintSubPacket();