//[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); } }
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); } }
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); } }
//[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(); }
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(); }
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(); }
/// <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(); }
/// <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); }
/// <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 }
/// <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); }
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); }
[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) { }*/ }
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); }
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); } }
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); } }
/// <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); }
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); }
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); } }
/// <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); }
/// <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; }
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; }