mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-04-25 14:17:46 +00:00
If kickEvent is fired, the current event is popped. Commited Inventory changes.
This commit is contained in:
parent
1e9d61c838
commit
7e2246e8d8
2 changed files with 517 additions and 445 deletions
|
@ -57,7 +57,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
int i = 0;
|
||||
foreach (InventoryItem item in itemsFromDB)
|
||||
{
|
||||
item.RefreshPositioning(itemPackageCode, (ushort) i);
|
||||
item.RefreshPositioning(owner, itemPackageCode, (ushort) i);
|
||||
list[i++] = item;
|
||||
}
|
||||
endOfListIndex = i;
|
||||
|
@ -99,6 +99,20 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
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)
|
||||
{
|
||||
return AddItem(itemId, 1, 1);
|
||||
|
@ -110,6 +124,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
}
|
||||
|
||||
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 (itemPackageCode != BAZAAR && itemRef.GetItemData().maxStack > 1)
|
||||
|
@ -126,7 +142,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
return INV_ERROR.SYSTEM_ERROR;
|
||||
}
|
||||
|
||||
itemRef.RefreshPositioning(itemPackageCode, (ushort) endOfListIndex);
|
||||
itemRef.RefreshPositioning(owner, itemPackageCode, (ushort)endOfListIndex);
|
||||
|
||||
isDirty[endOfListIndex] = true;
|
||||
list[endOfListIndex++] = itemRef;
|
||||
|
@ -136,8 +152,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
|
||||
return INV_ERROR.SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
public INV_ERROR AddItem(uint itemId, int quantity, byte quality)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
if (!IsSpaceForAdd(itemId, quantity, quality))
|
||||
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);
|
||||
addedItem.RefreshPositioning(itemPackageCode, (ushort)endOfListIndex);
|
||||
addedItem.RefreshPositioning(owner, itemPackageCode, (ushort)endOfListIndex);
|
||||
isDirty[endOfListIndex] = true;
|
||||
list[endOfListIndex++] = addedItem;
|
||||
quantityCount -= gItem.maxStack;
|
||||
|
@ -199,12 +218,16 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
|
||||
return INV_ERROR.SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
public void SetItem(ushort slot, InventoryItem item)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
list[slot] = item;
|
||||
SendUpdatePackets();
|
||||
item.RefreshPositioning(itemPackageCode, slot);
|
||||
item.RefreshPositioning(owner, itemPackageCode, slot);
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
if (!HasItem(itemId, quantity, quality))
|
||||
return;
|
||||
|
@ -265,6 +290,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
DoRealign();
|
||||
SendUpdatePackets();
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveItem(InventoryItem item)
|
||||
{
|
||||
|
@ -277,6 +303,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
}
|
||||
|
||||
public void RemoveItemByUniqueId(ulong itemDBId, int quantity)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
ushort slot = 0;
|
||||
InventoryItem toDelete = null;
|
||||
|
@ -300,7 +328,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
if (quantity >= toDelete.quantity)
|
||||
{
|
||||
DoDatabaseRemove(toDelete.uniqueId);
|
||||
list[slot].RefreshPositioning(0xFFFF, 0xFFFF);
|
||||
list[slot].RefreshPositioning(null, 0xFFFF, 0xFFFF);
|
||||
list[slot] = null;
|
||||
}
|
||||
else
|
||||
|
@ -314,23 +342,29 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
DoRealign();
|
||||
SendUpdatePackets();
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveItemAtSlot(ushort slot)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
if (slot >= endOfListIndex)
|
||||
return;
|
||||
|
||||
DoDatabaseRemove(list[slot].uniqueId);
|
||||
|
||||
list[slot].RefreshPositioning(0xFFFF, 0xFFFF);
|
||||
list[slot].RefreshPositioning(null, 0xFFFF, 0xFFFF);
|
||||
list[slot] = null;
|
||||
isDirty[slot] = true;
|
||||
|
||||
DoRealign();
|
||||
SendUpdatePackets();
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveItemAtSlot(ushort slot, int quantity)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
if (slot >= endOfListIndex)
|
||||
return;
|
||||
|
@ -343,7 +377,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
{
|
||||
DoDatabaseRemove(list[slot].uniqueId);
|
||||
|
||||
list[slot].RefreshPositioning(0xFFFF, 0xFFFF);
|
||||
list[slot].RefreshPositioning(null, 0xFFFF, 0xFFFF);
|
||||
list[slot] = null;
|
||||
DoRealign();
|
||||
}
|
||||
|
@ -354,12 +388,15 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
SendUpdatePackets();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
for (int i = 0; i < endOfListIndex; i++)
|
||||
{
|
||||
list[i].RefreshPositioning(0xFFFF, 0xFFFF);
|
||||
list[i].RefreshPositioning(null, 0xFFFF, 0xFFFF);
|
||||
list[i] = null;
|
||||
isDirty[i] = true;
|
||||
}
|
||||
|
@ -367,6 +404,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
|
||||
SendUpdatePackets();
|
||||
}
|
||||
}
|
||||
|
||||
public InventoryItem[] GetRawList()
|
||||
{
|
||||
|
@ -391,18 +429,26 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
|
||||
#region Packet Functions
|
||||
public void SendFullInventory(Player player)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode));
|
||||
SendInventoryPackets(player, 0);
|
||||
player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId));
|
||||
}
|
||||
}
|
||||
|
||||
private void SendInventoryPackets(Player player, InventoryItem item)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
player.QueuePacket(InventoryListX01Packet.BuildPacket(owner.actorId, item));
|
||||
}
|
||||
}
|
||||
|
||||
private void SendInventoryPackets(Player player, List<InventoryItem> items)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
int currentIndex = 0;
|
||||
|
||||
|
@ -424,10 +470,12 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
else
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void SendInventoryPackets(Player player, int startOffset)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
int currentIndex = startOffset;
|
||||
|
||||
|
@ -453,15 +501,20 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
else
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void SendInventoryRemovePackets(Player player, ushort index)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
player.QueuePacket(InventoryRemoveX01Packet.BuildPacket(owner.actorId, index));
|
||||
}
|
||||
}
|
||||
|
||||
private void SendInventoryRemovePackets(Player player, List<ushort> indexes)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
int currentIndex = 0;
|
||||
|
||||
|
@ -483,29 +536,38 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
else
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public void RefreshItem(Player player, InventoryItem item)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
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)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode));
|
||||
SendInventoryPackets(player, items.ToList());
|
||||
player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId));
|
||||
}
|
||||
}
|
||||
|
||||
public void RefreshItem(Player player, List<InventoryItem> items)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode));
|
||||
SendInventoryPackets(player, items);
|
||||
player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId));
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -534,10 +596,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
if (itemPackageCode == BAZAAR)
|
||||
return;
|
||||
|
||||
if (owner is Player)
|
||||
Database.SetQuantity((Player)owner, itemDBId, itemPackageCode);
|
||||
else if (owner is Retainer)
|
||||
Database.SetQuantity((Retainer)owner, itemDBId, itemPackageCode);
|
||||
Database.SetQuantity(itemDBId, quantity);
|
||||
}
|
||||
|
||||
private void DoDatabaseRemove(ulong itemDBId)
|
||||
|
@ -563,6 +622,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
}
|
||||
|
||||
public void SendUpdatePackets(Player player)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
List<InventoryItem> items = new List<InventoryItem>();
|
||||
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(InventoryEndChangePacket.BuildPacket(owner.actorId));
|
||||
}
|
||||
}
|
||||
|
||||
public void StartSendUpdate()
|
||||
{
|
||||
|
@ -616,6 +678,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
}
|
||||
|
||||
public bool IsSpaceForAdd(uint itemId, int quantity, int quality)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
int quantityCount = quantity;
|
||||
for (int i = 0; i < endOfListIndex; i++)
|
||||
|
@ -632,6 +696,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
|
||||
return quantityCount <= 0 || (quantityCount > 0 && !IsFull());
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
lock (inventoryLock)
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
|
@ -662,6 +729,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int GetNextEmptySlot()
|
||||
{
|
||||
|
|
|
@ -1691,6 +1691,8 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
if (actor == null)
|
||||
return;
|
||||
|
||||
runningEvents.Pop();
|
||||
|
||||
List<LuaParam> lParams = LuaUtils.CreateLuaParamList(parameters);
|
||||
SubPacket spacket = KickEventPacket.BuildPacket(actorId, actor.actorId, 0x75dc1, conditionName, lParams);
|
||||
spacket.DebugPrintSubPacket();
|
||||
|
@ -1702,6 +1704,8 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
if (actor == null)
|
||||
return;
|
||||
|
||||
runningEvents.Pop();
|
||||
|
||||
List<LuaParam> lParams = LuaUtils.CreateLuaParamList(parameters);
|
||||
SubPacket spacket = KickEventPacket.BuildPacket(actorId, actor.actorId, unknown, conditionName, lParams);
|
||||
spacket.DebugPrintSubPacket();
|
||||
|
|
Loading…
Add table
Reference in a new issue