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
PackedArrayclass for working with tightly-packed arrays. This replaces theLightArrayclass, 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
BlockArrayto usePackedArrayinternally. - Changed the value type of NBT arrays from a
listofintto aPackedArray. 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 earlierBufferclasses. - Added
Buffer1_9.un/pack_chunk()methods. - Added
Buffer1_9.un/pack_chunk_section_array()methods. - Added
Buffer1_9.pack_chunk_bitmask()method.
- Added dependency on
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!
BlockMapobjects are replaced byRegistryobjects 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 aLookupRegistryin a buffer. Other information (for example, mob names from IDs) can be decoded in packet handlers. BlockArrayobjects now track the number of non-air blocks, which is conveyed inchunk_datapackets.- Added methods for packing/unpacking optional varints, rotation, direction, villager and pose data.
- BREAKING CHANGE!
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_requestmessages with alogin_plugin_responseindicating 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.blockmodule, containing three classes for handling block and item IDs:OpaqueBlockMappasses IDs through unchangedBitShiftBlockMapdecodes blocks by bit-shifting - this format is used in Minecraft 1.7 through 1.12. Item IDs pass through unchanged.LookupBlockMapdecodes by looking up in a dictionary. This class hasfrom_jar()andfrom_json()methods for loading this dictionary from the official server (1.13+).
Buffertypes gain ablock_mapattribute. By default this is anOpaqueBlockMap(13). The buffer’s block map is consulted by methods that deal with slots, entity metadata and chunk data.BlockArrayobjects must now be given a block map on initialization, and will pass getitem/setitem values through the map.Added
quarry.types.nbt.RegionFileclass, which supports reading and writing NBT chunk data to.mcafiles.BlockArrayandLightArraynow support afrom_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 aRegionFile). Supports Minecraft 1.13+ only.BlockArray.paletteis now an empty list rather thanNonewhen a palette is not in useAdded
Buffer.pack_block()andBuffer.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 ofNonerather than-1.
Added
quarry.types.nbt.TagLongArrayclass.Added
quarry.types.nbt.TagRoot.bodyproperty 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()andProtocol.get_packet_ident()methods. These can be overridden to support custom packet name lookup behaviour.Moved
PacketDispatcher.dump_packet()toBuffer.hexdump().Fixed unpacking of byte entity metadata.
Fixed NBT handling of 1-length arrays.
Fixed
SpawningClientProtocolnot responding to keep-alives.Fixed unicode handling in chat unpacking.
v1.0¶
- Changes to
quarry.types.buffer:- Split
BufferintoBuffer1_7andBuffer_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
ProtocolintoBuffer.pack_packet()andBuffer.unpack_packet() - Added
Buffer.pack_optional()andBuffer.unpack_optional(), which handle boolean-prefixed optional data. - Added
Buffer.pack_array()andBuffer.unpack_array()convenience methods. - Made
Buffer.pack_entity_metadata()andBuffer.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
signedargument fromBuffer.pack_varint()andBuffer.unpack_varint(). All varints are now signed.
- Split
- Changes to
quarry.types.chunk:- Made
BlockArraysetitem/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()andLightArray.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.
- Made
- Changes to
quarry.types.nbt:- Added
TagCompound.update()method, which performs a “deep” update of an NBT tree.
- Added
- Changes to
quarry.net:- Added
Proxy.disable_forwarding() ClientFactory.connect()no longer acceptsprotocol_mode_nextandprotocol_versionarguments.ServerFactory.force_protocol_versionhas moved toFactory.force_protocol_version, and is now observed by clients.ClientProtocol.protocol_mode_nexthas moved toClientFactory.protocol_mode_next, and now defaults to “login”.- Removed
Protocol.compression_enabled. Uncompressed connections are now indicated byProtocol.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.
- Added
- Fixed
client_messengerchat unpacking. - Fixed the
entity_propertiesandadvancementspackets being swapped.
v0.9.1¶
- Dropped support for Python 3.3.
- Fixed Python 3.4+ compatibility issues.
- Made
SpawningClientProtocolsendplayer_position_and_lookrather thanplayer_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.taskswithquarry.net.ticker. An instance of theTickerclass is available asself.tickerfrom protocols. This object hasadd_delay()andadd_loop()methods for setting up delayed and repeating tasks respectively. The interface similar to the previousTasksobject, 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.chatmodule for handling Minecraft chat. Chat packing/unpacking methods inBuffernow accept/return an instance of theMessageclass. - Added
Buffer.pack_slot()method. - Added
Buffer.pack_entity_metadata()andBuffer.unpack_entity_metadata()methods. - Added
ServerFactory.prevent_proxy_connectionsattribute, defaulting toTrue, 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.utilspackage. Its contents have been distributed as follows:- The
buffer,chunk,nbtanduuid(renamed fromtypes) modules have moved into a newquarry.typespackage. - The
auth,crypto,httpandtasksmodules have moved into thequarry.netpackage. - The
errormodule was removed.ProtocolErroris now part ofquarry.net.protocol.
- The
- Revised the NBT implementation
TagByteArrayandTagIntArrayhave more straightforward signatures for__init__andfrom_buffTagListnow stores its contents as a list of tags, rather than a list of tag values. It no longer accepts aninner_kindinitialiser parameter, as this is derived from the type of the first supplied tag.NamedTagis removed.TagCompoundnow stores its value as adictof names and tags, rather than alistofNamedTagobjects.TagRootis introduced as the top-level tag. This is essentially aTagCompoundcontaining a single record.- Added a new
alt_reprfunction 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_roomexample. This server spawns a player in an empty world and allows player to chat to eachother. - Made
Protocol.send_packet()accept any number ofdataarguments, which are concatenated together. - Made
Buffer.__init__()accept a string argument, which is equivalent to creating an empty buffer and callingadd(). - Added
Buffer.pack_chunk_section()andBuffer.unpack_chunk_section(). These methods work with newquarry.types.chunktypes:LightArray(4 bits per block) andBlockArray(4-8 or 13 bits per block, with an optional palette). - Added
Buffer.pack_position(), which packs co-ordinates into alongand complementsBuffer.unpack_position(). - Added a
Bridge.make_profile()method, which is called to provide a profile to theUpstreamFactory. The default implementation generates an offline profile with the same display name as theDownstream.
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
usernamehave changed todisplay_namefor consistency with Mojang’s terminology. Factory.run()andFactory.stop()have been removed for being misleading about the role of factories. Use twisted’sreactor.run()instead.quarry.mojanghas been renamed toquarry.authand substantially rewritten.- Offline profiles are now represented by
OfflineProfileobjects. - 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
ProfileCLIclass provides a couple of useful methods for creating profiles from command-line arguments. - Profiles must now be provided to the
ClientFactoryinitializer, rather than set as a class variable. When a profile is not given, an offline profile is used. In proxies, the initialiser forUpstreamFactorymust be re-implemented if the proxy connects to the backing server in online mode. Factory.auth_timeouthas moved toServerFactory.auth_timeout. Clients now useProfile.timeoutwhen calling/joinendpoint.
- Throughout the codebase, references to
ClientFactory.connectreturns a deferred that will fire after afterreactor.connectTCPis 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
/joinindicates a token is invalid, then retry the/joinonce. - Added a new
SpawningClientProtocolclass that implements enough packets to keep a player in-game - Added a new
client_messengerexample. This bridges minecraft chat (in/out) with stdout and stdin.
v0.5¶
- Added
Buffer.unpack_nbt()andBuffer.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_stylesparameter toBuffer.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_pathtoServerFactory.favicon - Renamed
quarry.utiltoquarry.utils - Removed
protocol_modeparameter 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.bufferandquarry.utils.typesare 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_addrrenamed toProtocol.remote_addr- Client profile is automatically invalidated when
ClientFactorystops - (internals)
PacketDispatchermoved fromquarry.utiltoquarry.net - (examples) Chat logger now closely emulates vanilla client behaviour when sending “player”
- (documentation) It now exists!
v0.1¶
- Initial release