public static void SendMoveToPacketToSingleClient <T>(IRealmClient client, Unit movingUnit, uint moveTime, MonsterMoveFlags moveFlags, IEnumerable <T> waypoints) where T : IPathVertex { using (RealmPacketOut packet = MovementHandler.ConstructMultiWaypointMovePacket <T>(movingUnit, moveTime, moveFlags, waypoints)) client.Send(packet, false); }
public static void SendEnterTransport(Unit unit) { ITransportInfo transportInfo = unit.TransportInfo; MovementHandler.SendMonsterMoveTransport(unit, transportInfo.Position - unit.Position, unit.TransportPosition); }
public static void HandleMovement(IRealmClient client, RealmPacketIn packet) { Character activeCharacter = client.ActiveCharacter; Unit mover = activeCharacter.MoveControl.Mover as Unit; if (mover == null || !mover.UnitFlags.HasFlag((Enum)UnitFlags.PlayerControlled) || mover.UnitFlags.HasFlag((Enum)UnitFlags.Influenced)) { return; } mover.CancelEmote(); EntityId id = packet.ReadPackedEntityId(); if (packet.PacketId.RawId == 721U) { mover = client.ActiveCharacter.Map.GetObject(id) as Unit; if (mover == null) { return; } } uint clientTime; if (!MovementHandler.ReadMovementInfo(packet, activeCharacter, mover, out clientTime)) { return; } MovementHandler.BroadcastMovementInfo((PacketIn)packet, activeCharacter, mover, clientTime); }
/// <summary>Jumping while not moving when mounted</summary> public static void HandleMountSpecialAnim(IRealmClient client, RealmPacketIn packet) { Character activeCharacter = client.ActiveCharacter; if (!(activeCharacter.MoveControl.Mover is Unit) || !((Unit)activeCharacter.MoveControl.Mover).IsMounted) { return; } MovementHandler.SendMountSpecialAnim(client); }
public static void SendMoveToPacket <T>(Unit movingUnit, int speed, MonsterMoveFlags moveFlags, LinkedListNode <T> firstNode) where T : IPathVertex { if (!movingUnit.IsAreaActive) { return; } using (RealmPacketOut packet = MovementHandler.ConstructMultiWaypointMovePacket <T>(movingUnit, speed, moveFlags, firstNode)) movingUnit.SendPacketToArea(packet, true, false, Locale.Any, new float?()); }
public static void SendMoveToPacket <T>(Unit movingUnit, uint moveTime, MonsterMoveFlags moveFlags, IEnumerable <T> waypoints) where T : IPathVertex { if (!movingUnit.IsAreaActive) { return; } using (RealmPacketOut packet = MovementHandler.ConstructMultiWaypointMovePacket <T>(movingUnit, moveTime, moveFlags, waypoints)) movingUnit.SendPacketToArea(packet, true, false, Locale.Any, new float?()); }
//[PacketHandler(RealmServerOpCode.CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE)] public static void HandleChangeSeatsOnControlledVehicle(IRealmClient client, RealmPacketIn packet) { var guid = packet.ReadPackedEntityId(); var oldVehicle = client.ActiveCharacter.Map.GetObject(guid) as Vehicle; if (oldVehicle == null) { return; } uint clientTime; MovementHandler.ReadMovementInfo(packet, client.ActiveCharacter, oldVehicle, out clientTime); var newVehicleGuid = packet.ReadPackedEntityId(); var newVehicle = client.ActiveCharacter.Map.GetObject(newVehicleGuid) as Vehicle; if (newVehicle == null) { return; } var passenger = client.ActiveCharacter; var oldSeat = passenger.m_vehicleSeat; //shouldnt need this, but fall back just in case if (oldSeat == null) { oldVehicle.FindSeatOccupiedBy(passenger); } //uh oh! if (oldSeat == null) { return; } var seatId = packet.ReadByte(); var newSeat = newVehicle.Seats[seatId]; //something went wrong if (newSeat == null) { return; } //cheater?! if (newSeat.Passenger != null) { return; } oldSeat.ClearSeat(); newSeat.Enter(passenger); }
public static void HandleMoveNotActiveMover(IRealmClient client, RealmPacketIn packet) { Character activeCharacter = client.ActiveCharacter; EntityId id = packet.ReadPackedEntityId(); Unit mover = client.ActiveCharacter.Map.GetObject(id) as Unit; if (mover == null) { return; } mover.CancelEmote(); uint clientTime; if (!MovementHandler.ReadMovementInfo(packet, activeCharacter, mover, out clientTime)) { return; } MovementHandler.BroadcastMovementInfo((PacketIn)packet, activeCharacter, mover, clientTime); }
private static void BroadcastMovementInfo(PacketIn packet, Character chr, Unit mover, uint clientTime) { ICollection <IRealmClient> nearbyClients = chr.GetNearbyClients <Character>(false); if (nearbyClients.Count <= 0) { return; } using (RealmPacketOut pak = new RealmPacketOut(packet.PacketId)) { int num = mover.EntityId.WritePacked((BinaryWriter)pak); packet.Position = packet.HeaderSize + num; pak.Write(packet.ReadBytes(packet.RemainingLength)); foreach (IRealmClient client in (IEnumerable <IRealmClient>)nearbyClients) { MovementHandler.SendMovementPacket(client, pak, 10 + num, clientTime); } } }
public static void HandleChangeSeatsOnControlledVehicle(IRealmClient client, RealmPacketIn packet) { EntityId id1 = packet.ReadPackedEntityId(); Vehicle vehicle1 = client.ActiveCharacter.Map.GetObject(id1) as Vehicle; if (vehicle1 == null) { return; } uint clientTime; MovementHandler.ReadMovementInfo(packet, client.ActiveCharacter, (Unit)vehicle1, out clientTime); EntityId id2 = packet.ReadPackedEntityId(); Vehicle vehicle2 = client.ActiveCharacter.Map.GetObject(id2) as Vehicle; if (vehicle2 == null) { return; } Character activeCharacter = client.ActiveCharacter; VehicleSeat vehicleSeat = activeCharacter.m_vehicleSeat; if (vehicleSeat == null) { vehicle1.FindSeatOccupiedBy((Unit)activeCharacter); } if (vehicleSeat == null) { return; } byte num = packet.ReadByte(); VehicleSeat seat = vehicle2.Seats[(int)num]; if (seat == null || seat.Passenger != null) { return; } vehicleSeat.ClearSeat(); seat.Enter((Unit)activeCharacter); }
//[PacketHandler(RealmServerOpCode.CMSG_DISMISS_CONTROLLED_VEHICLE)] public static void HandleDismissControlledVehicle(IRealmClient client, RealmPacketIn packet) { client.ActiveCharacter.Vehicle.ClearAllSeats(true); MovementHandler.HandleMovement(client, packet); }