Nukkit icon indicating copy to clipboard operation
Nukkit copied to clipboard

LevelDB support & other updates

Open PetteriM1 opened this issue 3 months ago • 1 comments

This PR adds support for LevelDB (version 1.20.10) worlds together with various other stuff from Nukkit PM1E (changelog) including but not limited to:

  • lots of new blocks & items
  • increased world height
  • waterlogging
  • dimension changes
  • better nether generator
  • fixes for overworld generator
  • fixes for lagging & crashing exploits
  • asynchronous chunk & packet sending
  • new movement mechanics
  • new APIs including custom blocks & entities
  • new version of RakNet library
  • performance improvements

Jenkins downloads: https://ci.opencollab.dev/job/NukkitX/job/Nukkit/job/leveldb/

For server owners:

  • Lots of new blocks, items and game mechanics were added

  • World height was increased and void was moved below the new world height bottom limit

  • Timings were removed, use spark instead

  • Support for legacy MCRegion & LevelDB worlds was removed

  • New worlds are using LevelDB by default

  • Some commands had changes in their functionality:

    • All player args require either full player name or a selector
    • Give has a default item count of 1 instead of 64
  • Gold and iron ores now drop raw ores instead or ore block

  • Attacking entities now resets sprinting (player.attack-stop-sprint: false to disable)

  • Test and update your plugins. Make sure land protection etc. plugins are configured to handle new blocks and items if needed.

  • Convert worlds using 'convert' command in console to enable new features. Multiple worlds can be converted at once but don't play on the server while converting.

  • To back up a running server with LevelDB worlds safely, use 'save-off hold' -> backup -> 'save-on hold' (Note: This disables unloading of modified chunks which increases memory usage temporarily.)

For plugin developers:

  • Check your plugins for fixed size arrays of block IDs and data values, use Block.MAX_BLOCK_ID and Block.DATA_BITS
  • Due to increased block data bits, full block IDs have changed. Recompile plugins which shift block ID by 4 and use Block.DATA_BITS (6). Or better, don't have your plugin depend on full IDs at all!
  • Notice increased world height (from 0-255 to -64-319, negative y coordinates!)
  • Block hash values changed due to increased world height
  • Notice separation of block and item ID for blocks with ID over 255 (itemId = 255 - blockId, negative item block IDs!)
  • Always use Block.get and Item.get instead of creating new Block & Item instances
  • For future compatibility, it's recommended to compare & get blocks & items using their MateralType (getItemType/getBlockType) instead of 'instanceof'
  • Timings API was removed
  • Added API for custom blocks (to be refactored)
  • Added API for custom entities
  • Added API for material type
  • Added API for persistent containers
  • Added entity/blockEntity.canSaveToStorage/setSaveToStorage to allow disabling saving of certain entites/block entities
  • Added level.isSaveOnUnloadEnabled/setSaveOnUnloadEnabled to allow disabling saving of unloaded chunks (remember to also disable auto save)
  • Some protected/internal APIs were removed/changed
  • Use API version 1.0.20 to require updated Nukkit

Contains (at least partially) or should make following pull requests obsolete: #417, #786, #879, #914 , #1819, #1280, #1493, #1511, #1873, #1908, #1967, #2117

Contains parts of code from other projects: Cloudburst Server, PowerNukkit

Should resolve following issues: #2178, #2160, #2036, #2001, #2000, #1885, #1706, #1605, #1604, #1593, #1573, #1563, #1540, #1482, #1456, #1383, #1378, #1367, #1340, #1324, #1320, #1200, #864, #846, #839, #785, #733, #702, #698, #660, #497, #444, #418, #398, #325, #272, #116

Co-author: @Alemiz112

PetteriM1 avatar Mar 26 '24 19:03 PetteriM1

Just had a skim over a few of the core classes. This definitely requires bumping the API to 2.0.

I my opinion, we shouldn't break all plugins just because a part of the API (which most of them don't even depend on) was changed. You know how many plugin devs are inactive and how much people depend on public plugins. The whole point of releasing this at its current stage is trying to Keep Nukkit alive, avoid having all plugins needed to be rewritten until Nukkit has gained active users and plugin devs again. If we break all plugins, most people are just going to use forks and other software that have already finished their rewrite. If 1.0.20 isn't good, maybe we can do 1.5?

PetteriM1 avatar Mar 26 '24 20:03 PetteriM1