diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs index 09b7b7ab..ed297041 100644 --- a/FFXIVClassic Map Server/PacketProcessor.cs +++ b/FFXIVClassic Map Server/PacketProcessor.cs @@ -182,8 +182,12 @@ namespace FFXIVClassic_Map_Server if (ownerActor == null) { + //Is it your retainer? + if (session.GetActor().currentSpawnedRetainer != null && session.GetActor().currentSpawnedRetainer.actorId == eventStart.scriptOwnerActorID) + ownerActor = session.GetActor().currentSpawnedRetainer; //Is it a instance actor? - ownerActor = session.GetActor().zone.FindActorInArea(session.GetActor().currentEventOwner); + if (ownerActor == null) + ownerActor = session.GetActor().zone.FindActorInArea(session.GetActor().currentEventOwner); if (ownerActor == null) { //Is it a Director? diff --git a/FFXIVClassic Map Server/actors/chara/npc/Retainer.cs b/FFXIVClassic Map Server/actors/chara/npc/Retainer.cs index ea545e9c..563652b6 100644 --- a/FFXIVClassic Map Server/actors/chara/npc/Retainer.cs +++ b/FFXIVClassic Map Server/actors/chara/npc/Retainer.cs @@ -1,5 +1,7 @@ -using FFXIVClassic_Map_Server.actors.chara.player; +using FFXIVClassic.Common; +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; @@ -10,22 +12,45 @@ namespace FFXIVClassic_Map_Server.actors.chara.npc { class Retainer : Npc { - public Retainer(uint id, string retainerName, ActorClass actorClass, Player player, float posX, float posY, float posZ, float rot) - : base(0, actorClass, String.Format("_rtnre{0:x7}", id), player.GetZone(), posX, posY, posZ, rot, 0, 0, retainerName) + Player player; + + public Retainer(string retainerName, ActorClass actorClass, Player player, float posX, float posY, float posZ, float rot) + : base(0, actorClass, "myretainer", player.GetZone(), posX, posY, posZ, rot, 0, 0, retainerName) { - this.actorId = 0xD0000000 | id; + this.player = player; + this.actorName = String.Format("_rtnre{0:x7}", actorId); } public void SendBazaarItems(Player player) { - Inventory bazaar = new Inventory(this, 4, Inventory.RETAINER_BAZAAR); - bazaar.SendFullInventory(player); + Inventory bazaar = new Inventory(this, 150, (ushort)0); + bazaar.AddItem(1000001); + bazaar.AddItem(3020517); + player.QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId)); + bazaar.SendFullInventory(player); + player.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); + } public void SendStorageItems(Player player) { - Inventory storage = new Inventory(this, 4, 1); + Inventory storage = new Inventory(this, 10, Inventory.CURRENCY); + storage.AddItem(1000001); + storage.AddItem(3020519); + player.QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId)); storage.SendFullInventory(player); + player.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); } + + public void SendHuhItems(Player player) + { + Inventory storage = new Inventory(this, 20, 7); + storage.AddItem(1000003); + storage.AddItem(1000016); + player.QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId)); + storage.SendFullInventory(player); + player.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); + } + } } diff --git a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs index b401727b..8f9e5ef2 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs @@ -230,6 +230,27 @@ namespace FFXIVClassic_Map_Server.actors.chara.player doRealign(); if (owner is Player) SendUpdatePackets((Player)owner); + } + + public void RemoveItemAtSlot(ushort slot, int quantity) + { + if (slot >= endOfListIndex) + return; + + if (list[slot] != null) + { + list[slot].quantity -= quantity; + + if (list[slot].quantity <= 0) + { + list[slot] = null; + doRealign(); + } + + isDirty[slot] = true; + if (owner is Player) + SendUpdatePackets((Player)owner); + } } public void ChangeDurability(uint slot, uint durabilityChange) @@ -390,12 +411,14 @@ namespace FFXIVClassic_Map_Server.actors.chara.player Array.Clear(isDirty, 0, isDirty.Length); + player.QueuePacket(InventoryBeginChangePacket.BuildPacket(owner.actorId)); player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, inventoryCapacity, inventoryCode)); //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)); } #endregion diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index c1ddd5d5..6e314c58 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -135,7 +135,8 @@ namespace FFXIVClassic_Map_Server.Actors public uint homepoint = 0; public byte homepointInn = 0; - //Instancing + //Retainer + RetainerMeetingRelationGroup retainerMeetingGroup = null; public Retainer currentSpawnedRetainer = null; public bool sentRetainerSpawn = false; @@ -1742,30 +1743,30 @@ namespace FFXIVClassic_Map_Server.Actors chocoboAppearance = appearanceId; } - public bool SpawnMyRetainer(Npc bell, int retainerIndex) + public Retainer SpawnMyRetainer(Npc bell, int retainerIndex) { Tuple retainerData = Database.GetRetainer(this, retainerIndex); ActorClass actorClass = Server.GetWorldManager().GetActorClass(retainerData.Item2); if (actorClass == null) - return false; + return null; float distance = (float)Math.Sqrt(((positionX - bell.positionX) * (positionX - bell.positionX)) + ((positionZ - bell.positionZ) * (positionZ - bell.positionZ))); float posX = bell.positionX - ((-1.0f * (bell.positionX - positionX)) / distance); float posZ = bell.positionZ - ((-1.0f * (bell.positionZ - positionZ)) / distance); - Retainer retainer = new Retainer(retainerData.Item1, retainerData.Item3, actorClass, this, posX, bell.positionY, positionZ, (float)Math.Atan2(positionX - posX, positionZ - posZ)); + Retainer retainer = new Retainer(retainerData.Item3, actorClass, this, posX, bell.positionY, positionZ, (float)Math.Atan2(positionX - posX, positionZ - posZ)); retainer.LoadEventConditions(actorClass.eventConditions); - //RetainerMeetingRelationGroup group = new RetainerMeetingRelationGroup(5555, this, retainer); - //group.SendGroupPackets(playerSession); + retainerMeetingGroup = new RetainerMeetingRelationGroup(5555, this, retainer); + retainerMeetingGroup.SendGroupPackets(playerSession); currentSpawnedRetainer = retainer; sentRetainerSpawn = false; - return true; + return retainer; } public void DespawnMyRetainer() @@ -1773,6 +1774,8 @@ namespace FFXIVClassic_Map_Server.Actors if (currentSpawnedRetainer != null) { currentSpawnedRetainer = null; + retainerMeetingGroup.SendDeletePacket(playerSession); + retainerMeetingGroup = null; } }