/// <summary> /// Sends pet's death to client. /// </summary> /// <param name="death">True if removal was caused by death</param> public void SendPetRemove(bool death) { if (!CbtInterface.IsAttacking && Owner != null && _ownerUILinked && !IsStationary && !death) { IPetCareerInterface petCareer = Owner.CrrInterface as IPetCareerInterface; if (petCareer != null) { petCareer.SummonPet(PetId); } } if (!_ownerUILinked || Owner == null) { return; } PacketOut Out = new PacketOut((byte)Opcodes.F_PET_INFO, 12); Out.WriteUInt16(Oid); Out.WriteUInt16(0); Out.WriteUInt16(0); Out.WriteByte(0); Out.WriteByte(0); Out.WriteByte((byte)PetUpdateType.Remove); Out.WriteByte(0); Out.WriteByte(0); Owner.SendPacket(Out); }
public override void Dispose() { if (IsDisposed) { return; } AbtInterface.NPCAbilities.Clear(); // Remove any owner events before disposing Owner.EvtInterface.RemoveEventNotify(EventName.OnDealDamage, Attack); Owner.EvtInterface.RemoveEventNotify(EventName.OnLeaveCombat, Recall); Owner.EvtInterface.RemoveEventNotify(EventName.OnDie, Dismiss); Owner.EvtInterface.RemoveEventNotify(EventName.OnRemoveFromWorld, Dismiss); #if DIST_DEBUG && DEBUG Owner.EvtInterface.RemoveEvent(DistanceDebug); #endif if (_ownerUILinked) { IPetCareerInterface petInterface = Owner.CrrInterface as IPetCareerInterface; petInterface?.Notify_PetDown(); _ownerUILinked = false; } base.Dispose(); }
public override void Destroy() { if (!PendingDisposal) { PendingDisposal = true; if (!IsDead) { IPetCareerInterface petInterface = Owner.CrrInterface as IPetCareerInterface; petInterface?.Notify_PetDown(); } } }
protected override void SetDeath(Unit killer) { Health = 0; States.Add((byte)CreatureState.Dead); // Death State PacketOut Out = new PacketOut((byte)Opcodes.F_OBJECT_DEATH, 12); Out.WriteUInt16(Oid); Out.WriteByte(1); Out.WriteByte(0); Out.WriteUInt16(killer.IsPet() ? killer.GetPet().Owner.Oid : killer.Oid); Out.Fill(0, 6); DispatchPacket(Out, true); AbtInterface.Cancel(true); ScrInterface.OnDie(this); BuffInterface.RemoveBuffsOnDeath(); EvtInterface.Notify(EventName.OnDie, this, killer); AiInterface.ProcessCombatEnd(); EvtInterface.AddEvent(RezUnit, 10000, 1); // Clear the object in 10 seconds. if (_ownerUILinked) { SendPetRemove(true); IPetCareerInterface petInterface = Owner.CrrInterface as IPetCareerInterface; petInterface?.Notify_PetDown(); _ownerUILinked = false; } }
public static void F_COMMAND_CONTROLLED(BaseClient client, PacketIn packet) { GameClient cclient = (GameClient)client; if (cclient.Plr?.CrrInterface == null) { return; } IPetCareerInterface petInterface = cclient.Plr.CrrInterface as IPetCareerInterface; Pet myPet = petInterface?.myPet; if (myPet == null) { return; } ushort abilityid = packet.GetUint16(); PetCommand command = (PetCommand)packet.GetUint8(); switch (command) { case PetCommand.Stay: if (cclient.Plr.IsMounted) { return; } myPet.MvtInterface.StopMove(); myPet.FollowMode = 1; myPet.IsHeeling = false; myPet.AiInterface.Debugger?.SendClientMessage("[MR]: Holding position by request."); myPet.SendPetUpdate(); break; // stay case PetCommand.Follow: if (cclient.Plr.IsMounted) { return; } myPet.AiInterface.ProcessCombatEnd(); if (myPet.StsInterface.Speed == 0) { break; } myPet.MvtInterface.ScaleSpeed(myPet.SpeedMult); myPet.MvtInterface.Recall(cclient.Plr); myPet.FollowMode = 2; myPet.AiInterface.Debugger?.SendClientMessage("[MR]: Heeling by request."); myPet.SendPetUpdate(); break; // heel case PetCommand.Passive: myPet.AiInterface.SetBrain(new PassiveBrain(myPet)); petInterface.AIMode = 3; myPet.AIMode = 3; myPet.AiInterface.Debugger?.SendClientMessage("[MR]: Passive state."); break; // mode Passive case PetCommand.Defensive: myPet.AiInterface.SetBrain(new GuardBrain(myPet)); petInterface.AIMode = 4; myPet.AIMode = 4; myPet.AiInterface.Debugger?.SendClientMessage("[MR]: Defensive state."); break; // mode Defensive case PetCommand.Aggressive: myPet.AiInterface.SetBrain(new AggressiveBrain(myPet)); petInterface.AIMode = 5; myPet.AIMode = 5; myPet.AiInterface.Debugger?.SendClientMessage("[MR]: Aggressive state."); break; // mode Aggressive case PetCommand.Attack: long now = TCPManager.GetTimeStampMS(); if (cclient.Plr.IsMounted || now <= myPet.AttackReuseTimer + COMMAND_ATTACK_REUSE) { return; } myPet.AttackReuseTimer = now; Unit target = cclient.Plr.CbtInterface.GetTarget(TargetTypes.TARGETTYPES_TARGET_ENEMY); if (target == null || !CombatInterface.CanAttack(myPet, target)) { return; } if (!cclient.Plr.LOSHit(target)) { return; } myPet.AiInterface.Debugger?.SendClientMessage("[MR]: Attacking by request."); myPet.IsHeeling = false; myPet.FollowMode = 0; myPet.Owner.CbtInterface.RefreshCombatTimer(); myPet.AiInterface.ProcessCombatStart(target); myPet.SendPetUpdate(); break; //attack case PetCommand.Release: myPet.Destroy(); break; case PetCommand.AbilityCast: if (cclient.Plr.IsMounted) { return; } foreach (NPCAbility pa in myPet.AbtInterface.NPCAbilities) { if (pa.Entry == abilityid) { if (pa.Range > 0) { Unit abTarget = myPet.CbtInterface.GetCurrentTarget(); if (abTarget == null || !myPet.LOSHit(abTarget)) { return; } } myPet.AbtInterface.StartCast(myPet, abilityid, 1); break; } } break; case PetCommand.Autocast: if (cclient.Plr.IsMounted) { return; } foreach (NPCAbility pa in myPet.AbtInterface.NPCAbilities) { if (pa.Entry != abilityid) { continue; } pa.AutoUse = !pa.AutoUse; myPet.SendPetUpdate(); break; } break; } }