mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-08-03 00:01:57 +02:00
Merge branch 'inventory_refactor' into develop
# Conflicts: # FFXIVClassic Map Server/Database.cs # FFXIVClassic Map Server/FFXIVClassic Map Server.csproj # FFXIVClassic Map Server/WorldManager.cs # FFXIVClassic Map Server/actors/area/Area.cs # FFXIVClassic Map Server/actors/area/Zone.cs # FFXIVClassic Map Server/actors/chara/Character.cs # FFXIVClassic Map Server/actors/chara/npc/Npc.cs # FFXIVClassic Map Server/actors/chara/player/Inventory.cs # FFXIVClassic Map Server/actors/chara/player/Player.cs # FFXIVClassic Map Server/dataobjects/ZoneConnection.cs # FFXIVClassic Map Server/lua/LuaEngine.cs # FFXIVClassic Map Server/packets/send/Actor/AddActorPacket.cs # FFXIVClassic Map Server/packets/send/Actor/DeleteAllActorsPacket.cs # FFXIVClassic Map Server/packets/send/Actor/SetActorPropetyPacket.cs # FFXIVClassic Map Server/packets/send/Actor/SetActorStatePacket.cs # FFXIVClassic Map Server/packets/send/Actor/SetActorStatusAllPacket.cs # FFXIVClassic Map Server/packets/send/Actor/SetActorStatusPacket.cs # FFXIVClassic Map Server/packets/send/Actor/_0x132Packet.cs # FFXIVClassic Map Server/packets/send/Actor/battle/BattleAction.cs # FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX10Packet.cs # FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX18Packet.cs # FFXIVClassic Map Server/packets/send/Actor/battle/CommandResultX00Packet.cs # FFXIVClassic Map Server/packets/send/Actor/events/SetEmoteEventCondition.cs # FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX08Packet.cs # data/scripts/commands/gm/giveitem.lua
This commit is contained in:
commit
bcb609e4f6
202 changed files with 2713 additions and 1040 deletions
|
@ -1,5 +1,4 @@
|
|||
using FFXIVClassic_Map_Server;
|
||||
using FFXIVClassic.Common;
|
||||
using FFXIVClassic.Common;
|
||||
using FFXIVClassic_Map_Server.actors.area;
|
||||
using FFXIVClassic_Map_Server.actors.chara.npc;
|
||||
using FFXIVClassic_Map_Server.lua;
|
||||
|
|
|
@ -3,11 +3,7 @@ using FFXIVClassic.Common;
|
|||
using FFXIVClassic_Map_Server.Actors;
|
||||
using FFXIVClassic_Map_Server.lua;
|
||||
using FFXIVClassic_Map_Server.packets.send.actor;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.area
|
||||
{
|
||||
|
|
|
@ -1,16 +1,11 @@
|
|||
using FFXIVClassic_Map_Server.actors.director;
|
||||
using FFXIVClassic_Map_Server.actors.group;
|
||||
using FFXIVClassic_Map_Server.Actors;
|
||||
using FFXIVClassic_Map_Server.lua;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.area
|
||||
{
|
||||
|
||||
|
||||
class PrivateAreaContent : PrivateArea
|
||||
{
|
||||
private Director currentDirector;
|
||||
|
|
|
@ -1,10 +1,4 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.area
|
||||
namespace FFXIVClassic_Map_Server.actors.area
|
||||
{
|
||||
class SpawnLocation
|
||||
{
|
||||
|
|
|
@ -1,7 +1,4 @@
|
|||
using FFXIVClassic_Map_Server;
|
||||
using FFXIVClassic.Common;
|
||||
|
||||
using FFXIVClassic_Map_Server.actors.chara.npc;
|
||||
using FFXIVClassic.Common;
|
||||
using FFXIVClassic_Map_Server.Actors;
|
||||
using FFXIVClassic_Map_Server.lua;
|
||||
using FFXIVClassic_Map_Server.packets.send.actor;
|
||||
|
@ -11,7 +8,6 @@ using System.Linq;
|
|||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.IO;
|
||||
|
||||
using FFXIVClassic_Map_Server.actors.director;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.area
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
|
||||
using FFXIVClassic.Common;
|
||||
using FFXIVClassic_Map_Server.actors.area;
|
||||
using FFXIVClassic_Map_Server.actors.chara.player;
|
||||
using FFXIVClassic_Map_Server.actors.group;
|
||||
using FFXIVClassic_Map_Server.Actors.Chara;
|
||||
using FFXIVClassic_Map_Server.dataobjects;
|
||||
using FFXIVClassic_Map_Server.packets.send.actor;
|
||||
using FFXIVClassic_Map_Server.packets.send.actor.inventory;
|
||||
using FFXIVClassic_Map_Server.utils;
|
||||
using FFXIVClassic_Map_Server.actors.chara.ai;
|
||||
using System;
|
||||
|
@ -107,7 +110,7 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
|
||||
public Group currentParty = null;
|
||||
public ContentGroup currentContentGroup = null;
|
||||
|
||||
|
||||
//public DateTime lastAiUpdate;
|
||||
|
||||
public AIContainer aiContainer;
|
||||
|
@ -131,8 +134,13 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
public float extraFloat;
|
||||
|
||||
protected Dictionary<string, UInt64> tempVars = new Dictionary<string, UInt64>();
|
||||
|
||||
//Inventory
|
||||
protected Dictionary<ushort, ItemPackage> itemPackages = new Dictionary<ushort, ItemPackage>();
|
||||
protected Equipment equipment;
|
||||
|
||||
public Character(uint actorID) : base(actorID)
|
||||
public Character(uint actorID)
|
||||
: base(actorID)
|
||||
{
|
||||
//Init timer array to "notimer"
|
||||
for (int i = 0; i < charaWork.statusShownTime.Length; i++)
|
||||
|
@ -207,7 +215,7 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
}
|
||||
return propPacketUtil.Done();
|
||||
}
|
||||
|
||||
|
||||
public void PlayAnimation(uint animId, bool onlySelf = false)
|
||||
{
|
||||
if (onlySelf)
|
||||
|
@ -218,7 +226,7 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
else
|
||||
zone.BroadcastPacketAroundActor(this, PlayAnimationOnActorPacket.BuildPacket(actorId, animId));
|
||||
}
|
||||
|
||||
|
||||
public void DoBattleAction(ushort commandId, uint animationId)
|
||||
{
|
||||
zone.BroadcastPacketAroundActor(this, CommandResultX00Packet.BuildPacket(actorId, animationId, commandId));
|
||||
|
@ -493,7 +501,7 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public virtual void Cast(uint spellId, uint targetId = 0)
|
||||
{
|
||||
if (aiContainer.CanChangeState())
|
||||
|
@ -1133,5 +1141,180 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
targetFind.FindWithinArea(this, ValidTarget.PartyMember, TargetFindAOETarget.Self);
|
||||
return targetFind.GetTargets();
|
||||
}
|
||||
|
||||
#region Inventory
|
||||
public void SendItemPackage(Player player, uint id)
|
||||
{
|
||||
if (!itemPackages.ContainsKey((ushort)id))
|
||||
return;
|
||||
|
||||
player.QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId, true));
|
||||
itemPackages[(ushort)id].SendFullInventory(player);
|
||||
player.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId));
|
||||
}
|
||||
|
||||
public void AddItem(uint catalogID)
|
||||
{
|
||||
AddItem(catalogID, 1);
|
||||
}
|
||||
|
||||
public void AddItem(uint catalogID, int quantity)
|
||||
{
|
||||
AddItem(catalogID, quantity, 1);
|
||||
}
|
||||
|
||||
public void AddItem(uint catalogID, int quantity, byte quality)
|
||||
{
|
||||
ushort itemPackage = GetPackageForItem(catalogID);
|
||||
if (itemPackages.ContainsKey(itemPackage))
|
||||
{
|
||||
itemPackages[itemPackage].AddItem(catalogID, quantity, quality);
|
||||
}
|
||||
}
|
||||
|
||||
public void AddItem(InventoryItem item)
|
||||
{
|
||||
ushort itemPackage = GetPackageForItem(item.GetItemData().catalogID);
|
||||
if (itemPackages.ContainsKey(itemPackage))
|
||||
{
|
||||
itemPackages[itemPackage].AddItem(item);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetItem(InventoryItem item, ushort itemPackage, ushort slot)
|
||||
{
|
||||
if (itemPackages.ContainsKey(itemPackage))
|
||||
{
|
||||
itemPackages[itemPackage].SetItem(slot, item);
|
||||
}
|
||||
}
|
||||
|
||||
public void MoveItem(InventoryItem item, ushort destinationPackage)
|
||||
{
|
||||
ushort sourcePackage = item.itemPackage;
|
||||
|
||||
if (!itemPackages.ContainsKey(sourcePackage) && !itemPackages.ContainsKey(destinationPackage))
|
||||
return;
|
||||
|
||||
itemPackages[sourcePackage].RemoveItem(item);
|
||||
itemPackages[destinationPackage].AddItem(item);
|
||||
}
|
||||
|
||||
public void RemoveItem(uint catalogID)
|
||||
{
|
||||
RemoveItem(catalogID, 1);
|
||||
}
|
||||
|
||||
public void RemoveItem(uint catalogID, int quantity)
|
||||
{
|
||||
RemoveItem(catalogID, quantity, 1);
|
||||
}
|
||||
|
||||
public void RemoveItem(uint catalogID, int quantity, byte quality)
|
||||
{
|
||||
ushort itemPackage = GetPackageForItem(catalogID);
|
||||
if (itemPackages.ContainsKey(itemPackage))
|
||||
{
|
||||
itemPackages[itemPackage].RemoveItem(catalogID, quantity, quality);
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveItemAtSlot(ushort itemPackage, ushort slot)
|
||||
{
|
||||
if (itemPackages.ContainsKey(itemPackage))
|
||||
{
|
||||
itemPackages[itemPackage].RemoveItemAtSlot(slot);
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveItem(InventoryItem item)
|
||||
{
|
||||
RemoveItem(item, 1);
|
||||
}
|
||||
|
||||
public void RemoveItem(InventoryItem item, int quantity)
|
||||
{
|
||||
if (itemPackages.ContainsKey(item.itemPackage))
|
||||
{
|
||||
itemPackages[item.itemPackage].RemoveItem(item, quantity);
|
||||
}
|
||||
}
|
||||
|
||||
public bool HasItem(uint catalogID)
|
||||
{
|
||||
return HasItem(catalogID, 1);
|
||||
}
|
||||
|
||||
public bool HasItem(uint catalogID, int minQuantity)
|
||||
{
|
||||
return HasItem(catalogID, minQuantity, 1);
|
||||
}
|
||||
|
||||
public bool HasItem(uint catalogID, int minQuantity, byte quality)
|
||||
{
|
||||
ushort itemPackage = GetPackageForItem(catalogID);
|
||||
if (itemPackages.ContainsKey(itemPackage))
|
||||
{
|
||||
return itemPackages[itemPackage].HasItem(catalogID, minQuantity, quality);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool HasItem(InventoryItem item)
|
||||
{
|
||||
ushort itemPackage = GetPackageForItem(item.GetItemData().catalogID);
|
||||
if (itemPackages.ContainsKey(itemPackage))
|
||||
{
|
||||
//return itemPackages[itemPackage].HasItem(item);
|
||||
return false; //TODO FIX
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public InventoryItem GetItem(LuaUtils.ItemRefParam reference)
|
||||
{
|
||||
if (reference.actorId != actorId)
|
||||
return null;
|
||||
if (itemPackages.ContainsKey(reference.itemPackage))
|
||||
{
|
||||
return itemPackages[reference.itemPackage].GetItemAtSlot(reference.slot);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public ItemPackage GetItemPackage(ushort package)
|
||||
{
|
||||
if (itemPackages.ContainsKey(package))
|
||||
return itemPackages[package];
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
public ushort GetPackageForItem(uint catalogID)
|
||||
{
|
||||
ItemData data = Server.GetItemGamedata(catalogID);
|
||||
|
||||
if (data == null)
|
||||
return ItemPackage.NORMAL;
|
||||
else
|
||||
{
|
||||
if (data.IsMoney())
|
||||
return ItemPackage.CURRENCY_CRYSTALS;
|
||||
else if (data.IsImportant())
|
||||
return ItemPackage.KEYITEMS;
|
||||
else
|
||||
return ItemPackage.NORMAL;
|
||||
}
|
||||
}
|
||||
|
||||
//public void removeItem(byUniqueId)
|
||||
//public void removeItem(byUniqueId, quantity)
|
||||
//public void removeItem(slot)
|
||||
//public void removeItem(slot, quantity)
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
|
@ -1,10 +1,4 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.chara.npc
|
||||
namespace FFXIVClassic_Map_Server.actors.chara.npc
|
||||
{
|
||||
class ActorClass
|
||||
{
|
||||
|
|
|
@ -1,14 +1,10 @@
|
|||
using FFXIVClassic.Common;
|
||||
using FFXIVClassic_Map_Server.actors;
|
||||
using FFXIVClassic_Map_Server.actors.area;
|
||||
using FFXIVClassic_Map_Server.actors.chara.npc;
|
||||
using FFXIVClassic_Map_Server.Actors.Chara;
|
||||
using FFXIVClassic_Map_Server.dataobjects;
|
||||
using FFXIVClassic_Map_Server.lua;
|
||||
using FFXIVClassic_Map_Server.packets.receive.events;
|
||||
using FFXIVClassic_Map_Server.packets.send.actor;
|
||||
using FFXIVClassic_Map_Server.utils;
|
||||
using MoonSharp.Interpreter;
|
||||
using MySql.Data.MySqlClient;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
|
|
|
@ -1,12 +1,6 @@
|
|||
using FFXIVClassic.Common;
|
||||
using FFXIVClassic_Map_Server.actors.chara.player;
|
||||
using FFXIVClassic_Map_Server.actors.chara.player;
|
||||
using FFXIVClassic_Map_Server.Actors;
|
||||
using FFXIVClassic_Map_Server.packets.send.actor.inventory;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.chara.npc
|
||||
{
|
||||
|
@ -18,7 +12,6 @@ namespace FFXIVClassic_Map_Server.actors.chara.npc
|
|||
|
||||
private uint retainerId;
|
||||
private Player ownerPlayer;
|
||||
private Dictionary<ushort, Inventory> inventories = new Dictionary<ushort, Inventory>();
|
||||
|
||||
public Retainer(uint retainerId, ActorClass actorClass, Player player, float posX, float posY, float posZ, float rot)
|
||||
: base(0, actorClass, "myretainer", player.GetZone(), posX, posY, posZ, rot, 0, 0, null)
|
||||
|
@ -27,33 +20,16 @@ namespace FFXIVClassic_Map_Server.actors.chara.npc
|
|||
this.ownerPlayer = player;
|
||||
this.actorName = String.Format("_rtnre{0:x7}", actorId);
|
||||
|
||||
inventories[Inventory.NORMAL] = new Inventory(this, MAXSIZE_INVENTORY_NORMAL, Inventory.NORMAL);
|
||||
inventories[Inventory.CURRENCY_CRYSTALS] = new Inventory(this, MAXSIZE_INVENTORY_CURRANCY, Inventory.CURRENCY_CRYSTALS);
|
||||
inventories[Inventory.BAZAAR] = new Inventory(this, MAXSIZE_INVENTORY_BAZAAR, Inventory.BAZAAR);
|
||||
itemPackages[ItemPackage.NORMAL] = new ItemPackage(this, MAXSIZE_INVENTORY_NORMAL, ItemPackage.NORMAL);
|
||||
itemPackages[ItemPackage.CURRENCY_CRYSTALS] = new ItemPackage(this, MAXSIZE_INVENTORY_CURRANCY, ItemPackage.CURRENCY_CRYSTALS);
|
||||
itemPackages[ItemPackage.BAZAAR] = new ItemPackage(this, MAXSIZE_INVENTORY_BAZAAR, ItemPackage.BAZAAR);
|
||||
|
||||
inventories[Inventory.NORMAL].InitList(Database.GetInventory(this, Inventory.NORMAL));
|
||||
inventories[Inventory.CURRENCY_CRYSTALS].InitList(Database.GetInventory(this, Inventory.CURRENCY_CRYSTALS));
|
||||
inventories[Inventory.BAZAAR].InitList(Database.GetInventory(this, Inventory.BAZAAR));
|
||||
itemPackages[ItemPackage.NORMAL].InitList(Database.GetInventory(this, ItemPackage.NORMAL));
|
||||
itemPackages[ItemPackage.CURRENCY_CRYSTALS].InitList(Database.GetInventory(this, ItemPackage.CURRENCY_CRYSTALS));
|
||||
itemPackages[ItemPackage.BAZAAR].InitList(Database.GetInventory(this, ItemPackage.BAZAAR));
|
||||
}
|
||||
|
||||
public Inventory GetInventory(ushort type)
|
||||
{
|
||||
if (inventories.ContainsKey(type))
|
||||
return inventories[type];
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
public void SendFullRetainerInventory(Player player)
|
||||
{
|
||||
player.QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId));
|
||||
inventories[Inventory.NORMAL].SendFullInventory(player);
|
||||
inventories[Inventory.CURRENCY_CRYSTALS].SendFullInventory(player);
|
||||
inventories[Inventory.BAZAAR].SendFullInventory(player);
|
||||
player.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId));
|
||||
}
|
||||
|
||||
public uint getRetainerId()
|
||||
public uint GetRetainerId()
|
||||
{
|
||||
return retainerId;
|
||||
}
|
||||
|
|
|
@ -30,11 +30,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
private ushort inventoryCapacity;
|
||||
private ushort inventoryCode;
|
||||
private InventoryItem[] list;
|
||||
private Inventory normalInventory;
|
||||
private ItemPackage normalInventory;
|
||||
|
||||
private bool writeToDB = true;
|
||||
|
||||
public Equipment(Player ownerPlayer, Inventory normalInventory, ushort capacity, ushort code)
|
||||
public Equipment(Player ownerPlayer, ItemPackage normalInventory, ushort capacity, ushort code)
|
||||
{
|
||||
owner = ownerPlayer;
|
||||
inventoryCapacity = capacity;
|
||||
|
@ -63,7 +63,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
}
|
||||
}
|
||||
|
||||
toPlayer.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, 0x23, Inventory.EQUIPMENT_OTHERPLAYER));
|
||||
toPlayer.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, 0x23, ItemPackage.EQUIPMENT_OTHERPLAYER));
|
||||
int currentIndex = 0;
|
||||
|
||||
while (true)
|
||||
|
|
|
@ -10,16 +10,17 @@ using System.Linq;
|
|||
|
||||
namespace FFXIVClassic_Map_Server.actors.chara.player
|
||||
{
|
||||
class Inventory
|
||||
class ItemPackage
|
||||
{
|
||||
public const ushort NORMAL = 0; //Max 0xC8
|
||||
public const ushort TRADE = 1; //Max 0x96
|
||||
public const ushort UNKNOWN = 1; //Max 0x96
|
||||
public const ushort LOOT = 4; //Max 0xA
|
||||
public const ushort MELDREQUEST = 5; //Max 0x04
|
||||
public const ushort BAZAAR = 7; //Max 0x0A
|
||||
public const ushort CURRENCY_CRYSTALS = 99; //Max 0x140
|
||||
public const ushort KEYITEMS = 100; //Max 0x500
|
||||
public const ushort EQUIPMENT = 0x00FE; //Max 0x23
|
||||
public const ushort TRADE = 0x00FD; //Max 0x04
|
||||
public const ushort EQUIPMENT_OTHERPLAYER = 0x00F9; //Max 0x23
|
||||
|
||||
public enum INV_ERROR {
|
||||
|
@ -30,19 +31,20 @@ 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;
|
||||
private bool holdingUpdates = false;
|
||||
|
||||
private int endOfListIndex = 0;
|
||||
|
||||
public Inventory(Character ownerPlayer, ushort capacity, ushort code, bool temporary = false)
|
||||
|
||||
public ItemPackage(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];
|
||||
|
@ -53,7 +55,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
{
|
||||
int i = 0;
|
||||
foreach (InventoryItem item in itemsFromDB)
|
||||
{
|
||||
item.RefreshPositioning(owner, itemPackageCode, (ushort) i);
|
||||
list[i++] = item;
|
||||
}
|
||||
endOfListIndex = i;
|
||||
}
|
||||
|
||||
|
@ -92,63 +97,80 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public int GetItemQuantity(uint itemId)
|
||||
|
||||
public InventoryItem GetItemAttachedTo(InventoryItem attachedTo)
|
||||
{
|
||||
return GetItemQuantity(itemId, 1);
|
||||
}
|
||||
|
||||
public int GetItemQuantity(uint itemId, uint quality)
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
for (int i = endOfListIndex - 1; i >= 0; i--)
|
||||
for (int i = 0; i < endOfListIndex; i++)
|
||||
{
|
||||
InventoryItem item = list[i];
|
||||
|
||||
if (item.itemId == itemId && item.quality == quality)
|
||||
count += item.quantity;
|
||||
Debug.Assert(item != null, "Item slot was null!!!");
|
||||
|
||||
if (attachedTo.GetAttached() == item.uniqueId)
|
||||
return item;
|
||||
}
|
||||
|
||||
return count;
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public int AddItem(uint itemId)
|
||||
public INV_ERROR AddItem(uint itemId)
|
||||
{
|
||||
return AddItem(itemId, 1, 1);
|
||||
}
|
||||
|
||||
public void AddItem(uint[] itemId)
|
||||
{
|
||||
for (int i = 0; i < itemId.Length; i++)
|
||||
AddItem(itemId[i]);
|
||||
}
|
||||
|
||||
public int AddItem(uint itemId, int quantity)
|
||||
public INV_ERROR AddItem(uint itemId, int quantity)
|
||||
{
|
||||
return AddItem(itemId, quantity, 1);
|
||||
}
|
||||
|
||||
public int AddItem(uint itemId, int quantity, byte quality)
|
||||
|
||||
public INV_ERROR AddItem(InventoryItem itemRef)
|
||||
{
|
||||
//If it isn't a single item (ie: armor) just add like normal (not valid for BAZAAR)
|
||||
if (itemPackageCode != BAZAAR && itemRef.GetItemData().maxStack > 1)
|
||||
return AddItem(itemRef.itemId, itemRef.quantity, itemRef.quality);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
itemRef.RefreshPositioning(owner, itemPackageCode, (ushort)endOfListIndex);
|
||||
|
||||
isDirty[endOfListIndex] = true;
|
||||
list[endOfListIndex++] = itemRef;
|
||||
DoDatabaseAdd(itemRef);
|
||||
|
||||
SendUpdatePackets();
|
||||
|
||||
return INV_ERROR.SUCCESS;
|
||||
}
|
||||
|
||||
public INV_ERROR AddItem(uint itemId, int quantity, byte quality)
|
||||
{
|
||||
if (!IsSpaceForAdd(itemId, quantity, quality))
|
||||
return (int)INV_ERROR.INVENTORY_FULL;
|
||||
return INV_ERROR.INVENTORY_FULL;
|
||||
|
||||
ItemData gItem = Server.GetItemGamedata(itemId);
|
||||
|
||||
//If it's unique, abort
|
||||
if (HasItem(itemId) && gItem.isExclusive)
|
||||
return INV_ERROR.ALREADY_HAS_UNIQUE;
|
||||
|
||||
if (gItem == null)
|
||||
{
|
||||
Program.Log.Error("Inventory.AddItem: unable to find item %u", itemId);
|
||||
return (int)INV_ERROR.SYSTEM_ERROR;
|
||||
return INV_ERROR.SYSTEM_ERROR;
|
||||
}
|
||||
|
||||
//Check if item id exists
|
||||
int quantityCount = quantity;
|
||||
for (int i = 0; i < endOfListIndex; i++)
|
||||
{
|
||||
{
|
||||
InventoryItem item = list[i];
|
||||
|
||||
Debug.Assert(item != null, "Item slot was null!!!");
|
||||
|
@ -161,23 +183,26 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
quantityCount -= (gItem.maxStack - oldQuantity);
|
||||
|
||||
DoDatabaseQuantity(item.uniqueId, item.quantity);
|
||||
|
||||
|
||||
if (quantityCount <= 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//If it's unique, abort
|
||||
if (HasItem(itemId) && gItem.isRare)
|
||||
return (int)INV_ERROR.ALREADY_HAS_UNIQUE;
|
||||
|
||||
//New item that spilled over
|
||||
while (quantityCount > 0)
|
||||
{
|
||||
InventoryItem addedItem = Database.CreateItem(itemId, Math.Min(quantityCount, gItem.maxStack), quality, gItem.isExclusive ? (byte)0x3 : (byte)0x0, gItem.durability);
|
||||
addedItem.slot = (ushort)endOfListIndex;
|
||||
InventoryItem.ItemModifier modifiers = null;
|
||||
if (gItem.durability != 0)
|
||||
{
|
||||
modifiers = new InventoryItem.ItemModifier();
|
||||
modifiers.durability = (uint)gItem.durability;
|
||||
}
|
||||
|
||||
InventoryItem addedItem = Database.CreateItem(itemId, Math.Min(quantityCount, gItem.maxStack), quality, modifiers);
|
||||
addedItem.RefreshPositioning(owner, itemPackageCode, (ushort)endOfListIndex);
|
||||
isDirty[endOfListIndex] = true;
|
||||
list[endOfListIndex++] = addedItem;
|
||||
list[endOfListIndex++] = addedItem;
|
||||
quantityCount -= gItem.maxStack;
|
||||
|
||||
DoDatabaseAdd(addedItem);
|
||||
|
@ -185,7 +210,14 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
|
||||
SendUpdatePackets();
|
||||
|
||||
return (int)INV_ERROR.SUCCESS;
|
||||
return INV_ERROR.SUCCESS;
|
||||
}
|
||||
|
||||
public void SetItem(ushort slot, InventoryItem item)
|
||||
{
|
||||
list[slot] = item;
|
||||
SendUpdatePackets();
|
||||
item.RefreshPositioning(owner, itemPackageCode, slot);
|
||||
}
|
||||
|
||||
public void RemoveItem(uint itemId)
|
||||
|
@ -223,15 +255,14 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
//Stack nomnomed
|
||||
if (item.quantity - quantityCount <= 0)
|
||||
{
|
||||
DoDatabaseRemove(list[i].uniqueId);
|
||||
DoDatabaseRemove(list[i].uniqueId);
|
||||
list[i] = null;
|
||||
}
|
||||
//Stack reduced
|
||||
else
|
||||
{
|
||||
item.quantity -= quantityCount;
|
||||
DoDatabaseQuantity(list[i].uniqueId, list[i].quantity);
|
||||
}
|
||||
DoDatabaseQuantity(list[i].uniqueId, list[i].quantity);}
|
||||
|
||||
isDirty[i] = true;
|
||||
|
||||
|
@ -244,14 +275,24 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
}
|
||||
|
||||
DoRealign();
|
||||
SendUpdatePackets();
|
||||
SendUpdatePackets();
|
||||
}
|
||||
|
||||
public void RemoveItemByUniqueId(ulong itemDBId)
|
||||
public void RemoveItem(InventoryItem item)
|
||||
{
|
||||
RemoveItemByUniqueId(item.uniqueId, item.quantity);
|
||||
}
|
||||
|
||||
public void RemoveItem(InventoryItem item, int quantity)
|
||||
{
|
||||
RemoveItemByUniqueId(item.uniqueId, quantity);
|
||||
}
|
||||
|
||||
public void RemoveItemByUniqueId(ulong itemDBId, int quantity)
|
||||
{
|
||||
ushort slot = 0;
|
||||
InventoryItem toDelete = null;
|
||||
for (int i = endOfListIndex - 1; i >= 0; i--)
|
||||
for (int i = 0; i < endOfListIndex; i++)
|
||||
{
|
||||
InventoryItem item = list[i];
|
||||
|
||||
|
@ -267,10 +308,19 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
|
||||
if (toDelete == null)
|
||||
return;
|
||||
|
||||
DoDatabaseRemove(toDelete.uniqueId);
|
||||
|
||||
list[slot] = null;
|
||||
if (quantity >= toDelete.quantity)
|
||||
{
|
||||
DoDatabaseRemove(toDelete.uniqueId);
|
||||
list[slot].RefreshPositioning(null, 0xFFFF, 0xFFFF);
|
||||
list[slot] = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
list[slot].quantity -= quantity;
|
||||
DoDatabaseQuantity(list[slot].uniqueId, list[slot].quantity);
|
||||
}
|
||||
|
||||
isDirty[slot] = true;
|
||||
|
||||
DoRealign();
|
||||
|
@ -284,9 +334,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
|
||||
DoDatabaseRemove(list[slot].uniqueId);
|
||||
|
||||
list[slot].RefreshPositioning(null, 0xFFFF, 0xFFFF);
|
||||
list[slot] = null;
|
||||
isDirty[slot] = true;
|
||||
|
||||
|
||||
DoRealign();
|
||||
SendUpdatePackets();
|
||||
}
|
||||
|
@ -304,15 +355,34 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
{
|
||||
DoDatabaseRemove(list[slot].uniqueId);
|
||||
|
||||
list[slot].RefreshPositioning(null, 0xFFFF, 0xFFFF);
|
||||
list[slot] = null;
|
||||
DoRealign();
|
||||
}
|
||||
else
|
||||
DoDatabaseQuantity(list[slot].uniqueId, list[slot].quantity);
|
||||
else
|
||||
DoDatabaseQuantity(list[slot].uniqueId, list[slot].quantity);
|
||||
|
||||
isDirty[slot] = true;
|
||||
SendUpdatePackets();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
for (int i = 0; i < endOfListIndex; i++)
|
||||
{
|
||||
list[i].RefreshPositioning(null, 0xFFFF, 0xFFFF);
|
||||
list[i] = null;
|
||||
isDirty[i] = true;
|
||||
}
|
||||
endOfListIndex = 0;
|
||||
|
||||
SendUpdatePackets();
|
||||
}
|
||||
|
||||
public InventoryItem[] GetRawList()
|
||||
{
|
||||
return list;
|
||||
}
|
||||
|
||||
public void ChangeDurability(uint slot, uint durabilityChange)
|
||||
|
@ -334,14 +404,14 @@ 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));
|
||||
player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId));
|
||||
}
|
||||
|
||||
private void SendInventoryPackets(Player player, InventoryItem item)
|
||||
{
|
||||
player.QueuePacket(InventoryListX01Packet.BuildPacket(owner.actorId, item));
|
||||
player.QueuePacket(InventoryListX01Packet.BuildPacket(owner.actorId, item));
|
||||
}
|
||||
|
||||
private void SendInventoryPackets(Player player, List<InventoryItem> items)
|
||||
|
@ -366,7 +436,6 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
else
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void SendInventoryPackets(Player player, int startOffset)
|
||||
|
@ -395,7 +464,6 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
else
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void SendInventoryRemovePackets(Player player, ushort index)
|
||||
|
@ -425,26 +493,25 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
else
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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));
|
||||
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));
|
||||
player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId));
|
||||
}
|
||||
|
||||
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);
|
||||
player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId));
|
||||
}
|
||||
|
@ -458,10 +525,13 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
if (isTemporary)
|
||||
return;
|
||||
|
||||
if (itemPackageCode == BAZAAR)
|
||||
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)
|
||||
|
@ -469,10 +539,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
if (isTemporary)
|
||||
return;
|
||||
|
||||
if (owner is Player)
|
||||
Database.SetQuantity((Player)owner, itemDBId, inventoryCode);
|
||||
else if (owner is Retainer)
|
||||
Database.SetQuantity((Retainer)owner, itemDBId, inventoryCode);
|
||||
|
||||
if (itemPackageCode == BAZAAR)
|
||||
return;
|
||||
|
||||
Database.SetQuantity(itemDBId, quantity);
|
||||
}
|
||||
|
||||
private void DoDatabaseRemove(ulong itemDBId)
|
||||
|
@ -480,6 +551,9 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
if (isTemporary)
|
||||
return;
|
||||
|
||||
if (itemPackageCode == BAZAAR)
|
||||
return;
|
||||
|
||||
if (owner is Player)
|
||||
Database.RemoveItem((Player)owner, itemDBId);
|
||||
else if (owner is Retainer)
|
||||
|
@ -488,13 +562,13 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
|
||||
private void SendUpdatePackets()
|
||||
{
|
||||
if (owner is Player)
|
||||
if (owner is Player && !holdingUpdates)
|
||||
{
|
||||
SendUpdatePackets((Player)owner, true);
|
||||
SendUpdatePackets((Player)owner);
|
||||
}
|
||||
}
|
||||
|
||||
public void SendUpdatePackets(Player player, bool doneImmediate = false)
|
||||
public void SendUpdatePackets(Player player)
|
||||
{
|
||||
List<InventoryItem> items = new List<InventoryItem>();
|
||||
List<ushort> slotsToRemove = new List<ushort>();
|
||||
|
@ -513,21 +587,28 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
slotsToRemove.Add((ushort)i);
|
||||
}
|
||||
|
||||
if (doneImmediate)
|
||||
DoneSendUpdate();
|
||||
if (!holdingUpdates)
|
||||
Array.Clear(isDirty, 0, isDirty.Length);
|
||||
|
||||
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
|
||||
SendInventoryRemovePackets(player, slotsToRemove);
|
||||
player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId));
|
||||
player.QueuePacket(InventoryEndChangePacket.BuildPacket(owner.actorId));
|
||||
player.QueuePacket(InventoryEndChangePacket.BuildPacket(owner.actorId));
|
||||
}
|
||||
|
||||
public void StartSendUpdate()
|
||||
{
|
||||
holdingUpdates = true;
|
||||
}
|
||||
|
||||
public void DoneSendUpdate()
|
||||
{
|
||||
holdingUpdates = false;
|
||||
SendUpdatePackets();
|
||||
Array.Clear(isDirty, 0, isDirty.Length);
|
||||
}
|
||||
|
||||
|
@ -537,7 +618,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)
|
||||
|
@ -554,7 +635,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return quantityCount <= 0 || (quantityCount > 0 && !IsFull());
|
||||
}
|
||||
|
||||
|
@ -584,7 +665,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
if (count >= minQuantity)
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -620,6 +701,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
|
|||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
public int GetCount()
|
||||
{
|
||||
return endOfListIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,6 +23,9 @@ using FFXIVClassic_Map_Server.packets.send.actor.inventory;
|
|||
using FFXIVClassic_Map_Server.packets.send.player;
|
||||
using FFXIVClassic_Map_Server.packets.send.actor.battle;
|
||||
using FFXIVClassic_Map_Server.packets.receive.events;
|
||||
using FFXIVClassic_Map_Server.actors.group;
|
||||
using FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group;
|
||||
using FFXIVClassic_Map_Server.actors.chara.npc;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.Actors
|
||||
{
|
||||
|
@ -71,7 +74,6 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
//Event Related
|
||||
public uint currentEventOwner = 0;
|
||||
public string currentEventName = "";
|
||||
|
||||
public Coroutine currentEventRunning;
|
||||
|
||||
//Player Info
|
||||
|
@ -84,9 +86,11 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
public bool isGM = false;
|
||||
public bool isZoneChanging = true;
|
||||
|
||||
//Inventory
|
||||
private Dictionary<ushort, Inventory> inventories = new Dictionary<ushort, Inventory>();
|
||||
private Equipment equipment;
|
||||
//Trading
|
||||
private Player otherTrader = null;
|
||||
private ItemPackage myOfferings;
|
||||
private bool isTradeAccepted = false;
|
||||
private bool isTradeLocked = false;
|
||||
|
||||
//GC Related
|
||||
public byte gcCurrent;
|
||||
|
@ -115,6 +119,10 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
public uint homepoint = 0;
|
||||
public byte homepointInn = 0;
|
||||
|
||||
//Nameplate Stuff
|
||||
public uint currentLSPlate = 0;
|
||||
public byte repairType = 0;
|
||||
|
||||
//Retainer
|
||||
RetainerMeetingRelationGroup retainerMeetingGroup = null;
|
||||
public Retainer currentSpawnedRetainer = null;
|
||||
|
@ -138,14 +146,14 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
moveSpeeds[2] = SetActorSpeedPacket.DEFAULT_RUN;
|
||||
moveSpeeds[3] = SetActorSpeedPacket.DEFAULT_ACTIVE;
|
||||
|
||||
inventories[Inventory.NORMAL] = new Inventory(this, MAXSIZE_INVENTORY_NORMAL, Inventory.NORMAL);
|
||||
inventories[Inventory.KEYITEMS] = new Inventory(this, MAXSIZE_INVENTORY_KEYITEMS, Inventory.KEYITEMS);
|
||||
inventories[Inventory.CURRENCY_CRYSTALS] = new Inventory(this, MAXSIZE_INVENTORY_CURRANCY, Inventory.CURRENCY_CRYSTALS);
|
||||
inventories[Inventory.MELDREQUEST] = new Inventory(this, MAXSIZE_INVENTORY_MELDREQUEST, Inventory.MELDREQUEST);
|
||||
inventories[Inventory.BAZAAR] = new Inventory(this, MAXSIZE_INVENTORY_BAZAAR, Inventory.BAZAAR);
|
||||
inventories[Inventory.LOOT] = new Inventory(this, MAXSIZE_INVENTORY_LOOT, Inventory.LOOT);
|
||||
itemPackages[ItemPackage.NORMAL] = new ItemPackage(this, MAXSIZE_INVENTORY_NORMAL, ItemPackage.NORMAL);
|
||||
itemPackages[ItemPackage.KEYITEMS] = new ItemPackage(this, MAXSIZE_INVENTORY_KEYITEMS, ItemPackage.KEYITEMS);
|
||||
itemPackages[ItemPackage.CURRENCY_CRYSTALS] = new ItemPackage(this, MAXSIZE_INVENTORY_CURRANCY, ItemPackage.CURRENCY_CRYSTALS);
|
||||
itemPackages[ItemPackage.MELDREQUEST] = new ItemPackage(this, MAXSIZE_INVENTORY_MELDREQUEST, ItemPackage.MELDREQUEST);
|
||||
itemPackages[ItemPackage.BAZAAR] = new ItemPackage(this, MAXSIZE_INVENTORY_BAZAAR, ItemPackage.BAZAAR);
|
||||
itemPackages[ItemPackage.LOOT] = new ItemPackage(this, MAXSIZE_INVENTORY_LOOT, ItemPackage.LOOT);
|
||||
|
||||
equipment = new Equipment(this, inventories[Inventory.NORMAL], MAXSIZE_INVENTORY_EQUIPMENT, Inventory.EQUIPMENT);
|
||||
equipment = new Equipment(this, itemPackages[ItemPackage.NORMAL], MAXSIZE_INVENTORY_EQUIPMENT, ItemPackage.EQUIPMENT);
|
||||
|
||||
//Set the Skill level caps of all FFXIV (classes)skills to 50
|
||||
for (int i = 0; i < charaWork.battleSave.skillLevelCap.Length; i++)
|
||||
|
@ -228,7 +236,7 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
|
||||
Database.LoadPlayerCharacter(this);
|
||||
lastPlayTimeUpdate = Utils.UnixTimeStampUTC();
|
||||
|
||||
|
||||
this.aiContainer = new AIContainer(this, new PlayerController(this), null, new TargetFind(this));
|
||||
allegiance = CharacterTargetingAllegiance.Player;
|
||||
CalculateBaseStats();
|
||||
|
@ -474,7 +482,18 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
propPacketUtil.AddProperty(String.Format("work.guildleveChecked[{0}]", i));
|
||||
}
|
||||
|
||||
//NPC Linkshell
|
||||
//Bazaar
|
||||
CheckBazaarFlags(true);
|
||||
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)
|
||||
|
@ -514,13 +533,13 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
//GetSpawnPackets(actorId, spawnType).DebugPrintPacket();
|
||||
|
||||
#region Inventory & Equipment
|
||||
QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId));
|
||||
inventories[Inventory.NORMAL].SendFullInventory(this);
|
||||
inventories[Inventory.CURRENCY_CRYSTALS].SendFullInventory(this);
|
||||
inventories[Inventory.KEYITEMS].SendFullInventory(this);
|
||||
inventories[Inventory.BAZAAR].SendFullInventory(this);
|
||||
inventories[Inventory.MELDREQUEST].SendFullInventory(this);
|
||||
inventories[Inventory.LOOT].SendFullInventory(this);
|
||||
QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId, true));
|
||||
itemPackages[ItemPackage.NORMAL].SendFullInventory(this);
|
||||
itemPackages[ItemPackage.CURRENCY_CRYSTALS].SendFullInventory(this);
|
||||
itemPackages[ItemPackage.KEYITEMS].SendFullInventory(this);
|
||||
itemPackages[ItemPackage.BAZAAR].SendFullInventory(this);
|
||||
itemPackages[ItemPackage.MELDREQUEST].SendFullInventory(this);
|
||||
itemPackages[ItemPackage.LOOT].SendFullInventory(this);
|
||||
equipment.SendFullEquipment(false);
|
||||
playerSession.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId));
|
||||
#endregion
|
||||
|
@ -623,6 +642,33 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
}
|
||||
}
|
||||
|
||||
public void BroadcastPackets(List<SubPacket> packets, bool sendToSelf)
|
||||
{
|
||||
foreach (SubPacket packet in packets)
|
||||
{
|
||||
if (sendToSelf)
|
||||
{
|
||||
|
||||
SubPacket clonedPacket = new SubPacket(packet, actorId);
|
||||
QueuePacket(clonedPacket);
|
||||
}
|
||||
|
||||
foreach (Actor a in playerSession.actorInstanceList)
|
||||
{
|
||||
if (a is Player)
|
||||
{
|
||||
Player p = (Player)a;
|
||||
|
||||
if (p.Equals(this))
|
||||
continue;
|
||||
|
||||
SubPacket clonedPacket = new SubPacket(packet, a.actorId);
|
||||
p.QueuePacket(clonedPacket);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void BroadcastPacket(SubPacket packet, bool sendToSelf)
|
||||
{
|
||||
if (sendToSelf)
|
||||
|
@ -937,6 +983,8 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
public void PrepareClassChange(byte classId)
|
||||
{
|
||||
//If new class, init abilties and level
|
||||
if (charaWork.battleSave.skillLevel[classId - 1] <= 0)
|
||||
UpdateClassLevel(classId, 1);
|
||||
|
||||
SendCharaExpInfo();
|
||||
}
|
||||
|
@ -1003,6 +1051,16 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
RecalculateStats();
|
||||
}
|
||||
|
||||
public void UpdateClassLevel(byte classId, short level)
|
||||
{
|
||||
Database.PlayerCharacterUpdateClassLevel(this, classId, level);
|
||||
charaWork.battleSave.skillLevel[classId - 1] = level;
|
||||
ActorPropertyPacketUtil propertyBuilder = new ActorPropertyPacketUtil("charaWork/exp", this);
|
||||
propertyBuilder.AddProperty(String.Format("charaWork.battleSave.skillLevel[{0}]", classId-1));
|
||||
List<SubPacket> packets = propertyBuilder.Done();
|
||||
QueuePackets(packets);
|
||||
}
|
||||
|
||||
public void GraphicChange(int slot, InventoryItem invItem)
|
||||
{
|
||||
if (invItem == null)
|
||||
|
@ -1048,18 +1106,68 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
BroadcastPacket(CreateAppearancePacket(), true);
|
||||
}
|
||||
|
||||
public Inventory GetInventory(ushort type)
|
||||
public void SetRepairRequest(byte type)
|
||||
{
|
||||
if (inventories.ContainsKey(type))
|
||||
return inventories[type];
|
||||
else
|
||||
return null;
|
||||
charaWork.eventSave.repairType = type;
|
||||
ActorPropertyPacketUtil propPacketUtil = new ActorPropertyPacketUtil("charaWork/bazaar", this);
|
||||
propPacketUtil.AddProperty("charaWork.eventSave.repairType");
|
||||
QueuePackets(propPacketUtil.Done());
|
||||
}
|
||||
|
||||
public void CheckBazaarFlags(bool noUpdate = false)
|
||||
{
|
||||
bool isDealing = false, isRepairing = false, seekingItem = false;
|
||||
lock (GetItemPackage(ItemPackage.BAZAAR))
|
||||
{
|
||||
foreach (InventoryItem item in GetItemPackage(ItemPackage.BAZAAR).GetRawList())
|
||||
{
|
||||
if (item == null)
|
||||
break;
|
||||
|
||||
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;
|
||||
if (item.GetBazaarMode() == InventoryItem.TYPE_SEEK_ITEM)
|
||||
isDealing = true;
|
||||
|
||||
if (isDealing && isRepairing && seekingItem)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool doUpdate = false;
|
||||
|
||||
ActorPropertyPacketUtil propPacketUtil = new ActorPropertyPacketUtil("charaWork/bazaar", this);
|
||||
if (charaWork.eventTemp.bazaarRetail != isDealing)
|
||||
{
|
||||
charaWork.eventTemp.bazaarRetail = isDealing;
|
||||
propPacketUtil.AddProperty("charaWork.eventTemp.bazaarRetail");
|
||||
doUpdate = true;
|
||||
}
|
||||
|
||||
if (charaWork.eventTemp.bazaarRepair != isRepairing)
|
||||
{
|
||||
charaWork.eventTemp.bazaarRepair = isRepairing;
|
||||
propPacketUtil.AddProperty("charaWork.eventTemp.bazaarRepair");
|
||||
doUpdate = true;
|
||||
}
|
||||
|
||||
if (charaWork.eventTemp.bazaarMateria != (GetItemPackage(ItemPackage.MELDREQUEST).GetCount() != 0))
|
||||
{
|
||||
charaWork.eventTemp.bazaarMateria = GetItemPackage(ItemPackage.MELDREQUEST).GetCount() != 0;
|
||||
propPacketUtil.AddProperty("charaWork.eventTemp.bazaarMateria");
|
||||
doUpdate = true;
|
||||
}
|
||||
|
||||
if (!noUpdate && doUpdate)
|
||||
BroadcastPackets(propPacketUtil.Done(), true);
|
||||
}
|
||||
|
||||
public int GetCurrentGil()
|
||||
{
|
||||
if (GetInventory(Inventory.CURRENCY_CRYSTALS).HasItem(1000001))
|
||||
return GetInventory(Inventory.CURRENCY_CRYSTALS).GetItemByCatelogId(1000001).quantity;
|
||||
if (HasItem(1000001))
|
||||
return GetItemPackage(ItemPackage.CURRENCY_CRYSTALS).GetItemByCatelogId(1000001).quantity;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
@ -1576,8 +1684,10 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
|
||||
public void SendMyTradeToPlayer(Player player)
|
||||
{
|
||||
Inventory tradeInventory = new Inventory(this, 4, Inventory.TRADE);
|
||||
ItemPackage tradeInventory = new ItemPackage(this, 4, ItemPackage.TRADE);
|
||||
player.QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId, true));
|
||||
tradeInventory.SendFullInventory(player);
|
||||
player.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId));
|
||||
}
|
||||
|
||||
public void SendDataPacket(params object[] parameters)
|
||||
|
@ -1590,13 +1700,15 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
|
||||
public void StartEvent(Actor owner, EventStartPacket start)
|
||||
{
|
||||
currentEventOwner = start.scriptOwnerActorID;
|
||||
currentEventName = start.triggerName;
|
||||
LuaEngine.GetInstance().EventStarted(this, owner, start);
|
||||
}
|
||||
|
||||
public void UpdateEvent(EventUpdatePacket update)
|
||||
{
|
||||
LuaEngine.GetInstance().OnEventUpdate(this, update.luaParams);
|
||||
}
|
||||
LuaEngine.GetInstance().OnEventUpdate(this, update.luaParams);
|
||||
}
|
||||
|
||||
public void KickEvent(Actor actor, string conditionName, params object[] parameters)
|
||||
{
|
||||
|
@ -1604,7 +1716,18 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
return;
|
||||
|
||||
List<LuaParam> lParams = LuaUtils.CreateLuaParamList(parameters);
|
||||
SubPacket spacket = KickEventPacket.BuildPacket(actorId, actor.actorId, conditionName, lParams);
|
||||
SubPacket spacket = KickEventPacket.BuildPacket(actorId, actor.actorId, 0x75dc1705, conditionName, lParams);
|
||||
spacket.DebugPrintSubPacket();
|
||||
QueuePacket(spacket);
|
||||
}
|
||||
|
||||
public void KickEventSpecial(Actor actor, uint unknown, string conditionName, params object[] parameters)
|
||||
{
|
||||
if (actor == null)
|
||||
return;
|
||||
|
||||
List<LuaParam> lParams = LuaUtils.CreateLuaParamList(parameters);
|
||||
SubPacket spacket = KickEventPacket.BuildPacket(actorId, actor.actorId, unknown, conditionName, lParams);
|
||||
spacket.DebugPrintSubPacket();
|
||||
QueuePacket(spacket);
|
||||
}
|
||||
|
@ -1612,7 +1735,7 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
public void SetEventStatus(Actor actor, string conditionName, bool enabled, byte unknown)
|
||||
{
|
||||
QueuePacket(packets.send.actor.events.SetEventStatus.BuildPacket(actor.actorId, enabled, unknown, conditionName));
|
||||
}
|
||||
}
|
||||
|
||||
public void RunEventFunction(string functionName, params object[] parameters)
|
||||
{
|
||||
|
@ -2572,5 +2695,127 @@ namespace FFXIVClassic_Map_Server.Actors
|
|||
return equippedItem != null && equippedItem.itemId == itemId;
|
||||
}
|
||||
|
||||
public Retainer GetSpawnedRetainer()
|
||||
{
|
||||
return currentSpawnedRetainer;
|
||||
}
|
||||
|
||||
public void StartTradeTransaction(Player otherPlayer)
|
||||
{
|
||||
myOfferings = new ItemPackage(this, 4, ItemPackage.TRADE, true);
|
||||
ItemPackage otherPlayerOfferings = new ItemPackage(otherPlayer, 4, ItemPackage.TRADE, true);
|
||||
|
||||
myOfferings.StartSendUpdate();
|
||||
myOfferings.SendUpdatePackets(this);
|
||||
myOfferings.SendUpdatePackets(otherPlayer);
|
||||
myOfferings.DoneSendUpdate();
|
||||
|
||||
otherTrader = otherPlayer;
|
||||
isTradeAccepted = false;
|
||||
}
|
||||
|
||||
public Player GetOtherTrader()
|
||||
{
|
||||
return otherTrader;
|
||||
}
|
||||
|
||||
public ItemPackage GetTradeOfferings()
|
||||
{
|
||||
return myOfferings;
|
||||
}
|
||||
|
||||
public bool IsTrading()
|
||||
{
|
||||
return otherTrader != null;
|
||||
}
|
||||
|
||||
public bool IsTradeAccepted()
|
||||
{
|
||||
return isTradeAccepted;
|
||||
}
|
||||
|
||||
public void AddTradeItem(ushort slot, ushort linkedSlot, int subquantity)
|
||||
{
|
||||
if (!IsTrading())
|
||||
return;
|
||||
|
||||
InventoryItem mine = itemPackages[ItemPackage.NORMAL].GetItemAtSlot(linkedSlot);
|
||||
|
||||
InventoryItem tradeItem = new InventoryItem(mine, slot);
|
||||
|
||||
myOfferings.StartSendUpdate();
|
||||
myOfferings.AddItem(mine.itemId, mine.quantity, mine.quality);
|
||||
myOfferings.SendUpdatePackets(otherTrader);
|
||||
myOfferings.DoneSendUpdate();
|
||||
}
|
||||
|
||||
public void AddTradeGil(int quantity)
|
||||
{
|
||||
if (!IsTrading())
|
||||
return;
|
||||
|
||||
myOfferings.StartSendUpdate();
|
||||
myOfferings.AddItem(1000001, quantity, 1);
|
||||
myOfferings.SendUpdatePackets(otherTrader);
|
||||
myOfferings.DoneSendUpdate();
|
||||
}
|
||||
|
||||
public void RemoveTradeItem(ushort slot)
|
||||
{
|
||||
if (!IsTrading())
|
||||
return;
|
||||
|
||||
myOfferings.StartSendUpdate();
|
||||
myOfferings.RemoveItemAtSlot(slot);
|
||||
myOfferings.SendUpdatePackets(otherTrader);
|
||||
myOfferings.DoneSendUpdate();
|
||||
}
|
||||
|
||||
public void ClearTradeItems(ushort slot)
|
||||
{
|
||||
if (!IsTrading())
|
||||
return;
|
||||
|
||||
myOfferings.StartSendUpdate();
|
||||
myOfferings.Clear();
|
||||
myOfferings.SendUpdatePackets(otherTrader);
|
||||
myOfferings.DoneSendUpdate();
|
||||
}
|
||||
|
||||
public void AcceptTrade(bool accepted)
|
||||
{
|
||||
if (!IsTrading())
|
||||
return;
|
||||
isTradeAccepted = accepted;
|
||||
}
|
||||
|
||||
public void FinishTradeTransaction()
|
||||
{
|
||||
isTradeAccepted = false;
|
||||
myOfferings = null;
|
||||
otherTrader = null;
|
||||
}
|
||||
|
||||
public void Test()
|
||||
{
|
||||
QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId));
|
||||
QueuePacket(InventorySetBeginPacket.BuildPacket(actorId, 4, ItemPackage.TRADE));
|
||||
|
||||
QueuePacket(InventoryRemoveX01Packet.BuildPacket(actorId, 1));
|
||||
|
||||
QueuePacket(InventorySetEndPacket.BuildPacket(actorId));
|
||||
QueuePacket(InventoryEndChangePacket.BuildPacket(actorId));
|
||||
}
|
||||
public void Test2()
|
||||
{
|
||||
QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId));
|
||||
QueuePacket(InventorySetBeginPacket.BuildPacket(actorId, 4, ItemPackage.TRADE));
|
||||
|
||||
QueuePacket(EquipmentListX01Packet.BuildPacket(actorId, 1, 1));
|
||||
|
||||
QueuePacket(InventorySetEndPacket.BuildPacket(actorId));
|
||||
QueuePacket(InventoryEndChangePacket.BuildPacket(actorId));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,6 @@ using FFXIVClassic_Map_Server.packets.send.actor;
|
|||
using MoonSharp.Interpreter;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.director
|
||||
{
|
||||
|
|
|
@ -1,15 +1,10 @@
|
|||
using FFXIVClassic.Common;
|
||||
using FFXIVClassic_Map_Server.actors.area;
|
||||
using FFXIVClassic_Map_Server.actors.director.Work;
|
||||
using FFXIVClassic_Map_Server.actors.group;
|
||||
using FFXIVClassic_Map_Server.Actors;
|
||||
using FFXIVClassic_Map_Server.dataobjects;
|
||||
using FFXIVClassic_Map_Server.utils;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.director
|
||||
{
|
||||
|
|
|
@ -1,10 +1,4 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.director.Work
|
||||
namespace FFXIVClassic_Map_Server.actors.director.Work
|
||||
{
|
||||
|
||||
class GuildleveWork
|
||||
|
|
|
@ -5,12 +5,7 @@ using FFXIVClassic_Map_Server.Actors;
|
|||
using FFXIVClassic_Map_Server.dataobjects;
|
||||
using FFXIVClassic_Map_Server.packets.send.group;
|
||||
using FFXIVClassic_Map_Server.packets.send.groups;
|
||||
using FFXIVClassic_Map_Server.utils;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.group
|
||||
{
|
||||
|
|
|
@ -1,16 +1,4 @@
|
|||
using FFXIVClassic.Common;
|
||||
using FFXIVClassic_Map_Server.actors.director;
|
||||
using FFXIVClassic_Map_Server.actors.group.Work;
|
||||
using FFXIVClassic_Map_Server.Actors;
|
||||
using FFXIVClassic_Map_Server.dataobjects;
|
||||
using FFXIVClassic_Map_Server.packets.send.group;
|
||||
using FFXIVClassic_Map_Server.packets.send.groups;
|
||||
using FFXIVClassic_Map_Server.utils;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using FFXIVClassic_Map_Server.actors.director;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.group
|
||||
{
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
using FFXIVClassic_Map_Server.dataobjects;
|
||||
using FFXIVClassic_Map_Server.packets.send.group;
|
||||
using FFXIVClassic_Map_Server.packets.send.groups;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.group
|
||||
|
|
|
@ -2,11 +2,7 @@
|
|||
using FFXIVClassic_Map_Server.dataobjects;
|
||||
using FFXIVClassic_Map_Server.packets.send.group;
|
||||
using FFXIVClassic_Map_Server.packets.send.groups;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.group
|
||||
{
|
||||
|
|
|
@ -1,12 +1,6 @@
|
|||
using FFXIVClassic.Common;
|
||||
using FFXIVClassic_Map_Server.actors.group.Work;
|
||||
using FFXIVClassic_Map_Server.dataobjects;
|
||||
using FFXIVClassic_Map_Server.actors.group.Work;
|
||||
using FFXIVClassic_Map_Server.packets.send.group;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.group
|
||||
{
|
||||
|
|
|
@ -3,21 +3,17 @@ using FFXIVClassic_Map_Server.actors.group.Work;
|
|||
using FFXIVClassic_Map_Server.dataobjects;
|
||||
using FFXIVClassic_Map_Server.packets.send.group;
|
||||
using FFXIVClassic_Map_Server.packets.send.groups;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.group
|
||||
{
|
||||
class Relation : Group
|
||||
class RelationGroup : Group
|
||||
{
|
||||
public RelationWork work = new RelationWork();
|
||||
private uint charaOther;
|
||||
private ulong topicGroup;
|
||||
|
||||
public Relation(ulong groupIndex, uint host, uint other, uint command, ulong topicGroup) : base (groupIndex)
|
||||
public RelationGroup(ulong groupIndex, uint host, uint other, uint command, ulong topicGroup) : base (groupIndex)
|
||||
{
|
||||
this.charaOther = other;
|
||||
work._globalTemp.host = ((ulong)host << 32) | (0xc17909);
|
|
@ -4,11 +4,7 @@ using FFXIVClassic_Map_Server.Actors;
|
|||
using FFXIVClassic_Map_Server.dataobjects;
|
||||
using FFXIVClassic_Map_Server.packets.send.group;
|
||||
using FFXIVClassic_Map_Server.packets.send.groups;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.group
|
||||
{
|
||||
|
|
73
FFXIVClassic Map Server/actors/group/TradeGroup.cs
Normal file
73
FFXIVClassic Map Server/actors/group/TradeGroup.cs
Normal file
|
@ -0,0 +1,73 @@
|
|||
using FFXIVClassic.Common;
|
||||
using FFXIVClassic_Map_Server.actors.group.Work;
|
||||
using FFXIVClassic_Map_Server.dataobjects;
|
||||
using FFXIVClassic_Map_Server.packets.send.group;
|
||||
using FFXIVClassic_Map_Server.packets.send.groups;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.group
|
||||
{
|
||||
class TradeGroup : Group
|
||||
{
|
||||
public RelationWork work = new RelationWork();
|
||||
private uint charaOther;
|
||||
private ulong topicGroup;
|
||||
|
||||
public TradeGroup(ulong groupIndex, uint host, uint other)
|
||||
: base(groupIndex)
|
||||
{
|
||||
this.charaOther = other;
|
||||
work._globalTemp.host = ((ulong)host << 32) | (0xc17909);
|
||||
work._globalTemp.variableCommand = 30001;
|
||||
}
|
||||
|
||||
public uint GetHost()
|
||||
{
|
||||
return (uint)(((ulong)work._globalTemp.host >> 32) & 0xFFFFFFFF);
|
||||
}
|
||||
|
||||
public uint GetOther()
|
||||
{
|
||||
return charaOther;
|
||||
}
|
||||
|
||||
public override int GetMemberCount()
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
public override uint GetTypeId()
|
||||
{
|
||||
return Group.TradeRelationGroup;
|
||||
}
|
||||
|
||||
public ulong GetTopicGroupIndex()
|
||||
{
|
||||
return topicGroup;
|
||||
}
|
||||
|
||||
public override List<GroupMember> BuildMemberList(uint id)
|
||||
{
|
||||
List<GroupMember> groupMembers = new List<GroupMember>();
|
||||
|
||||
uint hostId = (uint)((work._globalTemp.host >> 32) & 0xFFFFFFFF);
|
||||
|
||||
groupMembers.Add(new GroupMember(hostId, -1, 0, false, Server.GetServer().GetSession(hostId) != null, Server.GetWorldManager().GetActorInWorld(hostId).customDisplayName));
|
||||
groupMembers.Add(new GroupMember(charaOther, -1, 0, false, Server.GetServer().GetSession(charaOther) != null, Server.GetWorldManager().GetActorInWorld(charaOther).customDisplayName));
|
||||
return groupMembers;
|
||||
}
|
||||
|
||||
public override void SendInitWorkValues(Session session)
|
||||
{
|
||||
SynchGroupWorkValuesPacket groupWork = new SynchGroupWorkValuesPacket(groupIndex);
|
||||
groupWork.addProperty(this, "work._globalTemp.host");
|
||||
groupWork.addProperty(this, "work._globalTemp.variableCommand");
|
||||
groupWork.setTarget("/_init");
|
||||
|
||||
SubPacket test = groupWork.buildPacket(session.id);
|
||||
test.DebugPrintSubPacket();
|
||||
session.QueuePacket(test);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -1,9 +1,4 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.group.Work
|
||||
namespace FFXIVClassic_Map_Server.actors.group.Work
|
||||
{
|
||||
class ContentGroupWork
|
||||
{
|
||||
|
|
|
@ -1,9 +1,4 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.group.Work
|
||||
namespace FFXIVClassic_Map_Server.actors.group.Work
|
||||
{
|
||||
class GlobalTemp
|
||||
{
|
||||
|
|
|
@ -1,10 +1,4 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.group.Work
|
||||
namespace FFXIVClassic_Map_Server.actors.group.Work
|
||||
{
|
||||
class GroupGlobalSave
|
||||
{
|
||||
|
|
|
@ -1,10 +1,4 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.group.Work
|
||||
namespace FFXIVClassic_Map_Server.actors.group.Work
|
||||
{
|
||||
class GroupGlobalTemp
|
||||
{
|
||||
|
|
|
@ -1,10 +1,4 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.group.Work
|
||||
namespace FFXIVClassic_Map_Server.actors.group.Work
|
||||
{
|
||||
class GroupMemberSave
|
||||
{
|
||||
|
|
|
@ -1,10 +1,4 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.group.Work
|
||||
namespace FFXIVClassic_Map_Server.actors.group.Work
|
||||
{
|
||||
class PartyWork
|
||||
{
|
||||
|
|
|
@ -1,10 +1,4 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFXIVClassic_Map_Server.actors.group.Work
|
||||
namespace FFXIVClassic_Map_Server.actors.group.Work
|
||||
{
|
||||
class RelationWork
|
||||
{
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
using FFXIVClassic.Common;
|
||||
using FFXIVClassic_Map_Server.lua;
|
||||
using FFXIVClassic_Map_Server.lua;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue