/// <summary> /// Sends any kind of extra command-bar to control other entities, such as NPCs, vehicles etc /// </summary> /// <param name="owner"></param> //public static void SendSpells(Character owner, NPC npc, uint duration, // PetAttackMode attackMode, PetAction action, PetFlags flags, // PetActionEntry[] petActions, // PetSpell[] spells) public static void SendSpells(Character owner, NPC pet, PetAction currentAction) { // TODO: Cooldowns var record = pet.PetRecord; var mode = pet.Entry.Type == CreatureType.NonCombatPet ? PetAttackMode.Passive : PetAttackMode.Defensive; var flags = PetFlags.None; uint[] actions = null; if(record != null) { mode = record.AttackMode; flags = record.Flags; actions = record.ActionButtons; } if (actions == null) actions = pet.BuildPetActionBar(); using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_PET_SPELLS, 20 + (PetConstants.PetActionCount * 4) + 1 + (pet.Spells.Count) + 1 + (0))) { packet.Write(pet.EntityId); packet.Write((ushort)pet.Entry.FamilyId); packet.Write(pet.RemainingDecayDelayMillis); // duration packet.Write((byte)mode); packet.Write((byte)currentAction); packet.Write((ushort)flags); for (var i = 0; i < PetConstants.PetActionCount; i++) { var action = actions[i]; packet.Write(action); } var spellPos = packet.Position; ++packet.Position; var spellCount = 0; foreach (var spell in pet.Spells) { if (!spell.IsPassive) { packet.Write((ushort)spell.Id); packet.Write((ushort)PetSpellState.Enabled); ++spellCount; } } packet.Write((byte)0); // TODO: Cooldowns packet.Position = spellPos; packet.Write((byte)spellCount); owner.Send(packet); } }