public void Teleport(ushort MapID, ushort X, ushort Y) { if (Kernel.IsWalkable(MapID, X, Y)) { GeneralData *Packet = PacketHelper.AllocGeneral(); if (Entity.Location.MapID == MapID && ConquerMath.CalculateDistance(X, Y, Entity.Location.X, Entity.Location.Y, true) < Kernel.ScreenView) { // Teleporting within Kernel.ScreenView distance. Don't remove entity from other players. Send "Jump" packet instead Packet->DataID = GeneralDataID.Jump; Packet->UID = Entity.UID; Packet->ValueA = Entity.Location.X; Packet->ValueB = Entity.Location.Y; Packet->ValueD_High = X; Packet->ValueD_Low = Y; Entity.Location.MapID = MapID; Entity.Location.X = X; Entity.Location.Y = Y; SendScreen(Packet, Packet->Size, true); } else { Packet->UID = Entity.UID; Packet->DataID = GeneralDataID.RemoveEntity; SendScreen(Packet, Packet->Size); } Packet = PacketHelper.ReAllocGeneral(Packet); Packet->UID = Entity.UID; Packet->DataID = GeneralDataID.ChangeMap; Packet->ValueA = X; Packet->ValueB = Y; Packet->ValueD_High = MapID; Entity.Location.MapID = MapID; Entity.Location.X = X; Entity.Location.Y = Y; Send(Packet, Packet->Size); Memory.Free(Packet); } else { Message(string.Format("Can't teleport to MapID: {0} X {1} Y {2}.", MapID, X, Y), ChatType.Center, Color.White); return; } }
public void RemoveFromScreen() { GeneralData *Packet = PacketHelper.AllocGeneral(); Packet->UID = Entity.UID; Packet->DataID = GeneralDataID.RemoveEntity; SendScreen(Packet, Packet->Size); Entity[] Entities = Screen.Players; Parallel.ForEach(Entities, (entity) => { entity.Owner.Screen.Remove(Entity); }); Memory.Free(Packet); }