Example #1
0
        //[PacketHandler(RealmServerOpCode.CMSG_GMTICKET_CREATE)]
        public static void HandleCreateTicketPacket(IRealmClient client, RealmPacketIn packet)
        {
            var chr = client.ActiveCharacter;

            if (chr.Ticket == null)
            {
                var map  = (MapId)packet.ReadUInt32();
                var x    = packet.ReadFloat();
                var y    = packet.ReadFloat();
                var z    = packet.ReadFloat();
                var msg  = packet.ReadCString();
                var type = (TicketType)packet.ReadUInt32();   // prev. unk0

                var unk1 = packet.ReadByte();                 // unk1, 1
                var unk2 = packet.ReadUInt32();               // unk2, 0
                var unk3 = packet.ReadUInt32();               // unk3, 0

                var ticket = new Ticket(chr, msg, type);

                TicketMgr.Instance.AddTicket(ticket);
                chr.Ticket = ticket;
                SendCreateResponse(client, TicketInfoResponse.Saved);
            }
            else
            {
                SendCreateResponse(client, TicketInfoResponse.Fail);
            }
        }
Example #2
0
		public static void HandleCreateTicketPacket(IRealmClient client, RealmPacketIn packet)
		{
			var chr = client.ActiveCharacter;
			if (chr.Ticket == null)
			{
				var map = (MapId)packet.ReadUInt32();
				var x = packet.ReadFloat();
				var y = packet.ReadFloat();
				var z = packet.ReadFloat();
				var msg = packet.ReadCString();
				var type = (TicketType)packet.ReadUInt32(); // prev. unk0

				var unk1 = packet.ReadByte(); // unk1, 1
				var unk2 = packet.ReadUInt32(); // unk2, 0
				var unk3 = packet.ReadUInt32(); // unk3, 0

				var ticket = new Ticket(chr, msg, type);

				TicketMgr.Instance.AddTicket(ticket);
				chr.Ticket = ticket;
				SendCreateResponse(client, TicketInfoResponse.Saved);
			}
			else
			{
				SendCreateResponse(client, TicketInfoResponse.Fail);
			}
		}
Example #3
0
        public static void HandleCreateTicketPacket(IRealmClient client, RealmPacketIn packet)
        {
            Character activeCharacter = client.ActiveCharacter;

            if (activeCharacter.Ticket == null)
            {
                int        num1    = (int)packet.ReadUInt32();
                double     num2    = packet.ReadFloat();
                double     num3    = packet.ReadFloat();
                double     num4    = packet.ReadFloat();
                string     message = packet.ReadCString();
                TicketType type    = (TicketType)packet.ReadUInt32();
                int        num5    = packet.ReadByte();
                int        num6    = (int)packet.ReadUInt32();
                int        num7    = (int)packet.ReadUInt32();
                Ticket     ticket  = new Ticket(activeCharacter, message, type);
                TicketMgr.Instance.AddTicket(ticket);
                activeCharacter.Ticket = ticket;
                SendCreateResponse(client, TicketInfoResponse.Saved);
            }
            else
            {
                SendCreateResponse(client, TicketInfoResponse.Fail);
            }
        }
Example #4
0
 //[PacketHandler(RealmServerOpCode.CMSG_GM_REPORT_LAG)]
 public static void HandleReportLagTicket(IRealmClient client, RealmPacketIn packet)
 {
     var type = (TicketReportLagType)packet.ReadUInt32();
     var unk0 = packet.ReadUInt32();             // Seems to be always 0
     var posX = packet.ReadFloat();
     var posY = packet.ReadFloat();
     var posZ = packet.ReadFloat();
 }
Example #5
0
 public static void HandleReportLagTicket(IRealmClient client, RealmPacketIn packet)
 {
     int    num1 = (int)packet.ReadUInt32();
     int    num2 = (int)packet.ReadUInt32();
     double num3 = packet.ReadFloat();
     double num4 = packet.ReadFloat();
     double num5 = packet.ReadFloat();
 }
Example #6
0
		public static void HandleReportLagTicket(IRealmClient client, RealmPacketIn packet)
		{
			var type = (TicketReportLagType)packet.ReadUInt32();
			var unk0 = packet.ReadUInt32(); // Seems to be always 0
			var posX = packet.ReadFloat();
			var posY = packet.ReadFloat();
			var posZ = packet.ReadFloat();
		}
Example #7
0
        /// <summary>The client sends this after he was rooted</summary>
        public static void HandleRootAck(IRealmClient client, RealmPacketIn packet)
        {
            Character activeCharacter = client.ActiveCharacter;

            packet.ReadPackedEntityId();
            int    num1 = (int)packet.ReadUInt32();
            int    num2 = (int)packet.ReadUInt32();
            double num3 = (double)packet.ReadFloat();
            double num4 = (double)packet.ReadFloat();
            double num5 = (double)packet.ReadFloat();
            double num6 = (double)packet.ReadFloat();
        }
Example #8
0
        /// <summary>Handles an incoming minimap ping</summary>
        /// <param name="client">the Session the incoming packet belongs to</param>
        /// <param name="packet">the full packet</param>
        public static void MinimapPing(IRealmClient client, RealmPacketIn packet)
        {
            float       x           = packet.ReadFloat();
            float       y           = packet.ReadFloat();
            GroupMember groupMember = client.ActiveCharacter.GroupMember;

            if (groupMember == null)
            {
                return;
            }
            groupMember.Group.SendPing(groupMember, x, y);
        }
Example #9
0
        /// <summary>
        /// The client sends this after he was rooted
        /// </summary>
        //[ClientPacketHandler((RealmServerOpCode.CMSG_FORCE_MOVE_ROOT_ACK, IsGamePacket = false)]
        public static void HandleRootAck(IRealmClient client, RealmPacketIn packet)
        {
            var chr = client.ActiveCharacter;

            var chrEntityId = packet.ReadPackedEntityId();
            var unknown1    = packet.ReadUInt32();
            var unknown2    = packet.ReadUInt32();
            var posX        = packet.ReadFloat();
            var posY        = packet.ReadFloat();
            var posZ        = packet.ReadFloat();
            var orientation = packet.ReadFloat();

            // TODO: find something to do with this information
        }
Example #10
0
        /// <summary>
        /// Handles an incoming minimap ping
        /// </summary>
        /// <param name="client">the Session the incoming packet belongs to</param>
        /// <param name="packet">the full packet</param>
        //[ClientPacketHandler((RealmServerOpCode.MSG_MINIMAP_PING)]
        public static void MinimapPing(IRealmClient client, RealmPacketIn packet)
        {
            var x = packet.ReadFloat();
            var y = packet.ReadFloat();

            var member = client.ActiveCharacter.GroupMember;

            if (member == null)
            {
                return;
            }

            member.Group.SendPing(member, x, y);
        }
Example #11
0
        public static void EndMoveRequest(IRealmClient client, RealmPacketIn packet)
        {
            packet.Position -= 3;
            float x  = packet.ReadFloat();
            float y  = packet.ReadFloat();
            float x1 = packet.ReadFloat();
            float y1 = packet.ReadFloat();

            packet.Position += 4;
            short target = packet.ReadInt16();

            client.ActiveCharacter.IsMoving = false;
            Asda2MovmentHandler.SendEndMoveCommonResponse(client, x, y, x1, y1, target);
        }
Example #12
0
        [PacketHandler(RealmServerOpCode.EndMove)]//4008
        public static void EndMoveRequest(IRealmClient client, RealmPacketIn packet)
        {
            packet.Position -= 3;        //nk6 default : 1000Len : 8
            var x  = packet.ReadFloat(); //default : 1192383353Len : 4
            var y  = packet.ReadFloat(); //default : 1195875328Len : 4
            var x0 = packet.ReadFloat(); //default : 1192383353Len : 4
            var y0 = packet.ReadFloat(); //default : 1195875328Len : 4

            //Util.NLog.LogUtil.WarnException("{0} {1} {2} {3}",x,y,x0,y0);
            packet.Position += 4;
            var target = packet.ReadInt16();

            client.ActiveCharacter.IsMoving = false;
            SendEndMoveCommonResponse(client, x, y, x0, y0, target);

            /*  try
             * {
             * //(byte;70)z(single;0)x(single;1)y(single;1)
             * /* packet.ReadByte();
             * packet.ReadSingle();
             * var x = packet.ReadSingle();
             * var y = packet.ReadSingle();#1#
             * var chr = client.ActiveCharacter;
             *  if(chr.IsMoving)
             *  {
             *      chr.IsMoving = false;
             *      //SendEndMoveCommonResponse(chr);
             *      return;
             *  }
             * if ((chr.EndMoveCount+1) % 6 == 0)
             * {
             *  SendStartMoveCommonToOneClienResponset(chr, chr.Client,true);
             * }
             *  if (chr.EndMoveCount == 40)
             * {
             *  //chr.TeleportToBindLocation();
             *  Asda2CharacterHandler.SendResurectResponse(chr);
             * }
             * chr.EndMoveCount++;
             * }
             * catch (System.IO.EndOfStreamException) { }*/
        }
Example #13
0
        public static void HandleMoveSetRawPosition(IRealmClient client, RealmPacketIn packet)
        {
            var pos = packet.ReadVector3();
            float orientation = packet.ReadFloat();

			var region = client.ActiveCharacter.Region;
			if (region != null)
			{
				client.ActiveCharacter.TeleportTo(region, ref pos);
			}
        }
        public static void HandleMoveSetRawPosition(IRealmClient client, RealmPacketIn packet)
        {
            Vector3 pos = packet.ReadVector3();
            double  num = (double)packet.ReadFloat();
            Map     map = client.ActiveCharacter.Map;

            if (map == null)
            {
                return;
            }
            client.ActiveCharacter.TeleportTo(map, ref pos);
        }
        public static void HandleMoveSetRawPosition(IRealmClient client, RealmPacketIn packet)
        {
            var   pos         = packet.ReadVector3();
            float orientation = packet.ReadFloat();

            var map = client.ActiveCharacter.Map;

            if (map != null)
            {
                client.ActiveCharacter.TeleportTo(map, ref pos);
            }
        }
        public static void HandleWorldTeleport(IRealmClient client, RealmPacketIn packet)
        {
            int     num1            = (int)packet.ReadUInt32();
            MapId   mapId           = (MapId)packet.ReadUInt32();
            Vector3 pos             = packet.ReadVector3();
            double  num2            = (double)packet.ReadFloat();
            Map     nonInstancedMap = WCell.RealmServer.Global.World.GetNonInstancedMap(mapId);

            if (nonInstancedMap == null)
            {
                return;
            }
            client.ActiveCharacter.TeleportTo(nonInstancedMap, ref pos);
        }
Example #17
0
        public static void HandleWorldTeleport(IRealmClient client, RealmPacketIn packet)
        {
            uint time = packet.ReadUInt32();
			MapId mapId = (MapId)packet.ReadUInt32();

			var pos = packet.ReadVector3();
            float orientation = packet.ReadFloat(); // in client specified as degrees

			var region = World.GetRegion(mapId);
			if (region != null)
			{
				client.ActiveCharacter.TeleportTo(region, ref pos);
			}
        }
        public static void HandleWorldTeleport(IRealmClient client, RealmPacketIn packet)
        {
            uint  time  = packet.ReadUInt32();
            MapId mapId = (MapId)packet.ReadUInt32();

            var   pos         = packet.ReadVector3();
            float orientation = packet.ReadFloat(); // in client specified as degrees

            var map = World.GetNonInstancedMap(mapId);

            if (map != null)
            {
                client.ActiveCharacter.TeleportTo(map, ref pos);
            }
        }
Example #19
0
        public static void HandleBuyItem(IRealmClient client, RealmPacketIn packet)
        {
            var vendorId    = packet.ReadEntityId();
            var itemEntryId = packet.ReadUInt32();

            //var slot = packet.ReadUInt32();			// slot in the vendor list
            packet.ReadFloat();                                                         // unknown float
            //var count = packet.ReadUInt32();
            var amount = packet.ReadInt32();

            var chr    = client.ActiveCharacter;
            var vendor = chr.Map.GetObject(vendorId) as NPC;

            if (vendor != null && vendor.IsVendor)
            {
                vendor.VendorEntry.BuyItem(chr, itemEntryId, chr.Inventory, amount, BaseInventory.INVALID_SLOT);
            }
        }
Example #20
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="packet">The packet to read the info from</param>
        /// <param name="chr">The active character in the client that send the movement packet</param>
        /// <param name="mover">The unit we want this movement info to affect</param>
        /// <param name="clientTime">Used to return the read client time</param>
        /// <returns>A boolean value used to determine broadcasting of this movement info to other clients</returns>
        public static bool ReadMovementInfo(RealmPacketIn packet, Character chr, Unit mover, out uint clientTime)
        {
            var moveFlags = (MovementFlags)packet.ReadInt32();
            //var moveFlags2 = (MovementFlags2)packet.ReadInt32();
            var moveFlags2 = (MovementFlags2)packet.ReadInt16();

            //var moveFlags2 = MovementFlags2.None;

            clientTime = packet.ReadUInt32();
            //var delay = Utility.GetEpochTime() - clientTime;

            var newPosition = packet.ReadVector3();
            var orientation = packet.ReadFloat();

            if (moveFlags.HasFlag(MovementFlags.OnTransport))
            {
                var transportId          = packet.ReadPackedEntityId();
                var transportPosition    = packet.ReadVector3();
                var transportOrientation = packet.ReadFloat();
                var transportTime        = packet.ReadUInt32();
                var transportSeat        = packet.ReadByte();

                var transport = mover.Map.GetObject(transportId) as ITransportInfo;
                var isVehicle = transport is Vehicle;
                //if (transport == null || !transport.IsInRadius(chr, 100f))
                if (transport == null)
                {
                    if (mover.Transport != null)
                    {
                        mover.Transport.RemovePassenger(mover);
                    }
                    //client.ActiveCharacter.Kick("Invalid Transport flag");
                    return(false);
                }

                if (mover.TransportInfo != transport)
                {
                    if (!isVehicle)
                    {
                        ((Transport)transport).AddPassenger(mover);
                    }
                    else
                    {
                        return(false);
                    }
                }

                if (!isVehicle)
                {
                    mover.TransportPosition    = transportPosition;
                    mover.TransportOrientation = transportOrientation;
                    mover.TransportTime        = transportTime;
                }
            }
            else if (mover.Transport != null)
            {
                mover.Transport.RemovePassenger(mover);
            }

            if (moveFlags.HasFlag(MovementFlags.Swimming | MovementFlags.Flying) ||
                moveFlags2.HasFlag(MovementFlags2.AlwaysAllowPitching))
            {
                if (moveFlags.HasFlag(MovementFlags.Flying) && !chr.CanFly)
                {
                    return(false);
                }

                // pitch, ranges from -1.55 to 1.55
                var pitch = packet.ReadFloat();

                if (chr == mover)
                {
                    chr.MovePitch(pitch);
                }
            }

            var airTime = packet.ReadUInt32();

            if (moveFlags.HasFlag(MovementFlags.Falling))
            {
                // constant, but different when jumping in water and on land?
                var jumpFloat1 = packet.ReadFloat();

                // sin + cos of angle between orientation and players orientation
                var jumpSinAngle = packet.ReadFloat();
                var jumpCosAngle = packet.ReadFloat();
                // speed of xy movement
                var jumpXYSpeed = packet.ReadFloat();

                //chr.OnFalling(airTime, jumpXYSpeed);
            }

            if (packet.PacketId.RawId == (uint)RealmServerOpCode.MSG_MOVE_FALL_LAND && chr == mover)
            {
                chr.OnFalling();
            }

            if (moveFlags.HasFlag(MovementFlags.Swimming) && chr == mover)
            {
                chr.OnSwim();
            }
            else if (chr.IsSwimming && chr == mover)
            {
                chr.OnStopSwimming();
            }

            if (moveFlags.HasFlag(MovementFlags.SplineElevation))
            {
                var spline = packet.ReadFloat();
            }

            // it is only orientation if it is none of the packets below, and has no flags but orientation flags
            var onlyOrientation = newPosition == mover.Position;

            if (!onlyOrientation && (mover.IsInWorld && !mover.SetPosition(newPosition, orientation)))
            {
                // rather unrealistic case
            }
            else
            {
                if (onlyOrientation)
                {
                    mover.Orientation = orientation;
                }
                else
                {
                    mover.OnMove();
                }

                mover.MovementFlags  = moveFlags;
                mover.MovementFlags2 = moveFlags2;

                if (onlyOrientation)
                {
                    mover.Orientation = orientation;
                }
                else
                {
                    if (!mover.CanMove)
                    {
                        // cannot kick, since sometimes packets simply have bad timing
                        //chr.Kick("Illegal movement.");
                        return(false);
                    }
                }
                return(true);
            }
            return(false);
        }
Example #21
0
        public static void MinimapPing(IRealmClient client, RealmPacketIn packet)
        {
            var x = packet.ReadFloat();
            var y = packet.ReadFloat();

            var member = client.ActiveCharacter.GroupMember;

            if (member == null)
                return;

            member.Group.SendPing(member, x, y);
        }
Example #22
0
		public static void HandleBuyItem(IRealmClient client, RealmPacketIn packet)
		{
			var vendorId = packet.ReadEntityId();
			var itemEntryId = packet.ReadUInt32();
            //var slot = packet.ReadUInt32();			// slot in the vendor list
			packet.ReadFloat();						// unknown float
            //var count = packet.ReadUInt32();
			var amount = packet.ReadInt32();

			var chr = client.ActiveCharacter;
			var vendor = chr.Region.GetObject(vendorId) as NPC;
			if (vendor != null && vendor.IsVendor)
			{
				vendor.VendorEntry.BuyItem(chr, itemEntryId, chr.Inventory, amount, BaseInventory.INVALID_SLOT);
			}
		}
Example #23
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="packet">The packet to read the info from</param>
        /// <param name="chr">The active character in the client that send the movement packet</param>
        /// <param name="mover">The unit we want this movement info to affect</param>
        /// <param name="clientTime">Used to return the read client time</param>
        /// <returns>A boolean value used to determine broadcasting of this movement info to other clients</returns>
        public static bool ReadMovementInfo(RealmPacketIn packet, Character chr, Unit mover, out uint clientTime)
        {
            MovementFlags  movementFlags  = (MovementFlags)packet.ReadInt32();
            MovementFlags2 movementFlags2 = (MovementFlags2)packet.ReadInt16();

            clientTime = packet.ReadUInt32();
            Vector3 pt          = packet.ReadVector3();
            float   orientation = packet.ReadFloat();

            if (movementFlags.HasFlag((Enum)MovementFlags.OnTransport))
            {
                EntityId       id            = packet.ReadPackedEntityId();
                Vector3        vector3       = packet.ReadVector3();
                float          num1          = packet.ReadFloat();
                uint           num2          = packet.ReadUInt32();
                int            num3          = (int)packet.ReadByte();
                ITransportInfo transportInfo = mover.Map.GetObject(id) as ITransportInfo;
                bool           flag          = transportInfo is Vehicle;
                if (transportInfo == null)
                {
                    if (mover.Transport != null)
                    {
                        mover.Transport.RemovePassenger(mover);
                    }
                    return(false);
                }

                if (mover.TransportInfo != transportInfo)
                {
                    if (flag)
                    {
                        return(false);
                    }
                    ((Transport)transportInfo).AddPassenger(mover);
                }

                if (!flag)
                {
                    mover.TransportPosition    = vector3;
                    mover.TransportOrientation = num1;
                    mover.TransportTime        = num2;
                }
            }
            else if (mover.Transport != null)
            {
                mover.Transport.RemovePassenger(mover);
            }

            if (movementFlags.HasFlag((Enum)(MovementFlags.Swimming | MovementFlags.Flying)) ||
                movementFlags2.HasFlag((Enum)MovementFlags2.AlwaysAllowPitching))
            {
                if (movementFlags.HasFlag((Enum)MovementFlags.Flying) && !chr.CanFly)
                {
                    return(false);
                }
                float moveAngle = packet.ReadFloat();
                if (chr == mover)
                {
                    chr.MovePitch(moveAngle);
                }
            }

            int num4 = (int)packet.ReadUInt32();

            if (movementFlags.HasFlag((Enum)MovementFlags.Falling))
            {
                double num1 = (double)packet.ReadFloat();
                double num2 = (double)packet.ReadFloat();
                double num3 = (double)packet.ReadFloat();
                double num5 = (double)packet.ReadFloat();
            }

            if (packet.PacketId.RawId == 201U && chr == mover)
            {
                chr.OnFalling();
            }
            if (movementFlags.HasFlag((Enum)MovementFlags.Swimming) && chr == mover)
            {
                chr.OnSwim();
            }
            else if (chr.IsSwimming && chr == mover)
            {
                chr.OnStopSwimming();
            }
            if (movementFlags.HasFlag((Enum)MovementFlags.SplineElevation))
            {
                double num6 = (double)packet.ReadFloat();
            }

            bool flag1 = pt == mover.Position;

            if (!flag1 && mover.IsInWorld && !mover.SetPosition(pt, orientation))
            {
                return(false);
            }
            if (flag1)
            {
                mover.Orientation = orientation;
            }
            else
            {
                mover.OnMove();
            }
            mover.MovementFlags  = movementFlags;
            mover.MovementFlags2 = movementFlags2;
            if (flag1)
            {
                mover.Orientation = orientation;
            }
            else if (!mover.CanMove)
            {
                return(false);
            }
            return(true);
        }
Example #24
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, uint glyphSlot = (uint)0)
		{
			IsPlayerCast = true;

			//var stopwatch = Stopwatch.StartNew();

			if (IsCasting)
			{
				if (!IsChanneling)
				{
					SpellHandler.SendCastFailed(Client, castId, spell, SpellFailedReason.SpellInProgress);
					return SpellFailedReason.SpellInProgress;
				}
				else
				{
					Cancel(SpellFailedReason.DontReport);
				}
			}

			GlyphSlot = glyphSlot;

			Map = CasterObject.Map;
			Phase = CasterObject.Phase;

			IsCasting = true;
			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.ItemGone);
					return SpellFailedReason.ItemGone;
				}
			}
			// 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 m_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 m_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;
		}
Example #25
0
        private SpellFailedReason ReadTargetInfoFromPacket(RealmPacketIn packet)
        {
            TargetFlags = (SpellTargetFlags)packet.ReadUInt32();

            // TODO: Corpse flags

            if (TargetFlags == SpellTargetFlags.Self)
            {
                SelectedTarget = CasterObject;
                TargetLoc = SelectedTarget.Position;
                return SpellFailedReason.Ok;
            }

            if (TargetFlags.HasAnyFlag(SpellTargetFlags.WorldObject))
            {
                var entityId = packet.ReadPackedEntityId();
                SelectedTarget = Map.GetObject(entityId);

                if (SelectedTarget == null || !CasterObject.CanSee(SelectedTarget))
                {
                    Cancel(SpellFailedReason.BadTargets);
                    return SpellFailedReason.BadTargets;
                }

                TargetLoc = SelectedTarget.Position;
            }

            if (CasterObject is Character && TargetFlags.HasAnyFlag(SpellTargetFlags.AnyItem))
            {
                var entityId = packet.ReadPackedEntityId();
                TargetItem = CasterChar.Inventory.GetItem(entityId);

                if (TargetItem == null || !TargetItem.CanBeUsed)
                {
                    Cancel(SpellFailedReason.ItemGone);
                    return SpellFailedReason.ItemGone;
                }
            }

            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;

            if (TargetFlags.HasAnyFlag(SpellTargetFlags.DestinationLocation))
            {
                SelectedTarget = Map.GetObject(packet.ReadPackedEntityId());
                TargetLoc = new Vector3(packet.ReadFloat(), packet.ReadFloat(), packet.ReadFloat());
            }

            if (TargetFlags.HasAnyFlag(SpellTargetFlags.String))
            {
                StringTarget = packet.ReadCString();
            }

            return SpellFailedReason.Ok;
        }