internal void Update() { if (!visible) { return; } Packet packet = null; bool posChanged = false, farChanged = false, rotChanged = false; if (position.X != oldpos.X || position.Y != oldpos.Y || position.Z != oldpos.Z) { posChanged = true; } if (position.RotX != oldpos.RotX || position.RotY != oldpos.RotY) { rotChanged = true; } if (Math.Abs((int)position.X - oldpos.X) > 127 || Math.Abs((int)position.Y - oldpos.Y) > 127 || Math.Abs((int)position.Z - oldpos.Z) > 127) { farChanged = true; } if (farChanged) { packet = Protocol.TeleportPacket(id, Position); } else if (posChanged && rotChanged) { unchecked { packet = Protocol.MoveLookPacket( id, (byte)(position.X - oldpos.X), (byte)(position.Y - oldpos.Y), (byte)(position.Z - oldpos.Z), position.RotX, position.RotY); } } else if (posChanged) { unchecked { packet = Protocol.MovePacket( id, (byte)(position.X - oldpos.X), (byte)(position.Y - oldpos.Y), (byte)(position.Z - oldpos.Z)); } } else if (rotChanged) { packet = Protocol.LookPacket(id, position.RotX, position.RotY); } if (packet != null) { oldpos.Set(position); packet.Send(level); MoveEvent.Raise(level.server, this); } }