mirror of
				https://bitbucket.org/Ioncannon/project-meteor-server.git
				synced 2025-05-20 08:26:59 -04:00 
			
		
		
		
	Merge branch 'develop' of https://bitbucket.org/Ioncannon/ffxiv-classic-server into develop
Fix Excruciate removign status from enemy rather than caster
This commit is contained in:
		| @@ -1,16 +1,17 @@ | ||||
|  | ||||
| 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; | ||||
| using System.Collections.Generic; | ||||
| using FFXIVClassic_Map_Server.actors.chara; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor.battle; | ||||
| using FFXIVClassic_Map_Server.packets.send; | ||||
| using FFXIVClassic_Map_Server.actors.chara.ai.state; | ||||
| using FFXIVClassic_Map_Server.actors.chara.ai.utils; | ||||
| using FFXIVClassic_Map_Server.actors.chara.npc; | ||||
| @@ -107,7 +108,7 @@ namespace FFXIVClassic_Map_Server.Actors | ||||
|  | ||||
|         public Group currentParty = null; | ||||
|         public ContentGroup currentContentGroup = null; | ||||
|  | ||||
|          | ||||
|         //public DateTime lastAiUpdate; | ||||
|  | ||||
|         public AIContainer aiContainer; | ||||
| @@ -131,8 +132,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 ReferencedItemPackage 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 +213,7 @@ namespace FFXIVClassic_Map_Server.Actors | ||||
|             } | ||||
|             return propPacketUtil.Done(); | ||||
|         } | ||||
|  | ||||
|          | ||||
|         public void PlayAnimation(uint animId, bool onlySelf = false) | ||||
|         { | ||||
|             if (onlySelf) | ||||
| @@ -218,7 +224,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)); | ||||
| @@ -504,7 +510,7 @@ namespace FFXIVClassic_Map_Server.Actors | ||||
|             } | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|          | ||||
|         public virtual void Cast(uint spellId, uint targetId = 0) | ||||
|         { | ||||
|             if (aiContainer.CanChangeState()) | ||||
| @@ -1154,5 +1160,180 @@ namespace FFXIVClassic_Map_Server.Actors | ||||
|             targetFind.FindWithinArea(this, ValidTarget.Party, 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].SendUpdate(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 | ||||
|  | ||||
|     } | ||||
| } | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,8 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara | ||||
| { | ||||
|   | ||||
| @@ -1,9 +1,5 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.actors.chara.npc; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara | ||||
| { | ||||
|   | ||||
							
								
								
									
										295
									
								
								FFXIVClassic Map Server/actors/chara/ReferencedItemPackage.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										295
									
								
								FFXIVClassic Map Server/actors/chara/ReferencedItemPackage.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,295 @@ | ||||
| using FFXIVClassic_Map_Server.actors.chara.player; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.dataobjects; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor.inventory; | ||||
| using System.Collections.Generic; | ||||
| using System.Diagnostics; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara | ||||
| { | ||||
|  | ||||
|     class ReferencedItemPackage | ||||
|     { | ||||
|         const uint EMPTY = 0xFFFFFFFF; | ||||
|  | ||||
|         private readonly Player owner; | ||||
|         private readonly InventoryItem[] referenceList; | ||||
|         private readonly ushort itemPackageCode; | ||||
|         private readonly ushort itemPackageCapacity; | ||||
|         private bool writeToDB = false; | ||||
|  | ||||
|         public ReferencedItemPackage(Player owner, ushort capacity, ushort code) | ||||
|         { | ||||
|             this.owner = owner; | ||||
|             itemPackageCode = code; | ||||
|             itemPackageCapacity = capacity; | ||||
|             referenceList = new InventoryItem[capacity]; | ||||
|  | ||||
|             if (code == ItemPackage.EQUIPMENT) | ||||
|                 writeToDB = true; | ||||
|         } | ||||
|  | ||||
|         public void ToggleDBWrite(bool flag) | ||||
|         { | ||||
|             writeToDB = flag; | ||||
|         } | ||||
|  | ||||
|         #region Package Management | ||||
|         public void SetList(InventoryItem[] toSet) | ||||
|         { | ||||
|             Debug.Assert(referenceList.Length == itemPackageCapacity); | ||||
|             toSet.CopyTo(referenceList, 0); | ||||
|         } | ||||
|  | ||||
|         public void Set(ushort[] positions, ushort[] itemSlots, ushort itemPackage) | ||||
|         { | ||||
|             Debug.Assert(positions.Length == itemSlots.Length); | ||||
|             | ||||
|             for (int i = 0; i < positions.Length; i++) | ||||
|             { | ||||
|                 InventoryItem item = owner.GetItemPackage(itemPackage)?.GetItemAtSlot(itemSlots[i]); | ||||
|  | ||||
|                 if (item == null) | ||||
|                     continue; | ||||
|  | ||||
|                 Database.EquipItem(owner, positions[i], item.uniqueId); | ||||
|                 referenceList[positions[i]] = item; | ||||
|             } | ||||
|  | ||||
|             owner.QueuePacket(InventoryBeginChangePacket.BuildPacket(owner.actorId)); | ||||
|             SendUpdate(); | ||||
|             owner.QueuePacket(InventoryEndChangePacket.BuildPacket(owner.actorId)); | ||||
|         } | ||||
|          | ||||
|         public void Set(ushort position, ushort itemPackagePosition, ushort itemPackageCode) | ||||
|         { | ||||
|             InventoryItem item = owner.GetItemPackage(itemPackageCode).GetItemAtSlot(itemPackagePosition); | ||||
|  | ||||
|             if (item == null) | ||||
|                 return; | ||||
|  | ||||
|             Set(position, item); | ||||
|         } | ||||
|  | ||||
|         public void Set(ushort position, InventoryItem item) | ||||
|         { | ||||
|             if (position >= referenceList.Length) | ||||
|                 return; | ||||
|  | ||||
|             if (writeToDB) | ||||
|                 Database.EquipItem(owner, position, item.uniqueId); | ||||
|  | ||||
|             ItemPackage newPackage = owner.GetItemPackage(item.itemPackage); | ||||
|             ItemPackage oldPackage = null; | ||||
|  | ||||
|             if (referenceList[position] != null) | ||||
|             { | ||||
|                 oldPackage = owner.GetItemPackage(referenceList[position].itemPackage); | ||||
|                 InventoryItem oldItem = referenceList[position]; | ||||
|                 oldPackage.MarkDirty(oldItem); | ||||
|             } | ||||
|              | ||||
|             newPackage.MarkDirty(item); | ||||
|  | ||||
|             referenceList[position] = item; | ||||
|  | ||||
|             owner.QueuePacket(InventoryBeginChangePacket.BuildPacket(owner.actorId)); | ||||
|             if (oldPackage != null) | ||||
|                 oldPackage.SendUpdate(); | ||||
|             newPackage.SendUpdate(); | ||||
|             SendSingleUpdate(position); | ||||
|             owner.QueuePacket(InventoryEndChangePacket.BuildPacket(owner.actorId));             | ||||
|         } | ||||
|  | ||||
|         public void Clear(ushort position) | ||||
|         { | ||||
|             if (position >= referenceList.Length) | ||||
|                 return; | ||||
|  | ||||
|             if (writeToDB) | ||||
|                 Database.UnequipItem(owner, position); | ||||
|  | ||||
|             ItemPackage oldItemPackage = owner.GetItemPackage(referenceList[position].itemPackage); | ||||
|  | ||||
|             oldItemPackage.MarkDirty(referenceList[position]); | ||||
|             referenceList[position] = null; | ||||
|  | ||||
|             owner.QueuePacket(InventoryBeginChangePacket.BuildPacket(owner.actorId)); | ||||
|             oldItemPackage.SendUpdate(); | ||||
|             SendSingleUpdate(position); | ||||
|             owner.QueuePacket(InventoryEndChangePacket.BuildPacket(owner.actorId)); | ||||
|         } | ||||
|  | ||||
|         public void ClearAll() | ||||
|         { | ||||
|             List<ItemPackage> packagesToRefresh = new List<ItemPackage>(); | ||||
|  | ||||
|             for (int i = 0; i < referenceList.Length; i++) | ||||
|             { | ||||
|                 if (referenceList[i] == null) | ||||
|                     continue; | ||||
|  | ||||
|                 if (writeToDB) | ||||
|                     Database.UnequipItem(owner, (ushort)i); | ||||
|  | ||||
|                 ItemPackage package = owner.GetItemPackage(referenceList[i].itemPackage);                | ||||
|                 package.MarkDirty(referenceList[i]);             | ||||
|                 packagesToRefresh.Add(package); | ||||
|  | ||||
|                 referenceList[i] = null;                | ||||
|             } | ||||
|  | ||||
|             owner.QueuePacket(InventoryBeginChangePacket.BuildPacket(owner.actorId)); | ||||
|             for (int i = 0; i < packagesToRefresh.Count; i++) | ||||
|                 packagesToRefresh[i].SendUpdate(); | ||||
|             SendUpdate(); | ||||
|             owner.QueuePacket(InventoryEndChangePacket.BuildPacket(owner.actorId)); | ||||
|         } | ||||
|         #endregion | ||||
|  | ||||
|         #region Send Update Functions | ||||
|         public void SendSingleUpdate(ushort position) | ||||
|         { | ||||
|             owner.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode)); | ||||
|             SendSingleLinkedItemPacket(owner, position); | ||||
|             owner.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); | ||||
|         } | ||||
|  | ||||
|         public void SendUpdate() | ||||
|         { | ||||
|             SendUpdate(owner); | ||||
|         } | ||||
|  | ||||
|         public void SendUpdate(Player targetPlayer) | ||||
|         { | ||||
|             List<ushort> slotsToUpdate = new List<ushort>(); | ||||
|  | ||||
|             for (ushort i = 0; i < referenceList.Length; i++) | ||||
|             { | ||||
|                 if (referenceList[i] != null) | ||||
|                     slotsToUpdate.Add(i); | ||||
|             } | ||||
|           | ||||
|             targetPlayer.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode)); | ||||
|             SendLinkedItemPackets(targetPlayer, slotsToUpdate); | ||||
|             targetPlayer.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); | ||||
|         } | ||||
|  | ||||
|         public void SendUpdateAsItemPackage(Player targetPlayer) | ||||
|         { | ||||
|             SendUpdateAsItemPackage(targetPlayer, itemPackageCapacity, itemPackageCode); | ||||
|         } | ||||
|  | ||||
|         public void SendUpdateAsItemPackage(Player targetPlayer, ushort destinationCapacity, ushort destinationCode) | ||||
|         { | ||||
|             List<InventoryItem> items = new List<InventoryItem>(); | ||||
|  | ||||
|             for (ushort i = 0; i < referenceList.Length; i++) | ||||
|             { | ||||
|                 if (referenceList[i] == null) | ||||
|                     continue; | ||||
|  | ||||
|                 InventoryItem item = referenceList[i]; | ||||
|                 item.linkSlot = i; //We have to set the linkSlot as this is the position in the Referenced IP, not the original IP it's linked from. | ||||
|                 items.Add(referenceList[i]); | ||||
|             } | ||||
|              | ||||
|             targetPlayer.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, destinationCapacity, destinationCode));          | ||||
|             SendItemPackets(targetPlayer, items); | ||||
|             targetPlayer.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); | ||||
|  | ||||
|             //Clean Up linkSlots | ||||
|             for (ushort i = 0; i < referenceList.Length; i++) | ||||
|             { | ||||
|                 if (referenceList[i] == null) | ||||
|                     continue; | ||||
|                 InventoryItem item = referenceList[i]; | ||||
|                 item.linkSlot = 0xFFFF; | ||||
|             } | ||||
|         } | ||||
|         #endregion | ||||
|  | ||||
|         #region Packet Functions (Private) | ||||
|         private void SendSingleLinkedItemPacket(Player targetPlayer, ushort position) | ||||
|         { | ||||
|             if (referenceList[position] == null) | ||||
|                 targetPlayer.QueuePacket(InventoryRemoveX01Packet.BuildPacket(owner.actorId, position)); | ||||
|             else | ||||
|                 targetPlayer.QueuePacket(LinkedItemListX01Packet.BuildPacket(owner.actorId, position, referenceList[position])); | ||||
|         } | ||||
|  | ||||
|         private void SendLinkedItemPackets(Player targetPlayer, List<ushort> slotsToUpdate) | ||||
|         { | ||||
|             int currentIndex = 0; | ||||
|  | ||||
|             while (true) | ||||
|             { | ||||
|                 if (slotsToUpdate.Count - currentIndex >= 64) | ||||
|                     targetPlayer.QueuePacket(LinkedItemListX64Packet.BuildPacket(owner.actorId, referenceList, slotsToUpdate, ref currentIndex)); | ||||
|                 else if (slotsToUpdate.Count - currentIndex >= 32) | ||||
|                     targetPlayer.QueuePacket(LinkedItemListX32Packet.BuildPacket(owner.actorId, referenceList, slotsToUpdate, ref currentIndex)); | ||||
|                 else if (slotsToUpdate.Count - currentIndex >= 16) | ||||
|                     targetPlayer.QueuePacket(LinkedItemListX16Packet.BuildPacket(owner.actorId, referenceList, slotsToUpdate, ref currentIndex)); | ||||
|                 else if (slotsToUpdate.Count - currentIndex > 1) | ||||
|                     targetPlayer.QueuePacket(LinkedItemListX08Packet.BuildPacket(owner.actorId, referenceList, slotsToUpdate, ref currentIndex)); | ||||
|                 else if (slotsToUpdate.Count - currentIndex == 1) | ||||
|                 { | ||||
|                     targetPlayer.QueuePacket(LinkedItemListX01Packet.BuildPacket(owner.actorId, slotsToUpdate[currentIndex], referenceList[slotsToUpdate[currentIndex]])); | ||||
|                     currentIndex++; | ||||
|                 } | ||||
|                 else | ||||
|                     break; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         private void SendItemPackets(Player player, List<InventoryItem> items) | ||||
|         { | ||||
|             int currentIndex = 0; | ||||
|  | ||||
|             while (true) | ||||
|             { | ||||
|                 if (items.Count - currentIndex >= 64) | ||||
|                     player.QueuePacket(InventoryListX64Packet.BuildPacket(owner.actorId, items, ref currentIndex)); | ||||
|                 else if (items.Count - currentIndex >= 32) | ||||
|                     player.QueuePacket(InventoryListX32Packet.BuildPacket(owner.actorId, items, ref currentIndex)); | ||||
|                 else if (items.Count - currentIndex >= 16) | ||||
|                     player.QueuePacket(InventoryListX16Packet.BuildPacket(owner.actorId, items, ref currentIndex)); | ||||
|                 else if (items.Count - currentIndex > 1) | ||||
|                     player.QueuePacket(InventoryListX08Packet.BuildPacket(owner.actorId, items, ref currentIndex)); | ||||
|                 else if (items.Count - currentIndex == 1) | ||||
|                 { | ||||
|                     player.QueuePacket(InventoryListX01Packet.BuildPacket(owner.actorId, items[currentIndex])); | ||||
|                     currentIndex++; | ||||
|                 } | ||||
|                 else | ||||
|                     break; | ||||
|             } | ||||
|         } | ||||
|         #endregion | ||||
|  | ||||
|         #region Getters/Setters | ||||
|         public ushort GetCode() | ||||
|         { | ||||
|             return itemPackageCode; | ||||
|         } | ||||
|  | ||||
|         public int GetCapacity() | ||||
|         { | ||||
|             return itemPackageCapacity; | ||||
|         } | ||||
|  | ||||
|         public Player GetOwner() | ||||
|         { | ||||
|             return owner; | ||||
|         } | ||||
|  | ||||
|         public InventoryItem GetItemAtSlot(ushort position) | ||||
|         { | ||||
|             if (position < referenceList.Length) | ||||
|                 return referenceList[position]; | ||||
|             else | ||||
|                 return null; | ||||
|         } | ||||
|         #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 | ||||
| namespace FFXIVClassic_Map_Server.actors.chara | ||||
| { | ||||
|     class SubState | ||||
|     { | ||||
|   | ||||
| @@ -1,8 +1,5 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.actors.chara.ai.state; | ||||
| using FFXIVClassic_Map_Server.actors.chara.ai.controllers; | ||||
|   | ||||
| @@ -1,11 +1,6 @@ | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.actors.chara.player; | ||||
| using FFXIVClassic.Common; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor.battle; | ||||
| using FFXIVClassic_Map_Server.actors.chara.ai.utils; | ||||
| using MoonSharp.Interpreter; | ||||
|   | ||||
| @@ -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.ai | ||||
| namespace FFXIVClassic_Map_Server.actors.chara.ai | ||||
| { | ||||
|     class BattleTrait | ||||
|     { | ||||
|   | ||||
| @@ -1,8 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using System.Collections.Generic; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara.ai | ||||
|   | ||||
| @@ -1,12 +1,7 @@ | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.lua; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor.battle; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using MoonSharp.Interpreter; | ||||
| using FFXIVClassic.Common; | ||||
|  | ||||
|   | ||||
| @@ -1,16 +1,11 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic.Common; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.lua; | ||||
| using FFXIVClassic_Map_Server.actors.area; | ||||
| using FFXIVClassic_Map_Server.packets.send; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor.battle; | ||||
| using System.Collections.ObjectModel; | ||||
| using FFXIVClassic_Map_Server.utils; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara.ai | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.actors.chara.npc; | ||||
| using FFXIVClassic.Common; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers | ||||
| { | ||||
|   | ||||
| @@ -1,8 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers | ||||
|   | ||||
| @@ -1,8 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers | ||||
|   | ||||
| @@ -1,11 +1,5 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor; | ||||
| using FFXIVClassic.Common; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers | ||||
| { | ||||
|   | ||||
| @@ -1,11 +1,6 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using MoonSharp; | ||||
| using MoonSharp.Interpreter; | ||||
| using FFXIVClassic_Map_Server.lua; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara.ai | ||||
|   | ||||
| @@ -1,14 +1,9 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server; | ||||
| using FFXIVClassic_Map_Server.utils; | ||||
| using FFXIVClassic.Common; | ||||
| using FFXIVClassic_Map_Server.actors.area; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor; | ||||
|  | ||||
| // port of https://github.com/DarkstarProject/darkstar/blob/master/src/map/ai/helpers/pathfind.h | ||||
|  | ||||
|   | ||||
| @@ -1,14 +1,10 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic.Common; | ||||
| using FFXIVClassic_Map_Server.actors.chara.ai; | ||||
| using FFXIVClassic_Map_Server.actors.chara.ai.controllers; | ||||
| using FFXIVClassic_Map_Server.actors.group; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor; | ||||
|  | ||||
| // port of dsp's ai code https://github.com/DarkstarProject/darkstar/blob/master/src/map/ai/ | ||||
|  | ||||
|   | ||||
| @@ -1,13 +1,7 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic.Common; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor.battle; | ||||
| using FFXIVClassic_Map_Server.packets.send; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara.ai.state | ||||
| { | ||||
|   | ||||
| @@ -1,8 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic.Common; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor; | ||||
|   | ||||
| @@ -1,8 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor; | ||||
|  | ||||
|   | ||||
| @@ -1,8 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor; | ||||
|  | ||||
|   | ||||
| @@ -1,8 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara.ai.state | ||||
|   | ||||
| @@ -1,10 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.actors.chara.player; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.dataobjects; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara.ai.state | ||||
|   | ||||
| @@ -1,14 +1,8 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic.Common; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor.battle; | ||||
| using FFXIVClassic_Map_Server.packets.send; | ||||
| using FFXIVClassic_Map_Server.utils; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara.ai.state | ||||
| { | ||||
|   | ||||
| @@ -1,10 +1,5 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic.Common; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor.battle; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara.ai.state | ||||
|   | ||||
| @@ -1,13 +1,7 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic.Common; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor.battle; | ||||
| using FFXIVClassic_Map_Server.packets.send; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara.ai.state | ||||
| { | ||||
|   | ||||
| @@ -1,9 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| namespace FFXIVClassic_Map_Server.actors.chara.ai.utils | ||||
| { | ||||
|     static class AttackUtils | ||||
|   | ||||
| @@ -1,15 +1,10 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor.battle; | ||||
| using FFXIVClassic_Map_Server.actors.chara.player; | ||||
| using FFXIVClassic_Map_Server.actors.chara.npc; | ||||
| using FFXIVClassic_Map_Server.dataobjects; | ||||
| using FFXIVClassic.Common; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara.ai.utils | ||||
|   | ||||
| @@ -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,9 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.actors.chara.ai; | ||||
| using FFXIVClassic_Map_Server.actors.chara.ai.controllers; | ||||
|  | ||||
|   | ||||
| @@ -1,22 +1,15 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic.Common; | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.actors.chara.npc; | ||||
| using FFXIVClassic_Map_Server.actors; | ||||
| using FFXIVClassic_Map_Server.actors.chara; | ||||
| using FFXIVClassic_Map_Server.actors.chara.ai; | ||||
| using FFXIVClassic_Map_Server.actors.chara.ai.controllers; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor; | ||||
| using FFXIVClassic_Map_Server.actors.chara.ai.state; | ||||
| using FFXIVClassic_Map_Server.utils; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor.battle; | ||||
| using FFXIVClassic_Map_Server.actors.chara.ai.utils; | ||||
| using FFXIVClassic_Map_Server.actors.group; | ||||
| using FFXIVClassic_Map_Server.packets.send; | ||||
| using FFXIVClassic_Map_Server.Actors.Chara; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.Actors | ||||
|   | ||||
| @@ -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 | ||||
| { | ||||
|     enum MobModifier | ||||
|     { | ||||
|   | ||||
| @@ -1,22 +1,14 @@ | ||||
| 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; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using FFXIVClassic_Map_Server.actors.chara.ai; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.Actors | ||||
|   | ||||
| @@ -1,13 +1,7 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
|  | ||||
| using FFXIVClassic_Map_Server.actors.chara.ai; | ||||
| using FFXIVClassic_Map_Server.actors.chara.ai.controllers; | ||||
| using FFXIVClassic_Map_Server.actors.chara.npc; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.Actors | ||||
| { | ||||
|   | ||||
| @@ -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; | ||||
|         } | ||||
|   | ||||
| @@ -1,236 +0,0 @@ | ||||
| using FFXIVClassic_Map_Server.Actors; | ||||
| using FFXIVClassic_Map_Server.dataobjects; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor.inventory; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.actors.chara.player | ||||
| { | ||||
|     class Equipment | ||||
|     { | ||||
|         public const int SLOT_MAINHAND = 0; | ||||
|         public const int SLOT_OFFHAND = 1; | ||||
|         public const int SLOT_THROWINGWEAPON = 4; | ||||
|         public const int SLOT_PACK = 5; | ||||
|         public const int SLOT_POUCH = 6; | ||||
|         public const int SLOT_HEAD = 8; | ||||
|         public const int SLOT_UNDERSHIRT = 9; | ||||
|         public const int SLOT_BODY = 10; | ||||
|         public const int SLOT_UNDERGARMENT = 11; | ||||
|         public const int SLOT_LEGS = 12; | ||||
|         public const int SLOT_HANDS = 13; | ||||
|         public const int SLOT_BOOTS = 14; | ||||
|         public const int SLOT_WAIST = 15; | ||||
|         public const int SLOT_NECK = 16; | ||||
|         public const int SLOT_EARS = 17; | ||||
|         public const int SLOT_WRISTS = 19; | ||||
|         public const int SLOT_RIGHTFINGER = 21; | ||||
|         public const int SLOT_LEFTFINGER = 22; | ||||
|  | ||||
|         private Player owner; | ||||
|         private ushort inventoryCapacity; | ||||
|         private ushort inventoryCode; | ||||
|         private InventoryItem[] list; | ||||
|         private Inventory normalInventory; | ||||
|  | ||||
|         private bool writeToDB = true; | ||||
|  | ||||
|         public Equipment(Player ownerPlayer, Inventory normalInventory, ushort capacity, ushort code) | ||||
|         { | ||||
|             owner = ownerPlayer; | ||||
|             inventoryCapacity = capacity; | ||||
|             inventoryCode = code; | ||||
|             list = new InventoryItem[inventoryCapacity]; | ||||
|             this.normalInventory = normalInventory; | ||||
|         } | ||||
|  | ||||
|         public InventoryItem GetItemAtSlot(ushort slot) | ||||
|         { | ||||
|             if (slot < list.Length) | ||||
|                 return list[slot]; | ||||
|             else | ||||
|                 return null; | ||||
|         } | ||||
|  | ||||
|         public void SendCheckEquipmentToPlayer(Player toPlayer) | ||||
|         { | ||||
|             List<InventoryItem> items = new List<InventoryItem>(); | ||||
|             for (ushort i = 0; i < list.Length; i++) | ||||
|             { | ||||
|                 if (list[i] != null) | ||||
|                 { | ||||
|                     InventoryItem equipItem = new InventoryItem(list[i], i); | ||||
|                     items.Add(equipItem); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             toPlayer.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, 0x23, Inventory.EQUIPMENT_OTHERPLAYER)); | ||||
|             int currentIndex = 0; | ||||
|  | ||||
|             while (true) | ||||
|             { | ||||
|                 if (items.Count - currentIndex >= 16) | ||||
|                     toPlayer.QueuePacket(InventoryListX16Packet.BuildPacket(owner.actorId, items, ref currentIndex)); | ||||
|                 else if (items.Count - currentIndex > 1) | ||||
|                     toPlayer.QueuePacket(InventoryListX08Packet.BuildPacket(owner.actorId, items, ref currentIndex)); | ||||
|                 else if (items.Count - currentIndex == 1) | ||||
|                 { | ||||
|                     toPlayer.QueuePacket(InventoryListX01Packet.BuildPacket(owner.actorId, items[currentIndex])); | ||||
|                     currentIndex++; | ||||
|                 } | ||||
|                 else | ||||
|                     break; | ||||
|             } | ||||
|             toPlayer.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); | ||||
|         } | ||||
|  | ||||
|         public void SendFullEquipment(bool DoClear) | ||||
|         { | ||||
|             List<ushort> slotsToUpdate = new List<ushort>(); | ||||
|             for (ushort i = 0; i < list.Length; i++) | ||||
|             { | ||||
|                 if (list[i] == null && DoClear) | ||||
|                     slotsToUpdate.Add(0); | ||||
|                 else if (list[i] != null) | ||||
|                     slotsToUpdate.Add(i); | ||||
|             } | ||||
|  | ||||
|             owner.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, inventoryCapacity, inventoryCode)); | ||||
|             SendEquipmentPackets(slotsToUpdate); | ||||
|             owner.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId));       | ||||
|         } | ||||
|  | ||||
|         public void SetEquipment(ushort[] slots, ushort[] itemSlots) | ||||
|         { | ||||
|             if (slots.Length != itemSlots.Length) | ||||
|                 return; | ||||
|  | ||||
|             for (int i = 0; i < slots.Length; i++) | ||||
|             { | ||||
|                 InventoryItem item = normalInventory.GetItemAtSlot(itemSlots[i]); | ||||
|  | ||||
|                 if (item == null) | ||||
|                     continue; | ||||
|  | ||||
|                 Database.EquipItem(owner, slots[i], item.uniqueId); | ||||
|                 list[slots[i]] = normalInventory.GetItemAtSlot(itemSlots[i]); | ||||
|             } | ||||
|  | ||||
|             owner.QueuePacket(InventoryBeginChangePacket.BuildPacket(owner.actorId)); | ||||
|             SendFullEquipment(false); | ||||
|             owner.QueuePacket(InventoryEndChangePacket.BuildPacket(owner.actorId)); | ||||
|         } | ||||
|  | ||||
|         public void SetEquipment(InventoryItem[] toEquip) | ||||
|         { | ||||
|             List<ushort> slotsToUpdate = new List<ushort>(); | ||||
|             for (ushort i = 0; i < toEquip.Length; i++) | ||||
|             { | ||||
|                 if (toEquip[i] != null) | ||||
|                     slotsToUpdate.Add(i);  | ||||
|             } | ||||
|             list = toEquip; | ||||
|         } | ||||
|  | ||||
|         public void Equip(ushort slot, ushort invSlot) | ||||
|         { | ||||
|             InventoryItem item = normalInventory.GetItemAtSlot(invSlot); | ||||
|  | ||||
|             if (item == null) | ||||
|                 return; | ||||
|  | ||||
|             Equip(slot, item); | ||||
|         } | ||||
|  | ||||
|         public void Equip(ushort slot, InventoryItem item) | ||||
|         { | ||||
|             if (slot >= list.Length) | ||||
|                 return; | ||||
|  | ||||
|             if (writeToDB) | ||||
|                 Database.EquipItem(owner, slot, item.uniqueId); | ||||
|  | ||||
|             owner.QueuePacket(InventoryBeginChangePacket.BuildPacket(owner.actorId)); | ||||
|  | ||||
|             if (list[slot] != null)             | ||||
|                 normalInventory.RefreshItem(owner, list[slot], item);             | ||||
|             else | ||||
|                 normalInventory.RefreshItem(owner, item); | ||||
|  | ||||
|             owner.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, inventoryCapacity, inventoryCode)); | ||||
|             SendEquipmentPackets(slot, item); | ||||
|             owner.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); | ||||
|  | ||||
|             owner.QueuePacket(InventoryEndChangePacket.BuildPacket(owner.actorId)); | ||||
|  | ||||
|             list[slot] = item; | ||||
|             owner.CalculateBaseStats();// RecalculateStats(); | ||||
|         } | ||||
|  | ||||
|         public void ToggleDBWrite(bool flag) | ||||
|         { | ||||
|             writeToDB = flag; | ||||
|         } | ||||
|  | ||||
|         public void Unequip(ushort slot) | ||||
|         { | ||||
|             if (slot >= list.Length) | ||||
|                 return; | ||||
|  | ||||
|             if (writeToDB) | ||||
|                 Database.UnequipItem(owner, slot); | ||||
|  | ||||
|             owner.QueuePacket(InventoryBeginChangePacket.BuildPacket(owner.actorId)); | ||||
|  | ||||
|             normalInventory.RefreshItem(owner, list[slot]); | ||||
|  | ||||
|             owner.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, inventoryCapacity, inventoryCode)); | ||||
|             SendEquipmentPackets(slot, null); | ||||
|             owner.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); | ||||
|  | ||||
|             owner.QueuePacket(InventoryEndChangePacket.BuildPacket(owner.actorId)); | ||||
|  | ||||
|             list[slot] = null; | ||||
|             owner.RecalculateStats(); | ||||
|         } | ||||
|  | ||||
|         private void SendEquipmentPackets(ushort equipSlot, InventoryItem item) | ||||
|         { | ||||
|             if (item == null) | ||||
|                 owner.QueuePacket(InventoryRemoveX01Packet.BuildPacket(owner.actorId, equipSlot)); | ||||
|             else | ||||
|                 owner.QueuePacket(EquipmentListX01Packet.BuildPacket(owner.actorId, equipSlot, item.slot)); | ||||
|         } | ||||
|  | ||||
|         private void SendEquipmentPackets(List<ushort> slotsToUpdate) | ||||
|         { | ||||
|              | ||||
|             int currentIndex = 0; | ||||
|  | ||||
|             while (true) | ||||
|             { | ||||
|                 if (slotsToUpdate.Count - currentIndex >= 64) | ||||
|                     owner.QueuePacket(EquipmentListX64Packet.BuildPacket(owner.actorId, list, slotsToUpdate, ref currentIndex)); | ||||
|                 else if (slotsToUpdate.Count - currentIndex >= 32) | ||||
|                     owner.QueuePacket(EquipmentListX32Packet.BuildPacket(owner.actorId, list, slotsToUpdate, ref currentIndex)); | ||||
|                 else if (slotsToUpdate.Count - currentIndex >= 16) | ||||
|                     owner.QueuePacket(EquipmentListX16Packet.BuildPacket(owner.actorId, list, slotsToUpdate, ref currentIndex)); | ||||
|                 else if (slotsToUpdate.Count - currentIndex > 1) | ||||
|                     owner.QueuePacket(EquipmentListX08Packet.BuildPacket(owner.actorId, list, slotsToUpdate, ref currentIndex)); | ||||
|                 else if (slotsToUpdate.Count - currentIndex == 1) | ||||
|                 { | ||||
|                     owner.QueuePacket(EquipmentListX01Packet.BuildPacket(owner.actorId, slotsToUpdate[currentIndex], list[slotsToUpdate[currentIndex]].slot)); | ||||
|                     currentIndex++; | ||||
|                 } | ||||
|                 else | ||||
|                     break; | ||||
|             } | ||||
|  | ||||
|         } | ||||
|  | ||||
|         public int GetCapacity() | ||||
|         { | ||||
|             return list.Length; | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -23,19 +23,12 @@ 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 static FFXIVClassic_Map_Server.LuaUtils; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.Actors | ||||
| { | ||||
|     class Player : Character | ||||
|     { | ||||
|         public const int MAXSIZE_INVENTORY_NORMAL = 200; | ||||
|         public const int MAXSIZE_INVENTORY_CURRANCY = 320; | ||||
|         public const int MAXSIZE_INVENTORY_KEYITEMS = 500; | ||||
|         public const int MAXSIZE_INVENTORY_LOOT = 10; | ||||
|         public const int MAXSIZE_INVENTORY_MELDREQUEST = 4; | ||||
|         public const int MAXSIZE_INVENTORY_BAZAAR = 10; | ||||
|         public const int MAXSIZE_INVENTORY_EQUIPMENT = 35; | ||||
|  | ||||
|         public const int TIMER_TOTORAK = 0; | ||||
|         public const int TIMER_DZEMAEL = 1;         | ||||
|         public const int TIMER_BOWL_OF_EMBERS_HARD = 2; | ||||
| @@ -62,6 +55,25 @@ namespace FFXIVClassic_Map_Server.Actors | ||||
|         public const int NPCLS_ACTIVE   = 2; | ||||
|         public const int NPCLS_ALERT    = 3; | ||||
|  | ||||
|         public const int SLOT_MAINHAND = 0; | ||||
|         public const int SLOT_OFFHAND = 1; | ||||
|         public const int SLOT_THROWINGWEAPON = 4; | ||||
|         public const int SLOT_PACK = 5; | ||||
|         public const int SLOT_POUCH = 6; | ||||
|         public const int SLOT_HEAD = 8; | ||||
|         public const int SLOT_UNDERSHIRT = 9; | ||||
|         public const int SLOT_BODY = 10; | ||||
|         public const int SLOT_UNDERGARMENT = 11; | ||||
|         public const int SLOT_LEGS = 12; | ||||
|         public const int SLOT_HANDS = 13; | ||||
|         public const int SLOT_BOOTS = 14; | ||||
|         public const int SLOT_WAIST = 15; | ||||
|         public const int SLOT_NECK = 16; | ||||
|         public const int SLOT_EARS = 17; | ||||
|         public const int SLOT_WRISTS = 19; | ||||
|         public const int SLOT_RIGHTFINGER = 21; | ||||
|         public const int SLOT_LEFTFINGER = 22; | ||||
|  | ||||
|         public static int[] MAXEXP = {570, 700, 880, 1100, 1500, 1800, 2300, 3200, 4300, 5000,                   //Level <= 10 | ||||
|                                      5900, 6800, 7700, 8700, 9700, 11000, 12000, 13000, 15000, 16000,            //Level <= 20 | ||||
|                                      20000, 22000, 23000, 25000, 27000, 29000, 31000, 33000, 35000, 38000,       //Level <= 30 | ||||
| @@ -71,7 +83,6 @@ namespace FFXIVClassic_Map_Server.Actors | ||||
|         //Event Related | ||||
|         public uint currentEventOwner = 0; | ||||
|         public string currentEventName = ""; | ||||
|  | ||||
|         public Coroutine currentEventRunning; | ||||
|  | ||||
|         //Player Info | ||||
| @@ -84,9 +95,10 @@ 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 ReferencedItemPackage myOfferings; | ||||
|         private bool isTradeAccepted = false; | ||||
|  | ||||
|         //GC Related | ||||
|         public byte gcCurrent; | ||||
| @@ -115,6 +127,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; | ||||
| @@ -140,14 +156,13 @@ 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); | ||||
|  | ||||
|             equipment = new Equipment(this, inventories[Inventory.NORMAL], MAXSIZE_INVENTORY_EQUIPMENT, Inventory.EQUIPMENT); | ||||
|             itemPackages[ItemPackage.NORMAL] = new ItemPackage(this, ItemPackage.MAXSIZE_NORMAL, ItemPackage.NORMAL); | ||||
|             itemPackages[ItemPackage.KEYITEMS] = new ItemPackage(this, ItemPackage.MAXSIZE_KEYITEMS, ItemPackage.KEYITEMS); | ||||
|             itemPackages[ItemPackage.CURRENCY_CRYSTALS] = new ItemPackage(this, ItemPackage.MAXSIZE_CURRANCY, ItemPackage.CURRENCY_CRYSTALS); | ||||
|             itemPackages[ItemPackage.MELDREQUEST] = new ItemPackage(this, ItemPackage.MAXSIZE_MELDREQUEST, ItemPackage.MELDREQUEST); | ||||
|             itemPackages[ItemPackage.BAZAAR] = new ItemPackage(this, ItemPackage.MAXSIZE_BAZAAR, ItemPackage.BAZAAR); | ||||
|             itemPackages[ItemPackage.LOOT] = new ItemPackage(this, ItemPackage.MAXSIZE_LOOT, ItemPackage.LOOT); | ||||
|             equipment = new ReferencedItemPackage(this, ItemPackage.MAXSIZE_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++) | ||||
| @@ -230,7 +245,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(); | ||||
| @@ -476,7 +491,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) | ||||
| @@ -516,14 +542,14 @@ 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); | ||||
|             equipment.SendFullEquipment(false);    | ||||
|             QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId, true)); | ||||
|             itemPackages[ItemPackage.NORMAL].SendFullPackage(this); | ||||
|             itemPackages[ItemPackage.CURRENCY_CRYSTALS].SendFullPackage(this); | ||||
|             itemPackages[ItemPackage.KEYITEMS].SendFullPackage(this); | ||||
|             itemPackages[ItemPackage.BAZAAR].SendFullPackage(this); | ||||
|             itemPackages[ItemPackage.MELDREQUEST].SendFullPackage(this); | ||||
|             itemPackages[ItemPackage.LOOT].SendFullPackage(this); | ||||
|             equipment.SendUpdate(this);    | ||||
|             playerSession.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); | ||||
|             #endregion | ||||
|  | ||||
| @@ -625,6 +651,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) | ||||
| @@ -940,6 +993,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(); | ||||
|         } | ||||
| @@ -1012,6 +1067,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)             | ||||
| @@ -1057,18 +1122,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; | ||||
|         } | ||||
| @@ -1094,7 +1209,7 @@ namespace FFXIVClassic_Map_Server.Actors | ||||
|             return isZoneChanging; | ||||
|         } | ||||
|  | ||||
|         public Equipment GetEquipment() | ||||
|         public ReferencedItemPackage GetEquipment() | ||||
|         { | ||||
|             return equipment; | ||||
|         }      | ||||
| @@ -1578,16 +1693,10 @@ namespace FFXIVClassic_Map_Server.Actors | ||||
|             else | ||||
|                 return; | ||||
|  | ||||
|             QueuePacket(InventoryBeginChangePacket.BuildPacket(toBeExamined.actorId)); | ||||
|             toBeExamined.GetEquipment().SendCheckEquipmentToPlayer(this); | ||||
|             QueuePacket(InventoryBeginChangePacket.BuildPacket(toBeExamined.actorId, true)); | ||||
|             toBeExamined.GetEquipment().SendUpdateAsItemPackage(this, ItemPackage.MAXSIZE_EQUIPMENT_OTHERPLAYER, ItemPackage.EQUIPMENT_OTHERPLAYER); | ||||
|             QueuePacket(InventoryEndChangePacket.BuildPacket(toBeExamined.actorId)); | ||||
|         } | ||||
|  | ||||
|         public void SendMyTradeToPlayer(Player player) | ||||
|         { | ||||
|             Inventory tradeInventory = new Inventory(this, 4, Inventory.TRADE); | ||||
|             tradeInventory.SendFullInventory(player); | ||||
|         } | ||||
|         }         | ||||
|  | ||||
|         public void SendDataPacket(params object[] parameters) | ||||
|         { | ||||
| @@ -1599,13 +1708,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) | ||||
|         { | ||||
| @@ -1613,7 +1724,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); | ||||
|         } | ||||
| @@ -1621,7 +1743,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) | ||||
|         { | ||||
| @@ -2475,7 +2597,7 @@ namespace FFXIVClassic_Map_Server.Actors | ||||
|             base.CalculateBaseStats(); | ||||
|             //Add weapon property mod | ||||
|             var equip = GetEquipment(); | ||||
|             var mainHandItem = equip.GetItemAtSlot(Equipment.SLOT_MAINHAND); | ||||
|             var mainHandItem = equip.GetItemAtSlot(SLOT_MAINHAND); | ||||
|             var damageAttribute = 0; | ||||
|             var attackDelay = 3000; | ||||
|             var hitCount = 1; | ||||
| @@ -2549,5 +2671,120 @@ namespace FFXIVClassic_Map_Server.Actors | ||||
|             return equippedItem != null && equippedItem.itemId == itemId; | ||||
|         } | ||||
|  | ||||
|         public Retainer GetSpawnedRetainer() | ||||
|         { | ||||
|             return currentSpawnedRetainer; | ||||
|         } | ||||
|  | ||||
|         public void StartTradeTransaction(Player otherPlayer) | ||||
|         { | ||||
|             myOfferings = new ReferencedItemPackage(this, ItemPackage.MAXSIZE_TRADE, ItemPackage.TRADE);             | ||||
|             otherTrader = otherPlayer; | ||||
|             isTradeAccepted = false; | ||||
|         } | ||||
|  | ||||
|         public Player GetOtherTrader() | ||||
|         { | ||||
|             return otherTrader; | ||||
|         } | ||||
|  | ||||
|         public ReferencedItemPackage GetTradeOfferings() | ||||
|         { | ||||
|             return myOfferings; | ||||
|         } | ||||
|  | ||||
|         public bool IsTrading() | ||||
|         { | ||||
|             return otherTrader != null; | ||||
|         } | ||||
|  | ||||
|         public bool IsTradeAccepted() | ||||
|         { | ||||
|             return isTradeAccepted; | ||||
|         } | ||||
|          | ||||
|         public void AddTradeItem(ushort slot, ItemRefParam chosenItem, int tradeQuantity) | ||||
|         { | ||||
|             if (!IsTrading()) | ||||
|                 return; | ||||
|              | ||||
|             //Get chosen item | ||||
|             InventoryItem offeredItem = itemPackages[chosenItem.itemPackage].GetItemAtSlot(chosenItem.slot); | ||||
|             offeredItem.SetTradeQuantity(tradeQuantity); | ||||
|              | ||||
|             myOfferings.Set(slot, offeredItem); | ||||
|             SendTradePackets(); | ||||
|         } | ||||
|          | ||||
|         public void RemoveTradeItem(ushort slot) | ||||
|         { | ||||
|             if (!IsTrading()) | ||||
|                 return; | ||||
|  | ||||
|             InventoryItem offeredItem = myOfferings.GetItemAtSlot(slot); | ||||
|             offeredItem.SetNormal(); | ||||
|  | ||||
|             myOfferings.Clear(slot); | ||||
|             SendTradePackets(); | ||||
|         } | ||||
|  | ||||
|         public void ClearTradeItems() | ||||
|         { | ||||
|             if (!IsTrading()) | ||||
|                 return; | ||||
|  | ||||
|             for (ushort i = 0; i < myOfferings.GetCapacity(); i++) | ||||
|             { | ||||
|                 InventoryItem offeredItem = myOfferings.GetItemAtSlot(i); | ||||
|                 if (offeredItem != null) | ||||
|                     offeredItem.SetNormal(); | ||||
|             } | ||||
|  | ||||
|             myOfferings.ClearAll(); | ||||
|             SendTradePackets(); | ||||
|         } | ||||
|  | ||||
|         private void SendTradePackets() | ||||
|         { | ||||
|             //Send to self | ||||
|             QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId, true)); | ||||
|             myOfferings.SendUpdate(this); | ||||
|             QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); | ||||
|  | ||||
|             //Send to other trader | ||||
|             otherTrader.QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId, true)); | ||||
|             myOfferings.SendUpdateAsItemPackage(otherTrader); | ||||
|             otherTrader.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); | ||||
|         } | ||||
|  | ||||
|         public void AcceptTrade(bool accepted) | ||||
|         { | ||||
|             if (!IsTrading()) | ||||
|                 return; | ||||
|             isTradeAccepted = accepted;             | ||||
|         } | ||||
|  | ||||
|         public void FinishTradeTransaction() | ||||
|         { | ||||
|             if (myOfferings != null) | ||||
|             { | ||||
|                 myOfferings.ClearAll(); | ||||
|                 for (ushort i = 0; i < myOfferings.GetCapacity(); i++) | ||||
|                 { | ||||
|                     InventoryItem offeredItem = myOfferings.GetItemAtSlot(i); | ||||
|                     if (offeredItem != null) | ||||
|                         offeredItem.SetNormal(); | ||||
|                 } | ||||
|  | ||||
|                 QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId, true)); | ||||
|                 myOfferings.SendUpdate(this); | ||||
|                 QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); | ||||
|             } | ||||
|  | ||||
|             isTradeAccepted = false; | ||||
|             myOfferings = null; | ||||
|             otherTrader = null; | ||||
|         } | ||||
|          | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user