Changelog

master

Nothing yet.

v1.5.1

  • Added support for Minecraft 1.15.2

v1.5

  • Added support for Minecraft 1.15 and 1.15.1
  • Dropped support for Python 3.4
  • Added TagRoot.from_body() constructor.
  • Added Message.__repr__() method.
  • Revised implementation of chunk data
    • Added dependency on bitstring
    • Added a new PackedArray class for working with tightly-packed arrays. This replaces the LightArray class, and additionally supports heightmaps and raw block data. This particular implementation ensures values are contiguous in memory, which speeds up gets/sets at the expense of a de/serialization process that involves two passes of bitwise reversals.
    • Reworked BlockArray to use PackedArray internally.
    • Changed the value type of NBT arrays from a list of int to a PackedArray. A heuristic is used to determine the value width.
    • Revised Buffer1_14.un/pack_chunk_section() to include arguments for block/skylight data, for consistency with earlier Buffer classes.
    • Added Buffer1_9.un/pack_chunk() methods.
    • Added Buffer1_9.un/pack_chunk_section_array() methods.
    • Added Buffer1_9.pack_chunk_bitmask() method.

v1.4

  • Added support for Minecraft 1.14.3 and 1.14.4
  • Fixed support for Minecraft 1.7

v1.3

  • Added support for Minecraft 1.14 - 1.14.2
    • BREAKING CHANGE! BlockMap objects are replaced by Registry objects with greater responsibilities, reflecting the increase in information generated by the official server when run with --reports. Villager and particle data is now decoded when using a LookupRegistry in a buffer. Other information (for example, mob names from IDs) can be decoded in packet handlers.
    • BlockArray objects now track the number of non-air blocks, which is conveyed in chunk_data packets.
    • Added methods for packing/unpacking optional varints, rotation, direction, villager and pose data.

v1.2

  • Added support for Minecraft 1.13.2
  • Fixed support for server icons (thanks @dries007) and added caching.

v1.1.1

  • Various bugfixes.

v1.1

  • Added support for Minecraft 1.13.

    • Added 1.13 packet enumeration.
    • The wire format of chunk sections, entity metadata and slots has changed. Slots no longer contain a ‘damage’ field.
    • Added methods for packing/unpacking particles and command graphs.
    • Clients now respond to login_plugin_request messages with a login_plugin_response indicating that the client didn’t understand the request. Like other quarry packet handlers, this method can be overridden in a subclass to implement a custom authentication flow.
  • Slot/blocks/chunks/regions improvements:

    • Added quarry.types.block module, containing three classes for handling block and item IDs:

      • OpaqueBlockMap passes IDs through unchanged
      • BitShiftBlockMap decodes blocks by bit-shifting - this format is used in Minecraft 1.7 through 1.12. Item IDs pass through unchanged.
      • LookupBlockMap decodes by looking up in a dictionary. This class has from_jar() and from_json() methods for loading this dictionary from the official server (1.13+).

      Buffer types gain a block_map attribute. By default this is an OpaqueBlockMap(13). The buffer’s block map is consulted by methods that deal with slots, entity metadata and chunk data.

      BlockArray objects must now be given a block map on initialization, and will pass getitem/setitem values through the map.

    • Added quarry.types.nbt.RegionFile class, which supports reading and writing NBT chunk data to .mca files.

    • BlockArray and LightArray now support a from_nbt() class method. This creates an array that is a view on to an NBT compound tag representing a section (as might be retrieved via a RegionFile). Supports Minecraft 1.13+ only.

    • BlockArray.palette is now an empty list rather than None when a palette is not in use

    • Added Buffer.pack_block() and Buffer.unpack_block() methods.

    • Slot dictionaries now use an 'item' key to store the item identifier, rather than 'id'. An empty slot is now represented with an 'item' value of None rather than -1.

  • Added quarry.types.nbt.TagLongArray class.

  • Added quarry.types.nbt.TagRoot.body property to retrieve the child tag.

  • Added quarry.types.nbt._Tag.from_bytes() method.

  • Added quarry.types.uuid.UUID.random() constructor.

  • Added Protocol.get_packet_name() and Protocol.get_packet_ident() methods. These can be overridden to support custom packet name lookup behaviour.

  • Moved PacketDispatcher.dump_packet() to Buffer.hexdump().

  • Fixed unpacking of byte entity metadata.

  • Fixed NBT handling of 1-length arrays.

  • Fixed SpawningClientProtocol not responding to keep-alives.

  • Fixed unicode handling in chat unpacking.

v1.0

  • Changes to quarry.types.buffer:
    • Split Buffer into Buffer1_7 and Buffer_1_9, and select an appropriate buffer type by protocol version. This is done in anticipation of revisions to the slot and entity metadata formats in 1.13.
    • Moved some packet framing logic from Protocol into Buffer.pack_packet() and Buffer.unpack_packet()
    • Added Buffer.pack_optional() and Buffer.unpack_optional(), which handle boolean-prefixed optional data.
    • Added Buffer.pack_array() and Buffer.unpack_array() convenience methods.
    • Made Buffer.pack_entity_metadata() and Buffer.unpack_entity_metadata() work with a dictionary rather than a list of tuples. Also corrected a couple of issues with re-packing data.
    • Removed the signed argument from Buffer.pack_varint() and Buffer.unpack_varint(). All varints are now signed.
  • Changes to quarry.types.chunk:
    • Made BlockArray setitem/getitem accept/return an opaque ID, rather than a 2-tuple of (block_id, metadata). In Minecraft 1.13 it’s no longer possible to convert between the two with bitshifting.
    • Added BlockArray.empty() and LightArray.empty() methods to initialize empty (zero-filled) block/light arrays.
    • Added BlockArray.is_empty() method, which can be used by servers to check whether a chunk section should be sent.
  • Changes to quarry.types.nbt:
    • Added TagCompound.update() method, which performs a “deep” update of an NBT tree.
  • Changes to quarry.net:
    • Added Proxy.disable_forwarding()
    • ClientFactory.connect() no longer accepts protocol_mode_next and protocol_version arguments.
    • ServerFactory.force_protocol_version has moved to Factory.force_protocol_version, and is now observed by clients.
    • ClientProtocol.protocol_mode_next has moved to ClientFactory.protocol_mode_next, and now defaults to “login”.
    • Removed Protocol.compression_enabled. Uncompressed connections are now indicated by Protocol.compression_threshold == -1.
    • Modified Profile.validate() to not automatically attempt to refresh invalid profiles. This should be an explicit user choice.
    • Added Profile.to_file(), which saves to a JSON file containing a subset of the information available in ~/.minecraft/launcher_profiles.json.
    • Fixed restarting a stopped Ticker.
  • Fixed client_messenger chat unpacking.
  • Fixed the entity_properties and advancements packets being swapped.

v0.9.1

  • Dropped support for Python 3.3.
  • Fixed Python 3.4+ compatibility issues.
  • Made SpawningClientProtocol send player_position_and_look rather than player_position.
  • Fixed ticker logger being None.

v0.9

  • Added support for Minecraft 1.12.2.
  • Added documentation for proxies
  • Added a “fast forwarding” mode for proxies that skips packing/unpacking of packets.
  • Re-arranged some proxy internals.
  • Replaced quarry.net.tasks with quarry.net.ticker. An instance of the Ticker class is available as self.ticker from protocols. This object has add_delay() and add_loop() methods for setting up delayed and repeating tasks respectively. The interface similar to the previous Tasks object, except that timings are now given in ticks rather than seconds. The new tick loop is closer to the vanilla minecraft tick loop: delayed ticks are run faster the usual, and when too many ticks are queued they are skipped altogether.
  • Added quarry.types.chat module for handling Minecraft chat. Chat packing/unpacking methods in Buffer now accept/return an instance of the Message class.
  • Added Buffer.pack_slot() method.
  • Added Buffer.pack_entity_metadata() and Buffer.unpack_entity_metadata() methods.
  • Added ServerFactory.prevent_proxy_connections attribute, defaulting to True, that prevents clients from connecting via a proxy. Note that this specifically affects online mode, and works by comparing the IP of the connecting client with the IP recorded as making the authentication request with the Mojang session server.

v0.8

  • Added support for Minecraft 1.12.1. Thanks to Christian Hogan for the patch.

v0.7

  • Added support for Minecraft 1.12
  • Several breaking changes! Read on for more.
  • Removed the quarry.utils package. Its contents have been distributed as follows:
    • The buffer, chunk, nbt and uuid (renamed from types) modules have moved into a new quarry.types package.
    • The auth, crypto, http and tasks modules have moved into the quarry.net package.
    • The error module was removed. ProtocolError is now part of quarry.net.protocol.
  • Revised the NBT implementation
    • TagByteArray and TagIntArray have more straightforward signatures for __init__ and from_buff
    • TagList now stores its contents as a list of tags, rather than a list of tag values. It no longer accepts an inner_kind initialiser parameter, as this is derived from the type of the first supplied tag.
    • NamedTag is removed.
    • TagCompound now stores its value as a dict of names and tags, rather than a list of NamedTag objects.
    • TagRoot is introduced as the top-level tag. This is essentially a TagCompound containing a single record.
    • Added a new alt_repr function that prints a tag using the same representation as in the NBT specification.
    • Improved performance.
    • Added some tests.
  • Substantially expanded documentation.
  • Added a new server_chat_room example. This server spawns a player in an empty world and allows player to chat to eachother.
  • Made Protocol.send_packet() accept any number of data arguments, which are concatenated together.
  • Made Buffer.__init__() accept a string argument, which is equivalent to creating an empty buffer and calling add().
  • Added Buffer.pack_chunk_section() and Buffer.unpack_chunk_section(). These methods work with new quarry.types.chunk types: LightArray (4 bits per block) and BlockArray (4-8 or 13 bits per block, with an optional palette).
  • Added Buffer.pack_position(), which packs co-ordinates into a long and complements Buffer.unpack_position().
  • Added a Bridge.make_profile() method, which is called to provide a profile to the UpstreamFactory. The default implementation generates an offline profile with the same display name as the Downstream.

v0.6.3

  • Fix bundle

v0.6.2

  • Added support for Minecraft 1.11.2
  • Added a default implementation for the “disconnect” packet, which now does the same thing as “login_disconnect”, i.e. logs a warning and closes the connection.

v0.6.1

  • Fix bundle

v0.6

  • Added support for Minecraft 1.11
  • BREAKING CHANGES!
    • Throughout the codebase, references to username have changed to display_name for consistency with Mojang’s terminology.
    • Factory.run() and Factory.stop() have been removed for being misleading about the role of factories. Use twisted’s reactor.run() instead.
    • quarry.mojang has been renamed to quarry.auth and substantially rewritten.
    • Offline profiles are now represented by OfflineProfile objects.
    • Online profiles have a number of new static creator methods: - from_credentials() accepts an email address and password - from_token() accepts a client and access token, display name and UUID - from_file() loads a profile from the Mojang launcher.
    • A new ProfileCLI class provides a couple of useful methods for creating profiles from command-line arguments.
    • Profiles must now be provided to the ClientFactory initializer, rather than set as a class variable. When a profile is not given, an offline profile is used. In proxies, the initialiser for UpstreamFactory must be re-implemented if the proxy connects to the backing server in online mode.
    • Factory.auth_timeout has moved to ServerFactory.auth_timeout. Clients now use Profile.timeout when calling /join endpoint.
  • ClientFactory.connect returns a deferred that will fire after after reactor.connectTCP is called for the last time. Usually there is a small time delay before this happens while quarry queries the server’s version.
  • Clients will refresh a profile if /join indicates a token is invalid, then retry the /join once.
  • Added a new SpawningClientProtocol class that implements enough packets to keep a player in-game
  • Added a new client_messenger example. This bridges minecraft chat (in/out) with stdout and stdin.

v0.5

  • Added Buffer.unpack_nbt() and Buffer.pack_nbt() methods for working with the NBT (Named Binary Tag) format.
  • Added Buffer.unpack_position() method. This unpacks a 26/12/26-packed position.
  • Added strip_styles parameter to Buffer.unpack_chat(). If set to false, text is returned including old-style style escapes (U+00A7 plus a character)
  • A stopping client factory no longer invalidates its profile.
  • Added Python 3 compatibility to PacketDispatcher.dump_packet()
  • Fix tests for Buffer.unpack_chat()

v0.4

  • Added support for Minecraft 1.10
  • Added support for Minecraft 1.9.3 and 1.9.4
  • Improved the varint implementation - it now supports signed and magnitude-limited numbers. Also added some sensible defaults to various bits of quarry that use varints.
  • Made Buffer.unpack_chat() not add curly braces to “translate” objects without accompanying “with” objects.
  • Made Buffer.unpack_chat() strip old-style (u00A7) chat escapes.

v0.3.1

  • Added support for Minecraft 1.9.1 and 1.9.2
  • Fixed protocol error in example chat logger when connecting to 1.9 servers

v0.3

  • Added support for Minecraft 1.9
  • Compression is now supported in servers
  • Servers will now reject new connections when full
  • Servers will now report a forced protocol version in status responses, rather than repeating the client’s version.
  • The point at which a proxy will connect to the upstream server is now customisable.
  • Renamed “maps” packet to “map”
  • Renamed “sign editor open” packet to “open sign editor”
  • Renamed ServerFactory.favicon_path to ServerFactory.favicon
  • Renamed quarry.util to quarry.utils
  • Removed protocol_mode parameter from some proxy callbacks
  • Added many new docstrings; made documentation use Sphinx’s autodoc
  • Fixed exception handling when looking up a packet name. Thanks to PangeaCake for the fix.
  • Fixed issue where an exception was raised when generating an offline-mode UUID in Python 3. Thanks to PangeaCake for the report.
  • Fixed issue with compression in proxies when the upstream server set the compression threshold after passthrough had been enabled. Thanks to PangeaCake for the report.
  • (tests) quarry.utils.buffer and quarry.utils.types are now covered.

v0.2.3

  • (documentation) Fixed changelog for v0.2.2

v0.2.2

  • Fixed proxies
  • (documentation) Added changelog

v0.2.1

  • (documentation) Fixed front page

v0.2

  • Tentative Python 3 support
  • Removed @register. Packet handlers are now looked up by method name
  • Packets are now addressed by name, rather than mode and ident
  • Protocol.recv_addr renamed to Protocol.remote_addr
  • Client profile is automatically invalidated when ClientFactory stops
  • (internals) PacketDispatcher moved from quarry.util to quarry.net
  • (examples) Chat logger now closely emulates vanilla client behaviour when sending “player”
  • (documentation) It now exists!

v0.1

  • Initial release