public void CastSpell(Object target, UInt32 SpellId) { SpellTargetFlags flags = 0; if (target == objectMgr.getPlayerObject()) { flags = SpellTargetFlags.Self; } else { flags = SpellTargetFlags.Unit; //Target(target as Unit); } PacketOut packet = new PacketOut(WorldServerOpCode.CMSG_CAST_SPELL); packet.Write(SpellId); packet.Write((byte)0); // unk flags in WCell packet.Write((UInt32)flags); // 0x18A02 if (flags.Has(SpellTargetFlags.SpellTargetFlag_Dynamic_0x10000 | SpellTargetFlags.Corpse | SpellTargetFlags.Object | SpellTargetFlags.PvPCorpse | SpellTargetFlags.Unit)) { packet.Write(target.Guid.GetNewGuid()); } // 0x1010 if (flags.Has(SpellTargetFlags.TradeItem | SpellTargetFlags.Item)) { packet.Write(target.Guid.GetNewGuid()); } // 0x20 if (flags.Has(SpellTargetFlags.SourceLocation)) { packet.Write(objectMgr.getPlayerObject().Position.X); packet.Write(objectMgr.getPlayerObject().Position.Y); packet.Write(objectMgr.getPlayerObject().Position.Z); } // 0x40 if (flags.Has(SpellTargetFlags.DestinationLocation)) { packet.Write(target.Guid.GetNewGuid()); packet.Write(target.Position.X); packet.Write(target.Position.Y); packet.Write(target.Position.Z); } Send(packet); }
public static bool HasAnyFlag(this SpellTargetFlags flags, SpellTargetFlags otherFlags) { return (flags & otherFlags) != 0; }
/// <summary> /// This starts a spell-cast, requested by the client. /// The client submits where or what the user selected in the packet. /// </summary> internal SpellFailedReason Start(Spell spell, RealmPacketIn packet, byte castId, byte unkFlags) { isPlayerCast = true; //var stopwatch = Stopwatch.StartNew(); if (IsCasting) { if (!IsChanneling) { SpellHandler.SendCastFailed(Client, castId, spell, SpellFailedReason.SpellInProgress); return SpellFailedReason.SpellInProgress; } else { Cancel(SpellFailedReason.DontReport); } } Map = CasterObject.Map; Phase = CasterObject.Phase; m_casting = true; m_spell = spell; Id = castId; //byte unkFlag = packet.ReadByte(); // TODO: Corpse flags //(targetFlags & SpellCastTargetFlags.Corpse) != 0 || // (targetFlags & SpellCastTargetFlags.ReleasedCorpse) != 0) { // read the target-information, sent with the Spell WorldObject selected = null; bool targetFound = false; TargetFlags = (SpellTargetFlags)packet.ReadUInt32(); // 0x0 if (TargetFlags == SpellTargetFlags.Self) { targetFound = true; TargetLoc = CasterObject.Position; selected = CasterObject; } // 0x18A02 if (TargetFlags.HasAnyFlag( SpellTargetFlags.SpellTargetFlag_Dynamic_0x10000 | SpellTargetFlags.Corpse | SpellTargetFlags.Object | SpellTargetFlags.PvPCorpse | SpellTargetFlags.Unit)) { // The user selected an Object var uid = packet.ReadPackedEntityId(); selected = Map.GetObject(uid); if (selected == null || !CasterObject.CanSee(selected)) { Cancel(SpellFailedReason.BadTargets); return SpellFailedReason.BadTargets; } targetFound = true; TargetLoc = selected.Position; } // 0x1010 if (CasterObject is Character && TargetFlags.HasAnyFlag(SpellTargetFlags.TradeItem | SpellTargetFlags.Item)) { var uid = packet.ReadPackedEntityId(); TargetItem = ((Character)CasterObject).Inventory.GetItem(uid); if (TargetItem == null || !TargetItem.CanBeUsed) { Cancel(SpellFailedReason.BadTargets); return SpellFailedReason.BadTargets; } } // 0x20 if (TargetFlags.HasAnyFlag(SpellTargetFlags.SourceLocation)) { Map.GetObject(packet.ReadPackedEntityId()); // since 3.2.0 //SourceLoc = new Vector3(packet.ReadFloat(), packet.ReadFloat(), packet.ReadFloat()); } SourceLoc = CasterObject.Position; // 0x40 if (TargetFlags.HasAnyFlag(SpellTargetFlags.DestinationLocation)) { selected = Map.GetObject(packet.ReadPackedEntityId()); TargetLoc = new Vector3(packet.ReadFloat(), packet.ReadFloat(), packet.ReadFloat()); //Console.WriteLine("SpellCast.Start - DestLoc {0}", TargetLoc); targetFound = true; } // 0x2000 if (TargetFlags.HasAnyFlag(SpellTargetFlags.String)) { StringTarget = packet.ReadCString(); } if ((unkFlags & 2) != 0) { float f1 = packet.ReadFloat(); float f2 = packet.ReadFloat(); byte b1 = packet.ReadByte(); // here the client appends a MSG_MOVE_STOP movement packet } // special cast handler: Interrupt casting and call the handler instead // for Spell-overrides through Addons if (spell.SpecialCast != null) { spell.SpecialCast(spell, CasterObject, selected, ref TargetLoc); Cancel(SpellFailedReason.DontReport); return SpellFailedReason.DontReport; } if (targetFound) { // default checks if (selected != CasterObject) { if (CasterObject is Character) { // check range var chr = CasterObject as Character; var sqDistance = CasterObject.GetDistanceSq(ref TargetLoc); if (!Utility.IsInRange(sqDistance, chr.GetSpellMaxRange(spell, selected)) || (selected != null && selected.Map != CasterObject.Map)) { Cancel(SpellFailedReason.OutOfRange); return SpellFailedReason.OutOfRange; } if (Utility.IsInRange(sqDistance, spell.Range.MinDist)) { Cancel(SpellFailedReason.TooClose); return SpellFailedReason.TooClose; } } if (selected != null && !selected.IsInWorld) { Cancel(SpellFailedReason.OutOfRange); return SpellFailedReason.OutOfRange; } } Selected = selected; } if (spell.RequiredTargetId != 0) { // check for custom Targets if (Selected == null || Selected.EntryId != spell.RequiredTargetId || !spell.MatchesRequiredTargetType(Selected)) { Cancel(SpellFailedReason.BadTargets); return SpellFailedReason.BadTargets; } } //if (selected == null && Caster is Unit) //{ // Selected = ((Unit)Caster).Target; //} var reason = Prepare(); if (reason == SpellFailedReason.Ok) { return FinishPrepare(); } //if (CasterChar != null) //{ // CasterChar.SendSystemMessage("SpellCast (Total): {0} ms", stopwatch.ElapsedTicks / 10000d); //} return reason; }
/// <summary> /// Close the timer and get rid of circular references; will be called automatically /// </summary> internal protected void Cleanup(bool finalCleanup) { isPlayerCast = false; Id = 0; m_casting = false; if (m_spell.IsTame && Selected is NPC) { ((NPC)Selected).CurrentTamer = null; } TargetItem = null; CasterItem = null; m_castTimer.Stop(); m_initialTargets = null; m_handlers = null; m_passiveCast = false; m_pushbacks = 0; m_spell = null; TriggerEffect = null; TargetFlags = 0; if (m_targets != null) { m_targets.Clear(); } if (finalCleanup) { DoFinalCleanup(m_handlers); } }
public static bool HasAnyFlag(this SpellTargetFlags flags, SpellTargetFlags otherFlags) { return((flags & otherFlags) != SpellTargetFlags.Self); }
public static bool Has(this SpellTargetFlags flags, SpellTargetFlags toCheck) { return (flags & toCheck) != 0; }
public static bool Has(this SpellTargetFlags flags, SpellTargetFlags toCheck) { return((flags & toCheck) != 0); }