Repository: ZeppelinMC/Zeppelin Branch: main Commit: ed75f63fe8f4 Files: 1356 Total size: 1.4 MB Directory structure: gitextract_f2qo_zll/ ├── .github/ │ └── workflows/ │ └── go.yml ├── LICENSE ├── commands/ │ ├── commands.go │ ├── debug.go │ ├── gc.go │ ├── mem.go │ ├── tick.go │ └── time.go ├── go.mod ├── go.sum ├── main.go ├── properties/ │ ├── decode.go │ ├── encode.go │ └── properties.go ├── protocol/ │ ├── nbt/ │ │ ├── decoder.go │ │ ├── encoder.go │ │ ├── qnbt/ │ │ │ ├── abi.go │ │ │ ├── buffer.go │ │ │ ├── decode.go │ │ │ ├── list.go │ │ │ ├── malloc.go │ │ │ ├── map.go │ │ │ ├── primitive.go │ │ │ ├── qnbt.go │ │ │ └── struct.go │ │ └── staticReader.go │ ├── net/ │ │ ├── authentication.go │ │ ├── cfb8/ │ │ │ └── cfb8.go │ │ ├── config.go │ │ ├── conn.go │ │ ├── encryption.go │ │ ├── io/ │ │ │ ├── buffers/ │ │ │ │ └── buffers.go │ │ │ ├── compress/ │ │ │ │ ├── compress.go │ │ │ │ ├── lz4.go │ │ │ │ └── zlib.go │ │ │ └── encoding/ │ │ │ ├── encoding.go │ │ │ ├── reader.go │ │ │ └── writer.go │ │ ├── listener.go │ │ ├── metadata/ │ │ │ ├── metadata.go │ │ │ └── new.go │ │ ├── packet/ │ │ │ ├── configuration/ │ │ │ │ ├── clientInfo.go │ │ │ │ ├── cookie.go │ │ │ │ ├── disconnect.go │ │ │ │ ├── finish.go │ │ │ │ ├── keepAlive.go │ │ │ │ ├── ping.go │ │ │ │ ├── plugin.go │ │ │ │ ├── registryData.go │ │ │ │ └── resetChat.go │ │ │ ├── handshake/ │ │ │ │ └── handshake.go │ │ │ ├── login/ │ │ │ │ ├── cookie.go │ │ │ │ ├── disconnect.go │ │ │ │ ├── encryption.go │ │ │ │ ├── loginStart.go │ │ │ │ ├── loginSuccess.go │ │ │ │ ├── plugin.go │ │ │ │ └── setCompression.go │ │ │ ├── packet.go │ │ │ ├── play/ │ │ │ │ ├── acknowledgeBlockChange.go │ │ │ │ ├── blockAction.go │ │ │ │ ├── blockEntityData.go │ │ │ │ ├── blockUpdate.go │ │ │ │ ├── bundleDelimiter.go │ │ │ │ ├── changeDifficulty.go │ │ │ │ ├── chatCommand.go │ │ │ │ ├── chatMessage.go │ │ │ │ ├── chunkBatch.go │ │ │ │ ├── chunkData.go │ │ │ │ ├── clickContainer.go │ │ │ │ ├── clientInfo.go │ │ │ │ ├── closeContainer.go │ │ │ │ ├── commands.go │ │ │ │ ├── confirmTeleport.go │ │ │ │ ├── damageEvent.go │ │ │ │ ├── deleteMessage.go │ │ │ │ ├── disconnect.go │ │ │ │ ├── disguisedChatMessage.go │ │ │ │ ├── entityAnimation.go │ │ │ │ ├── entityEvent.go │ │ │ │ ├── entitySoundEffect.go │ │ │ │ ├── gameEvent.go │ │ │ │ ├── hurtAnimation.go │ │ │ │ ├── interact.go │ │ │ │ ├── keepAlive.go │ │ │ │ ├── login.go │ │ │ │ ├── openScreen.go │ │ │ │ ├── playerAbilitiesCB.go │ │ │ │ ├── playerAbilitiesSB.go │ │ │ │ ├── playerChatMessage.go │ │ │ │ ├── playerCommand.go │ │ │ │ ├── playerInfoRemove.go │ │ │ │ ├── playerInfoUpdate.go │ │ │ │ ├── playerSession.go │ │ │ │ ├── plugin.go │ │ │ │ ├── removeEntities.go │ │ │ │ ├── serverData.go │ │ │ │ ├── serverLinks.go │ │ │ │ ├── setCenterChunk.go │ │ │ │ ├── setContainerContent.go │ │ │ │ ├── setCreativeModeSlot.go │ │ │ │ ├── setDefaultSpawnPosition.go │ │ │ │ ├── setEntityMetadata.go │ │ │ │ ├── setEntityVelocity.go │ │ │ │ ├── setHeadRotation.go │ │ │ │ ├── setHeldItemCB.go │ │ │ │ ├── setHeldItemSB.go │ │ │ │ ├── setPlayerOnGround.go │ │ │ │ ├── setPlayerPosition.go │ │ │ │ ├── setPlayerPositionAndRotation.go │ │ │ │ ├── setPlayerRotation.go │ │ │ │ ├── setTickingState.go │ │ │ │ ├── signedChatCommand.go │ │ │ │ ├── soundEffect.go │ │ │ │ ├── spawnEntity.go │ │ │ │ ├── stepTick.go │ │ │ │ ├── swingArm.go │ │ │ │ ├── synchronizePlayerPosition.go │ │ │ │ ├── systemChatMessage.go │ │ │ │ ├── updateEntityPosition.go │ │ │ │ ├── updateEntityPositionAndRotation.go │ │ │ │ ├── updateEntityRotation.go │ │ │ │ ├── updateRecipeBook.go │ │ │ │ ├── updateSectionBlocks.go │ │ │ │ ├── updateTags.go │ │ │ │ ├── updateTime.go │ │ │ │ └── useItemOn.go │ │ │ └── status/ │ │ │ ├── ping.go │ │ │ └── status.go │ │ ├── pool.go │ │ ├── registry/ │ │ │ ├── embed.go │ │ │ └── registry.go │ │ ├── slot/ │ │ │ ├── comp_dec.go │ │ │ └── slot.go │ │ └── tags/ │ │ └── tags.go │ └── text/ │ ├── builder.go │ ├── color.go │ └── text.go ├── readme.md ├── server/ │ ├── command/ │ │ ├── builder.go │ │ ├── command.go │ │ ├── graph.go │ │ └── manager.go │ ├── container/ │ │ └── container.go │ ├── entity/ │ │ ├── entity.go │ │ └── levelEntity.go │ ├── player/ │ │ ├── chunks.go │ │ ├── conn.go │ │ ├── handler_chat_command.go │ │ ├── player.go │ │ ├── playerlist.go │ │ └── state/ │ │ ├── list/ │ │ │ └── playerlist.go │ │ ├── playerEntity.go │ │ └── playerEntityManager.go │ ├── plugin.go │ ├── registry/ │ │ ├── activity.go │ │ ├── armor_material.go │ │ ├── attribute.go │ │ ├── block.go │ │ ├── block_entity_type.go │ │ ├── block_predicate_type.go │ │ ├── block_type.go │ │ ├── cat_variant.go │ │ ├── chunk_status.go │ │ ├── command_argument_type.go │ │ ├── creative_mode_tab.go │ │ ├── custom_stat.go │ │ ├── data_component_type.go │ │ ├── decorated_pot_pattern.go │ │ ├── enchantment_effect_component_type.go │ │ ├── enchantment_entity_effect_type.go │ │ ├── enchantment_level_based_value_type.go │ │ ├── enchantment_location_based_effect_type.go │ │ ├── enchantment_provider_type.go │ │ ├── enchantment_value_effect_type.go │ │ ├── entity_sub_predicate_type.go │ │ ├── entity_type.go │ │ ├── float_provider_type.go │ │ ├── fluid.go │ │ ├── frog_variant.go │ │ ├── game_event.go │ │ ├── height_provider_type.go │ │ ├── instrument.go │ │ ├── int_provider_type.go │ │ ├── item.go │ │ ├── item_sub_predicate_type.go │ │ ├── loot_condition_type.go │ │ ├── loot_function_type.go │ │ ├── loot_nbt_provider_type.go │ │ ├── loot_number_provider_type.go │ │ ├── loot_pool_entry_type.go │ │ ├── loot_score_provider_type.go │ │ ├── map_decoration_type.go │ │ ├── memory_module_type.go │ │ ├── menu.go │ │ ├── mob_effect.go │ │ ├── number_format_type.go │ │ ├── particle_type.go │ │ ├── point_of_interest_type.go │ │ ├── pos_rule_test.go │ │ ├── position_source_type.go │ │ ├── potion.go │ │ ├── recipe_serializer.go │ │ ├── recipe_type.go │ │ ├── registry.go │ │ ├── rule_block_entity_modifier.go │ │ ├── rule_test.go │ │ ├── schedule.go │ │ ├── sensor_type.go │ │ ├── sound_event.go │ │ ├── stat_type.go │ │ ├── trigger_type.go │ │ ├── villager_profession.go │ │ ├── villager_type.go │ │ ├── worldgen_biome_source.go │ │ ├── worldgen_block_state_provider_type.go │ │ ├── worldgen_carver.go │ │ ├── worldgen_chunk_generator.go │ │ ├── worldgen_density_function_type.go │ │ ├── worldgen_feature.go │ │ ├── worldgen_feature_size_type.go │ │ ├── worldgen_foliage_placer_type.go │ │ ├── worldgen_material_condition.go │ │ ├── worldgen_material_rule.go │ │ ├── worldgen_placement_modifier_type.go │ │ ├── worldgen_pool_alias_binding.go │ │ ├── worldgen_root_placer_type.go │ │ ├── worldgen_structure_piece.go │ │ ├── worldgen_structure_placement.go │ │ ├── worldgen_structure_pool_element.go │ │ ├── worldgen_structure_processor.go │ │ ├── worldgen_structure_type.go │ │ ├── worldgen_tree_decorator_type.go │ │ └── worldgen_trunk_placer_type.go │ ├── server.go │ ├── tick/ │ │ └── tick.go │ └── world/ │ ├── block/ │ │ ├── 0block.go │ │ ├── acaciaButton.go │ │ ├── acaciaDoor.go │ │ ├── acaciaFence.go │ │ ├── acaciaFenceGate.go │ │ ├── acaciaHangingSign.go │ │ ├── acaciaLeaves.go │ │ ├── acaciaLog.go │ │ ├── acaciaPlanks.go │ │ ├── acaciaPressurePlate.go │ │ ├── acaciaSapling.go │ │ ├── acaciaSign.go │ │ ├── acaciaSlab.go │ │ ├── acaciaStairs.go │ │ ├── acaciaTrapdoor.go │ │ ├── acaciaWallHangingSign.go │ │ ├── acaciaWallSign.go │ │ ├── acaciaWood.go │ │ ├── activatorRail.go │ │ ├── air.go │ │ ├── allium.go │ │ ├── amethystBlock.go │ │ ├── amethystCluster.go │ │ ├── ancientDebris.go │ │ ├── andesite.go │ │ ├── andesiteSlab.go │ │ ├── andesiteStairs.go │ │ ├── andesiteWall.go │ │ ├── anvil.go │ │ ├── attachedMelonStem.go │ │ ├── attachedPumpkinStem.go │ │ ├── azalea.go │ │ ├── azaleaLeaves.go │ │ ├── azureBluet.go │ │ ├── bamboo.go │ │ ├── bambooBlock.go │ │ ├── bambooButton.go │ │ ├── bambooDoor.go │ │ ├── bambooFence.go │ │ ├── bambooFenceGate.go │ │ ├── bambooHangingSign.go │ │ ├── bambooMosaic.go │ │ ├── bambooMosaicSlab.go │ │ ├── bambooMosaicStairs.go │ │ ├── bambooPlanks.go │ │ ├── bambooPressurePlate.go │ │ ├── bambooSapling.go │ │ ├── bambooSign.go │ │ ├── bambooSlab.go │ │ ├── bambooStairs.go │ │ ├── bambooTrapdoor.go │ │ ├── bambooWallHangingSign.go │ │ ├── bambooWallSign.go │ │ ├── barrel.go │ │ ├── barrier.go │ │ ├── basalt.go │ │ ├── beacon.go │ │ ├── bedrock.go │ │ ├── beeNest.go │ │ ├── beehive.go │ │ ├── beetroots.go │ │ ├── bell.go │ │ ├── bigDripleaf.go │ │ ├── bigDripleafStem.go │ │ ├── birchButton.go │ │ ├── birchDoor.go │ │ ├── birchFence.go │ │ ├── birchFenceGate.go │ │ ├── birchHangingSign.go │ │ ├── birchLeaves.go │ │ ├── birchLog.go │ │ ├── birchPlanks.go │ │ ├── birchPressurePlate.go │ │ ├── birchSapling.go │ │ ├── birchSign.go │ │ ├── birchSlab.go │ │ ├── birchStairs.go │ │ ├── birchTrapdoor.go │ │ ├── birchWallHangingSign.go │ │ ├── birchWallSign.go │ │ ├── birchWood.go │ │ ├── blackBanner.go │ │ ├── blackBed.go │ │ ├── blackCandle.go │ │ ├── blackCandleCake.go │ │ ├── blackCarpet.go │ │ ├── blackConcrete.go │ │ ├── blackConcretePowder.go │ │ ├── blackGlazedTerracotta.go │ │ ├── blackShulkerBox.go │ │ ├── blackStainedGlass.go │ │ ├── blackStainedGlassPane.go │ │ ├── blackTerracotta.go │ │ ├── blackWallBanner.go │ │ ├── blackWool.go │ │ ├── blackstone.go │ │ ├── blackstoneSlab.go │ │ ├── blackstoneStairs.go │ │ ├── blackstoneWall.go │ │ ├── blastFurnace.go │ │ ├── blueBanner.go │ │ ├── blueBed.go │ │ ├── blueCandle.go │ │ ├── blueCandleCake.go │ │ ├── blueCarpet.go │ │ ├── blueConcrete.go │ │ ├── blueConcretePowder.go │ │ ├── blueGlazedTerracotta.go │ │ ├── blueIce.go │ │ ├── blueOrchid.go │ │ ├── blueShulkerBox.go │ │ ├── blueStainedGlass.go │ │ ├── blueStainedGlassPane.go │ │ ├── blueTerracotta.go │ │ ├── blueWallBanner.go │ │ ├── blueWool.go │ │ ├── boneBlock.go │ │ ├── bookshelf.go │ │ ├── brainCoral.go │ │ ├── brainCoralBlock.go │ │ ├── brainCoralFan.go │ │ ├── brainCoralWallFan.go │ │ ├── brewingStand.go │ │ ├── brickSlab.go │ │ ├── brickStairs.go │ │ ├── brickWall.go │ │ ├── bricks.go │ │ ├── brownBanner.go │ │ ├── brownBed.go │ │ ├── brownCandle.go │ │ ├── brownCandleCake.go │ │ ├── brownCarpet.go │ │ ├── brownConcrete.go │ │ ├── brownConcretePowder.go │ │ ├── brownGlazedTerracotta.go │ │ ├── brownMushroom.go │ │ ├── brownMushroomBlock.go │ │ ├── brownShulkerBox.go │ │ ├── brownStainedGlass.go │ │ ├── brownStainedGlassPane.go │ │ ├── brownTerracotta.go │ │ ├── brownWallBanner.go │ │ ├── brownWool.go │ │ ├── bubbleColumn.go │ │ ├── bubbleCoral.go │ │ ├── bubbleCoralBlock.go │ │ ├── bubbleCoralFan.go │ │ ├── bubbleCoralWallFan.go │ │ ├── buddingAmethyst.go │ │ ├── cactus.go │ │ ├── cake.go │ │ ├── calcite.go │ │ ├── calibratedSculkSensor.go │ │ ├── campfire.go │ │ ├── candle.go │ │ ├── candleCake.go │ │ ├── carrots.go │ │ ├── cartographyTable.go │ │ ├── carvedPumpkin.go │ │ ├── cauldron.go │ │ ├── caveAir.go │ │ ├── caveVines.go │ │ ├── caveVinesPlant.go │ │ ├── chain.go │ │ ├── chainCommandBlock.go │ │ ├── cherryButton.go │ │ ├── cherryDoor.go │ │ ├── cherryFence.go │ │ ├── cherryFenceGate.go │ │ ├── cherryHangingSign.go │ │ ├── cherryLeaves.go │ │ ├── cherryLog.go │ │ ├── cherryPlanks.go │ │ ├── cherryPressurePlate.go │ │ ├── cherrySapling.go │ │ ├── cherrySign.go │ │ ├── cherrySlab.go │ │ ├── cherryStairs.go │ │ ├── cherryTrapdoor.go │ │ ├── cherryWallHangingSign.go │ │ ├── cherryWallSign.go │ │ ├── cherryWood.go │ │ ├── chest.go │ │ ├── chippedAnvil.go │ │ ├── chiseledBookshelf.go │ │ ├── chiseledCopper.go │ │ ├── chiseledDeepslate.go │ │ ├── chiseledNetherBricks.go │ │ ├── chiseledPolishedBlackstone.go │ │ ├── chiseledQuartzBlock.go │ │ ├── chiseledRedSandstone.go │ │ ├── chiseledSandstone.go │ │ ├── chiseledStoneBricks.go │ │ ├── chiseledTuff.go │ │ ├── chiseledTuffBricks.go │ │ ├── chorusFlower.go │ │ ├── chorusPlant.go │ │ ├── clay.go │ │ ├── coalBlock.go │ │ ├── coalOre.go │ │ ├── coarseDirt.go │ │ ├── cobbledDeepslate.go │ │ ├── cobbledDeepslateSlab.go │ │ ├── cobbledDeepslateStairs.go │ │ ├── cobbledDeepslateWall.go │ │ ├── cobblestone.go │ │ ├── cobblestoneSlab.go │ │ ├── cobblestoneStairs.go │ │ ├── cobblestoneWall.go │ │ ├── cobweb.go │ │ ├── cocoa.go │ │ ├── commandBlock.go │ │ ├── comparator.go │ │ ├── composter.go │ │ ├── conduit.go │ │ ├── copperBlock.go │ │ ├── copperBulb.go │ │ ├── copperDoor.go │ │ ├── copperGrate.go │ │ ├── copperOre.go │ │ ├── copperTrapdoor.go │ │ ├── cornflower.go │ │ ├── crackedDeepslateBricks.go │ │ ├── crackedDeepslateTiles.go │ │ ├── crackedNetherBricks.go │ │ ├── crackedPolishedBlackstoneBricks.go │ │ ├── crackedStoneBricks.go │ │ ├── crafter.go │ │ ├── craftingTable.go │ │ ├── creeperHead.go │ │ ├── creeperWallHead.go │ │ ├── crimsonButton.go │ │ ├── crimsonDoor.go │ │ ├── crimsonFence.go │ │ ├── crimsonFenceGate.go │ │ ├── crimsonFungus.go │ │ ├── crimsonHangingSign.go │ │ ├── crimsonHyphae.go │ │ ├── crimsonNylium.go │ │ ├── crimsonPlanks.go │ │ ├── crimsonPressurePlate.go │ │ ├── crimsonRoots.go │ │ ├── crimsonSign.go │ │ ├── crimsonSlab.go │ │ ├── crimsonStairs.go │ │ ├── crimsonStem.go │ │ ├── crimsonTrapdoor.go │ │ ├── crimsonWallHangingSign.go │ │ ├── crimsonWallSign.go │ │ ├── cryingObsidian.go │ │ ├── cutCopper.go │ │ ├── cutCopperSlab.go │ │ ├── cutCopperStairs.go │ │ ├── cutRedSandstone.go │ │ ├── cutRedSandstoneSlab.go │ │ ├── cutSandstone.go │ │ ├── cutSandstoneSlab.go │ │ ├── cyanBanner.go │ │ ├── cyanBed.go │ │ ├── cyanCandle.go │ │ ├── cyanCandleCake.go │ │ ├── cyanCarpet.go │ │ ├── cyanConcrete.go │ │ ├── cyanConcretePowder.go │ │ ├── cyanGlazedTerracotta.go │ │ ├── cyanShulkerBox.go │ │ ├── cyanStainedGlass.go │ │ ├── cyanStainedGlassPane.go │ │ ├── cyanTerracotta.go │ │ ├── cyanWallBanner.go │ │ ├── cyanWool.go │ │ ├── damagedAnvil.go │ │ ├── dandelion.go │ │ ├── darkOakButton.go │ │ ├── darkOakDoor.go │ │ ├── darkOakFence.go │ │ ├── darkOakFenceGate.go │ │ ├── darkOakHangingSign.go │ │ ├── darkOakLeaves.go │ │ ├── darkOakLog.go │ │ ├── darkOakPlanks.go │ │ ├── darkOakPressurePlate.go │ │ ├── darkOakSapling.go │ │ ├── darkOakSign.go │ │ ├── darkOakSlab.go │ │ ├── darkOakStairs.go │ │ ├── darkOakTrapdoor.go │ │ ├── darkOakWallHangingSign.go │ │ ├── darkOakWallSign.go │ │ ├── darkOakWood.go │ │ ├── darkPrismarine.go │ │ ├── darkPrismarineSlab.go │ │ ├── darkPrismarineStairs.go │ │ ├── daylightDetector.go │ │ ├── deadBrainCoral.go │ │ ├── deadBrainCoralBlock.go │ │ ├── deadBrainCoralFan.go │ │ ├── deadBrainCoralWallFan.go │ │ ├── deadBubbleCoral.go │ │ ├── deadBubbleCoralBlock.go │ │ ├── deadBubbleCoralFan.go │ │ ├── deadBubbleCoralWallFan.go │ │ ├── deadBush.go │ │ ├── deadFireCoral.go │ │ ├── deadFireCoralBlock.go │ │ ├── deadFireCoralFan.go │ │ ├── deadFireCoralWallFan.go │ │ ├── deadHornCoral.go │ │ ├── deadHornCoralBlock.go │ │ ├── deadHornCoralFan.go │ │ ├── deadHornCoralWallFan.go │ │ ├── deadTubeCoral.go │ │ ├── deadTubeCoralBlock.go │ │ ├── deadTubeCoralFan.go │ │ ├── deadTubeCoralWallFan.go │ │ ├── decoratedPot.go │ │ ├── deepslate.go │ │ ├── deepslateBrickSlab.go │ │ ├── deepslateBrickStairs.go │ │ ├── deepslateBrickWall.go │ │ ├── deepslateBricks.go │ │ ├── deepslateCoalOre.go │ │ ├── deepslateCopperOre.go │ │ ├── deepslateDiamondOre.go │ │ ├── deepslateEmeraldOre.go │ │ ├── deepslateGoldOre.go │ │ ├── deepslateIronOre.go │ │ ├── deepslateLapisOre.go │ │ ├── deepslateRedstoneOre.go │ │ ├── deepslateTileSlab.go │ │ ├── deepslateTileStairs.go │ │ ├── deepslateTileWall.go │ │ ├── deepslateTiles.go │ │ ├── detectorRail.go │ │ ├── diamondBlock.go │ │ ├── diamondOre.go │ │ ├── diorite.go │ │ ├── dioriteSlab.go │ │ ├── dioriteStairs.go │ │ ├── dioriteWall.go │ │ ├── dirt.go │ │ ├── dirtPath.go │ │ ├── dispenser.go │ │ ├── dragonEgg.go │ │ ├── dragonHead.go │ │ ├── dragonWallHead.go │ │ ├── driedKelpBlock.go │ │ ├── dripstoneBlock.go │ │ ├── dropper.go │ │ ├── emeraldBlock.go │ │ ├── emeraldOre.go │ │ ├── enchantingTable.go │ │ ├── endGateway.go │ │ ├── endPortal.go │ │ ├── endPortalFrame.go │ │ ├── endRod.go │ │ ├── endStone.go │ │ ├── endStoneBrickSlab.go │ │ ├── endStoneBrickStairs.go │ │ ├── endStoneBrickWall.go │ │ ├── endStoneBricks.go │ │ ├── enderChest.go │ │ ├── exposedChiseledCopper.go │ │ ├── exposedCopper.go │ │ ├── exposedCopperBulb.go │ │ ├── exposedCopperDoor.go │ │ ├── exposedCopperGrate.go │ │ ├── exposedCopperTrapdoor.go │ │ ├── exposedCutCopper.go │ │ ├── exposedCutCopperSlab.go │ │ ├── exposedCutCopperStairs.go │ │ ├── farmland.go │ │ ├── fern.go │ │ ├── fire.go │ │ ├── fireCoral.go │ │ ├── fireCoralBlock.go │ │ ├── fireCoralFan.go │ │ ├── fireCoralWallFan.go │ │ ├── fletchingTable.go │ │ ├── flowerPot.go │ │ ├── floweringAzalea.go │ │ ├── floweringAzaleaLeaves.go │ │ ├── frogspawn.go │ │ ├── frostedIce.go │ │ ├── furnace.go │ │ ├── gildedBlackstone.go │ │ ├── glass.go │ │ ├── glassPane.go │ │ ├── glowLichen.go │ │ ├── glowstone.go │ │ ├── goldBlock.go │ │ ├── goldOre.go │ │ ├── granite.go │ │ ├── graniteSlab.go │ │ ├── graniteStairs.go │ │ ├── graniteWall.go │ │ ├── grassBlock.go │ │ ├── gravel.go │ │ ├── grayBanner.go │ │ ├── grayBed.go │ │ ├── grayCandle.go │ │ ├── grayCandleCake.go │ │ ├── grayCarpet.go │ │ ├── grayConcrete.go │ │ ├── grayConcretePowder.go │ │ ├── grayGlazedTerracotta.go │ │ ├── grayShulkerBox.go │ │ ├── grayStainedGlass.go │ │ ├── grayStainedGlassPane.go │ │ ├── grayTerracotta.go │ │ ├── grayWallBanner.go │ │ ├── grayWool.go │ │ ├── greenBanner.go │ │ ├── greenBed.go │ │ ├── greenCandle.go │ │ ├── greenCandleCake.go │ │ ├── greenCarpet.go │ │ ├── greenConcrete.go │ │ ├── greenConcretePowder.go │ │ ├── greenGlazedTerracotta.go │ │ ├── greenShulkerBox.go │ │ ├── greenStainedGlass.go │ │ ├── greenStainedGlassPane.go │ │ ├── greenTerracotta.go │ │ ├── greenWallBanner.go │ │ ├── greenWool.go │ │ ├── grindstone.go │ │ ├── hangingRoots.go │ │ ├── hayBlock.go │ │ ├── heavyCore.go │ │ ├── heavyWeightedPressurePlate.go │ │ ├── honeyBlock.go │ │ ├── honeycombBlock.go │ │ ├── hopper.go │ │ ├── hornCoral.go │ │ ├── hornCoralBlock.go │ │ ├── hornCoralFan.go │ │ ├── hornCoralWallFan.go │ │ ├── ice.go │ │ ├── infestedChiseledStoneBricks.go │ │ ├── infestedCobblestone.go │ │ ├── infestedCrackedStoneBricks.go │ │ ├── infestedDeepslate.go │ │ ├── infestedMossyStoneBricks.go │ │ ├── infestedStone.go │ │ ├── infestedStoneBricks.go │ │ ├── ironBars.go │ │ ├── ironBlock.go │ │ ├── ironDoor.go │ │ ├── ironOre.go │ │ ├── ironTrapdoor.go │ │ ├── jackOLantern.go │ │ ├── jigsaw.go │ │ ├── jukebox.go │ │ ├── jungleButton.go │ │ ├── jungleDoor.go │ │ ├── jungleFence.go │ │ ├── jungleFenceGate.go │ │ ├── jungleHangingSign.go │ │ ├── jungleLeaves.go │ │ ├── jungleLog.go │ │ ├── junglePlanks.go │ │ ├── junglePressurePlate.go │ │ ├── jungleSapling.go │ │ ├── jungleSign.go │ │ ├── jungleSlab.go │ │ ├── jungleStairs.go │ │ ├── jungleTrapdoor.go │ │ ├── jungleWallHangingSign.go │ │ ├── jungleWallSign.go │ │ ├── jungleWood.go │ │ ├── kelp.go │ │ ├── kelpPlant.go │ │ ├── ladder.go │ │ ├── lantern.go │ │ ├── lapisBlock.go │ │ ├── lapisOre.go │ │ ├── largeAmethystBud.go │ │ ├── largeFern.go │ │ ├── lava.go │ │ ├── lavaCauldron.go │ │ ├── lectern.go │ │ ├── lever.go │ │ ├── light.go │ │ ├── lightBlueBanner.go │ │ ├── lightBlueBed.go │ │ ├── lightBlueCandle.go │ │ ├── lightBlueCandleCake.go │ │ ├── lightBlueCarpet.go │ │ ├── lightBlueConcrete.go │ │ ├── lightBlueConcretePowder.go │ │ ├── lightBlueGlazedTerracotta.go │ │ ├── lightBlueShulkerBox.go │ │ ├── lightBlueStainedGlass.go │ │ ├── lightBlueStainedGlassPane.go │ │ ├── lightBlueTerracotta.go │ │ ├── lightBlueWallBanner.go │ │ ├── lightBlueWool.go │ │ ├── lightGrayBanner.go │ │ ├── lightGrayBed.go │ │ ├── lightGrayCandle.go │ │ ├── lightGrayCandleCake.go │ │ ├── lightGrayCarpet.go │ │ ├── lightGrayConcrete.go │ │ ├── lightGrayConcretePowder.go │ │ ├── lightGrayGlazedTerracotta.go │ │ ├── lightGrayShulkerBox.go │ │ ├── lightGrayStainedGlass.go │ │ ├── lightGrayStainedGlassPane.go │ │ ├── lightGrayTerracotta.go │ │ ├── lightGrayWallBanner.go │ │ ├── lightGrayWool.go │ │ ├── lightWeightedPressurePlate.go │ │ ├── lightningRod.go │ │ ├── lilac.go │ │ ├── lilyOfTheValley.go │ │ ├── lilyPad.go │ │ ├── limeBanner.go │ │ ├── limeBed.go │ │ ├── limeCandle.go │ │ ├── limeCandleCake.go │ │ ├── limeCarpet.go │ │ ├── limeConcrete.go │ │ ├── limeConcretePowder.go │ │ ├── limeGlazedTerracotta.go │ │ ├── limeShulkerBox.go │ │ ├── limeStainedGlass.go │ │ ├── limeStainedGlassPane.go │ │ ├── limeTerracotta.go │ │ ├── limeWallBanner.go │ │ ├── limeWool.go │ │ ├── lodestone.go │ │ ├── loom.go │ │ ├── magentaBanner.go │ │ ├── magentaBed.go │ │ ├── magentaCandle.go │ │ ├── magentaCandleCake.go │ │ ├── magentaCarpet.go │ │ ├── magentaConcrete.go │ │ ├── magentaConcretePowder.go │ │ ├── magentaGlazedTerracotta.go │ │ ├── magentaShulkerBox.go │ │ ├── magentaStainedGlass.go │ │ ├── magentaStainedGlassPane.go │ │ ├── magentaTerracotta.go │ │ ├── magentaWallBanner.go │ │ ├── magentaWool.go │ │ ├── magmaBlock.go │ │ ├── mangroveButton.go │ │ ├── mangroveDoor.go │ │ ├── mangroveFence.go │ │ ├── mangroveFenceGate.go │ │ ├── mangroveHangingSign.go │ │ ├── mangroveLeaves.go │ │ ├── mangroveLog.go │ │ ├── mangrovePlanks.go │ │ ├── mangrovePressurePlate.go │ │ ├── mangrovePropagule.go │ │ ├── mangroveRoots.go │ │ ├── mangroveSign.go │ │ ├── mangroveSlab.go │ │ ├── mangroveStairs.go │ │ ├── mangroveTrapdoor.go │ │ ├── mangroveWallHangingSign.go │ │ ├── mangroveWallSign.go │ │ ├── mangroveWood.go │ │ ├── mediumAmethystBud.go │ │ ├── melon.go │ │ ├── melonStem.go │ │ ├── mossBlock.go │ │ ├── mossCarpet.go │ │ ├── mossyCobblestone.go │ │ ├── mossyCobblestoneSlab.go │ │ ├── mossyCobblestoneStairs.go │ │ ├── mossyCobblestoneWall.go │ │ ├── mossyStoneBrickSlab.go │ │ ├── mossyStoneBrickStairs.go │ │ ├── mossyStoneBrickWall.go │ │ ├── mossyStoneBricks.go │ │ ├── movingPiston.go │ │ ├── mud.go │ │ ├── mudBrickSlab.go │ │ ├── mudBrickStairs.go │ │ ├── mudBrickWall.go │ │ ├── mudBricks.go │ │ ├── muddyMangroveRoots.go │ │ ├── mushroomStem.go │ │ ├── mycelium.go │ │ ├── netherBrickFence.go │ │ ├── netherBrickSlab.go │ │ ├── netherBrickStairs.go │ │ ├── netherBrickWall.go │ │ ├── netherBricks.go │ │ ├── netherGoldOre.go │ │ ├── netherPortal.go │ │ ├── netherQuartzOre.go │ │ ├── netherSprouts.go │ │ ├── netherWart.go │ │ ├── netherWartBlock.go │ │ ├── netheriteBlock.go │ │ ├── netherrack.go │ │ ├── noteBlock.go │ │ ├── oakButton.go │ │ ├── oakDoor.go │ │ ├── oakFence.go │ │ ├── oakFenceGate.go │ │ ├── oakHangingSign.go │ │ ├── oakLeaves.go │ │ ├── oakLog.go │ │ ├── oakPlanks.go │ │ ├── oakPressurePlate.go │ │ ├── oakSapling.go │ │ ├── oakSign.go │ │ ├── oakSlab.go │ │ ├── oakStairs.go │ │ ├── oakTrapdoor.go │ │ ├── oakWallHangingSign.go │ │ ├── oakWallSign.go │ │ ├── oakWood.go │ │ ├── observer.go │ │ ├── obsidian.go │ │ ├── ochreFroglight.go │ │ ├── orangeBanner.go │ │ ├── orangeBed.go │ │ ├── orangeCandle.go │ │ ├── orangeCandleCake.go │ │ ├── orangeCarpet.go │ │ ├── orangeConcrete.go │ │ ├── orangeConcretePowder.go │ │ ├── orangeGlazedTerracotta.go │ │ ├── orangeShulkerBox.go │ │ ├── orangeStainedGlass.go │ │ ├── orangeStainedGlassPane.go │ │ ├── orangeTerracotta.go │ │ ├── orangeTulip.go │ │ ├── orangeWallBanner.go │ │ ├── orangeWool.go │ │ ├── oxeyeDaisy.go │ │ ├── oxidizedChiseledCopper.go │ │ ├── oxidizedCopper.go │ │ ├── oxidizedCopperBulb.go │ │ ├── oxidizedCopperDoor.go │ │ ├── oxidizedCopperGrate.go │ │ ├── oxidizedCopperTrapdoor.go │ │ ├── oxidizedCutCopper.go │ │ ├── oxidizedCutCopperSlab.go │ │ ├── oxidizedCutCopperStairs.go │ │ ├── packedIce.go │ │ ├── packedMud.go │ │ ├── pearlescentFroglight.go │ │ ├── peony.go │ │ ├── petrifiedOakSlab.go │ │ ├── piglinHead.go │ │ ├── piglinWallHead.go │ │ ├── pinkBanner.go │ │ ├── pinkBed.go │ │ ├── pinkCandle.go │ │ ├── pinkCandleCake.go │ │ ├── pinkCarpet.go │ │ ├── pinkConcrete.go │ │ ├── pinkConcretePowder.go │ │ ├── pinkGlazedTerracotta.go │ │ ├── pinkPetals.go │ │ ├── pinkShulkerBox.go │ │ ├── pinkStainedGlass.go │ │ ├── pinkStainedGlassPane.go │ │ ├── pinkTerracotta.go │ │ ├── pinkTulip.go │ │ ├── pinkWallBanner.go │ │ ├── pinkWool.go │ │ ├── piston.go │ │ ├── pistonHead.go │ │ ├── pitcherCrop.go │ │ ├── pitcherPlant.go │ │ ├── playerHead.go │ │ ├── playerWallHead.go │ │ ├── podzol.go │ │ ├── pointedDripstone.go │ │ ├── polishedAndesite.go │ │ ├── polishedAndesiteSlab.go │ │ ├── polishedAndesiteStairs.go │ │ ├── polishedBasalt.go │ │ ├── polishedBlackstone.go │ │ ├── polishedBlackstoneBrickSlab.go │ │ ├── polishedBlackstoneBrickStairs.go │ │ ├── polishedBlackstoneBrickWall.go │ │ ├── polishedBlackstoneBricks.go │ │ ├── polishedBlackstoneButton.go │ │ ├── polishedBlackstonePressurePlate.go │ │ ├── polishedBlackstoneSlab.go │ │ ├── polishedBlackstoneStairs.go │ │ ├── polishedBlackstoneWall.go │ │ ├── polishedDeepslate.go │ │ ├── polishedDeepslateSlab.go │ │ ├── polishedDeepslateStairs.go │ │ ├── polishedDeepslateWall.go │ │ ├── polishedDiorite.go │ │ ├── polishedDioriteSlab.go │ │ ├── polishedDioriteStairs.go │ │ ├── polishedGranite.go │ │ ├── polishedGraniteSlab.go │ │ ├── polishedGraniteStairs.go │ │ ├── polishedTuff.go │ │ ├── polishedTuffSlab.go │ │ ├── polishedTuffStairs.go │ │ ├── polishedTuffWall.go │ │ ├── poppy.go │ │ ├── pos/ │ │ │ └── pos.go │ │ ├── potatoes.go │ │ ├── pottedAcaciaSapling.go │ │ ├── pottedAllium.go │ │ ├── pottedAzaleaBush.go │ │ ├── pottedAzureBluet.go │ │ ├── pottedBamboo.go │ │ ├── pottedBirchSapling.go │ │ ├── pottedBlueOrchid.go │ │ ├── pottedBrownMushroom.go │ │ ├── pottedCactus.go │ │ ├── pottedCherrySapling.go │ │ ├── pottedCornflower.go │ │ ├── pottedCrimsonFungus.go │ │ ├── pottedCrimsonRoots.go │ │ ├── pottedDandelion.go │ │ ├── pottedDarkOakSapling.go │ │ ├── pottedDeadBush.go │ │ ├── pottedFern.go │ │ ├── pottedFloweringAzaleaBush.go │ │ ├── pottedJungleSapling.go │ │ ├── pottedLilyOfTheValley.go │ │ ├── pottedMangrovePropagule.go │ │ ├── pottedOakSapling.go │ │ ├── pottedOrangeTulip.go │ │ ├── pottedOxeyeDaisy.go │ │ ├── pottedPinkTulip.go │ │ ├── pottedPoppy.go │ │ ├── pottedRedMushroom.go │ │ ├── pottedRedTulip.go │ │ ├── pottedSpruceSapling.go │ │ ├── pottedTorchflower.go │ │ ├── pottedWarpedFungus.go │ │ ├── pottedWarpedRoots.go │ │ ├── pottedWhiteTulip.go │ │ ├── pottedWitherRose.go │ │ ├── powderSnow.go │ │ ├── powderSnowCauldron.go │ │ ├── poweredRail.go │ │ ├── prismarine.go │ │ ├── prismarineBrickSlab.go │ │ ├── prismarineBrickStairs.go │ │ ├── prismarineBricks.go │ │ ├── prismarineSlab.go │ │ ├── prismarineStairs.go │ │ ├── prismarineWall.go │ │ ├── pumpkin.go │ │ ├── pumpkinStem.go │ │ ├── purpleBanner.go │ │ ├── purpleBed.go │ │ ├── purpleCandle.go │ │ ├── purpleCandleCake.go │ │ ├── purpleCarpet.go │ │ ├── purpleConcrete.go │ │ ├── purpleConcretePowder.go │ │ ├── purpleGlazedTerracotta.go │ │ ├── purpleShulkerBox.go │ │ ├── purpleStainedGlass.go │ │ ├── purpleStainedGlassPane.go │ │ ├── purpleTerracotta.go │ │ ├── purpleWallBanner.go │ │ ├── purpleWool.go │ │ ├── purpurBlock.go │ │ ├── purpurPillar.go │ │ ├── purpurSlab.go │ │ ├── purpurStairs.go │ │ ├── quartzBlock.go │ │ ├── quartzBricks.go │ │ ├── quartzPillar.go │ │ ├── quartzSlab.go │ │ ├── quartzStairs.go │ │ ├── rail.go │ │ ├── rawCopperBlock.go │ │ ├── rawGoldBlock.go │ │ ├── rawIronBlock.go │ │ ├── redBanner.go │ │ ├── redBed.go │ │ ├── redCandle.go │ │ ├── redCandleCake.go │ │ ├── redCarpet.go │ │ ├── redConcrete.go │ │ ├── redConcretePowder.go │ │ ├── redGlazedTerracotta.go │ │ ├── redMushroom.go │ │ ├── redMushroomBlock.go │ │ ├── redNetherBrickSlab.go │ │ ├── redNetherBrickStairs.go │ │ ├── redNetherBrickWall.go │ │ ├── redNetherBricks.go │ │ ├── redSand.go │ │ ├── redSandstone.go │ │ ├── redSandstoneSlab.go │ │ ├── redSandstoneStairs.go │ │ ├── redSandstoneWall.go │ │ ├── redShulkerBox.go │ │ ├── redStainedGlass.go │ │ ├── redStainedGlassPane.go │ │ ├── redTerracotta.go │ │ ├── redTulip.go │ │ ├── redWallBanner.go │ │ ├── redWool.go │ │ ├── redstoneBlock.go │ │ ├── redstoneLamp.go │ │ ├── redstoneOre.go │ │ ├── redstoneTorch.go │ │ ├── redstoneWallTorch.go │ │ ├── redstoneWire.go │ │ ├── reinforcedDeepslate.go │ │ ├── repeater.go │ │ ├── repeatingCommandBlock.go │ │ ├── respawnAnchor.go │ │ ├── rootedDirt.go │ │ ├── roseBush.go │ │ ├── sand.go │ │ ├── sandstone.go │ │ ├── sandstoneSlab.go │ │ ├── sandstoneStairs.go │ │ ├── sandstoneWall.go │ │ ├── scaffolding.go │ │ ├── sculk.go │ │ ├── sculkCatalyst.go │ │ ├── sculkSensor.go │ │ ├── sculkShrieker.go │ │ ├── sculkVein.go │ │ ├── seaLantern.go │ │ ├── seaPickle.go │ │ ├── seagrass.go │ │ ├── shortGrass.go │ │ ├── shroomlight.go │ │ ├── shulkerBox.go │ │ ├── skeletonSkull.go │ │ ├── skeletonWallSkull.go │ │ ├── slimeBlock.go │ │ ├── smallAmethystBud.go │ │ ├── smallDripleaf.go │ │ ├── smithingTable.go │ │ ├── smoker.go │ │ ├── smoothBasalt.go │ │ ├── smoothQuartz.go │ │ ├── smoothQuartzSlab.go │ │ ├── smoothQuartzStairs.go │ │ ├── smoothRedSandstone.go │ │ ├── smoothRedSandstoneSlab.go │ │ ├── smoothRedSandstoneStairs.go │ │ ├── smoothSandstone.go │ │ ├── smoothSandstoneSlab.go │ │ ├── smoothSandstoneStairs.go │ │ ├── smoothStone.go │ │ ├── smoothStoneSlab.go │ │ ├── snifferEgg.go │ │ ├── snow.go │ │ ├── snowBlock.go │ │ ├── soulCampfire.go │ │ ├── soulFire.go │ │ ├── soulLantern.go │ │ ├── soulSand.go │ │ ├── soulSoil.go │ │ ├── soulTorch.go │ │ ├── soulWallTorch.go │ │ ├── spawner.go │ │ ├── sponge.go │ │ ├── sporeBlossom.go │ │ ├── spruceButton.go │ │ ├── spruceDoor.go │ │ ├── spruceFence.go │ │ ├── spruceFenceGate.go │ │ ├── spruceHangingSign.go │ │ ├── spruceLeaves.go │ │ ├── spruceLog.go │ │ ├── sprucePlanks.go │ │ ├── sprucePressurePlate.go │ │ ├── spruceSapling.go │ │ ├── spruceSign.go │ │ ├── spruceSlab.go │ │ ├── spruceStairs.go │ │ ├── spruceTrapdoor.go │ │ ├── spruceWallHangingSign.go │ │ ├── spruceWallSign.go │ │ ├── spruceWood.go │ │ ├── stickyPiston.go │ │ ├── stone.go │ │ ├── stoneBrickSlab.go │ │ ├── stoneBrickStairs.go │ │ ├── stoneBrickWall.go │ │ ├── stoneBricks.go │ │ ├── stoneButton.go │ │ ├── stonePressurePlate.go │ │ ├── stoneSlab.go │ │ ├── stoneStairs.go │ │ ├── stonecutter.go │ │ ├── strippedAcaciaLog.go │ │ ├── strippedAcaciaWood.go │ │ ├── strippedBambooBlock.go │ │ ├── strippedBirchLog.go │ │ ├── strippedBirchWood.go │ │ ├── strippedCherryLog.go │ │ ├── strippedCherryWood.go │ │ ├── strippedCrimsonHyphae.go │ │ ├── strippedCrimsonStem.go │ │ ├── strippedDarkOakLog.go │ │ ├── strippedDarkOakWood.go │ │ ├── strippedJungleLog.go │ │ ├── strippedJungleWood.go │ │ ├── strippedMangroveLog.go │ │ ├── strippedMangroveWood.go │ │ ├── strippedOakLog.go │ │ ├── strippedOakWood.go │ │ ├── strippedSpruceLog.go │ │ ├── strippedSpruceWood.go │ │ ├── strippedWarpedHyphae.go │ │ ├── strippedWarpedStem.go │ │ ├── structureBlock.go │ │ ├── structureVoid.go │ │ ├── sugarCane.go │ │ ├── sunflower.go │ │ ├── suspiciousGravel.go │ │ ├── suspiciousSand.go │ │ ├── sweetBerryBush.go │ │ ├── tallGrass.go │ │ ├── tallSeagrass.go │ │ ├── target.go │ │ ├── terracotta.go │ │ ├── tintedGlass.go │ │ ├── tnt.go │ │ ├── torch.go │ │ ├── torchflower.go │ │ ├── torchflowerCrop.go │ │ ├── trappedChest.go │ │ ├── trialSpawner.go │ │ ├── tripwire.go │ │ ├── tripwireHook.go │ │ ├── tubeCoral.go │ │ ├── tubeCoralBlock.go │ │ ├── tubeCoralFan.go │ │ ├── tubeCoralWallFan.go │ │ ├── tuff.go │ │ ├── tuffBrickSlab.go │ │ ├── tuffBrickStairs.go │ │ ├── tuffBrickWall.go │ │ ├── tuffBricks.go │ │ ├── tuffSlab.go │ │ ├── tuffStairs.go │ │ ├── tuffWall.go │ │ ├── turtleEgg.go │ │ ├── twistingVines.go │ │ ├── twistingVinesPlant.go │ │ ├── vault.go │ │ ├── verdantFroglight.go │ │ ├── vine.go │ │ ├── voidAir.go │ │ ├── wallTorch.go │ │ ├── warpedButton.go │ │ ├── warpedDoor.go │ │ ├── warpedFence.go │ │ ├── warpedFenceGate.go │ │ ├── warpedFungus.go │ │ ├── warpedHangingSign.go │ │ ├── warpedHyphae.go │ │ ├── warpedNylium.go │ │ ├── warpedPlanks.go │ │ ├── warpedPressurePlate.go │ │ ├── warpedRoots.go │ │ ├── warpedSign.go │ │ ├── warpedSlab.go │ │ ├── warpedStairs.go │ │ ├── warpedStem.go │ │ ├── warpedTrapdoor.go │ │ ├── warpedWallHangingSign.go │ │ ├── warpedWallSign.go │ │ ├── warpedWartBlock.go │ │ ├── water.go │ │ ├── waterCauldron.go │ │ ├── waxedChiseledCopper.go │ │ ├── waxedCopperBlock.go │ │ ├── waxedCopperBulb.go │ │ ├── waxedCopperDoor.go │ │ ├── waxedCopperGrate.go │ │ ├── waxedCopperTrapdoor.go │ │ ├── waxedCutCopper.go │ │ ├── waxedCutCopperSlab.go │ │ ├── waxedCutCopperStairs.go │ │ ├── waxedExposedChiseledCopper.go │ │ ├── waxedExposedCopper.go │ │ ├── waxedExposedCopperBulb.go │ │ ├── waxedExposedCopperDoor.go │ │ ├── waxedExposedCopperGrate.go │ │ ├── waxedExposedCopperTrapdoor.go │ │ ├── waxedExposedCutCopper.go │ │ ├── waxedExposedCutCopperSlab.go │ │ ├── waxedExposedCutCopperStairs.go │ │ ├── waxedOxidizedChiseledCopper.go │ │ ├── waxedOxidizedCopper.go │ │ ├── waxedOxidizedCopperBulb.go │ │ ├── waxedOxidizedCopperDoor.go │ │ ├── waxedOxidizedCopperGrate.go │ │ ├── waxedOxidizedCopperTrapdoor.go │ │ ├── waxedOxidizedCutCopper.go │ │ ├── waxedOxidizedCutCopperSlab.go │ │ ├── waxedOxidizedCutCopperStairs.go │ │ ├── waxedWeatheredChiseledCopper.go │ │ ├── waxedWeatheredCopper.go │ │ ├── waxedWeatheredCopperBulb.go │ │ ├── waxedWeatheredCopperDoor.go │ │ ├── waxedWeatheredCopperGrate.go │ │ ├── waxedWeatheredCopperTrapdoor.go │ │ ├── waxedWeatheredCutCopper.go │ │ ├── waxedWeatheredCutCopperSlab.go │ │ ├── waxedWeatheredCutCopperStairs.go │ │ ├── weatheredChiseledCopper.go │ │ ├── weatheredCopper.go │ │ ├── weatheredCopperBulb.go │ │ ├── weatheredCopperDoor.go │ │ ├── weatheredCopperGrate.go │ │ ├── weatheredCopperTrapdoor.go │ │ ├── weatheredCutCopper.go │ │ ├── weatheredCutCopperSlab.go │ │ ├── weatheredCutCopperStairs.go │ │ ├── weepingVines.go │ │ ├── weepingVinesPlant.go │ │ ├── wetSponge.go │ │ ├── wheat.go │ │ ├── whiteBanner.go │ │ ├── whiteBed.go │ │ ├── whiteCandle.go │ │ ├── whiteCandleCake.go │ │ ├── whiteCarpet.go │ │ ├── whiteConcrete.go │ │ ├── whiteConcretePowder.go │ │ ├── whiteGlazedTerracotta.go │ │ ├── whiteShulkerBox.go │ │ ├── whiteStainedGlass.go │ │ ├── whiteStainedGlassPane.go │ │ ├── whiteTerracotta.go │ │ ├── whiteTulip.go │ │ ├── whiteWallBanner.go │ │ ├── whiteWool.go │ │ ├── witherRose.go │ │ ├── witherSkeletonSkull.go │ │ ├── witherSkeletonWallSkull.go │ │ ├── yellowBanner.go │ │ ├── yellowBed.go │ │ ├── yellowCandle.go │ │ ├── yellowCandleCake.go │ │ ├── yellowCarpet.go │ │ ├── yellowConcrete.go │ │ ├── yellowConcretePowder.go │ │ ├── yellowGlazedTerracotta.go │ │ ├── yellowShulkerBox.go │ │ ├── yellowStainedGlass.go │ │ ├── yellowStainedGlassPane.go │ │ ├── yellowTerracotta.go │ │ ├── yellowWallBanner.go │ │ ├── yellowWool.go │ │ ├── zombieHead.go │ │ └── zombieWallHead.go │ ├── chunk/ │ │ ├── anvil.go │ │ ├── chunk.go │ │ ├── encode.go │ │ ├── heightmaps/ │ │ │ └── heightmaps.go │ │ └── section/ │ │ ├── block.go │ │ ├── blockRegister.go │ │ ├── data/ │ │ │ └── blocks.nbt │ │ └── section.go │ ├── dimension/ │ │ ├── dimension.go │ │ ├── manager.go │ │ ├── tick.go │ │ └── window/ │ │ └── window.go │ ├── level/ │ │ ├── entity.go │ │ ├── item/ │ │ │ ├── attribute_modifiers.go │ │ │ ├── banner_patterns.go │ │ │ ├── bees.go │ │ │ ├── bucket_entity_data.go │ │ │ ├── can_do.go │ │ │ ├── container_loot.go │ │ │ ├── creative_slot_lock.go │ │ │ ├── enchantments.go │ │ │ ├── entity_data.go │ │ │ ├── fire_resistant.go │ │ │ ├── firework_explosion.go │ │ │ ├── fireworks.go │ │ │ ├── food.go │ │ │ ├── hide_additional_tooltip.go │ │ │ ├── hide_tooltip.go │ │ │ ├── intangible_projectile.go │ │ │ ├── item.go │ │ │ ├── items.go │ │ │ ├── jukebox_playable.go │ │ │ ├── lodestone_tracker.go │ │ │ ├── map_post_processing.go │ │ │ ├── stored_enchantments.go │ │ │ ├── susipicious_stew_effects.go │ │ │ ├── tool.go │ │ │ ├── trim.go │ │ │ ├── unbreakable.go │ │ │ ├── writable_book_content.go │ │ │ └── written_book_content.go │ │ ├── level.go │ │ ├── playerdata.go │ │ ├── region/ │ │ │ ├── anvil.go │ │ │ ├── region_dec.go │ │ │ └── region_enc.go │ │ ├── seed/ │ │ │ └── seed.go │ │ └── uuid/ │ │ └── uuid.go │ ├── terrain/ │ │ ├── superflat.go │ │ └── terrain.go │ └── world.go └── util/ ├── atomic/ │ ├── atomic.go │ └── slice.go ├── console/ │ └── console.go ├── log/ │ └── log.go ├── mapequal.go ├── rot.go └── unit.go ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/workflows/go.yml ================================================ name: Build Zeppelin on: push: pull_request: workflow_dispatch: release: types: [published] jobs: build: runs-on: ${{ matrix.os }} strategy: matrix: go-version: ["1.22.x"] os: [ubuntu-latest, macos-latest] arch: [amd64, arm64] steps: - uses: actions/checkout@v4 - name: Setup Go uses: actions/setup-go@v4 with: go-version: ${{ matrix.go-version }} - name: Install libdeflate run: | if [ ${{ runner.os }} == 'Linux' ]; then sudo apt-get update sudo apt-get install -y libdeflate-dev elif [ ${{ runner.os }} == 'macOS' ]; then brew install libdeflate fi - name: Build run: go build -v - name: Upload Go build results linux uses: actions/upload-artifact@v3 if: ${{ runner.os == 'Linux' && matrix.arch == 'amd64' }} with: name: Zeppelin-AMD64-Linux.zip path: zeppelin - name: Upload Go build results arm64-linux uses: actions/upload-artifact@v3 if: ${{ runner.os == 'Linux' && matrix.arch == 'arm64' }} with: name: Zeppelin-ARM64-Linux.zip path: zeppelin - name: Upload Go build results macos uses: actions/upload-artifact@v3 if: ${{ runner.os == 'macOS' && matrix.arch == 'amd64' }} with: name: Zeppelin-AMD64-macOS.zip path: zeppelin - name: Upload Go build results arm64-macos uses: actions/upload-artifact@v3 if: ${{ runner.os == 'macOS' && matrix.arch == 'arm64' }} with: name: Zeppelin-ARM64-macOS.zip path: zeppelin ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: commands/commands.go ================================================ package commands import "github.com/zeppelinmc/zeppelin/server/command" var Commands = []command.Command{ mem, debug, tick, timecmd, gc, } ================================================ FILE: commands/debug.go ================================================ package commands import ( "github.com/zeppelinmc/zeppelin/server/player" "math" "github.com/zeppelinmc/zeppelin/protocol/text" "github.com/zeppelinmc/zeppelin/server/command" //"github.com/zeppelinmc/zeppelin/server/session" "github.com/zeppelinmc/zeppelin/util" ) var debug = command.Command{ Node: command.NewLiteral("debug"), Aliases: []string{"f3"}, Namespace: "zeppelin", Callback: func(ccc command.CommandCallContext) { player, ok := ccc.Executor.(*player.Player) if !ok { ccc.Executor.SystemMessage(text.TextComponent{ Text: "This command should be used by a player.", Color: "red", }) return } x, y, z := player.Position() chunkX, chunkY, chunkZ := int32(x)>>4, int32(y)>>4, int32(z)>>4 xb, yb, zb := int32(math.Floor(x)), int32(math.Floor(y)), int32(math.Floor(z)) rx, rz := chunkX>>5, chunkZ>>5 yaw, pitch := player.Rotation() dimension := player.Dimension() c, err := dimension.GetChunk(chunkX, chunkZ) if err != nil { ccc.Executor.SystemMessage(text.TextComponent{ Text: "Unrendered chunk", Color: "red", }) return } onBlock, _ := c.Block(xb&0x0f, yb-1, zb&0x0f) sky, _ := c.SkyLightLevel(xb&0x0f, yb, zb&0x0f) ccc.Executor.SystemMessage(text.Unmarshalf( '&', //ccc.Executor.Config().ChatFormatter.Rune(), "XYZ: %.03f / %.05f / %.03f\nBlock: %d %d %d [%d %d %d]\nChunk: %d %d %d [%d %d in r.%d.%d.mca]\nStanding on: %s [%v]\nFacing: (%.01f / %.01f)\nClient Light: %d (%d sky, 0 block)\n\nYou are using: %s", x, y, z, xb, yb, zb, xb&0xf, yb&0xf, zb&0xf, chunkX, chunkY, chunkZ, chunkX&31, chunkZ&31, rx, rz, onBlock.Name, onBlock.Properties, util.NormalizeYaw(yaw), pitch, sky, sky, "idk", //s.ClientName(), )) }, } ================================================ FILE: commands/gc.go ================================================ package commands import ( "runtime" "github.com/zeppelinmc/zeppelin/protocol/text" "github.com/zeppelinmc/zeppelin/server/command" ) var gc = command.Command{ Node: command.NewLiteral("gc"), Namespace: "zeppelin", Callback: func(ccc command.CommandCallContext) { runtime.GC() ccc.Executor.SystemMessage(text.Text("Done.").WithColor(text.BrightGreen)) }, } ================================================ FILE: commands/mem.go ================================================ package commands import ( "fmt" "runtime" "github.com/zeppelinmc/zeppelin/protocol/net/io/buffers" "github.com/zeppelinmc/zeppelin/protocol/text" "github.com/zeppelinmc/zeppelin/server" "github.com/zeppelinmc/zeppelin/server/command" ) var memStats runtime.MemStats var mem = command.Command{ Node: command.NewLiteral("mem"), Namespace: "zeppelin", Callback: func(ccc command.CommandCallContext) { runtime.ReadMemStats(&memStats) loaded := ccc.Server.(*server.Server).World.LoadedChunks() goroutines := runtime.NumGoroutine() ccc.Executor.SystemMessage(text.TextComponent{ Text: fmt.Sprintf( "Server memory usage: \n\nAlloc: %dMiB, Total Alloc: %dMiB\nLoaded Chunks: %d\nBuffer size: %dB\nGoroutines: %d", memStats.Alloc/1024/1024, memStats.TotalAlloc/1024/1024, loaded, buffers.Size(), goroutines, ), }) }, } ================================================ FILE: commands/tick.go ================================================ package commands import ( "time" "github.com/zeppelinmc/zeppelin/protocol/text" "github.com/zeppelinmc/zeppelin/server" "github.com/zeppelinmc/zeppelin/server/command" ) var tick = command.Command{ Node: command.NewLiteral("tick", command.NewLiteral("info"), command.NewLiteral("freeze"), command.NewLiteral("unfreeze")), Callback: func(ccc command.CommandCallContext) { tickManager := ccc.Server.(*server.Server).TickManager command := ccc.Arguments.Fallback(0, "info") num := tickManager.Count() switch command { case "info": freq := tickManager.Frequency() ccc.Executor.SystemMessage(text.Sprintf( "Server Tickers: %d\nTicking Frequency: %.02ftps (expected ticks per second)", num, 1/(float64(freq)/float64(time.Second)), )) case "freeze": tickManager.Freeze() ccc.Executor.SystemMessage(text.Sprintf("Froze %d tickers", num)) case "unfreeze": tickManager.Unfreeze() ccc.Executor.SystemMessage(text.Sprintf("Froze %d tickers", num)) } }, } ================================================ FILE: commands/time.go ================================================ package commands import ( "github.com/zeppelinmc/zeppelin/server/command" ) var timecmd = command.Command{ Node: command.NewLiteral("time" /*command.NewCommand("add", command.NewTimeArgument("time", 0)), command.NewCommand("set", command.NewTimeArgument("time", 0))*/), Callback: func(ccc command.CommandCallContext) { /*command := ccc.Arguments.At(0) w := ccc.Server.(*server.Server).World switch command { case "set": t := ccc.Arguments.At(1) time, err := strconv.Atoi(t) if t == "" || err != nil { ccc.Reply(text.Sprint("Invalid time")) return } a, _ := w.Time() ccc.Executor.UpdateTime(a, int64(time)) }*/ }, } ================================================ FILE: go.mod ================================================ module github.com/zeppelinmc/zeppelin go 1.23 require ( github.com/fatih/color v1.17.0 github.com/google/uuid v1.6.0 golang.org/x/term v0.22.0 ) require ( github.com/4kills/go-libdeflate/v2 v2.2.0 github.com/pierrec/lz4/v4 v4.1.21 ) require github.com/oq-x/unsafe2 v0.0.0-20240901191313-2b7bec1d9e3b require ( github.com/aimjel/mine-net v0.0.0-20241231185445-f0751c927ecb // indirect github.com/grailbio/base v0.0.11 // indirect ) require ( github.com/4kills/go-zlib v1.2.0 github.com/aimjel/minecraft v0.0.0-20240907220502-e1fe5798908b github.com/aquilax/go-perlin v1.1.0 github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect golang.org/x/sys v0.25.0 // indirect ) ================================================ FILE: go.sum ================================================ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= github.com/4kills/go-libdeflate/v2 v2.2.0 h1:2kdYT79I+k23LO6VLn9p0l1Og47EWWgKbC1n353zE30= github.com/4kills/go-libdeflate/v2 v2.2.0/go.mod h1:hyouZv4OAhHaaMpYuejstUN0xOg8mA+yy75WE3Ty6SM= github.com/4kills/go-zlib v1.2.0 h1:h/OjHfOi0ZGAhotXzFVJK7V97cKNsEqRJVmJo4e8H6A= github.com/4kills/go-zlib v1.2.0/go.mod h1:ngBUonyN1YJBHSknfLPNtWokAjYhHsaZDio8yS+BqSo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20170410192909-ea383cf3ba6e/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/aimjel/mine-net v0.0.0-20241231184943-192b6fd6bfdc h1:Fl6/rTVRsK3yRvLIe59RgElHb/fpVVo8fOm1SYvAfS8= github.com/aimjel/mine-net v0.0.0-20241231184943-192b6fd6bfdc/go.mod h1:2p/uMjMBAOvMK8NvNnTsXS7s00IYvbS3Ji3YM2ApzxA= github.com/aimjel/mine-net v0.0.0-20241231185445-f0751c927ecb h1:DzjkzmO1C8qXdEUSWU0I4hHEi0tuaFNrKeLeRZ8ntZo= github.com/aimjel/mine-net v0.0.0-20241231185445-f0751c927ecb/go.mod h1:2p/uMjMBAOvMK8NvNnTsXS7s00IYvbS3Ji3YM2ApzxA= github.com/aimjel/minecraft v0.0.0-20240907220502-e1fe5798908b h1:P5dA2C10r7BqzbhXqjjx07+LBV1tcsioFJrogWBOOBY= github.com/aimjel/minecraft v0.0.0-20240907220502-e1fe5798908b/go.mod h1:jb47g4nDw3J8JdA4WxQpDx25NoIZiyNCjFOtM1b3Urk= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/aquilax/go-perlin v1.1.0 h1:Gg+3jQ24wT4Y5GI7TCRLmYarzUG0k+n/JATFqOimb7s= github.com/aquilax/go-perlin v1.1.0/go.mod h1:z9Rl7EM4BZY0Ikp2fEN1I5mKSOJ26HQpk0O2TBdN2HE= github.com/aws/aws-sdk-go v1.23.14/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.23.22/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.34.31/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= github.com/biogo/store v0.0.0-20190426020002-884f370e325d/go.mod h1:Iev9Q3MErcn+w3UOJD/DkEzllvugfdx7bGcMOFhvr/4= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gops v0.3.6/go.mod h1:RZ1rH95wsAGX4vMWKmqBOIWynmWisBf4QFdgT/k/xOI= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grailbio/base v0.0.1/go.mod h1:wVM2Cq2/HT0rt6WYGQhXJ3CCLkNnGjeAAOPHCZ2IsN0= github.com/grailbio/base v0.0.11 h1:F/khklg9LwJDZpdHaHBvJIQrZfthNfcz3h2WuiwqK7E= github.com/grailbio/base v0.0.11/go.mod h1:8xmAiPsu9U7ZrRuaUCSuT2SDJS97QXGqVKpn0Den8GA= github.com/grailbio/testutil v0.0.1/go.mod h1:j7teGaXqRY1n6m7oM8oy954lxL37Myt7nEJZlif3nMA= github.com/grailbio/testutil v0.0.3/go.mod h1:f9+y7xMXeXwyNcdV5cmo6GzRiitSOubMmqcqEON7NQQ= github.com/grailbio/v23/factories/grail v0.0.0-20190904050408-8a555d238e9a/go.mod h1:2g5HI42KHw+BDBdjLP3zs+WvTHlDK3RoE8crjCl26y4= github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= github.com/hanwen/go-fuse/v2 v2.0.2/go.mod h1:HH3ygZOoyRbP9y2q7y3+JM6hPL+Epe29IbWaS0UA81o= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/keybase/go-keychain v0.0.0-20190828153431-2390ae572545/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= github.com/keybase/go-ps v0.0.0-20161005175911-668c8856d999/go.mod h1:hY+WOq6m2FpbvyrI93sMaypsttvaIL5nhVR92dTMUcQ= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.8.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.8.6/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/oq-x/unsafe2 v0.0.0-20240901191313-2b7bec1d9e3b h1:ffDVPOtSkPRHwJxp34oBUxgxR8H4arPUSzQMwT3fZi8= github.com/oq-x/unsafe2 v0.0.0-20240901191313-2b7bec1d9e3b/go.mod h1:x0z103mg/p7DX2tk7+9ubWfXbh+ynkAtwRlEOVEbIkk= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil v2.19.9+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/vanadium/go-mdns-sd v0.0.0-20181006014439-f1a1ccd1252e/go.mod h1:35fXDjvKtzyf89fHHhyTTNLHaG2CkI7u/GvO59PIjP4= github.com/vitessio/vitess v2.1.1+incompatible/go.mod h1:A11WWLimUfZAYYm8P1I63RryRPP2GdpHRgQcfa++OnQ= github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/yasushi-saito/zlibng v0.0.0-20190905015749-ec536402779e/go.mod h1:qD8maXXiM82RPOfKUGWetL74si8WnsRS7LNPDWK7byI= github.com/yasushi-saito/zlibng v0.0.0-20190922135643-2a860060b80c/go.mod h1:fmRgeAuoXV70NcmjNe3PyhylzfGSgyLv9nZaW/I/C7Q= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20171017063910-8dbc5d05d6ed/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20190902003836-43865b531bee/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= k8s.io/api v0.0.0-20181213150558-05914d821849/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= k8s.io/apimachinery v0.0.0-20181127025237-2b1284ed4c93/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= k8s.io/client-go v10.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/goversion v1.0.0/go.mod h1:Eih9y/uIBS3ulggl7KNJ09xGSLcuNaLgmvvqa07sgfo= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= v.io v0.1.5/go.mod h1:Apu/AQfn7lq+o3m+ReLtlrKxkZTTo2p6mLXlioAUWA0= v.io v0.1.15/go.mod h1:Ort0a9YYK5eDJZ1Bc5m5hroWkygXzkifJzmlRpaGbWk= v.io/x/lib v0.1.4/go.mod h1:maU79RWqiiC9ARbvS+2Q8tqZUnQiHxeJDriXcW7cYg8= v.io/x/lib v0.1.6/go.mod h1:aLm+mPXyXf4Vd/n+1f4LcSQFFgqNhNzwQvHYfXoOLlE= v.io/x/lib v0.1.7/go.mod h1:aLm+mPXyXf4Vd/n+1f4LcSQFFgqNhNzwQvHYfXoOLlE= v.io/x/ref/internal/logger v0.1.1/go.mod h1:00nuJdZEVCzMOn9y474jZ+e6B9R/ydLW7d6IQFl/NHU= v.io/x/ref/lib/flags/sitedefaults v0.1.1/go.mod h1:ew4Igo60KMBDYhnxH6l7P+qBCJiqR8PVp7fJJYGqILA= ================================================ FILE: main.go ================================================ package main import ( _ "embed" "github.com/zeppelinmc/zeppelin/properties" "math/rand" "os" "runtime" "runtime/debug" "runtime/pprof" "slices" "strconv" "time" "github.com/zeppelinmc/zeppelin/commands" "github.com/zeppelinmc/zeppelin/server" "github.com/zeppelinmc/zeppelin/server/command" "github.com/zeppelinmc/zeppelin/server/world" "github.com/zeppelinmc/zeppelin/util" "github.com/zeppelinmc/zeppelin/util/console" "github.com/zeppelinmc/zeppelin/util/log" "golang.org/x/term" ) var timeStart = time.Now() func main() { log.Infolnf("Zeppelin 1.21 Minecraft server with %s on platform %s-%s", runtime.Version(), runtime.GOOS, runtime.GOARCH) max, ok := console.GetFlag("xmem") if ok { m, err := util.ParseSizeUnit(max) if err == nil { debug.SetMemoryLimit(int64(m)) log.Infolnf("Memory usage is limited to %s", util.FormatSizeUnit(m)) } } if slices.Index(os.Args, "--cpuprof") != -1 { if f, err := os.Create("zeppelin-cpu-profile"); err == nil { pprof.StartCPUProfile(f) log.Infoln("Started CPU profiler (writing to zeppelin-cpu-profile)") defer func() { log.Infoln("Stopped CPU profiler") pprof.StopCPUProfile() f.Close() }() } } if slices.Index(os.Args, "--memprof") != -1 { defer func() { log.InfolnClean("Writing memory profile to zeppelin-mem-profile") f, _ := os.Create("zeppelin-mem-profile") pprof.Lookup("allocs").WriteTo(f, 0) f.Close() }() } cfg := loadConfig() if cfg.LevelSeed == "" { cfg.LevelSeed = strconv.FormatInt(rand.Int63(), 10) } w, err := world.NewWorld(cfg) if err != nil { log.Errorlnf("Error preparing level: %v", w) return } log.Infof("Binding server to %s:%d\n", cfg.ServerIp, cfg.ServerPort) rawTerminal := slices.Index(os.Args, "--no-raw-terminal") == -1 srv, err := server.New(cfg, w) if err != nil { log.Errorln("Error binding server:", err) return } srv.CommandManager = command.NewManager(srv, commands.Commands...) if rawTerminal { oldState, err := term.MakeRaw(int(os.Stdin.Fd())) if err != nil { panic(err) } go console.StartRawConsole(srv) defer term.Restore(int(os.Stdin.Fd()), oldState) } else { go console.StartConsole(srv) } srv.Start(timeStart) } func loadConfig() properties.ServerProperties { file, err := os.ReadFile("server.properties") if err != nil { file, err := os.Create("server.properties") if err == nil { properties.Marshal(file, properties.Default) file.Close() } return properties.Default } var cfg properties.ServerProperties err = properties.Unmarshal(string(file), &cfg) if err != nil { cfg = properties.Default } return cfg } ================================================ FILE: properties/decode.go ================================================ // Package properties provides parsing of .properties files package properties import ( "fmt" "reflect" "strconv" "strings" ) // Unmarshal decodes the properties file func Unmarshal(src string, dst any) error { properties := strings.Split(src, "\n") val := reflect.ValueOf(dst) switch val.Kind() { case reflect.Pointer: val = val.Elem() switch val.Kind() { case reflect.Struct: return unmarshalStruct(properties, structMap(val)) default: return fmt.Errorf("Unmarshal excepts a pointer of a struct or map, not %s", val.Kind()) } default: return fmt.Errorf("Unmarshal excepts a pointer of a struct or map, not %s", val.Kind()) } } func unmarshalStruct(props []string, v map[string]reflect.Value) error { for _, line := range props { if len(line) == 0 { continue //comment } if line[0] == '#' { continue //comment } if line[0] == '!' { continue //comment } var key, value string for i, char := range line { if char == '=' || char == ':' || char == ' ' { key = line[:i] if i != len(line)-2 { value = line[i+1:] } break } } if value == "" { continue } value = strings.TrimSpace(value) value = strings.ReplaceAll(value, "\\n", "\n") value = strings.ReplaceAll(value, "\\r", "\r") value = strings.ReplaceAll(value, "\\t", "\t") field, ok := v[key] if !ok { continue } switch field.Kind() { case reflect.String: field.SetString(value) case reflect.Bool: switch value { case "true": field.SetBool(true) case "false": field.SetBool(false) default: return fmt.Errorf("unsupported value %s for type boolean", value) } case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: i, err := strconv.ParseInt(value, 10, field.Type().Bits()) if err != nil { return fmt.Errorf("unsupported value %s for type integer: %v", value, err) } field.SetInt(i) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: i, err := strconv.ParseUint(value, 10, field.Type().Bits()) if err != nil { return fmt.Errorf("unsupported value %s for type integer: %v", value, err) } field.SetUint(i) } } return nil } func structMap(val reflect.Value) map[string]reflect.Value { var sm = make(map[string]reflect.Value, val.NumField()) vt := val.Type() for i := 0; i < val.NumField(); i++ { ft := vt.Field(i) fv := val.Field(i) if !ft.IsExported() { continue } name := ft.Name propName, ok := ft.Tag.Lookup("properties") if ok { if propName == "-" { continue } name = propName if i := strings.Index(name, ",omitempty"); i != -1 { name = name[:i] } } if name == "" { name = ft.Name } sm[name] = fv } return sm } ================================================ FILE: properties/encode.go ================================================ package properties import ( "fmt" "io" "reflect" "strings" "unsafe" ) // Marshal encodes the properties file func Marshal(dst io.Writer, p any) error { val := reflect.ValueOf(p) switch val.Kind() { case reflect.Struct: return encodePropsStruct(dst, val) default: return fmt.Errorf("Marshal excepts a struct or map, not %s", val.Kind()) } } func encodePropsStruct(dst io.Writer, v reflect.Value) error { vt := v.Type() for i := 0; i < v.NumField(); i++ { tf := vt.Field(i) vf := v.Field(i) name, ok, omitempty := name(tf) if !ok { continue } if omitempty && vf.IsZero() { continue } if i != 0 { if err := writeString(dst, "\n"); err != nil { return err } } if err := writeString(dst, name+"="); err != nil { return err } switch vf.Kind() { case reflect.String, reflect.Bool, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: if err := writeString(dst, fmt.Sprint(vf.Interface())); err != nil { return err } default: return fmt.Errorf("unsupported kind %s for encode struct", vf.Kind()) } } return nil } func name(tf reflect.StructField) (n string, ok bool, omitempty bool) { if !tf.IsExported() { return "", false, false } name := tf.Name propName, ok := tf.Tag.Lookup("properties") if !ok { return name, true, false } if propName == "-" { return name, false, false } name = propName i := strings.Index(name, ",omitempty") if i == -1 { return name, true, false } name = name[:i] if name == "" { name = tf.Name } return name, true, true } func writeString(w io.Writer, str string) error { _, err := w.Write(unsafe.Slice(unsafe.StringData(str), len(str))) return err } ================================================ FILE: properties/properties.go ================================================ // Package properties provides encoding and decoding of .properties files package properties type formatter string func (f formatter) Rune() rune { return rune(f[0]) } type ServerProperties struct { AcceptTransfers bool `properties:"accept-transfers"` AllowFlight bool `properties:"allow-flight"` AllowNether bool `properties:"allow-nether"` BroadcastConsoleToOps bool `properties:"broadcast-console-to-ops"` BroadcastRconToOps bool `properties:"broadcast-rcon-to-ops"` Difficulty string `properties:"difficulty"` EnableCommandBlock bool `properties:"enable-command-block"` EnableRCON bool `properties:"enable-rcon"` EnableStatus bool `properties:"enable-status"` EnableQuery bool `properties:"enable-query"` EnableChat bool `properties:"enable-chat"` EnableEncryption bool `properties:"enable-encryption"` ChatFormatter formatter `properties:"chat-formatter"` SystemChatFormat string `properties:"system-chat-format"` EnforceSecureProfile bool `properties:"enforce-secure-profile"` EnforceWhitelist bool `properties:"enforce-whitelist"` EntityBroadcastRangePrecentage int `properties:"state-broadcast-range-precentage"` ForceGamemode bool `properties:"force-gamemode"` FunctionPermissionLevel int `properties:"function-permission-level"` Gamemode string `properties:"gamemode"` GenerateStructures bool `properties:"generate-structures"` GeneratorSettings string `properties:"generator-settings"` Hardcore bool `properties:"hardcore"` HideOnlinePlayers bool `properties:"hide-online-players"` InitialDisabledPacks string `properties:"initial-disabled-packs"` InitialEnabledPacks string `properties:"initial-enabled-packs"` LevelName string `properties:"level-name"` LevelSeed string `properties:"level-seed"` LevelType string `properties:"level-type"` LogIPs bool `properties:"log-ips"` MaxPlayers int `properties:"max-players"` MOTD string `properties:"motd"` NetworkCompressionThreshold int `properties:"network-compression-threshold"` OnlineMode bool `properties:"online-mode"` OpPermissionLevel int `properties:"op-permission-level"` PlayerIdleTimeout int `properties:"player-idle-timeout"` PreventProxyConnections bool `properties:"prevent-proxy-connections"` PvP bool `properties:"pvp"` QueryPort uint16 `properties:"query.port"` RCONPassword string `properties:"rcon.password"` RCONPort uint16 `properties:"rcon.port"` // NOTE: unlike java edition, this accepts deflate, lz4, none AND gzip. RegionFileCompression string `properties:"region-file-compression"` ResourcePack string `properties:"resource-pack"` ResourcePackId string `properties:"resource-pack-id"` ResourcePackSha1 string `properties:"resource-pack-sha1"` RequireResourcePack string `properties:"require-resource-pack"` ServerIp string `properties:"server-ip"` ServerPort uint16 `properties:"server-port"` SimulationDistance int32 `properties:"simulation-distance"` SpawnMonsters bool `properties:"spawn-monsters"` SpawnProtection int `properties:"spawn-protection"` ViewDistance int32 `properties:"view-distance"` WhiteList bool `properties:"white-list"` } var Default = ServerProperties{ AllowNether: true, BroadcastConsoleToOps: true, BroadcastRconToOps: true, Difficulty: "easy", EnableStatus: true, EnableChat: true, ChatFormatter: "§", EntityBroadcastRangePrecentage: 100, FunctionPermissionLevel: 2, Gamemode: "survival", GenerateStructures: true, InitialEnabledPacks: "vanilla", LevelName: "world", LevelType: "minecraft:normal", LogIPs: true, MaxPlayers: 20, MOTD: "A Minecraft Server", NetworkCompressionThreshold: 256, OnlineMode: true, OpPermissionLevel: 4, PvP: true, QueryPort: 25565, RCONPort: 25575, RegionFileCompression: "deflate", ServerPort: 25565, SimulationDistance: 10, SpawnMonsters: true, SpawnProtection: 16, ViewDistance: 10, } ================================================ FILE: protocol/nbt/decoder.go ================================================ package nbt import ( "bytes" "fmt" "io" "math" "reflect" "strings" "sync" "unsafe" ) var valueMap = sync.Pool{ New: func() any { return make(map[string]reflect.Value) }} func generateMap(v reflect.Value) map[string]reflect.Value { m := valueMap.Get().(map[string]reflect.Value) clear(m) ty := v.Type() for i := 0; i < v.NumField(); i++ { ft := ty.Field(i) if !ft.IsExported() { continue } found := ft.Name if n, ok := ft.Tag.Lookup("nbt"); ok { found = n } if i := strings.Index(found, ",omitempty"); i != -1 { found = found[:i] } m[found] = v.Field(i) } return m } const ( End = iota Byte Short Int Long Float Double ByteArray String List Compound IntArray LongArray ) type Decoder struct { rd io.Reader dontReadRootCompoundName, disallowUnknownFields bool } func NewDecoder(rd io.Reader) *Decoder { return &Decoder{rd: rd} } func (d *Decoder) ReadRootName(v bool) { d.dontReadRootCompoundName = !v } func (d *Decoder) DisallowUnknownFields(v bool) { d.disallowUnknownFields = v } // Unmarshal is the same as making a new decoder and using it on a bytes.Reader of the input func Unmarshal(input []byte, v any) (rootName string, err error) { return NewDecoder(bytes.NewReader(input)).Decode(v) } func (d *Decoder) DecodeRootCompound(v any) (rootName string, err error) { val := reflect.ValueOf(v) if val.Kind() != reflect.Pointer { return "", fmt.Errorf("Decode expects a pointer") } val = val.Elem() if !d.dontReadRootCompoundName { rootName, err = d.readString() if err != nil { return } } switch val.Kind() { case reflect.Struct: m := generateMap(val) defer func() { clear(m) valueMap.Put(m) }() if err := d.decodeCompoundStruct(m); err != nil { return "", err } case reflect.Map: if val.IsNil() { val.Set(reflect.MakeMap(val.Type())) } if err := d.decodeCompoundMap(val); err != nil { return rootName, err } default: return rootName, fmt.Errorf("Decode expects a pointer of struct/map, not %s", val.Type()) } return } // Decode will decode the nbt file into v and return the root name of the file func (d *Decoder) Decode(v any) (rootName string, err error) { val := reflect.ValueOf(v) if val.Kind() != reflect.Pointer { return "", fmt.Errorf("Decode expects a pointer") } val = val.Elem() typeId, err := d.readByte() if err != nil { return "", err } if typeId != Compound { return "", fmt.Errorf("expected a compound first element") } if !d.dontReadRootCompoundName { rootName, err = d.readString() if err != nil { return } } switch val.Kind() { case reflect.Struct: m := generateMap(val) defer func() { clear(m) valueMap.Put(m) }() if err := d.decodeCompoundStruct(m); err != nil { return "", err } case reflect.Map: if val.IsNil() { val.Set(reflect.MakeMap(val.Type())) } if err := d.decodeCompoundMap(val); err != nil { return rootName, err } default: return rootName, fmt.Errorf("Decode expects a pointer of struct/map, not %s", val.Type()) } return } func (d *Decoder) decodeCompoundMap(_map reflect.Value) error { var typeId [1]byte for { err := d.readTo(typeId[:]) if err != nil { return err } if typeId[0] == End { return nil } name, err := d.readString() if err != nil { return err } nameVal := reflect.ValueOf(name) switch typeId[0] { case Byte: d, err := d.readByte() if err != nil { return err } switch _map.Type().Elem().Kind() { case reflect.Uint8: _map.SetMapIndex(nameVal, reflect.ValueOf(uint8(d))) case reflect.Int8: case reflect.Bool: _map.SetMapIndex(nameVal, reflect.ValueOf(*(*bool)(unsafe.Pointer(&d)))) default: if reflect.TypeOf(d).AssignableTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d).Convert(_map.Type().Elem())) } else { return fmt.Errorf("cannot assign byte to type %s for field %s", _map.Type().Elem(), name) } } } case Short: d, err := d.readShort() if err != nil { return err } switch _map.Type().Elem().Kind() { case reflect.Uint16: _map.SetMapIndex(nameVal, reflect.ValueOf(uint16(d))) default: if reflect.TypeOf(d).AssignableTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d).Convert(_map.Type().Elem())) } else { return fmt.Errorf("cannot assign short to type %s for field %s", _map.Type().Elem(), name) } } } case Int: d, err := d.readInt() if err != nil { return err } switch _map.Type().Elem().Kind() { case reflect.Uint32: _map.SetMapIndex(nameVal, reflect.ValueOf(uint32(d))) default: if reflect.TypeOf(d).AssignableTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d).Convert(_map.Type().Elem())) } else { return fmt.Errorf("cannot assign int to type %s for field %s", _map.Type().Elem(), name) } } } case Long: d, err := d.readLong() if err != nil { return err } switch _map.Type().Elem().Kind() { case reflect.Uint64: _map.SetMapIndex(nameVal, reflect.ValueOf(uint64(d))) default: if reflect.TypeOf(d).AssignableTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d).Convert(_map.Type().Elem())) } else { return fmt.Errorf("cannot assign long to type %s for field %s", _map.Type().Elem(), name) } } } case String: d, err := d.readString() if err != nil { return err } if reflect.TypeOf(d).AssignableTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d).Convert(_map.Type().Elem())) } else { return fmt.Errorf("cannot assign string to type %s for field %s", _map.Type().Elem(), name) } } case Float: d, err := d.readFloat() if err != nil { return err } if reflect.TypeOf(d).AssignableTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d).Convert(_map.Type().Elem())) } else { return fmt.Errorf("cannot assign float to type %s for field %s", _map.Type().Elem(), name) } } case Double: d, err := d.readDouble() if err != nil { return err } if reflect.TypeOf(d).AssignableTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d).Convert(_map.Type().Elem())) } else { return fmt.Errorf("cannot assign double to type %s for field %s", _map.Type().Elem(), name) } } case ByteArray: d, err := d.readByteArray() if err != nil { return err } switch _map.Type().Elem().Kind() { case reflect.Slice: switch _map.Type().Elem().Elem().Kind() { case reflect.Int8: _map.SetMapIndex(nameVal, reflect.ValueOf(*(*[]int8)(unsafe.Pointer(&d)))) } default: if reflect.TypeOf(d).AssignableTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d).Convert(_map.Type().Elem())) } else { return fmt.Errorf("cannot assign byte array to type %s for field %s", _map.Type().Elem(), name) } } } case IntArray: d, err := d.readIntArray() if err != nil { return err } switch _map.Type().Elem().Kind() { case reflect.Slice: switch _map.Type().Elem().Elem().Kind() { case reflect.Uint32: _map.SetMapIndex(nameVal, reflect.ValueOf(*(*[]uint32)(unsafe.Pointer(&d)))) } default: if reflect.TypeOf(d).AssignableTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d).Convert(_map.Type().Elem())) } else { return fmt.Errorf("cannot assign int array to type %s for field %s", _map.Type().Elem(), name) } } } case LongArray: d, err := d.readLongArray() if err != nil { return err } switch _map.Type().Elem().Kind() { case reflect.Slice: switch _map.Type().Elem().Elem().Kind() { case reflect.Uint64: _map.SetMapIndex(nameVal, reflect.ValueOf(*(*[]uint64)(unsafe.Pointer(&d)))) } default: if reflect.TypeOf(d).AssignableTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(_map.Type().Elem()) { _map.SetMapIndex(nameVal, reflect.ValueOf(d).Convert(_map.Type().Elem())) } else { return fmt.Errorf("cannot assign long array to type %s for field %s", _map.Type().Elem(), name) } } } case List: switch _map.Type().Elem().Kind() { case reflect.Slice: s := reflect.MakeSlice(_map.Type().Elem(), 0, 0) d.decodeList(s) _map.SetMapIndex(nameVal, s) case reflect.Array: s := reflect.New(_map.Type().Elem()).Elem() d.decodeList(s) _map.SetMapIndex(nameVal, s) } case Compound: switch _map.Type().Elem().Kind() { case reflect.Map: s := reflect.MakeMap(_map.Type().Elem()) if err := d.decodeCompoundMap(s); err != nil { return err } _map.SetMapIndex(nameVal, s) case reflect.Struct: z := reflect.New(_map.Type().Elem()).Elem() m := generateMap(z) defer func() { clear(m) valueMap.Put(m) }() if err := d.decodeCompoundStruct(m); err != nil { return err } _map.SetMapIndex(nameVal, z) case reflect.Interface: if _map.Type().Elem().NumMethod() == 0 { s := reflect.MakeMap(reflect.TypeOf(map[string]any{})) if err := d.decodeCompoundMap(s); err != nil { return err } _map.SetMapIndex(nameVal, s) continue } fallthrough default: return fmt.Errorf("cannot assign compound to type %s on field %s", _map.Type().Elem(), name) } default: return fmt.Errorf("unknown tag %d", typeId[0]) } } } func (d *Decoder) decodeCompoundStruct(_struct map[string]reflect.Value) error { var typeId [1]byte for { err := d.readTo(typeId[:]) if err != nil { return err } if typeId[0] == End { return nil } name, err := d.readString() if err != nil { return err } var z, valid = _struct[name] switch typeId[0] { case Byte: d, err := d.readByte() if err != nil { return err } if valid { switch z.Kind() { case reflect.Uint8: z.SetUint(uint64(d)) case reflect.Int8: z.SetInt(int64(d)) case reflect.Bool: z.SetBool(*(*bool)(unsafe.Pointer(&d))) default: if reflect.TypeOf(d).AssignableTo(z.Type()) { z.Set(reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(z.Type()) { z.Set(reflect.ValueOf(d).Convert(z.Type())) } else { return fmt.Errorf("cannot assign byte to type %s for field %s", z.Type(), name) } } } } case Short: d, err := d.readShort() if err != nil { return err } if valid { switch z.Kind() { case reflect.Uint16: z.SetUint(uint64(d)) case reflect.Int16: z.SetInt(int64(d)) default: if reflect.TypeOf(d).AssignableTo(z.Type()) { z.Set(reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(z.Type()) { z.Set(reflect.ValueOf(d).Convert(z.Type())) } else { return fmt.Errorf("cannot assign short to type %s for field %s", z.Type(), name) } } } } case Int: d, err := d.readInt() if err != nil { return err } if valid { switch z.Type().Kind() { case reflect.Uint32, reflect.Uint: z.SetUint(uint64(d)) case reflect.Int32, reflect.Int: z.SetInt(int64(d)) default: if reflect.TypeOf(d).AssignableTo(z.Type()) { z.Set(reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(z.Type()) { z.Set(reflect.ValueOf(d).Convert(z.Type())) } else { return fmt.Errorf("cannot assign int to type %s for field %s", z.Type(), name) } } } } case Long: d, err := d.readLong() if err != nil { return err } if valid { switch z.Type().Kind() { case reflect.Uint64: z.SetUint(uint64(d)) case reflect.Int64: z.SetInt(d) default: if reflect.TypeOf(d).AssignableTo(z.Type()) { z.Set(reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(z.Type()) { z.Set(reflect.ValueOf(d).Convert(z.Type())) } else { return fmt.Errorf("cannot assign long to type %s for field %s", z.Type(), name) } } } } case String: d, err := d.readString() if err != nil { return err } if valid { if reflect.TypeOf(d).AssignableTo(z.Type()) { z.Set(reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(z.Type()) { z.Set(reflect.ValueOf(d).Convert(z.Type())) } else { return fmt.Errorf("cannot assign string to type %s for field %s", z.Type(), name) } } } case Float: d, err := d.readFloat() if err != nil { return err } if valid { if reflect.TypeOf(d).AssignableTo(z.Type()) { z.Set(reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(z.Type()) { z.Set(reflect.ValueOf(d).Convert(z.Type().Elem())) } else { return fmt.Errorf("cannot assign float to type %s for field %s", z.Type(), name) } } } case Double: d, err := d.readDouble() if err != nil { return err } if valid { if reflect.TypeOf(d).AssignableTo(z.Type()) { z.Set(reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(z.Type()) { z.Set(reflect.ValueOf(d).Convert(z.Type())) } else { return fmt.Errorf("cannot assign double to type %s for field %s", z.Type(), name) } } } case ByteArray: d, err := d.readByteArray() if err != nil { return err } if valid { switch z.Type().Kind() { case reflect.Slice: switch z.Type().Elem().Kind() { case reflect.Int8: z.Set(reflect.ValueOf(*(*[]int8)(unsafe.Pointer(&d)))) case reflect.Uint8: z.Set(reflect.ValueOf(d)) } default: if reflect.TypeOf(d).AssignableTo(z.Type()) { z.Set(reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(z.Type()) { z.Set(reflect.ValueOf(d).Convert(z.Type())) } else { return fmt.Errorf("cannot assign byte array to type %s for field %s", z.Type(), name) } } } } case IntArray: d, err := d.readIntArray() if err != nil { return err } if valid { switch z.Type().Kind() { case reflect.Slice: switch z.Type().Elem().Kind() { case reflect.Uint32: z.Set(reflect.ValueOf(*(*[]uint32)(unsafe.Pointer(&d)))) case reflect.Int32: z.Set(reflect.ValueOf(d)) } default: if reflect.TypeOf(d).AssignableTo(z.Type()) { z.Set(reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(z.Type()) { z.Set(reflect.ValueOf(d).Convert(z.Type())) } else { return fmt.Errorf("cannot assign int array to type %s for field %s", z.Type(), name) } } } } case LongArray: d, err := d.readLongArray() if err != nil { return err } if valid { switch z.Type().Kind() { case reflect.Slice: switch z.Type().Elem().Kind() { case reflect.Uint64: z.Set(reflect.ValueOf(*(*[]uint64)(unsafe.Pointer(&d)))) case reflect.Int64: z.Set(reflect.ValueOf(d)) } default: if reflect.TypeOf(d).AssignableTo(z.Type()) { z.Set(reflect.ValueOf(d)) } else { if reflect.TypeOf(d).ConvertibleTo(z.Type()) { z.Set(reflect.ValueOf(d).Convert(z.Type())) } else { return fmt.Errorf("cannot assign long array to type %s for field %s", z.Type(), name) } } } } case List: if valid { switch z.Type().Kind() { case reflect.Slice: d.decodeList(z) case reflect.Array: s := reflect.New(z.Type()).Elem() d.decodeList(s) z.Set(s) } } else { d._decodeList() } case Compound: if valid { switch z.Type().Kind() { case reflect.Struct: m := generateMap(_struct[name]) defer valueMap.Put(m) if err := d.decodeCompoundStruct(m); err != nil { return err } case reflect.Interface: if z.Type().NumMethod() == 0 { s := reflect.MakeMap(reflect.TypeOf(map[string]any{})) if err := d.decodeCompoundMap(s); err != nil { return err } z.Set(s) continue } fallthrough case reflect.Map: s := reflect.MakeMap(z.Type()) if err := d.decodeCompoundMap(s); err != nil { return err } z.Set(s) default: return fmt.Errorf("cannot assign compound to type %s on field %s", z.Type(), name) } } else { d.decodeCompound() } default: return fmt.Errorf("unknown tag %d", typeId[0]) } } } // TODO add byte, int, long array IMPORTANT! func (d *Decoder) decodeList(list reflect.Value) error { typeId, err := d.readByte() if err != nil { return err } length, err := d.readInt() if err != nil { return err } if list.Len() < int(length) { switch list.Kind() { case reflect.Slice: list.Set(reflect.MakeSlice(list.Type(), int(length), int(length))) case reflect.Array: return fmt.Errorf("list of size %d is too big for array %s", length, list.Type()) } } for i := 0; i < int(length); i++ { switch typeId { case Byte: d, err := d.readByte() if err != nil { return err } switch list.Type().Elem().Kind() { case reflect.Uint8: list.Index(i).Set(reflect.ValueOf(uint8(d))) default: if reflect.TypeOf(d).AssignableTo(list.Type().Elem()) { list.Index(i).Set(reflect.ValueOf(d)) } else { return fmt.Errorf("cannot assign byte to type %s for index %d", list.Type().Elem(), i) } } case Short: d, err := d.readShort() if err != nil { return err } switch list.Type().Elem().Kind() { case reflect.Uint16: list.Index(i).Set(reflect.ValueOf(uint16(d))) default: if reflect.TypeOf(d).AssignableTo(list.Type().Elem()) { list.Index(i).Set(reflect.ValueOf(d)) } else { return fmt.Errorf("cannot assign short to type %s for index %d", list.Type().Elem(), i) } } case Int: d, err := d.readInt() if err != nil { return err } switch list.Type().Elem().Kind() { case reflect.Uint32: list.Index(i).Set(reflect.ValueOf(uint32(d))) default: if reflect.TypeOf(d).AssignableTo(list.Type().Elem()) { list.Index(i).Set(reflect.ValueOf(d)) } else { return fmt.Errorf("cannot assign int to type %s for index %d", list.Type().Elem(), i) } } case Long: d, err := d.readLong() if err != nil { return err } switch list.Type().Elem().Kind() { case reflect.Uint64: list.Index(i).Set(reflect.ValueOf(uint64(d))) default: if reflect.TypeOf(d).AssignableTo(list.Type().Elem()) { list.Index(i).Set(reflect.ValueOf(d)) } else { return fmt.Errorf("cannot assign long to type %s for index %d", list.Type().Elem(), i) } } case Float: d, err := d.readFloat() if err != nil { return err } if reflect.TypeOf(d).AssignableTo(list.Type().Elem()) { list.Index(i).Set(reflect.ValueOf(d)) } else { return fmt.Errorf("cannot assign float to type %s for index %d", list.Type().Elem(), i) } case Double: d, err := d.readDouble() if err != nil { return err } if reflect.TypeOf(d).AssignableTo(list.Type().Elem()) { list.Index(i).Set(reflect.ValueOf(d)) } else { return fmt.Errorf("cannot assign double to type %s for index %d", list.Type().Elem(), i) } case String: d, err := d.readString() if err != nil { return err } if reflect.TypeOf(d).AssignableTo(list.Type().Elem()) { list.Index(i).Set(reflect.ValueOf(d)) } else { return fmt.Errorf("cannot assign string to type %s for index %d", list.Type().Elem(), i) } case Compound: switch list.Type().Elem().Kind() { case reflect.Struct: m := generateMap(list.Index(i)) defer valueMap.Put(m) if err := d.decodeCompoundStruct(m); err != nil { return err } case reflect.Map: list.Index(i).Set(reflect.MakeMap(list.Type().Elem())) if err := d.decodeCompoundMap(list.Index(i)); err != nil { return err } default: return fmt.Errorf("cannot assign compound to type %s on index %d", list.Type().Elem(), i) } case List: switch list.Type().Elem().Kind() { case reflect.Slice: list.Index(i).Set(reflect.MakeSlice(list.Type().Elem(), 0, 0)) fallthrough case reflect.Array: if err := d.decodeList(list.Index(i)); err != nil { return err } default: return fmt.Errorf("cannot assign list to type %s on index %d", list.Type().Elem(), i) } default: return fmt.Errorf("unknown tag %d", typeId) } } return nil } func (d *Decoder) decodeCompound() error { for { typeId, err := d.readByte() if err != nil { return err } if typeId == End { return nil } _, err = d.readString() if err != nil { return err } switch typeId { case Byte: _, err := d.readByte() if err != nil { return err } case Short: _, err := d.readShort() if err != nil { return err } case Int: _, err := d.readInt() if err != nil { return err } case Long: _, err := d.readLong() if err != nil { return err } case Float: _, err := d.readFloat() if err != nil { return err } case Double: _, err := d.readDouble() if err != nil { return err } case ByteArray: _, err := d.readByteArray() if err != nil { return err } case IntArray: _, err := d.readIntArray() if err != nil { return err } case LongArray: _, err := d.readLongArray() if err != nil { return err } case String: _, err := d.readString() if err != nil { return err } case Compound: if err := d.decodeCompound(); err != nil { return err } case List: if err := d._decodeList(); err != nil { return err } } } } func (d *Decoder) _decodeList() error { typeId, err := d.readByte() if err != nil { return err } length, err := d.readInt() if err != nil { return err } for i := 0; i < int(length); i++ { switch typeId { case Byte: if _, err := d.readByte(); err != nil { return err } case Short: if _, err := d.readShort(); err != nil { return err } case Int: if _, err := d.readInt(); err != nil { return err } case Long: if _, err := d.readLong(); err != nil { return err } case Float: if _, err := d.readFloat(); err != nil { return err } case Double: if _, err := d.readDouble(); err != nil { return err } case String: if _, err := d.readString(); err != nil { return err } case List: if err := d._decodeList(); err != nil { return err } case Compound: if err := d.decodeCompound(); err != nil { return err } case ByteArray: if _, err := d.readByteArray(); err != nil { return err } case IntArray: if _, err := d.readIntArray(); err != nil { return err } case LongArray: if _, err := d.readLongArray(); err != nil { return err } } } return nil } func (d *Decoder) readByte() (int8, error) { var data [1]byte _, err := d.rd.Read(data[:]) return int8(data[0]), err } func (d *Decoder) readTo(t []byte) error { _, err := d.rd.Read(t) return err } func (d *Decoder) readShort() (int16, error) { var data [2]byte _, err := d.rd.Read(data[:]) return int16(data[0])<<8 | int16(data[1]), err } func (d *Decoder) readInt() (int32, error) { var data [4]byte _, err := d.rd.Read(data[:]) return int32(data[0])<<24 | int32(data[1])<<16 | int32(data[2])<<8 | int32(data[3]), err } func (d *Decoder) readLong() (int64, error) { var data [8]byte _, err := d.rd.Read(data[:]) return int64(data[0])<<56 | int64(data[1])<<48 | int64(data[2])<<40 | int64(data[3])<<32 | int64(data[4])<<24 | int64(data[5])<<16 | int64(data[6])<<8 | int64(data[7]), err } func (d *Decoder) readFloat() (float32, error) { i, err := d.readInt() return math.Float32frombits(uint32(i)), err } func (d *Decoder) readDouble() (float64, error) { i, err := d.readLong() return math.Float64frombits(uint64(i)), err } func (d *Decoder) readString() (string, error) { l, err := d.readShort() if err != nil { return "", err } if l < 0 { return "", fmt.Errorf("negative length for make (read string)") } var data = make([]byte, l) _, err = d.rd.Read(data) return string(data), err } func (d *Decoder) readByteArray() ([]byte, error) { l, err := d.readInt() if err != nil { return nil, err } if l < 0 { return nil, fmt.Errorf("negative length for make (read byte array)") } var data = make([]byte, l) _, err = d.rd.Read(data) return data, err } func (d *Decoder) readIntArray() ([]int32, error) { l, err := d.readInt() if err != nil { return nil, err } if l < 0 { return nil, fmt.Errorf("negative length for make (read int array)") } var data = make([]byte, l*4) _, err = d.rd.Read(data) if err != nil { return nil, err } var sl = make([]int32, l) for i := range sl { sl[i] = int32(data[i*4+0])<<24 | int32(data[i*4+1])<<16 | int32(data[i*4+2])<<8 | int32(data[i*4+3]) } return sl, nil } func (d *Decoder) readLongArray() ([]int64, error) { l, err := d.readInt() if err != nil { return nil, err } if l < 0 { return nil, fmt.Errorf("negative length for make (read long array)") } var data = make([]byte, l*8) _, err = d.rd.Read(data) if err != nil { return nil, err } var sl = make([]int64, l) for i := range sl { sl[i] = int64(data[i*8+0])<<56 | int64(data[i*8+1])<<48 | int64(data[i*8+2])<<40 | int64(data[i*8+3])<<32 | int64(data[i*8+4])<<24 | int64(data[i*8+5])<<16 | int64(data[i*8+6])<<8 | int64(data[i*8+7]) } return sl, nil } ================================================ FILE: protocol/nbt/encoder.go ================================================ package nbt import ( "encoding/binary" "fmt" "io" "math" "reflect" "strings" "unsafe" ) type Encoder struct { w io.Writer dontWriteRootCompoundName bool } func NewEncoder(w io.Writer) *Encoder { return &Encoder{w: w} } func (e *Encoder) Encode(name string, v any) error { if err := e.writeByte(Compound); err != nil { return err } if !e.dontWriteRootCompoundName { if err := e.writeString(name); err != nil { return err } } val := reflect.ValueOf(v) switch val.Kind() { case reflect.Struct: return e.encodeCompoundStruct(val) case reflect.Map: return e.encodeCompoundMap(val) default: return fmt.Errorf("Encode expects map/struct, not %s", val.Type()) } } func (e *Encoder) WriteRootName(val bool) { e.dontWriteRootCompoundName = !val } func (e *Encoder) writeBytes(b ...byte) error { _, err := e.w.Write(b) return err } func (e *Encoder) writeByte(b int8) error { return e.writeBytes(byte(b)) } func (e *Encoder) writeShort(s int16) error { return e.writeBytes( byte(s>>8), byte(s), ) } func (e *Encoder) writeInt(i int32) error { return e.writeBytes( byte(i>>24), byte(i>>16), byte(i>>8), byte(i), ) } func (e *Encoder) writeLong(l int64) error { return e.writeBytes( byte(l>>56), byte(l>>48), byte(l>>40), byte(l>>32), byte(l>>24), byte(l>>16), byte(l>>8), byte(l), ) } func (e *Encoder) writeFloat(f float32) error { return e.writeInt(int32(math.Float32bits(f))) } func (e *Encoder) writeDouble(d float64) error { return e.writeLong(int64(math.Float64bits(d))) } func (e *Encoder) writeIntArray(il []int32) error { if err := e.writeInt(int32(len(il))); err != nil { return err } return binary.Write(e.w, binary.BigEndian, il) } func (e *Encoder) writeLongArray(ll []int64) error { if err := e.writeInt(int32(len(ll))); err != nil { return err } return binary.Write(e.w, binary.BigEndian, ll) } func (e *Encoder) writeString(s string) error { if err := e.writeShort(int16(len(s))); err != nil { return err } return e.writeBytes([]byte(s)...) } func (e *Encoder) encodeCompoundStruct(val reflect.Value) error { for i := 0; i < val.NumField(); i++ { tf := val.Type().Field(i) f := val.Field(i) if !tf.IsExported() { continue } name := tf.Name if v, ok := tf.Tag.Lookup("nbt"); ok { name = v } if name == "-" { continue } var omitempty bool i := strings.Index(name, ",omitempty") if i != -1 { name = name[:i] omitempty = true } if omitempty && f.IsZero() { continue } if f.Kind() == reflect.Interface { f = f.Elem() } switch f.Kind() { case reflect.Bool: if err := e.writeByte(Byte); err != nil { return err } if err := e.writeString(name); err != nil { return err } b := f.Bool() if err := e.writeByte(*(*int8)(unsafe.Pointer(&b))); err != nil { return err } case reflect.Int8, reflect.Uint8: if err := e.writeByte(Byte); err != nil { return err } if err := e.writeString(name); err != nil { return err } if f.CanUint() { if err := e.writeByte(int8(f.Uint())); err != nil { return err } } else { if err := e.writeByte(int8(f.Int())); err != nil { return err } } case reflect.Int16, reflect.Uint16: if err := e.writeByte(Short); err != nil { return err } if err := e.writeString(name); err != nil { return err } if f.CanUint() { if err := e.writeShort(int16(f.Uint())); err != nil { return err } } else { if err := e.writeShort(int16(f.Int())); err != nil { return err } } case reflect.Int32, reflect.Uint32: if err := e.writeByte(Int); err != nil { return err } if err := e.writeString(name); err != nil { return err } if f.CanUint() { if err := e.writeInt(int32(f.Uint())); err != nil { return err } } else { if err := e.writeInt(int32(f.Int())); err != nil { return err } } case reflect.Int64, reflect.Uint64: if err := e.writeByte(Long); err != nil { return err } if err := e.writeString(name); err != nil { return err } if f.CanUint() { if err := e.writeLong(int64(f.Uint())); err != nil { return err } } else { if err := e.writeLong(int64(f.Int())); err != nil { return err } } case reflect.Float32: if err := e.writeByte(Float); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.writeFloat(float32(f.Float())); err != nil { return err } case reflect.Float64: if err := e.writeByte(Double); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.writeDouble(f.Float()); err != nil { return err } case reflect.String: if err := e.writeByte(String); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.writeString(f.String()); err != nil { return err } case reflect.Slice, reflect.Array: switch f.Type().Elem().Kind() { case reflect.Uint8, reflect.Int8: if err := e.writeByte(ByteArray); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.writeInt(int32(f.Len())); err != nil { return err } for i := 0; i < f.Len(); i++ { val := f.Index(i) switch val.Kind() { case reflect.Int8: if err := e.writeByte(int8(val.Int())); err != nil { return err } case reflect.Uint8: if err := e.writeByte(int8(val.Uint())); err != nil { return err } } } case reflect.Uint32, reflect.Int32: if err := e.writeByte(IntArray); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.writeInt(int32(f.Len())); err != nil { return err } for i := 0; i < f.Len(); i++ { fi := f.Index(i) if f.CanUint() { if err := e.writeInt(int32(fi.Uint())); err != nil { return err } } else { if err := e.writeInt(int32(fi.Int())); err != nil { return err } } } case reflect.Uint64, reflect.Int64: if err := e.writeByte(LongArray); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.writeInt(int32(f.Len())); err != nil { return err } for i := 0; i < f.Len(); i++ { x := f.Index(i) if x.CanUint() { if err := e.writeLong(int64(x.Uint())); err != nil { return err } } else { if err := e.writeLong(x.Int()); err != nil { return err } } } default: if err := e.writeByte(List); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.encodeList(f); err != nil { return err } } case reflect.Struct: if err := e.writeByte(Compound); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.encodeCompoundStruct(f); err != nil { return err } case reflect.Map: if err := e.writeByte(Compound); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.encodeCompoundMap(f); err != nil { return err } } } return e.writeByte(0) } func (e *Encoder) encodeCompoundMap(val reflect.Value) error { for _, key := range val.MapKeys() { f := val.MapIndex(key) name := key.String() switch f.Kind() { case reflect.Bool: if err := e.writeByte(Byte); err != nil { return err } if err := e.writeString(name); err != nil { return err } b := f.Bool() if err := e.writeByte(*(*int8)(unsafe.Pointer(&b))); err != nil { return err } case reflect.Int8, reflect.Uint8: if err := e.writeByte(Byte); err != nil { return err } if err := e.writeString(name); err != nil { return err } if f.CanUint() { if err := e.writeByte(int8(f.Uint())); err != nil { return err } } else { if err := e.writeByte(int8(f.Int())); err != nil { return err } } case reflect.Int16, reflect.Uint16: if err := e.writeByte(Short); err != nil { return err } if err := e.writeString(name); err != nil { return err } if f.CanUint() { if err := e.writeShort(int16(f.Uint())); err != nil { return err } } else { if err := e.writeShort(int16(f.Int())); err != nil { return err } } case reflect.Int32, reflect.Uint32: if err := e.writeByte(Int); err != nil { return err } if err := e.writeString(name); err != nil { return err } if f.CanUint() { if err := e.writeInt(int32(f.Uint())); err != nil { return err } } else { if err := e.writeInt(int32(f.Int())); err != nil { return err } } case reflect.Int64, reflect.Uint64: if err := e.writeByte(Long); err != nil { return err } if err := e.writeString(name); err != nil { return err } if f.CanUint() { if err := e.writeLong(int64(f.Uint())); err != nil { return err } } else { if err := e.writeLong(int64(f.Int())); err != nil { return err } } case reflect.Float32: if err := e.writeByte(Float); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.writeFloat(float32(f.Float())); err != nil { return err } case reflect.Float64: if err := e.writeByte(Double); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.writeDouble(f.Float()); err != nil { return err } case reflect.String: if err := e.writeByte(String); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.writeString(f.String()); err != nil { return err } case reflect.Slice, reflect.Array: switch f.Type().Elem().Kind() { case reflect.Uint8, reflect.Int8: if err := e.writeByte(ByteArray); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.writeInt(int32(f.Len())); err != nil { return err } for i := 0; i < f.Len(); i++ { val := f.Index(i) switch val.Kind() { case reflect.Int8: if err := e.writeByte(int8(val.Int())); err != nil { return err } case reflect.Uint8: if err := e.writeByte(int8(val.Uint())); err != nil { return err } } } case reflect.Uint32, reflect.Int32: if err := e.writeByte(IntArray); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.writeIntArray(*(*[]int32)(f.UnsafePointer())); err != nil { return err } case reflect.Uint64, reflect.Int64: if err := e.writeByte(LongArray); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.writeLongArray(*(*[]int64)(f.UnsafePointer())); err != nil { return err } default: if err := e.writeByte(List); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.encodeList(f); err != nil { return err } } case reflect.Struct: if err := e.writeByte(Compound); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.encodeCompoundStruct(f); err != nil { return err } case reflect.Map: if err := e.writeByte(Compound); err != nil { return err } if err := e.writeString(name); err != nil { return err } if err := e.encodeCompoundMap(f); err != nil { return err } } } return e.writeByte(0) } func (e *Encoder) encodeList(val reflect.Value) error { if err := e.writeByte(e.tagFor(val.Type().Elem())); err != nil { return err } if err := e.writeInt(int32(val.Len())); err != nil { return err } for i := 0; i < val.Len(); i++ { f := val.Index(i) switch val.Type().Elem().Kind() { case reflect.Bool: b := f.Bool() if err := e.writeByte(*(*int8)(unsafe.Pointer(&b))); err != nil { return err } case reflect.Int8: if err := e.writeByte(int8(f.Int())); err != nil { return err } case reflect.Uint8: if err := e.writeByte(int8(f.Uint())); err != nil { return err } case reflect.Int16: if err := e.writeShort(int16(f.Int())); err != nil { return err } case reflect.Uint16: if err := e.writeShort(int16(f.Uint())); err != nil { return err } case reflect.Int32: if err := e.writeInt(int32(f.Int())); err != nil { return err } case reflect.Uint32: if err := e.writeInt(int32(f.Uint())); err != nil { return err } case reflect.Int64: if err := e.writeLong(f.Int()); err != nil { return err } case reflect.Uint64: if err := e.writeLong(int64(f.Uint())); err != nil { return err } case reflect.String: if err := e.writeString(f.String()); err != nil { return err } case reflect.Slice, reflect.Array: switch f.Type().Elem().Kind() { case reflect.Uint8, reflect.Int8: if err := e.writeInt(int32(f.Len())); err != nil { return err } for i := 0; i < f.Len(); i++ { val := f.Index(i) switch val.Kind() { case reflect.Int8: if err := e.writeByte(int8(val.Int())); err != nil { return err } case reflect.Uint8: if err := e.writeByte(int8(val.Uint())); err != nil { return err } } } case reflect.Uint32, reflect.Int32: if err := e.writeIntArray(*(*[]int32)(f.UnsafePointer())); err != nil { return err } case reflect.Uint64, reflect.Int64: if err := e.writeInt(int32(f.Len())); err != nil { return err } for i := 0; i < f.Len(); i++ { x := f.Index(i) if x.CanUint() { if err := e.writeLong(int64(x.Uint())); err != nil { return err } } else { if err := e.writeLong(x.Int()); err != nil { return err } } } default: if err := e.encodeList(f); err != nil { return err } } case reflect.Float32: if err := e.writeFloat(float32(f.Float())); err != nil { return err } case reflect.Float64: if err := e.writeDouble(f.Float()); err != nil { return err } case reflect.Struct: if err := e.encodeCompoundStruct(f); err != nil { return err } case reflect.Map: if err := e.encodeCompoundMap(f); err != nil { return err } } } return nil } func (e *Encoder) tagFor(typ reflect.Type) int8 { switch typ.Kind() { case reflect.Uint8, reflect.Int8, reflect.Bool: return Byte case reflect.Uint16, reflect.Int16: return Short case reflect.Uint32, reflect.Int32: return Int case reflect.Uint64, reflect.Int64: return Long case reflect.Float32: return Float case reflect.Float64: return Double case reflect.Struct, reflect.Map: return Compound case reflect.String: return String case reflect.Slice, reflect.Array: { switch typ.Elem().Kind() { case reflect.Uint8, reflect.Int8: return ByteArray case reflect.Uint32, reflect.Int32: return IntArray case reflect.Uint64, reflect.Int64: return LongArray default: return List } } default: return 0 } } ================================================ FILE: protocol/nbt/qnbt/abi.go ================================================ package qnbt import ( "unsafe" "github.com/oq-x/unsafe2" ) type name struct { Bytes *byte } func (n name) exported() bool { return (*n.Bytes)&(1<<0) != 0 } func (n name) hastag() bool { return (*n.Bytes)&(1<<1) != 0 } func (n name) embedded() bool { return (*n.Bytes)&(1<<3) != 0 } func (n name) rvi(off int) (int, int) { v := 0 for i := 0; ; i++ { x := *n.data(off + i) v += int(x&0x7f) << (7 * i) if x&0x80 == 0 { return i + 1, v } } } func (n name) data(off int) *byte { return (*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(n.Bytes)) + uintptr(off))) } func (n name) name() string { i, l := n.rvi(1) return unsafe.String(n.data(i+1), l) } func (n name) tag() string { if !n.hastag() { return "" } i, l := n.rvi(1) i2, l2 := n.rvi(1 + i + l) return unsafe.String(n.data(1+i+l+i2), l2) } type structField struct { name name typ *unsafe2.Type off uintptr } type structType struct { unsafe2.Type pkgPath name fields []structField } type ptrType struct { unsafe2.Type elem *unsafe2.Type } type arrayType struct { unsafe2.Type elem *unsafe2.Type slice *unsafe2.Type len uintptr } type mapType struct { unsafe2.Type key *unsafe2.Type elem *unsafe2.Type // rest is unimportant } // returns the element of a pointer func ptrelem(t *unsafe2.Type, v uintptr) (*unsafe2.Type, unsafe.Pointer) { ptr_t := *(*ptrType)(unsafe.Pointer(t)) elem_t := ptr_t.elem return elem_t, unsafe.Pointer(v) } func kindOf(t *unsafe2.Type) uint8 { return t.Kind & kindm } const ( kindm = (1 << 5) - 1 ) func kind_name(k uint8) string { switch k { case bool_k: return "bool" case int_k: return "int" case int8_k: return "int8" case int16_k: return "int16" case int32_k: return "int32" case int64_k: return "int64" case uint_k: return "uint" case uint8_k: return "uint8" case uint16_k: return "uint16" case uint32_k: return "uint32" case uint64_k: return "uint64" case uintptr_k: return "uintptr" case float32_k: return "float32" case float64_k: return "float64" case complex64_k: return "complex64" case complex128_k: return "complex128" case array_k: return "array" case chan_k: return "chan" case func_k: return "func" case interface_k: return "interface" case map_k: return "map" case pointer_k: return "pointer" case slice_k: return "slice" case string_k: return "string" case struct_k: return "struct" case unsafe_ptr_k: return "unsafe.Pointer" default: return "invalid" } } const ( invalid_k uint8 = iota bool_k int_k int8_k int16_k int32_k int64_k uint_k uint8_k uint16_k uint32_k uint64_k uintptr_k float32_k float64_k complex64_k complex128_k array_k chan_k func_k interface_k map_k pointer_k slice_k string_k struct_k unsafe_ptr_k ) func setSliceArray(s, a unsafe.Pointer, l int) { *(*uintptr)(s) = uintptr(a) *(*int)(unsafe.Add(s, ptrSize)) = l *(*int)(unsafe.Add(s, ptrSize*2)) = l } var ptrSize = unsafe.Sizeof(0) ================================================ FILE: protocol/nbt/qnbt/buffer.go ================================================ package qnbt import ( "io" "unsafe" ) type bufferedReader struct { src io.Reader buf []byte r, w int } func (rd *bufferedReader) available() int { return rd.w - rd.r } func (rd *bufferedReader) readBytes(num int) ([]byte, error) { if err := rd.fill(num); err != nil { return nil, err } b := rd.buf[rd.r : rd.r+num] rd.r += num return b, nil } func (rd *bufferedReader) readBytesString(num int) (string, error) { b, err := rd.readBytes(num) if err != nil { return "", err } return unsafe.String(unsafe.SliceData(b), num), nil } func (rd *bufferedReader) fill(min int) error { if rd.available() < min { rd.r, rd.w = 0, copy(rd.buf, rd.buf[rd.r:rd.w]) for i := 0; i < 5; i++ { n, err := rd.src.Read(rd.buf[rd.w:]) rd.w += n if err != nil { return err } min -= n if min <= 0 || rd.w == len(rd.buf) { return nil } } return io.ErrNoProgress } return nil } func (rd *bufferedReader) skip(n int) error { avail := rd.w - rd.r if avail > n { rd.r += n return nil } n -= avail rd.r += avail rd.r, rd.w = 0, copy(rd.buf, rd.buf[rd.r:rd.w]) for n > 0 { mx := n if mx >= len(rd.buf) { mx = len(rd.buf) } x, err := rd.src.Read(rd.buf[rd.w : rd.w+mx]) rd.w += x rd.r += x if err != nil { return err } if rd.w == len(rd.buf) { rd.r, rd.w = 0, 0 } n -= x } return nil } ================================================ FILE: protocol/nbt/qnbt/decode.go ================================================ // deprecated: :( package qnbt import ( "errors" "fmt" "io" "sync" "unsafe" "github.com/oq-x/unsafe2" ) type MismatchError struct { // name of the field trying to decode name string // the type kind expected expectedKind string // the type kind got gotKind string // the tag got tag string } func (m MismatchError) Error() string { return fmt.Sprintf("MismatchError: tag %s (expected %s), got %s (while decoding %s)", m.tag, m.expectedKind, m.gotKind, m.name) } var ( ErrExpectPointer = errors.New("expected a pointer for dst") ErrUnsupported = errors.New("unsupported type") ErrUnknownTag = errors.New("unknown tag") ) var decoders = sync.Pool{ New: func() any { return new(Decoder) }, } var readers = sync.Pool{ New: func() any { r := new(bufferedReader) r.buf = make([]byte, 1024) return r }, } type Decoder struct { // if disallowUnknownKeys is enabled, the decoder will return an error if it reads a name not in the struct disallowUnknownKeys bool // if networkNBT is enabled, the name for the root compound will not be read networkNBT bool rd *bufferedReader } // Close closes the decoder for further use and puts it back in the decoder pool func (d *Decoder) Close() { readers.Put(d.rd) d.rd = nil decoders.Put(d) } func NewDecoder(rd io.Reader) *Decoder { dc := decoders.Get().(*Decoder) dc.disallowUnknownKeys, dc.networkNBT = false, false dc.rd = &bufferedReader{ src: rd, buf: make([]byte, 1024), } dc.rd = readers.Get().(*bufferedReader) dc.rd.buf, dc.rd.src, dc.rd.r, dc.rd.w = slicesize(dc.rd.buf, 1024), rd, 0, 0 return dc } func slicesize(s []byte, l int) []byte { if l < len(s) { return s[:l] } else { return make([]byte, l) } } func (dc *Decoder) DisallowUnknownKeys(v bool) *Decoder { dc.disallowUnknownKeys = v return dc } func (dc *Decoder) NetworkNBT(v bool) *Decoder { dc.networkNBT = v return dc } func Unmarshal(data []byte, dst any) (rootName string, err error) { dc := decoders.Get().(*Decoder) defer decoders.Put(dc) dc.disallowUnknownKeys, dc.networkNBT = false, false dc.rd = readers.Get().(*bufferedReader) dc.rd.buf, dc.rd.src, dc.rd.r, dc.rd.w = data, nil, 0, len(data) return dc.DecodeAndClose(dst) } // DecodeAndClose decodes into dst and closes the decoder func (d *Decoder) DecodeAndClose(dst any) (rootName string, err error) { defer d.Close() return d.Decode(dst) } func (d *Decoder) Decode(dst any) (rootName string, err error) { id := unsafe2.InterfaceData(dst) typ := (*unsafe2.Type)(unsafe.Pointer(id.Type)) if kindOf(typ) != pointer_k { return rootName, ErrExpectPointer } typ, v := ptrelem(typ, id.Value) rootTagS, err := d.rd.readBytesString(1) if err != nil { return rootName, err } if !d.networkNBT { if err := d.readString(&rootName); err != nil { return rootName, err } } switch rootTagS { case string_t_b: if k := kindOf(typ); k != string_k { return rootName, MismatchError{ expectedKind: "string", gotKind: kind_name(k), tag: tagName(rootTagS), name: "root", } } case compound_t_b: switch k := kindOf(typ); k { case struct_k: typ := (*structType)(unsafe.Pointer(typ)) s := newStruct(typ, v) defer structs.Put(s) if err := d.decodeStructCompound(s); err != nil { return rootName, err } default: return rootName, MismatchError{ expectedKind: "struct", gotKind: kind_name(k), tag: tagName(rootTagS), name: "root", } } default: return rootName, ErrUnsupported } return rootName, nil } func (d *Decoder) discardCompound() error { for { tag, err := d.readByte2() if err != nil { return err } if tag == end_t { return nil } if err := d.skipString(); err != nil { return err } s, err := d.discard(tag) if err != nil { return err } if !s { switch tag { case compound_t: if err := d.discardCompound(); err != nil { return err } case list_t: if err := d.discardList(); err != nil { return err } default: return ErrUnknownTag } } } } func (d *Decoder) discard(tag_b byte) (skipped bool, err error) { switch tag_b { case byte_t: return true, d.rd.skip(1) case short_t: return true, d.rd.skip(2) case int_t, float_t: return true, d.rd.skip(4) case long_t, double_t: return true, d.rd.skip(8) case byte_array_t: l, err := d.readInt() if err != nil { return true, err } return true, d.rd.skip(int(l)) case string_t: l, err := d.readShort() if err != nil { return true, err } return true, d.rd.skip(int(l)) case int_array_t: l, err := d.readInt() if err != nil { return true, err } return true, d.rd.skip(int(l) * 4) case long_array_t: l, err := d.readInt() if err != nil { return true, err } return true, d.rd.skip(int(l) * 8) default: return } } ================================================ FILE: protocol/nbt/qnbt/list.go ================================================ package qnbt import ( "fmt" "strconv" "unsafe" "github.com/oq-x/unsafe2" ) func (d *Decoder) decodeListSlice(ptr unsafe.Pointer, t *ptrType) error { tag, err := d.readByte2() if err != nil { return err } l, err := d.readInt() if err != nil { return err } if tag == end_t { return nil } cap := *(*int)(unsafe.Add(ptr, ptrSize*2)) array := &array_t{ elem: t.elem, ptr: unsafe.Pointer(*(*uintptr)(ptr)), len: uintptr(cap), } if int(l) > cap { array.ptr = mallocgc(uintptr(l)*array.elem.Size, nil, true) array.len = uintptr(l) setSliceArray(ptr, array.ptr, int(l)) } return d.readListArray(tag, l, array) } type array_t struct { elem *unsafe2.Type ptr unsafe.Pointer len uintptr } func (a *array_t) index(i int) unsafe.Pointer { return unsafe.Add(a.ptr, a.elem.Size*uintptr(i)) } func (d *Decoder) decodeListArray(a *array_t) error { tag, err := d.readByte2() if err != nil { return err } l, err := d.readInt() if err != nil { return err } if tag == end_t { return nil } if uintptr(l) < a.len { return fmt.Errorf("array too small") } return d.readListArray(tag, l, a) } func (d *Decoder) readListArray(tag byte, l int32, a *array_t) error { kind := kindOf(a.elem) for i := 0; i < int(l); i++ { iptr := a.index(i) //if err := match("", tag, a.elem); err != nil { // return err //} switch tag { case byte_t: if err := d.readBytePtr(iptr); err != nil { return err } case short_t: if err := d.readShortPtr(iptr); err != nil { return err } case int_t, float_t: if err := d.readIntPtr(iptr); err != nil { return err } case long_t, double_t: if err := d.readLongPtr(iptr); err != nil { return err } case byte_array_t: switch kind { case array_k: if err := d.readByteArray(iptr); err != nil { return err } case slice_k: l, err := d.readInt() if err != nil { return err } ptr := mallocgc(uintptr(l), nil, true) if err := d.decodeByteArray(int(l), ptr); err != nil { return err } setSliceArray(iptr, ptr, int(l)) } case string_t: if err := d.readStringPtr(iptr); err != nil { return err } case long_array_t: switch kind { case array_k: if err := d.readLongArray(iptr); err != nil { return err } case slice_k: l, err := d.readInt() if err != nil { return err } ptr := mallocgc(uintptr(l)*8, nil, true) if err := d.decodeLongArray(int(l), ptr); err != nil { return err } setSliceArray(iptr, ptr, int(l)) } case int_array_t: switch kind { case array_k: if err := d.readIntArray(iptr); err != nil { return err } case slice_k: l, err := d.readInt() if err != nil { return err } ptr := mallocgc(uintptr(l)*4, nil, true) if err := d.decodeIntArray(int(l), ptr); err != nil { return err } setSliceArray(iptr, ptr, int(l)) } case compound_t: switch kind { case struct_k: s := newStruct((*structType)(unsafe.Pointer(a.elem)), iptr) if err := d.decodeStructCompound(s); err != nil { return err } structs.Put(s) case map_k: t := (*mapType)(unsafe.Pointer(a.elem)) if kK, kE := kindOf(t.key), kindOf(t.elem); kK != string_k || kE != string_k { return MismatchError{ name: strconv.Itoa(i), expectedKind: "struct/map[string]string", gotKind: fmt.Sprintf("map[%s]%s", kind_name(kK), kind_name(kE)), //tag: tagName(tag), } } m := *(*map[string]string)(iptr) if m == nil { m = make(map[string]string) *(*map[string]string)(iptr) = m } if err := d.decodeMapString(m); err != nil { return err } } case list_t: switch kind { case array_k: arr := (*arrayType)(unsafe.Pointer(a.elem)) if err := d.decodeListArray(&array_t{arr.elem, iptr, arr.len}); err != nil { return err } case slice_k: if err := d.decodeListSlice(iptr, (*ptrType)(unsafe.Pointer(a.elem))); err != nil { return err } } default: return ErrUnknownTag } } return nil } func (d *Decoder) discardList() error { tag, err := d.readByte2() if err != nil { return err } len, err := d.readInt() if err != nil { return err } f := fixedSize(tag) if f == 0 { return nil } if f != -1 { return d.rd.skip(f * int(len)) } for i := int32(0); i < len; i++ { s, err := d.discard(tag) if err != nil { return err } if !s { switch tag { case compound_t: if err := d.discardCompound(); err != nil { return err } case list_t: if err := d.discardList(); err != nil { return err } default: return ErrUnknownTag } } } return nil } func fixedSize(tag byte) int { switch tag { case end_t: return 0 case byte_t: return 1 case short_t: return 2 case int_t, float_t: return 4 case long_t, double_t: return 8 default: return -1 } } ================================================ FILE: protocol/nbt/qnbt/malloc.go ================================================ package qnbt import ( "unsafe" "github.com/oq-x/unsafe2" ) //go:linkname mallocgc runtime.mallocgc func mallocgc(size uintptr, typ *unsafe2.Type, needzero bool) unsafe.Pointer ================================================ FILE: protocol/nbt/qnbt/map.go ================================================ package qnbt import "fmt" func (d *Decoder) decodeMapString(m map[string]string) error { var name string for { tag, err := d.rd.readBytesString(1) if err != nil { return err } if tag == end_t_b { return nil } if err := d.readStringNonCopy(&name); err != nil { return err } if tag != string_t_b { return fmt.Errorf("expected string tag, got %s", tagName(tag)) } var v string if err := d.readString(&v); err != nil { return err } m[name] = v } } ================================================ FILE: protocol/nbt/qnbt/primitive.go ================================================ package qnbt import ( "encoding/binary" "unsafe" "github.com/zeppelinmc/zeppelin/protocol/nbt/qnbt/native" ) const ( end_t = iota byte_t short_t int_t long_t float_t double_t byte_array_t string_t list_t compound_t int_array_t long_array_t ) // a little trick to avoid allocations var ( end_t_b = string([]byte{end_t}) byte_t_b = string([]byte{byte_t}) short_t_b = string([]byte{short_t}) int_t_b = string([]byte{int_t}) long_t_b = string([]byte{long_t}) float_t_b = string([]byte{float_t}) double_t_b = string([]byte{double_t}) byte_array_t_b = string([]byte{byte_array_t}) string_t_b = string([]byte{string_t}) list_t_b = string([]byte{list_t}) compound_t_b = string([]byte{compound_t}) int_array_t_b = string([]byte{int_array_t}) long_array_t_b = string([]byte{long_array_t}) ) func tagName(t string) string { switch t { case end_t_b: return "TAG_End" case byte_t_b: return "TAG_Byte" case short_t_b: return "TAG_Short" case int_t_b: return "TAG_Int" case long_t_b: return "TAG_Long" case float_t_b: return "TAG_Float" case double_t_b: return "TAG_Double" case byte_array_t_b: return "TAG_Byte_Array" case string_t_b: return "TAG_String" case list_t_b: return "TAG_List" case compound_t_b: return "TAG_Compound" case int_array_t_b: return "TAG_Int_Array" case long_array_t_b: return "TAG_Long_Array" default: return "Unknown" } } func (d *Decoder) load(length int) []byte { b := d.rd.buf[d.rd.r : d.rd.r+length] d.rd.r += length return b } func (d *Decoder) readByte(b *byte) error { if err := d.rd.fill(1); err != nil { return err } *b = d.rd.buf[d.rd.r] d.rd.r++ return nil } func (d *Decoder) readByte2() (byte, error) { if err := d.rd.fill(1); err != nil { return 0, err } b := d.rd.buf[d.rd.r] d.rd.r++ return b, nil } func (d *Decoder) readBytePtr(ptr unsafe.Pointer) error { return d.readByte((*byte)(ptr)) } func (d *Decoder) readShort() (int16, error) { if err := d.rd.fill(2); err != nil { return 0, err } return int16(binary.BigEndian.Uint16(d.load(2))), nil } func (d *Decoder) readShortPtr(ptr unsafe.Pointer) error { if err := d.rd.fill(2); err != nil { return err } s := unsafe.Slice((*byte)(ptr), 2) copy(s, d.load(2)) if !native.SystemBigEndian { native.Convert16(s) } return nil } func (d *Decoder) readInt() (int32, error) { if err := d.rd.fill(4); err != nil { return 0, err } return int32(binary.BigEndian.Uint32(d.load(4))), nil } func (d *Decoder) readIntPtr(ptr unsafe.Pointer) error { if err := d.rd.fill(4); err != nil { return err } s := unsafe.Slice((*byte)(ptr), 4) copy(s, d.load(4)) if !native.SystemBigEndian { native.Convert32(s) } return nil } func (d *Decoder) readLongPtr(ptr unsafe.Pointer) error { if err := d.rd.fill(8); err != nil { return err } s := unsafe.Slice((*byte)(ptr), 8) copy(s, d.load(8)) if !native.SystemBigEndian { native.Convert64(s) } return nil } func (d *Decoder) skipString() error { l, err := d.readShort() if err != nil { return err } return d.rd.skip(int(l)) } func (d *Decoder) readString(dst *string) error { l, err := d.readShort() if err != nil { return err } if err := d.rd.fill(int(l)); err != nil { return err } *dst = string(d.load(int(l))) return nil } func (d *Decoder) readStringNonCopy(dst *string) error { l, err := d.readShort() if err != nil { return err } if err := d.rd.fill(int(l)); err != nil { return err } buf := d.rd.buf[d.rd.r : d.rd.r+int(l)] d.rd.r += int(l) *dst = unsafe.String(unsafe.SliceData(buf), len(buf)) return nil } func (d *Decoder) readStringPtr(dst unsafe.Pointer) error { return d.readString((*string)(dst)) } func (d *Decoder) readLongArray(ptr unsafe.Pointer) error { l, err := d.readInt() if err != nil { return err } return d.decodeLongArray(int(l), ptr) } func (d *Decoder) decodeLongArray(len int, ptr unsafe.Pointer) error { for i := 0; i < len; i++ { if err := d.readLongPtr(ptr); err != nil { return err } ptr = unsafe.Add(ptr, 8) } return nil } func (d *Decoder) readIntArray(ptr unsafe.Pointer) error { l, err := d.readInt() if err != nil { return err } return d.decodeIntArray(int(l), ptr) } func (d *Decoder) decodeIntArray(len int, ptr unsafe.Pointer) error { for i := 0; i < len; i++ { if err := d.readIntPtr(ptr); err != nil { return err } ptr = unsafe.Add(ptr, 4) } return nil } func (d *Decoder) readByteArray(ptr unsafe.Pointer) error { l, err := d.readInt() if err != nil { return err } return d.decodeByteArray(int(l), ptr) } /*func (d *Decoder) decodeByteArray(len int, ptr unsafe.Pointer) error { data, err := d.rd.readBytes(len) if err != nil { return err } copy(unsafe.Slice((*byte)(ptr), len), data) return nil } */ func (d *Decoder) decodeByteArray(l int, ptr unsafe.Pointer) error { for l > 0 { lr := min(len(d.rd.buf), l) data, err := d.rd.readBytes(lr) if err != nil { return err } copy(unsafe.Slice((*byte)(ptr), l), data) l -= lr ptr = unsafe.Add(ptr, lr) } return nil } ================================================ FILE: protocol/nbt/qnbt/qnbt.go ================================================ // qNBT is a very efficient NBT decoder! // Caveats: does not work with []any, map[string]any or maps in general (except for map[string]string) // Specification: // Uses very lite, custom reflection (mostly unsafe) package qnbt ================================================ FILE: protocol/nbt/qnbt/struct.go ================================================ package qnbt import ( "fmt" "strings" "sync" "unsafe" "github.com/oq-x/unsafe2" ) var structs = sync.Pool{ New: func() any { return &struct_t{ names: make(map[string]int), } }} func newStruct(t *structType, ptr unsafe.Pointer) *struct_t { s := structs.Get().(*struct_t) clear(s.names) s.t = t s.ptr = ptr for i, f := range t.fields { if !f.name.exported() { continue } name := f.name.name() if nbtname, ok := findNBTTag(f.name.tag()); ok { name = nbtname if name == "-" { continue } if i := strings.Index(name, ",omitempty"); i != -1 { name = name[:i] } } s.names[name] = i } return s } func findNBTTag(tag string) (string, bool) { i := strings.Index(tag, `nbt:"`) if i == -1 { return "", false } tag = tag[i+5:] i = strings.Index(tag, `"`) if i == -1 { return "", false } return tag[:i], true } type struct_t struct { t *structType names map[string]int ptr unsafe.Pointer } func (s *struct_t) field(n string) (f *structField, ptr unsafe.Pointer, ok bool) { i, ok := s.names[n] if !ok { return nil, nil, ok } ft := s.t.fields[i] return &ft, unsafe.Add(s.ptr, ft.off), ok } func (d *Decoder) decodeStructCompound(s *struct_t) error { var name string for { tag, err := d.readByte2() if err != nil { return err } if tag == end_t { return nil } if err := d.readStringNonCopy(&name); err != nil { return err } field, fieldPtr, ok := s.field(name) if ok { //if err := match(name, tag, field.typ); err != nil { // return err //} switch tag { case byte_t: if err := d.readBytePtr(fieldPtr); err != nil { return err } case string_t: if err := d.readStringPtr(fieldPtr); err != nil { return err } case short_t: if err := d.readShortPtr(fieldPtr); err != nil { return err } case int_t, float_t: if err := d.readIntPtr(fieldPtr); err != nil { return err } case long_t, double_t: if err := d.readLongPtr(fieldPtr); err != nil { return err } case byte_array_t: switch kindOf(field.typ) { case array_k: if err := d.readByteArray(fieldPtr); err != nil { return err } case slice_k: l, err := d.readInt() if err != nil { return err } ptr := mallocgc(uintptr(l), nil, true) if err := d.decodeByteArray(int(l), ptr); err != nil { return err } setSliceArray(fieldPtr, ptr, int(l)) } case long_array_t: switch kindOf(field.typ) { case array_k: if err := d.readLongArray(fieldPtr); err != nil { return err } case slice_k: l, err := d.readInt() if err != nil { return err } ptr := mallocgc(uintptr(l)*8, nil, true) if err := d.decodeLongArray(int(l), ptr); err != nil { return err } setSliceArray(fieldPtr, ptr, int(l)) } case int_array_t: switch kindOf(field.typ) { case array_k: if err := d.readIntArray(fieldPtr); err != nil { return err } case slice_k: l, err := d.readInt() if err != nil { return err } ptr := mallocgc(uintptr(l)*4, nil, true) if err := d.decodeIntArray(int(l), ptr); err != nil { return err } setSliceArray(fieldPtr, ptr, int(l)) } case compound_t: switch kindOf(field.typ) { case struct_k: s := newStruct((*structType)(unsafe.Pointer(field.typ)), fieldPtr) if err := d.decodeStructCompound(s); err != nil { return err } structs.Put(s) case map_k: t := (*mapType)(unsafe.Pointer(field.typ)) if kK, kE := kindOf(t.key), kindOf(t.elem); kK != string_k || kE != string_k { return MismatchError{ name: name, expectedKind: "struct/map[string]string", gotKind: fmt.Sprintf("map[%s]%s", kind_name(kK), kind_name(kE)), tag: tagName(string([]byte{tag})), } } m := *(*map[string]string)(fieldPtr) if m == nil { m = make(map[string]string) *(*map[string]string)(fieldPtr) = m } if err := d.decodeMapString(m); err != nil { return err } } case list_t: switch kindOf(field.typ) { case array_k: t := (*arrayType)(unsafe.Pointer(field.typ)) if err := d.decodeListArray(&array_t{t.elem, fieldPtr, t.len}); err != nil { return err } case slice_k: if err := d.decodeListSlice(fieldPtr, (*ptrType)(unsafe.Pointer(field.typ))); err != nil { return err } } default: return ErrUnknownTag } } else { s, err := d.discard(tag) if err != nil { return err } if !s { switch tag { case compound_t: if err := d.discardCompound(); err != nil { return err } case list_t: if err := d.discardList(); err != nil { return err } default: return ErrUnknownTag } } } //fmt.Println(tag, name) } } func match(name, tag_b string, t *unsafe2.Type) error { k := kindOf(t) switch tag_b { case byte_t_b: if k != uint8_k && k != int8_k && k != bool_k { return MismatchError{ name: name, expectedKind: "uint8/int8/bool", gotKind: kind_name(k), tag: tagName(tag_b), } } case short_t_b: if k != int16_k && k != uint16_k { return MismatchError{ name: name, expectedKind: "int16/uint16", gotKind: kind_name(k), tag: tagName(tag_b), } } case int_t_b: if k != int32_k && k != uint32_k { return MismatchError{ name: name, expectedKind: "int32/uint32", gotKind: kind_name(k), tag: tagName(tag_b), } } case long_t_b: if k != int64_k && k != uint64_k { return MismatchError{ name: name, expectedKind: "int64/uint64", gotKind: kind_name(k), tag: tagName(tag_b), } } case float_t_b: if k != float32_k { return MismatchError{ name: name, expectedKind: "float32", gotKind: kind_name(k), tag: tagName(tag_b), } } case double_t_b: if k != float64_k { return MismatchError{ name: name, expectedKind: "float64", gotKind: kind_name(k), tag: tagName(tag_b), } } case byte_array_t_b: if k != slice_k && k != array_k { return MismatchError{ name: name, expectedKind: "[]uint8/[]int8", gotKind: kind_name(k), tag: tagName(tag_b), } } base := (*ptrType)(unsafe.Pointer(t)) elemKind := kindOf(base.elem) if elemKind != int8_k && elemKind != uint8_k { return MismatchError{ name: name, expectedKind: "[]uint8/[]int8", gotKind: kind_name(k), tag: tagName(tag_b), } } case string_t_b: if k != string_k { return MismatchError{ name: name, expectedKind: "string", gotKind: kind_name(k), tag: tagName(tag_b), } } case list_t_b: if k != slice_k && k != array_k { return MismatchError{ name: name, expectedKind: "slice/array", gotKind: kind_name(k), tag: tagName(tag_b), } } case compound_t_b: if k != struct_k && k != map_k { return MismatchError{ name: name, expectedKind: "struct/map[string]string", gotKind: kind_name(k), tag: tagName(tag_b), } } case int_array_t_b: if k != slice_k && k != array_k { return MismatchError{ name: name, expectedKind: "[]uint32/[]int32", gotKind: kind_name(k), tag: tagName(tag_b), } } base := (*ptrType)(unsafe.Pointer(t)) elemKind := kindOf(base.elem) if elemKind != int32_k && elemKind != uint32_k { return MismatchError{ name: name, expectedKind: "[]uint32/[]int32", gotKind: kind_name(k), tag: tagName(tag_b), } } case long_array_t_b: if k != slice_k && k != array_k { return MismatchError{ name: name, expectedKind: "[]uint64/[]int64", gotKind: kind_name(k), tag: tagName(tag_b), } } base := (*ptrType)(unsafe.Pointer(t)) elemKind := kindOf(base.elem) if elemKind != int64_k && elemKind != uint64_k { return MismatchError{ name: name, expectedKind: "[]uint64/[]int64", gotKind: kind_name(k), tag: tagName(tag_b), } } } return nil } ================================================ FILE: protocol/nbt/staticReader.go ================================================ package nbt import ( "fmt" "io" "unsafe" ) /* Reader is an NBT decoder that uses no reflection. it should be used for static structures. The read functions read the type id, name and value */ type StaticReader struct { r io.Reader } func NewStaticReader(r io.Reader) StaticReader { return StaticReader{r} } // reads a byte func (r StaticReader) readByte() (byte, error) { var data [1]byte _, err := r.r.Read(data[:]) return data[0], err } // reads a short, big endian func (r StaticReader) readShort() (int16, error) { var data [2]byte _, err := r.r.Read(data[:]) return int16(data[0])<<8 | int16(data[1]), err } // reads an int, big endian func (r StaticReader) readInt() (int32, error) { var data [4]byte _, err := r.r.Read(data[:]) return int32(data[0])<<24 | int32(data[1])<<16 | int32(data[2])<<8 | int32(data[3]), err } // reads a long, big endian func (r StaticReader) readLong() (int64, error) { var data [8]byte _, err := r.r.Read(data[:]) return int64(data[0])<<56 | int64(data[1])<<48 | int64(data[2])<<40 | int64(data[3])<<32 | int64(data[4])<<24 | int64(data[5])<<16 | int64(data[6])<<8 | int64(data[7]), err } // reads a string prefixed by a short of its length func (r StaticReader) readString() (string, error) { length, err := r.readShort() if err != nil { return "", err } if length < 0 { return "", fmt.Errorf("negative length for make (read string)") } var data = make([]byte, length) if _, err := r.r.Read(data); err != nil { return "", err } return unsafe.String(unsafe.SliceData(data), len(data)), nil //*(*string)(unsafe.Pointer(&data)), nil } func (r StaticReader) ReadRoot(withName bool) (typeId byte, name string, err error) { typeId, err = r.readByte() if err != nil { return typeId, "", err } if withName { name, err = r.readString() } return } func (r StaticReader) Byte(dst *byte) (string, error) { typeId, err := r.readByte() if err != nil { return "", err } if typeId != Byte { return "", fmt.Errorf("tried reading TAG_Byte, got %d", typeId) } name, err := r.readString() if err != nil { return "", err } *dst, err = r.readByte() return name, err } func (r StaticReader) Short(dst *int16) (string, error) { typeId, err := r.readByte() if err != nil { return "", err } if typeId != Short { return "", fmt.Errorf("tried reading TAG_Short, got %d", typeId) } name, err := r.readString() if err != nil { return "", err } *dst, err = r.readShort() return name, err } func (r StaticReader) Int(dst *int32) (string, error) { typeId, err := r.readByte() if err != nil { return "", err } if typeId != Int { return "", fmt.Errorf("tried reading TAG_Int, got %d", typeId) } name, err := r.readString() if err != nil { return "", err } *dst, err = r.readInt() return name, err } func (r StaticReader) Long(dst *int64) (string, error) { typeId, err := r.readByte() if err != nil { return "", err } if typeId != Long { return "", fmt.Errorf("tried reading TAG_Long, got %d", typeId) } name, err := r.readString() if err != nil { return "", err } *dst, err = r.readLong() return name, err } func (r StaticReader) String(dst *string) (string, error) { typeId, err := r.readByte() if err != nil { return "", err } if typeId != String { return "", fmt.Errorf("tried reading TAG_String, got %d", typeId) } name, err := r.readString() if err != nil { return "", err } *dst, err = r.readString() return name, err } func (r StaticReader) Compound(dst *CompoundReader) (string, error, bool) { typeId, err := r.readByte() if err != nil { return "", err, false } if typeId == End { return "", nil, true } if typeId != Compound { return "", fmt.Errorf("tried reading TAG_Compound, got %d", typeId), false } name, err := r.readString() if err != nil { return "", err, false } *dst = CompoundReader{r} return name, err, false } type CompoundReader struct { r StaticReader } // super convenient func (cr CompoundReader) ReadStringMap(tgt map[string]string) error { for { typeId, err := cr.r.readByte() if err != nil { return err } if typeId == End { return nil } name, err := cr.r.readString() if err != nil { return err } switch typeId { case String: str, err := cr.r.readString() if err != nil { return err } tgt[name] = str default: return fmt.Errorf("unsupported tag %d for string map", typeId) } } } func (cr CompoundReader) ReadAll(targets ...any) error { for i := 0; i < len(targets)+1; i++ { //+1 to read end typeId, err := cr.r.readByte() if err != nil { return err } if typeId == End { return nil } _, err = cr.r.readString() if err != nil { return err } switch typeId { case Byte: dst, ok := targets[i].(*byte) if !ok { return fmt.Errorf("mismatched type Byte and %T", targets[i]) } *dst, err = cr.r.readByte() if err != nil { return err } case Short: dst, ok := targets[i].(*int16) if !ok { return fmt.Errorf("mismatched type Short and %T", targets[i]) } *dst, err = cr.r.readShort() if err != nil { return err } case Int: dst, ok := targets[i].(*int32) if !ok { return fmt.Errorf("mismatched type Int and %T", targets[i]) } *dst, err = cr.r.readInt() if err != nil { return err } case Long: dst, ok := targets[i].(*int64) if !ok { return fmt.Errorf("mismatched type Long and %T", targets[i]) } *dst, err = cr.r.readLong() if err != nil { return err } case String: dst, ok := targets[i].(*string) if !ok { return fmt.Errorf("mismatched type String and %T", targets[i]) } *dst, err = cr.r.readString() if err != nil { return err } case Compound: switch dst := targets[i].(type) { case []any: CompoundReader{r: cr.r}.ReadAll(dst) case map[string]string: CompoundReader{r: cr.r}.ReadStringMap(dst) default: return fmt.Errorf("mismatched type Compound and %T", targets[i]) } case List: dst, ok := targets[i].(func(len int32, rd ListReader)) if !ok { return fmt.Errorf("mismatched type List and %T", targets[i]) } typeId, err := cr.r.readByte() if err != nil { return err } len, err := cr.r.readInt() if err != nil { return err } dst(len, ListReader{typeId: typeId, r: cr.r}) } } return nil } type ListReader struct { typeId byte r StaticReader } func (lr ListReader) Read(tgt any) (err error) { switch lr.typeId { case Byte: dst, ok := tgt.(*byte) if !ok { return fmt.Errorf("mismatched type Byte and %T", tgt) } *dst, err = lr.r.readByte() if err != nil { return err } case Short: dst, ok := tgt.(*int16) if !ok { return fmt.Errorf("mismatched type Short and %T", tgt) } *dst, err = lr.r.readShort() if err != nil { return err } case Int: dst, ok := tgt.(*int32) if !ok { return fmt.Errorf("mismatched type Int and %T", tgt) } *dst, err = lr.r.readInt() if err != nil { return err } case Long: dst, ok := tgt.(*int64) if !ok { return fmt.Errorf("mismatched type Long and %T", tgt) } *dst, err = lr.r.readLong() if err != nil { return err } case String: dst, ok := tgt.(*string) if !ok { return fmt.Errorf("mismatched type String and %T", tgt) } *dst, err = lr.r.readString() if err != nil { return err } case Compound: dst, ok := tgt.([]any) if !ok { return fmt.Errorf("mismatched type Compound and %T", lr) } CompoundReader{r: lr.r}.ReadAll(dst...) case List: dst, ok := tgt.(func(ListReader)) if !ok { return fmt.Errorf("mismatched type List and %T", tgt) } typeId, err := lr.r.readByte() if err != nil { return err } dst(ListReader{typeId: typeId, r: lr.r}) } return nil } ================================================ FILE: protocol/net/authentication.go ================================================ package net import ( "crypto/sha1" "crypto/x509" "encoding/hex" "encoding/json" "fmt" "net/http" "strings" "unsafe" "github.com/google/uuid" "github.com/zeppelinmc/zeppelin/protocol/net/packet/login" ) func authurl(u, h string) string { return "https://sessionserver.mojang.com/session/minecraft/hasJoined?username=" + u + "&serverId=" + h } func (conn *Conn) authenticate() error { key, err := x509.MarshalPKIXPublicKey(&conn.listener.privKey.PublicKey) if err != nil { return err } hash := conn.sessionHash(key) res, err := http.Get(authurl(conn.username, hash)) if err != nil { return err } if res.StatusCode != http.StatusOK { return fmt.Errorf("authenticated error: player not joined") } var response struct { ID string `json:"id"` Name string `json:"name"` Properties []struct { Name string `json:"name"` Value string `json:"value"` Signature string `json:"signature"` } `json:"properties"` } err = json.NewDecoder(res.Body).Decode(&response) if err != nil { return err } conn.username = response.Name conn.uuid, err = uuid.Parse(response.ID) if err != nil { return err } conn.properties = *(*[]login.Property)(unsafe.Pointer(&response.Properties)) return nil } func (conn *Conn) sessionHash(publicKey []byte) string { hash := sha1.New() hash.Write(conn.sharedSecret) hash.Write(publicKey) sum := hash.Sum(nil) negative := (sum[0] & 0x80) == 0x80 if negative { sum = twosComplement(sum) } // Trim away zeroes res := strings.TrimLeft(hex.EncodeToString(sum), "0") if negative { res = "-" + res } return res } func twosComplement(p []byte) []byte { carry := true for i := len(p) - 1; i >= 0; i-- { p[i] = byte(^p[i]) if carry { carry = p[i] == 0xff p[i]++ } } return p } ================================================ FILE: protocol/net/cfb8/cfb8.go ================================================ package cfb8 import "crypto/cipher" // CFB stream with 8 bit segment size // See http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf type CFB8 struct { // the input block used to produce an output block //also the same as the iv, but overtime it's changed input []byte //output used to decipher and cipher plaintext and cipher segments output []byte //block is the forward crypto function block cipher.Block decrypt bool } func (x *CFB8) XORKeyStream(dst, src []byte) { //notes: //the plaintext and ciphertext segments consist of s bits(8 in this case) for i, v := range src { //the forward crypto operation is applied to //the IV to produce the first output block x.block.Encrypt(x.output, x.input) //both the cipher plain text and segments are XOR with the msb s bits of the output block dst[i] = v ^ x.output[0] //makes room to concatenate s bits of cipher text segment for //encryption, and plaintext segment for decryption copy(x.input, x.input[1:16]) if x.decrypt { x.input[15] = v } else { x.input[15] = dst[i] } } } func NewCFB8(b cipher.Block, iv []byte, decrypt bool) *CFB8 { if b.BlockSize() != len(iv) { panic("blockSize and IV must be the same length") } cfb8 := &CFB8{ block: b, input: make([]byte, len(iv)), output: make([]byte, len(iv)), decrypt: decrypt, } //in CFB encryption, the first input block is the IV copy(cfb8.input, iv) return cfb8 } ================================================ FILE: protocol/net/config.go ================================================ package net import ( "crypto/rand" "crypto/rsa" "net" "github.com/zeppelinmc/zeppelin/protocol/net/packet/status" "github.com/zeppelinmc/zeppelin/protocol/text" ) type Config struct { Status StatusProvider PacketWriteChanBuffer int IP net.IP Port int CompressionThreshold int32 Encrypt bool Authenticate bool AcceptTransfers bool } type StatusProvider func(*Conn) status.StatusResponseData func (c Config) New() (*Listener, error) { l, err := net.ListenTCP("tcp", &net.TCPAddr{ IP: c.IP, Port: c.Port, }) if err != nil { return nil, err } lis := &Listener{ cfg: c, Listener: l, newConns: make(chan *Conn), err: make(chan error), ApprovePlayer: func(c *Conn) (ok bool, disconnectionReason *text.TextComponent) { return true, nil }, } if c.Encrypt { lis.privKey, err = rsa.GenerateKey(rand.Reader, 1024) } go lis.listen() return lis, err } func Status(s status.StatusResponseData) StatusProvider { return func(*Conn) status.StatusResponseData { return s } } ================================================ FILE: protocol/net/conn.go ================================================ package net import ( "bytes" "crypto/md5" "encoding/binary" "fmt" "io" "net" "sync" "sync/atomic" "unicode/utf16" "github.com/zeppelinmc/zeppelin/protocol/net/cfb8" "github.com/zeppelinmc/zeppelin/protocol/net/io/compress" "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/net/packet" "github.com/zeppelinmc/zeppelin/protocol/net/packet/handshake" "github.com/zeppelinmc/zeppelin/protocol/net/packet/login" "github.com/zeppelinmc/zeppelin/protocol/net/packet/status" "github.com/zeppelinmc/zeppelin/protocol/text" "github.com/google/uuid" ) var PacketEncodeInterceptor func(c *Conn, pk packet.Encodeable) (stop bool) var PacketDecodeInterceptor func(c *Conn, pk packet.Decodeable) (stop bool) var PacketWriteInterceptor func(c *Conn, pk *bytes.Buffer, headerSize int32) (stop bool) var PacketReadInterceptor func(c *Conn, pk *bytes.Reader, packetId int32) (stop bool) const ( clientVeryOldMsg = "Your client is WAYYYYYY too old!!! this server supports MC 1.21" clientTooOldMsg = "Your client is too old! this server supports MC 1.21" clientTooNewMsg = "Your client is too new! this server supports MC 1.21" ) type Conn struct { net.Conn listener *Listener username string uuid uuid.UUID properties []login.Property state atomic.Int32 encrypted bool sharedSecret, verifyToken []byte decrypter, encrypter *cfb8.CFB8 compressionSet bool usesForge bool read_mu sync.Mutex write_mu sync.Mutex packetWriteChan chan packet.Encodeable } func (conn *Conn) UsesForge() bool { return conn.usesForge } func (conn *Conn) Username() string { return conn.username } func (conn *Conn) UUID() uuid.UUID { return conn.uuid } func (conn *Conn) Properties() []login.Property { return conn.properties } func (conn *Conn) SetState(state int32) { conn.state.Store(state) } func (conn *Conn) State() int32 { return conn.state.Load() } var pkpool = sync.Pool{ New: func() any { return bytes.NewBuffer(nil) }, } var pkcppool = sync.Pool{ New: func() any { return bytes.NewBuffer(nil) }, } func (conn *Conn) wpk(pk packet.Encodeable) error { if PacketEncodeInterceptor != nil { if PacketEncodeInterceptor(conn, pk) { return nil } } var packetBuf = pkpool.Get().(*bytes.Buffer) packetBuf.Reset() defer pkpool.Put(packetBuf) w := encoding.NewWriter(packetBuf) // write the header for the packet var headerSize int32 if conn.listener.cfg.CompressionThreshold < 0 || !conn.compressionSet { packetBuf.Write([]byte{0x80, 0x80, 0}) headerSize = 3 } else if conn.compressionSet { packetBuf.Write([]byte{0x80, 0x80, 0, 0x80, 0x80, 0}) headerSize = 6 } if err := w.VarInt(pk.ID()); err != nil { return err } if err := pk.Encode(w); err != nil { return err } if PacketWriteInterceptor != nil { if PacketWriteInterceptor(conn, packetBuf, headerSize) { return nil } } if conn.listener.cfg.CompressionThreshold < 0 || !conn.compressionSet { // no compression i := encoding.PutVarInt(packetBuf.Bytes()[:3], int32(packetBuf.Len()-3)) if i != 2 { packetBuf.Bytes()[i] |= 0x80 } _, err := conn.Write(packetBuf.Bytes()) return err } else { // yes compression if conn.listener.cfg.CompressionThreshold > int32(packetBuf.Len())-6 { // packet is too small to be compressed i := encoding.PutVarInt(packetBuf.Bytes()[:3], int32(packetBuf.Len()-3)) if i != 2 { packetBuf.Bytes()[i] |= 0x80 } _, err := conn.Write(packetBuf.Bytes()) return err } else { // packet is compressed uncompressedLength := int32(packetBuf.Len() - 6) if i := encoding.PutVarInt(packetBuf.Bytes()[3:6], uncompressedLength); i != 2 { packetBuf.Bytes()[i+3] |= 0x80 } compressedPacket, err := compress.CompressZlib(packetBuf.Bytes()[6:], &MaxCompressedPacketSize) if err != nil { return err } packetBuf.Truncate(6) packetBuf.Write(compressedPacket) if i := encoding.PutVarInt(packetBuf.Bytes()[:3], int32(packetBuf.Len())-3); i != 2 { packetBuf.Bytes()[i] |= 0x80 } if _, err := conn.Write(packetBuf.Bytes()); err != nil { return err } return err } } } func (conn *Conn) WritePacket(pk packet.Encodeable) error { if conn.encrypted { conn.write_mu.Lock() defer conn.write_mu.Unlock() } //no lock seems to work fine without encryption (?) return conn.wpk(pk) } // 1MiB var MaxCompressedPacketSize = 1024 * 1024 func (conn *Conn) Read(dst []byte) (i int, err error) { i, err = conn.Conn.Read(dst) if err != nil { return i, err } if conn.encrypted { conn.decryptd(dst, dst) } return i, err } func (conn *Conn) Write(data []byte) (i int, err error) { if !conn.encrypted { return conn.Conn.Write(data) } conn.encryptd(data, data) return conn.Conn.Write(data) } func (conn *Conn) ReadPacket() (decoded packet.Decodeable, interceptionStopped bool, err error) { conn.read_mu.Lock() defer conn.read_mu.Unlock() var rd = encoding.NewReader(conn, 0) var ( length, packetId int32 ) if conn.listener.cfg.CompressionThreshold < 0 || !conn.compressionSet { // no compression if _, err := rd.VarInt(&length); err != nil { return nil, false, err } if length <= 0 { return nil, false, fmt.Errorf("malformed packet: empty") } if length > 4096 { return nil, false, fmt.Errorf("packet too big") } var packet = make([]byte, length) if _, err := conn.Read(packet); err != nil { return nil, false, err } id, data, err := encoding.VarInt(packet) if err != nil { return nil, false, err } packetId = id packet = data length = int32(len(data)) br := bytes.NewReader(packet) if PacketReadInterceptor != nil { if PacketReadInterceptor(conn, br, packetId) { return nil, true, nil } } rd = encoding.NewReader(br, int(length)) } else { var packetLength int32 if _, err := rd.VarInt(&packetLength); err != nil { return nil, false, err } if packetLength <= 0 { return nil, false, fmt.Errorf("malformed packet: empty") } var dataLength int32 dataLengthSize, err := rd.VarInt(&dataLength) if err != nil { return nil, false, err } if dataLength < 0 { return nil, false, fmt.Errorf("malformed packet: negative length") } if dataLength == 0 { //packet is uncompressed length = packetLength - int32(dataLengthSize) if length < 0 { return nil, false, fmt.Errorf("malformed packet: negative length") } if length != 0 { var packet = make([]byte, length) if _, err := conn.Read(packet); err != nil { return nil, false, err } id, data, err := encoding.VarInt(packet) if err != nil { return nil, false, err } packetId = id packet = data length = int32(len(data)) r := bytes.NewReader(packet) if PacketReadInterceptor != nil { if PacketReadInterceptor(conn, r, packetId) { return nil, true, nil } } rd = encoding.NewReader(r, int(length)) } } else { //packet is compressed length = dataLength compressedLength := packetLength - int32(dataLengthSize) var ilength = int(length) var packetBuf = pkpool.Get().(*bytes.Buffer) packetBuf.Reset() packetBuf.ReadFrom(io.LimitReader(conn, int64(compressedLength))) defer pkpool.Put(packetBuf) uncompressedPacket, err := compress.DecompressZlib(packetBuf.Bytes(), &ilength) if err != nil { return nil, false, err } id, data, err := encoding.VarInt(uncompressedPacket) if err != nil { return nil, false, err } packetId = id uncompressedPacket = data length = int32(len(data)) r := bytes.NewReader(uncompressedPacket) if PacketReadInterceptor != nil { if PacketReadInterceptor(conn, r, packetId) { return nil, true, nil } } rd = encoding.NewReader(r, int(length)) } } var pk packet.Decodeable pc, ok := ServerboundPool[conn.state.Load()][packetId] if !ok { return packet.UnknownPacket{ Id: packetId, Length: length, Payload: rd, }, false, nil } else { pk = pc() if PacketDecodeInterceptor != nil { if PacketDecodeInterceptor(conn, pk) { return nil, true, nil } } err := pk.Decode(rd) return pk, false, err } } // PushPacket adds a packet to the queue without waiting for it to be sent func (conn *Conn) PushPacket(pk packet.Encodeable) { conn.packetWriteChan <- pk } func (conn *Conn) packetWriteChanListen() { go func() { for pk := range conn.packetWriteChan { if conn.encrypted { conn.write_mu.Lock() } conn.WritePacket(pk) if conn.encrypted { conn.write_mu.Unlock() } } }() } func (conn *Conn) writeLegacyStatus(status status.StatusResponseData) { protocolString := fmt.Sprint(status.Version.Protocol) onlineString := fmt.Sprint(status.Players.Online) maxString := fmt.Sprint(status.Players.Max) stringData := make([]rune, 3, 3+len(protocolString)+len(status.Version.Name)+len(status.Description.Text)+len(onlineString)+len(maxString)) stringData[0], stringData[1] = '§', '1' stringData = append(append(stringData, []rune(protocolString)...), 0) stringData = append(append(stringData, []rune(status.Version.Name)...), 0) stringData = append(append(stringData, []rune(status.Description.Text)...), 0) stringData = append(append(stringData, []rune(onlineString)...), 0) stringData = append(stringData, []rune(maxString)...) utf16be := utf16.Encode([]rune(stringData)) length := uint16(len(utf16be)) conn.Write([]byte{ 0xFF, byte(length >> 8), byte(length), }) binary.Write(conn, binary.BigEndian, utf16be) } func (conn *Conn) writeLegacyDisconnect(reason string) { var data = []byte{0xFF} var strdata = utf16.Encode([]rune(reason)) var strlen = int16(len(strdata)) data = append(data, byte(strlen>>8), byte(strlen)) conn.Write(data) binary.Write(conn, binary.BigEndian, strdata) } func (conn *Conn) writeClassicDisconnect(reason string) { var data = []byte{0x0E} data = append(data, reason...) for len(data)-1 < 64 { data = append(data, 0x20) } conn.Write(data) } var fml2hs = [...]byte{0, 70, 79, 82, 71, 69} // Handles the handshake, and status/login state for the connection // Returns true if the client is logging in func (conn *Conn) handleHandshake() bool { pk, s, err := conn.ReadPacket() if err != nil { conn.writeClassicDisconnect(clientVeryOldMsg) return false } if s { return false } handshaking, ok := pk.(*handshake.Handshaking) if !ok { if pk.ID() == 122 { conn.writeLegacyStatus(conn.listener.cfg.Status(conn)) } if pk.ID() == 78 { conn.writeLegacyDisconnect(clientTooOldMsg) } return false } if addr := []byte(handshaking.ServerAddress); len(addr) > len(fml2hs) && [6]byte(addr[len(addr)-len(fml2hs):]) == fml2hs { conn.usesForge = true } switch handshaking.NextState { case handshake.Status: conn.state.Store(StatusState) pk, s, err := conn.ReadPacket() if err != nil || s { return false } switch pac := pk.(type) { case *status.StatusRequest: if err := conn.WritePacket(&status.StatusResponse{Data: conn.listener.cfg.Status(conn)}); err != nil { return false } pk, s, err = conn.ReadPacket() if err != nil || s { return false } p, ok := pk.(*status.Ping) if !ok { return false } conn.WritePacket(p) case *status.Ping: conn.WritePacket(pac) } case handshake.Transfer: if !conn.listener.cfg.AcceptTransfers { conn.WritePacket(&login.Disconnect{Reason: text.Sprint("Transfers are not allowed.")}) conn.Close() return false } fallthrough case handshake.Login: conn.state.Store(LoginState) if handshaking.ProtocolVersion > ProtocolVersion { conn.WritePacket(&login.Disconnect{Reason: text.TextComponent{Text: clientTooNewMsg}}) return false } if handshaking.ProtocolVersion < ProtocolVersion { conn.WritePacket(&login.Disconnect{Reason: text.TextComponent{Text: clientTooOldMsg}}) return false } pk, s, err := conn.ReadPacket() if err != nil || s { return false } loginStart, ok := pk.(*login.LoginStart) if !ok { return false } if ok, r := conn.listener.ApprovePlayer(conn); !ok { var reason = text.Sprint("Disconnected") if r != nil { reason = *r } conn.WritePacket(&login.Disconnect{Reason: reason}) conn.Close() return false } conn.username = loginStart.Name conn.uuid = loginStart.PlayerUUID if conn.listener.cfg.Encrypt { if err := conn.encrypt(); err != nil { return false } if conn.listener.cfg.Authenticate { if err := conn.authenticate(); err != nil && conn.listener.cfg.Authenticate { conn.WritePacket(&login.Disconnect{Reason: text.TextComponent{Text: "This server uses authenticated encryption mode, and you are using a cracked account."}}) return false } } } if !conn.listener.cfg.Authenticate { conn.uuid = username2v3(conn.username) } if err := conn.WritePacket(&login.SetCompression{Threshold: conn.listener.cfg.CompressionThreshold}); err != nil { return false } conn.compressionSet = true suc := &login.LoginSuccess{ UUID: conn.uuid, Username: conn.username, Properties: conn.properties, } if err := conn.WritePacket(suc); err != nil { return false } pk, s, err = conn.ReadPacket() if err != nil || s { return false } _, ok = pk.(*login.LoginAcknowledged) if !ok { return false } conn.state.Store(ConfigurationState) return true } return false } func username2v3(username string) uuid.UUID { d := append([]byte("OfflinePlayer:"), username...) sum := md5.Sum(d) sum[6] &= 0x0f /* clear version */ sum[6] |= 0x30 /* set to version 3 */ sum[8] &= 0x3f /* clear variant */ sum[8] |= 0x80 /* set to IETF variant */ return uuid.UUID(sum) } ================================================ FILE: protocol/net/encryption.go ================================================ package net import ( "crypto/aes" "crypto/rand" "crypto/rsa" "crypto/x509" "fmt" "github.com/zeppelinmc/zeppelin/protocol/net/cfb8" "github.com/zeppelinmc/zeppelin/protocol/net/packet/login" ) func (conn *Conn) encryptd(plaintext, dst []byte) { conn.encrypter.XORKeyStream(dst, plaintext) } func (conn *Conn) decryptd(ciphertext, dst []byte) { conn.decrypter.XORKeyStream(dst, ciphertext) } func (conn *Conn) encrypt() error { key, err := x509.MarshalPKIXPublicKey(&conn.listener.privKey.PublicKey) if err != nil { return err } verifyToken := make([]byte, 4) rand.Read(verifyToken) conn.WritePacket(&login.EncryptionRequest{ PublicKey: key, VerifyToken: verifyToken, ShouldAuthenticate: conn.listener.cfg.Authenticate, }) p, s, err := conn.ReadPacket() if err != nil || s { return err } res, ok := p.(*login.EncryptionResponse) if !ok { return fmt.Errorf("unsuccessful encryption") } conn.encrypted = ok conn.sharedSecret, err = rsa.DecryptPKCS1v15(nil, conn.listener.privKey, res.SharedSecret) if err != nil { return err } conn.verifyToken, err = rsa.DecryptPKCS1v15(nil, conn.listener.privKey, res.VerifyToken) if err != nil { return err } if [4]byte(conn.verifyToken) != [4]byte(verifyToken) { return fmt.Errorf("unsuccessful encryption") } block, err := aes.NewCipher(conn.sharedSecret) if err != nil { return err } conn.encrypter = cfb8.NewCFB8(block, conn.sharedSecret, false) conn.decrypter = cfb8.NewCFB8(block, conn.sharedSecret, true) return nil } ================================================ FILE: protocol/net/io/buffers/buffers.go ================================================ package buffers import ( "bytes" "sync" ) var Buffers = sync.Pool{ New: func() any { return new(bytes.Buffer) }, } func Size() int { buf := Buffers.Get().(*bytes.Buffer) defer Buffers.Put(buf) return buf.Cap() } ================================================ FILE: protocol/net/io/compress/compress.go ================================================ package compress import ( "bytes" "compress/gzip" "sync" "github.com/4kills/go-libdeflate/v2" "github.com/4kills/go-zlib" ) var decompressors = sync.Pool{ New: func() any { dc, _ := libdeflate.NewDecompressor() return dc }, } var compressors = sync.Pool{ New: func() any { dc, _ := libdeflate.NewCompressor() return dc }, } var bufs = sync.Pool{ New: func() any { return new(bytes.Buffer) }, } // RZlib is a pool of zlib.Reader's that can be reused to avoid allocations var RZlib = sync.Pool{ New: func() any { d, _ := zlib.NewReader(nil); return d }, } // RGzip is a pool of gzip.Reader's that can be reused to avoid allocations var RGzip = sync.Pool{ New: func() any { d, _ := gzip.NewReader(nil); return d }, } // WZlib is a pool of zlib.Writer's that can be reused to avoid allocations var WZlib = sync.Pool{ New: func() any { return zlib.NewWriter(nil) }, } // WGzip is a pool of gzip.Writer's that can be reused to avoid allocations var WGzip = sync.Pool{ New: func() any { return gzip.NewWriter(nil) }, } ================================================ FILE: protocol/net/io/compress/lz4.go ================================================ package compress import ( "bytes" "encoding/binary" "fmt" "github.com/pierrec/lz4/v4" ) // Decompress a lz4-java data. The data returned is only safe to use until the next operation func DecompressLZ4(data []byte) ([]byte, error) { var buf = bufs.Get().(*bytes.Buffer) defer bufs.Put(buf) buf.Reset() var ( offsetFile int offsetBuffer int ) for { if offsetFile == len(data) { return buf.Bytes()[:offsetBuffer], nil } header := data[offsetFile : offsetFile+21] offsetFile += 21 if string(header[:8]) != magic { return buf.Bytes()[:offsetBuffer], fmt.Errorf("invalid magic value") } token := header[8] compressedLength := int(binary.LittleEndian.Uint32(header[9:13])) compressionMethod := token & 0xf0 switch compressionMethod { case methodUncompressed: if buf.Cap()-offsetBuffer < compressedLength { buf.Grow(offsetBuffer + compressedLength) } copy(buf.Bytes()[offsetBuffer:offsetBuffer+compressedLength], data[offsetFile:offsetFile+compressedLength]) offsetBuffer += compressedLength case methodLZ4: decompressedLength := int(binary.LittleEndian.Uint32(header[13:17])) if buf.Cap()-offsetBuffer < decompressedLength { buf.Grow(offsetBuffer + decompressedLength) } if _, err := lz4.UncompressBlock(data[offsetFile:offsetFile+compressedLength], buf.Bytes()[offsetBuffer:offsetBuffer+decompressedLength]); err != nil { return buf.Bytes()[:offsetBuffer], err } offsetBuffer += decompressedLength } offsetFile += compressedLength } } const magic = "LZ4Block" const ( methodUncompressed = 1 << (iota + 4) methodLZ4 ) ================================================ FILE: protocol/net/io/compress/zlib.go ================================================ package compress import ( "bytes" "github.com/4kills/go-libdeflate/v2" ) // Decompress zlib. If decompressedLength is provided, the data returned will only be safe to use until the next operation // It is recommmended to provide the decompressed length to avoid allocation. If you don't know it, provide a number likely bigger than the decompressed length. func DecompressZlib(compressed []byte, decompressedLength *int) ([]byte, error) { dc := decompressors.Get().(libdeflate.Decompressor) defer decompressors.Put(dc) if decompressedLength != nil { dst := bufs.Get().(*bytes.Buffer) if dst.Len() < int(*decompressedLength) { dst.Grow(*decompressedLength) } defer bufs.Put(dst) c := dst.Bytes()[:*decompressedLength] _, decompressedResult, err := dc.DecompressZlib(compressed, c) return decompressedResult, err } else { _, decompressedResult, err := dc.DecompressZlib(compressed, nil) return decompressedResult, err } } // Compresses zlib. If compressedLength is provided, data returned will only be safe to use until the next operation. // It is recommmended to provide the compressed length to avoid allocation. If you don't know it, provide a number likely bigger than the compressed length. func CompressZlib(decompressedData []byte, compressedLength *int) (compressed []byte, err error) { c := compressors.Get().(libdeflate.Compressor) defer compressors.Put(c) if compressedLength != nil { dst := bufs.Get().(*bytes.Buffer) if dst.Len() < int(*compressedLength) { dst.Grow(*compressedLength) } defer bufs.Put(dst) dc := dst.Bytes()[:*compressedLength] _, compressedResult, err := c.CompressZlib(decompressedData, dc) return compressedResult, err } else { _, compressedResult, err := c.CompressZlib(decompressedData, nil) return compressedResult, err } } ================================================ FILE: protocol/net/io/encoding/encoding.go ================================================ // Package encoding provides encoding and decoding of minecraft data types package encoding import ( "fmt" "io" "unsafe" ) func AppendByte(data []byte, b int8) []byte { return append(data, byte(b)) } func AppendUbyte(data []byte, b byte) []byte { return append(data, b) } func AppendShort(data []byte, s int16) []byte { return append(data, byte(s>>8), byte(s)) } func AppendUshort(data []byte, s uint16) []byte { return append(data, byte(s>>8), byte(s)) } func AppendInt(data []byte, i int32) []byte { return append(data, byte(i>>24), byte(i>>16), byte(i>>8), byte(i)) } func AppendLong(data []byte, l int64) []byte { return append(data, byte(l>>56), byte(l>>48), byte(l>>40), byte(l>>32), byte(l>>24), byte(l>>16), byte(l>>8), byte(l)) } func AppendVarInt(data []byte, value int32) []byte { ux := uint32(value) for ux >= 0x80 { data = append(data, byte(ux&0x7F)|0x80) ux >>= 7 } return append(data, byte(ux)) } func PutVarInt(data []byte, value int32) (n int) { ux := uint32(value) var i int for ; ux >= 0x80; i++ { data[i] = byte(ux&0x7F) | 0x80 ux >>= 7 } data[i] = byte(ux) return i } func WriteVarInt(w io.Writer, value int32) error { ux := uint32(value) for ux >= 0x80 { if _, err := w.Write([]byte{byte(ux&0x7F) | 0x80}); err != nil { return err } ux >>= 7 } _, err := w.Write([]byte{byte(ux)}) return err } func VarInt(data []byte) (int32, []byte, error) { var ( position int currentByte byte value int32 ) for { if len(data) == 0 { return value, data, io.EOF } currentByte = data[0] data = data[1:] value |= int32(currentByte&127) << position if (currentByte & 128) == 0 { break } position += 7 if position >= 32 { return value, data, fmt.Errorf("VarInt is too big") } } return value, data, nil } func ReadVarInt(r io.Reader) (int32, error) { var ( position int32 currentByte byte continueBit byte = 128 segmentBits byte = 127 value int32 ) for { if _, err := r.Read(unsafe.Slice(¤tByte, 1)); err != nil { return value, err } value |= int32(currentByte&segmentBits) << position if (currentByte & continueBit) == 0 { break } position += 7 if position >= 32 { return value, fmt.Errorf("VarInt is too big") } } return value, nil } func AppendVarLong(data []byte, value int64) []byte { var ( continueBit int64 = 128 segmentBits int64 = 127 ) for { if (value & ^segmentBits) == 0 { return append(data, byte(value)) } data = append(data, byte((value&segmentBits)|continueBit)) value >>= 7 } } func AppendString(data []byte, str string) []byte { data = AppendVarInt(data, int32(len(str))) return append(data, str...) } func String(data []byte) (string, error) { l, strd, err := VarInt(data) if err != nil { return "", err } return unsafe.String(unsafe.SliceData(strd), l), nil } type BitSet []int64 func (set BitSet) Get(i int) bool { return (set[i/64] & (1 << (i % 64))) != 0 } func (set BitSet) Set(i int) { set[i/64] |= 1 << (i % 64) } func (set BitSet) Unset(i int) { set[i/64] &= ^(1 << (i % 64)) } type FixedBitSet []byte func (set FixedBitSet) Get(i int) bool { return (set[i/8] & (1 << (i % 8))) != 0 } func (set FixedBitSet) Set(i int) { set[i/8] |= 1 << (i % 8) } func (set FixedBitSet) Unset(i int) { set[i/8] &= ^(1 << (i % 8)) } ================================================ FILE: protocol/net/io/encoding/reader.go ================================================ package encoding import ( "encoding/json" "fmt" "io" "math" "unsafe" "github.com/zeppelinmc/zeppelin/protocol/nbt" "github.com/zeppelinmc/zeppelin/protocol/text" "github.com/google/uuid" ) type Reader struct { r io.Reader length int } func NewReader(r io.Reader, length int) Reader { return Reader{r, length} } func (r *Reader) SetLength(length int) { r.length = length } func (r Reader) readBytes(l int) ([]byte, error) { if l < 0 { return nil, fmt.Errorf("negative length for make (read bytes)") } arr := make([]byte, l) _, err := r.r.Read(arr) return arr, err } func (r Reader) Read(dst []byte) (i int, err error) { return r.r.Read(dst) } func (r Reader) Bool(b *bool) error { var byt byte err := r.Ubyte(&byt) *b = byt != 0 return err } func (r Reader) ReadAll(data *[]byte) (err error) { *data, err = r.readBytes(r.length) return err } func (r Reader) Byte(i *int8) error { d, err := r.readBytes(1) *i = int8(d[0]) return err } func (r Reader) Ubyte(i *byte) error { d, err := r.readBytes(1) *i = d[0] return err } func (r Reader) Short(i *int16) error { d, err := r.readBytes(2) *i = int16(d[0])<<8 | int16(d[1]) return err } func (r Reader) Ushort(i *uint16) error { d, err := r.readBytes(2) *i = uint16(d[0])<<8 | uint16(d[1]) return err } func (r Reader) Int(i *int32) error { d, err := r.readBytes(4) *i = int32(d[0])<<24 | int32(d[1])<<16 | int32(d[2])<<8 | int32(d[3]) return err } func (r Reader) Long(i *int64) error { d, err := r.readBytes(8) *i = int64(d[0])<<56 | int64(d[1])<<48 | int64(d[2])<<40 | int64(d[3])<<32 | int64(d[4])<<24 | int64(d[5])<<16 | int64(d[6])<<8 | int64(d[7]) return err } func (r Reader) Float(f *float32) error { return r.Int((*int32)(unsafe.Pointer(f))) } func (r Reader) Double(f *float64) error { return r.Long((*int64)(unsafe.Pointer(f))) } func (r Reader) String(s *string) error { var l int32 if _, err := r.VarInt(&l); err != nil { return err } d, err := r.readBytes(int(l)) *s = unsafe.String(unsafe.SliceData(d), len(d)) return err } func (r Reader) Identifier(s *string) error { return r.String(s) } func (r Reader) VarInt(value *int32) (i int, err error) { var ( position int32 currentByte byte CONTINUE_BIT byte = 128 SEGMENT_BITS byte = 127 size int ) for { if err := r.Ubyte(¤tByte); err != nil { return size, err } *value |= int32((currentByte & SEGMENT_BITS)) << position size++ if (currentByte & CONTINUE_BIT) == 0 { break } position += 7 if position >= 32 { return size, fmt.Errorf("VarInt is too big") } } return size, nil } func (r Reader) VarLong(value *int64) error { var ( position int64 currentByte byte CONTINUE_BIT byte = 128 SEGMENT_BITS byte = 127 ) for { if err := r.Ubyte(¤tByte); err != nil { return err } *value |= int64((currentByte & SEGMENT_BITS)) << position if (currentByte & CONTINUE_BIT) == 0 { break } position += 7 if position >= 32 { return fmt.Errorf("VarInt is too big") } } return nil } func (r Reader) Position(x, y, z *int32) error { var l int64 err := r.Long(&l) *x = int32(l >> 38) *y = int32(l << 52 >> 52) *z = int32(l << 26 >> 38) return err } func (r Reader) UUID(u *uuid.UUID) error { d, err := r.readBytes(16) *u = uuid.UUID(d) return err } func (r Reader) BitSet(data *BitSet) error { var l int32 if _, err := r.VarInt(&l); err != nil { return err } if l < 0 { return fmt.Errorf("negative length for make (bitset)") } *data = make([]int64, l) for _, l := range *data { if err := r.Long(&l); err != nil { return err } } return nil } func (r Reader) FixedBitSet(data *FixedBitSet, bits int32) error { *data = make(FixedBitSet, int(math.Ceil(float64(bits)/8))) for _, l := range *data { if err := r.Ubyte(&l); err != nil { return err } } return nil } // Length prefixed byte array func (r Reader) ByteArray(s *[]byte) error { var l int32 if _, err := r.VarInt(&l); err != nil { return err } d, err := r.readBytes(int(l)) *s = d return err } func (r Reader) FixedByteArray(s []byte) error { _, err := r.r.Read(s) return err } func (r Reader) NBT(v any) error { dec := nbt.NewDecoder(r.r) dec.ReadRootName(false) _, err := dec.Decode(v) return err } func (r Reader) JSONTextComponent(comp *text.TextComponent) error { var d []byte if err := r.ByteArray(&d); err != nil { return err } return json.Unmarshal(d, comp) } func (r Reader) TextComponent(comp *text.TextComponent) error { var tag int8 if err := r.Byte(&tag); err != nil { return err } switch tag { case nbt.String: return r.nbtString(&comp.Text) case nbt.Compound: return r.NBT(comp) default: return fmt.Errorf("invalid text component root compound") } } func (r Reader) nbtString(v *string) error { var stringlen int16 if err := r.Short(&stringlen); err != nil { return err } d, err := r.readBytes(int(stringlen)) *v = unsafe.String(unsafe.SliceData(d), len(d)) return err } ================================================ FILE: protocol/net/io/encoding/writer.go ================================================ package encoding import ( "bytes" "encoding/json" "fmt" "math" "unsafe" "github.com/zeppelinmc/zeppelin/protocol/nbt" "github.com/zeppelinmc/zeppelin/protocol/text" "github.com/google/uuid" ) type Writer struct { w *bytes.Buffer } func NewWriter(w *bytes.Buffer) Writer { return Writer{w} } func (w Writer) Write(data []byte) (i int, err error) { return w.w.Write(data) } func (w Writer) Bool(b bool) error { return w.Ubyte(*(*byte)(unsafe.Pointer(&b))) } func (w Writer) Byte(i int8) error { return w.Ubyte(uint8(i)) } func (w Writer) Ubyte(i uint8) error { _, err := w.Write([]byte{i}) return err } func (w Writer) Short(i int16) error { return w.Ushort(uint16(i)) } func (w Writer) Ushort(i uint16) error { _, err := w.Write( []byte{ byte(i >> 8), byte(i), }, ) return err } func (w Writer) Int(i int32) error { _, err := w.Write( []byte{ byte(i >> 24), byte(i >> 16), byte(i >> 8), byte(i), }, ) return err } func (w Writer) Long(i int64) error { _, err := w.Write( []byte{ byte(i >> 56), byte(i >> 48), byte(i >> 40), byte(i >> 32), byte(i >> 24), byte(i >> 16), byte(i >> 8), byte(i), }, ) return err } func (w Writer) Float(f float32) error { return w.Int(int32(math.Float32bits(f))) } func (w Writer) Double(f float64) error { return w.Long(int64(math.Float64bits(f))) } func (w Writer) String(s string) error { if err := w.VarInt(int32(len(s))); err != nil { return err } _, err := w.Write(unsafe.Slice(unsafe.StringData(s), len(s))) //(*(*[]byte)(unsafe.Pointer(&s))) return err } func (w Writer) Identifier(s string) error { if len(s) > 32767 { return fmt.Errorf("expected identifier len to be smaller than 32767, got %d", len(s)) } if err := w.VarInt(int32(len(s))); err != nil { return err } _, err := w.Write(unsafe.Slice(unsafe.StringData(s), len(s))) //(*(*[]byte)(unsafe.Pointer(&s))) return err } func (w Writer) VarInt(value int32) error { ux := uint32(value) for ux >= 0x80 { if err := w.Ubyte(byte(ux&0x7F) | 0x80); err != nil { return err } ux >>= 7 } return w.Ubyte(byte(ux)) } func (w Writer) VarLong(value int64) error { var ( CONTINUE_BIT int64 = 128 SEGMENT_BITS int64 = 127 ) for { if (value & ^SEGMENT_BITS) == 0 { return w.Ubyte(byte(value)) } if err := w.Ubyte(byte((value & SEGMENT_BITS) | CONTINUE_BIT)); err != nil { return err } value >>= 7 } } func (w Writer) Position(x, y, z int32) error { return w.Long(((int64(x) & 0x3FFFFFF) << 38) | ((int64(z) & 0x3FFFFFF) << 12) | (int64(y) & 0xFFF)) } func (w Writer) UUID(u uuid.UUID) error { d := [16]byte(u) _, err := w.Write(d[:]) return err } func (w Writer) BitSet(data BitSet) error { if err := w.VarInt(int32(len(data))); err != nil { return err } for _, l := range data { if err := w.Long(l); err != nil { return err } } return nil } func (w Writer) FixedBitSet(data FixedBitSet) error { for _, l := range data { if err := w.Ubyte(l); err != nil { return err } } return nil } // Length prefixed byte array func (w Writer) ByteArray(s []byte) error { if err := w.VarInt(int32(len(s))); err != nil { return err } _, err := w.w.Write(s) return err } func (w Writer) FixedByteArray(s []byte) error { _, err := w.w.Write(s) return err } func (w Writer) JSONTextComponent(comp text.TextComponent) error { d, _ := json.Marshal(comp) return w.ByteArray(d) } func (w Writer) TextComponent(comp text.TextComponent) error { return w.NBT(comp) } func (w Writer) StringTextComponent(text string) error { if err := w.Byte(8); err != nil { return err } if err := w.Short(int16(len(text))); err != nil { return err } return w.String(text) } func (w Writer) NBT(data any) error { enc := nbt.NewEncoder(w.w) enc.WriteRootName(false) return enc.Encode("", data) } ================================================ FILE: protocol/net/listener.go ================================================ // Package net provides tools for creating minecraft servers, such as packet sending, registry data, encryption, authentication, compression and more package net import ( "crypto/rsa" "fmt" "github.com/zeppelinmc/zeppelin/protocol/net/packet" "net" "github.com/zeppelinmc/zeppelin/protocol/text" ) const ( ProtocolVersion = 767 ) const ( HandshakingState = iota StatusState LoginState ConfigurationState PlayState ) type Listener struct { net.Listener cfg Config ApprovePlayer func(*Conn) (ok bool, disconnectionReason *text.TextComponent) newConns chan *Conn err chan error privKey *rsa.PrivateKey } func (l *Listener) SetStatusProvider(p StatusProvider) { l.cfg.Status = p } func (l *Listener) StatusProvider() StatusProvider { return l.cfg.Status } func (l *Listener) listen() { for { c, err := l.Listener.Accept() if err != nil { l.err <- err close(l.newConns) return } conn := l.newConn(c) go func() { if conn.handleHandshake() { l.newConns <- conn } }() } } func (l *Listener) newConn(c net.Conn) *Conn { conn := &Conn{ Conn: c, listener: l, packetWriteChan: make(chan packet.Encodeable, l.cfg.PacketWriteChanBuffer), } return conn } func (l *Listener) Close() error { close(l.newConns) l.err <- fmt.Errorf("listener closed") return nil } func (l *Listener) Accept() (*Conn, error) { conn, ok := <-l.newConns if !ok { return nil, <-l.err } return conn, nil } ================================================ FILE: protocol/net/metadata/metadata.go ================================================ package metadata import ( "github.com/google/uuid" "github.com/zeppelinmc/zeppelin/protocol/net/slot" "github.com/zeppelinmc/zeppelin/protocol/text" ) /* [index] -> value value must be one of the types below learn more about metadata at https://wiki.vg/Entity_metadata */ type Metadata map[byte]any type ( Byte int8 //0 VarInt int32 //1 VarLong int64 //2 Float float32 //3 String string //4 TextComponent text.TextComponent //5 OptionalTextComponent *text.TextComponent //6 Slot = slot.Slot //7 Boolean bool //8 Rotations [3]Float //9 Position [3]int32 //10 OptionalPosition *[3]int32 //11 Direction VarInt //12 OptionalUUID *uuid.UUID //13 BlockState VarInt //14 OptionalBlockState VarInt //15 NBT any //16 // Particle //17 VillagerData [3]Float //18 | [type, profession, level] OptionalVarInt VarInt //19 Pose VarInt //20 CatVariant VarInt //21 FrogVariant VarInt //22 GlobalPosition struct { DimensionIdentifier String Position Position } OptionalGlobalPosition *GlobalPosition //23 PaintingVariant VarInt //24 SnifferState VarInt //25 Vector3 [3]Float //26 Quatermion [4]Float //27 ) const ( Standing Pose = iota FallFlying Sleeping Swimming SpinAttack Sneaking LongJumping Dying Croaking UsingTongue Sitting Roaring Sniffing Emerging Digging ) const ( SnifferIdling SnifferState = iota SnifferFeelingHappy SnifferScenting SnifferSniffing SnifferSearching SnifferDigging SnifferRising ) const ( VillagerTypeDesert = iota VillagerTypeJungle VillagerTypePlains VillagerTypeSavanna VillagerTypeSnow VillagerTypeSwamp VillagerTypeTaiga ) const ( VillagerProfessionNone = iota VillagerProfessionArmorer VillagerProfessionButcher VillagerProfessionCartographer VillagerProfessionCleric VillagerProfessionFarmer VillagerProfessionFisherman VillagerProfessionFletcher VillagerProfessionLeatherworker VillagerProfessionLibrarian VillagerProfessionMason // hi mason VillagerProfessionNitwit VillagerProfessionShepherd VillagerProfessionToolsmith VillagerProfessionWeaponsmith ) const ( IsOnFire = 1 << iota IsCrouching IsRiding_unused IsSprinting IsSwimming IsInvisible HasGlowingEffect IsFlyingWithElytra ) const ( IsHandActive = 1 << iota IsOffhandActive IsInRiptideSpinAttack ) // base state const ( // Byte (0) BaseIndex = iota // VarInt (1) AirTicksIndex // OptionalTextComponent (6) CustomNameIndex // Boolean (8) IsCustomNameVisibleIndex // Boolean (8) IsSilentIndex // Boolean (8) HasNoGravityIndex // Pose (21) PoseIndex // VarInt (1) TicksFrozenInPowderedSnowIndex ) // living state extends state const ( // Byte (0) LivingEntityHandstatesIndex = iota + 8 // Float (3) LivingEntityHealthIndex // VarInt (1) LivingEntityPotionEffectColorIndex // Boolean (8) LivingEntityPotionEffectAmbientIndex // VarInt (1) LivingEntityArrowCountIndex // VarInt (1) LivingEntityBeeStingersCountIndex // Optional Position (11) LivingEntitySleepingBedPositionIndex ) // player extends living state const ( // Float (3) PlayerAdditionalHeartsIndex = iota + 15 // VarInt (1) PlayerScoreIndex // Byte (0) PlayerDisplayedSkinPartsIndex // Byte (0) PlayerMainHandIndex // NBT (16) LeftShoulderEntityData // NBT (16) RightShoulderEntityData ) ================================================ FILE: protocol/net/metadata/new.go ================================================ package metadata // Player returns the default player metadata object func Player(health float32) Metadata { return Metadata{ // Entity BaseIndex: Byte(0), AirTicksIndex: VarInt(300), CustomNameIndex: OptionalTextComponent(nil), IsCustomNameVisibleIndex: Boolean(false), IsSilentIndex: Boolean(false), HasNoGravityIndex: Boolean(false), PoseIndex: Standing, TicksFrozenInPowderedSnowIndex: VarInt(0), // Living Entity extends Entity LivingEntityHandstatesIndex: Byte(0), LivingEntityHealthIndex: Float(health), // this one is actually stored in data (others are too but arent used yet) //LivingEntityPotionEffectColorIndex: VarInt(0), LivingEntityPotionEffectAmbientIndex: Boolean(false), LivingEntityArrowCountIndex: VarInt(0), LivingEntityBeeStingersCountIndex: VarInt(0), LivingEntitySleepingBedPositionIndex: OptionalPosition(nil), // Player extends Living Entity PlayerAdditionalHeartsIndex: Float(0), PlayerScoreIndex: VarInt(0), PlayerDisplayedSkinPartsIndex: Byte(0), PlayerMainHandIndex: Byte(1), } } ================================================ FILE: protocol/net/packet/configuration/clientInfo.go ================================================ package configuration import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) const ( ChatModeEnabled = iota ChatModeCommandsOnly ChatModeHidden ) const ( CapeEnabled = 1 << iota JacketEnabled LeftSleeveEnabled RightSleeveEnabled LeftPantsLegEnabled RightPantsLegEnabled HatEnabled ) const ( MainHandLeft = iota MainHandRight ) // serverbound const PacketIdClientInformation = 0x00 type ClientInformation struct { Locale string ViewDistance int8 ChatMode int32 ChatColors bool DisplayedSkinParts byte MainHand int32 EnableTextFiltering bool AllowServerListing bool } func (ClientInformation) ID() int32 { return 0x00 } func (c *ClientInformation) Encode(w encoding.Writer) error { if err := w.String(c.Locale); err != nil { return err } if err := w.Byte(c.ViewDistance); err != nil { return err } if err := w.VarInt(c.ChatMode); err != nil { return err } if err := w.Bool(c.ChatColors); err != nil { return err } if err := w.Ubyte(c.DisplayedSkinParts); err != nil { return err } if err := w.VarInt(c.MainHand); err != nil { return err } if err := w.Bool(c.EnableTextFiltering); err != nil { return err } return w.Bool(c.AllowServerListing) } func (c *ClientInformation) Decode(r encoding.Reader) error { if err := r.String(&c.Locale); err != nil { return err } if err := r.Byte(&c.ViewDistance); err != nil { return err } if _, err := r.VarInt(&c.ChatMode); err != nil { return err } if err := r.Bool(&c.ChatColors); err != nil { return err } if err := r.Ubyte(&c.DisplayedSkinParts); err != nil { return err } if _, err := r.VarInt(&c.MainHand); err != nil { return err } if err := r.Bool(&c.EnableTextFiltering); err != nil { return err } return r.Bool(&c.AllowServerListing) } ================================================ FILE: protocol/net/packet/configuration/cookie.go ================================================ package configuration import "github.com/zeppelinmc/zeppelin/protocol/net/packet/login" //clientbound const PacketIdCookieRequest = 0x00 type CookieRequest struct{ login.CookieRequest } func (CookieRequest) ID() int32 { return 0x00 } //serverbound const PacketIdCookieResponse = 0x01 type CookieResponse struct{ login.CookieResponse } func (CookieResponse) ID() int32 { return 0x01 } ================================================ FILE: protocol/net/packet/configuration/disconnect.go ================================================ package configuration import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/text" ) // clientbound const PacketIdDisconnect = 0x02 type Disconnect struct { Reason text.TextComponent } func (Disconnect) ID() int32 { return 0x02 } func (d *Disconnect) Encode(w encoding.Writer) error { return w.TextComponent(d.Reason) } func (d *Disconnect) Decode(r encoding.Reader) error { return r.TextComponent(&d.Reason) } ================================================ FILE: protocol/net/packet/configuration/finish.go ================================================ package configuration import ( "github.com/zeppelinmc/zeppelin/protocol/net/packet" ) const ( //clientbound PacketIdFinishConfiguration = 0x03 //serverbound PacketIdAcknowledgeFinishConfiguration ) type FinishConfiguration struct { packet.EmptyPacket } func (FinishConfiguration) ID() int32 { return 0x03 } type AcknowledgeFinishConfiguration = FinishConfiguration ================================================ FILE: protocol/net/packet/configuration/keepAlive.go ================================================ package configuration import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // two-sided const PacketIdKeepAlive = 0x04 type KeepAlive struct { KeepAliveID int64 } func (KeepAlive) ID() int32 { return 0x04 } func (k *KeepAlive) Encode(w encoding.Writer) error { return w.Long(k.KeepAliveID) } func (k *KeepAlive) Decode(r encoding.Reader) error { return r.Long(&k.KeepAliveID) } ================================================ FILE: protocol/net/packet/configuration/ping.go ================================================ package configuration import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // two-sided const PacketIdPing = 0x05 type Ping struct { ID_ int32 } func (Ping) ID() int32 { return 0x05 } func (p *Ping) Encode(w encoding.Writer) error { return w.Int(p.ID_) } func (p *Ping) Decode(r encoding.Reader) error { return r.Int(&p.ID_) } type Pong = Ping ================================================ FILE: protocol/net/packet/configuration/plugin.go ================================================ package configuration import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // two-sided const PacketIdPluginMessage = 0x01 type ClientboundPluginMessage struct { Channel string Data []byte } func (ClientboundPluginMessage) ID() int32 { return 0x01 } func (c *ClientboundPluginMessage) Encode(w encoding.Writer) error { if err := w.Identifier(c.Channel); err != nil { return err } return w.FixedByteArray(c.Data) } func (c *ClientboundPluginMessage) Decode(r encoding.Reader) error { if err := r.Identifier(&c.Channel); err != nil { return err } return r.ReadAll(&c.Data) } type ServerboundPluginMessage struct { ClientboundPluginMessage } func (ServerboundPluginMessage) ID() int32 { return 0x02 } ================================================ FILE: protocol/net/packet/configuration/registryData.go ================================================ package configuration import ( "reflect" "sync" "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/net/registry" ) var RegistryPackets = make([]*RegistryData, 0, len(registry.Registries)) func init() { for key, registry := range registry.Registries { RegistryPackets = append(RegistryPackets, &RegistryData{ RegistryId: key, Registry: registry, }) } } var RegistryPacketsMutex sync.Mutex // clientbound const PacketIdRegistryData = 0x07 type RegistryData struct { RegistryId string Registry any Indexes []string } func (RegistryData) ID() int32 { return 0x07 } func (r *RegistryData) Encode(w encoding.Writer) error { if err := w.Identifier(r.RegistryId); err != nil { return err } reg := reflect.ValueOf(r.Registry) switch reg.Kind() { case reflect.Map: r.Indexes = make([]string, 0, reg.Len()) if err := w.VarInt(int32(reg.Len())); err != nil { return err } for _, key := range reg.MapKeys() { v := reg.MapIndex(key).Interface() if err := w.Identifier(key.String()); err != nil { return err } if err := w.Bool(true); err != nil { return err } if err := w.NBT(v); err != nil { return err } r.Indexes = append(r.Indexes, key.String()) } case reflect.Struct: r.Indexes = make([]string, 0, reg.NumField()) if err := w.VarInt(int32(reg.NumField())); err != nil { return err } for i := 0; i < reg.NumField(); i++ { tf := reg.Type().Field(i) v := reg.Field(i).Interface() nbtname := tf.Tag.Get("nbt") if err := w.Identifier(nbtname); err != nil { return err } if err := w.Bool(true); err != nil { return err } if err := w.NBT(v); err != nil { return err } r.Indexes = append(r.Indexes, nbtname) } } return nil } func (d *RegistryData) Decode(r encoding.Reader) error { return nil //TODO } ================================================ FILE: protocol/net/packet/configuration/resetChat.go ================================================ package configuration import "github.com/zeppelinmc/zeppelin/protocol/net/packet" //clientbound const PacketIdResetChat = 0x06 type ResetChat struct{ packet.EmptyPacket } func (ResetChat) ID() int32 { return 0x06 } ================================================ FILE: protocol/net/packet/handshake/handshake.go ================================================ package handshake import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) const ( Status = iota + 1 Login Transfer ) // serverbound const PacketIdHandshaking = 0x00 type Handshaking struct { ProtocolVersion int32 ServerAddress string ServerPort uint16 NextState int32 } func (Handshaking) ID() int32 { return 0x00 } func (h *Handshaking) Decode(r encoding.Reader) error { if _, err := r.VarInt(&h.ProtocolVersion); err != nil { return err } if err := r.String(&h.ServerAddress); err != nil { return err } if err := r.Ushort(&h.ServerPort); err != nil { return err } _, err := r.VarInt(&h.NextState) return err } func (h Handshaking) Encode(w encoding.Writer) error { if err := w.VarInt(h.ProtocolVersion); err != nil { return err } if err := w.String(h.ServerAddress); err != nil { return err } if err := w.Ushort(h.ServerPort); err != nil { return err } return w.VarInt(h.NextState) } ================================================ FILE: protocol/net/packet/login/cookie.go ================================================ package login import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdCookieRequest = 0x05 type CookieRequest struct { Key string } func (CookieRequest) ID() int32 { return 0x05 } func (s *CookieRequest) Encode(w encoding.Writer) error { return w.String(s.Key) } func (s *CookieRequest) Decode(r encoding.Reader) error { return r.String(&s.Key) } type CookieResponse struct { Key string Found bool Payload []byte } func (CookieResponse) ID() int32 { return 0x04 } func (s *CookieResponse) Encode(w encoding.Writer) error { if err := w.String(s.Key); err != nil { return err } if err := w.Bool(s.Found); err != nil { return err } if s.Found { return w.ByteArray(s.Payload) } return nil } func (s *CookieResponse) Decode(r encoding.Reader) error { if err := r.String(&s.Key); err != nil { return err } if err := r.Bool(&s.Found); err != nil { return err } if s.Found { return r.ByteArray(&s.Payload) } return nil } ================================================ FILE: protocol/net/packet/login/disconnect.go ================================================ package login import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/text" ) // clientbound const PacketIdDisconnect = 0x00 type Disconnect struct { Reason text.TextComponent } func (Disconnect) ID() int32 { return 0x00 } func (d *Disconnect) Encode(w encoding.Writer) error { return w.JSONTextComponent(d.Reason) } func (d *Disconnect) Decode(r encoding.Reader) error { return r.JSONTextComponent(&d.Reason) } ================================================ FILE: protocol/net/packet/login/encryption.go ================================================ package login import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // two-sided const PacketIdEncryption = 0x01 type EncryptionRequest struct { PublicKey []byte VerifyToken []byte ShouldAuthenticate bool } func (EncryptionRequest) ID() int32 { return 0x01 } func (e *EncryptionRequest) Encode(w encoding.Writer) error { if err := w.String(""); err != nil { return err } if err := w.ByteArray(e.PublicKey); err != nil { return err } if err := w.ByteArray(e.VerifyToken); err != nil { return err } return w.Bool(e.ShouldAuthenticate) } func (e *EncryptionRequest) Decode(r encoding.Reader) error { var s string if err := r.String(&s); err != nil { return err } if err := r.ByteArray(&e.PublicKey); err != nil { return err } if err := r.ByteArray(&e.VerifyToken); err != nil { return err } return r.Bool(&e.ShouldAuthenticate) } type EncryptionResponse struct { SharedSecret []byte VerifyToken []byte } func (EncryptionResponse) ID() int32 { return 0x01 } func (e *EncryptionResponse) Encode(w encoding.Writer) error { if err := w.ByteArray(e.SharedSecret); err != nil { return err } return w.ByteArray(e.VerifyToken) } func (e *EncryptionResponse) Decode(r encoding.Reader) error { if err := r.ByteArray(&e.SharedSecret); err != nil { return err } return r.ByteArray(&e.VerifyToken) } ================================================ FILE: protocol/net/packet/login/loginStart.go ================================================ package login import ( "github.com/google/uuid" "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // serverbound const PacketIdLoginStart = 0x00 type LoginStart struct { Name string PlayerUUID uuid.UUID } func (LoginStart) ID() int32 { return 0x00 } func (l *LoginStart) Encode(w encoding.Writer) error { if err := w.String(l.Name); err != nil { return err } return w.UUID(l.PlayerUUID) } func (l *LoginStart) Decode(r encoding.Reader) error { if err := r.String(&l.Name); err != nil { return err } return r.UUID(&l.PlayerUUID) } ================================================ FILE: protocol/net/packet/login/loginSuccess.go ================================================ package login import ( "github.com/google/uuid" "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) type Textures struct { Timestamp int64 `json:"timestamp"` ProfileId string `json:"profileId"` ProfileName string `json:"profileName"` SignatureRequired bool `json:"signatureRequired"` Textures struct { Skin struct { URL string `json:"url"` Metadata struct { Model string `json:"model"` } `json:"metadata"` } `json:"SKIN"` Cape struct { URL string `json:"url"` } `json:"CAPE"` } `json:"textures"` } type Property struct { Name string Value string Signature string } // clientbound const PacketIdLoginSuccess = 0x02 type LoginSuccess struct { UUID uuid.UUID Username string Properties []Property } func (LoginSuccess) ID() int32 { return PacketIdLoginSuccess } func (l *LoginSuccess) Encode(w encoding.Writer) error { if err := w.UUID(l.UUID); err != nil { return err } if err := w.String(l.Username); err != nil { return err } if err := w.VarInt(int32(len(l.Properties))); err != nil { return err } for _, property := range l.Properties { if err := w.String(property.Name); err != nil { return err } if err := w.String(property.Value); err != nil { return err } if err := w.Bool(property.Signature != ""); err != nil { return err } if property.Signature != "" { if err := w.String(property.Signature); err != nil { return err } } } w.Bool(true) //TODO:remove for 1.21.3 return nil } const PacketIdLoginAcknowledged = 0x03 type LoginAcknowledged struct{} func (LoginAcknowledged) ID() int32 { return PacketIdLoginAcknowledged } func (*LoginAcknowledged) Decode(encoding.Reader) error { return nil } ================================================ FILE: protocol/net/packet/login/plugin.go ================================================ package login import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdLoginPluginRequest = 0x04 type LoginPluginRequest struct { MessageID int32 Channel string Data []byte } func (LoginPluginRequest) ID() int32 { return 0x04 } func (l *LoginPluginRequest) Encode(w encoding.Writer) error { if err := w.VarInt(l.MessageID); err != nil { return err } if err := w.Identifier(l.Channel); err != nil { return err } return w.FixedByteArray(l.Data) } func (l *LoginPluginRequest) Decode(r encoding.Reader) error { if _, err := r.VarInt(&l.MessageID); err != nil { return err } if err := r.Identifier(&l.Channel); err != nil { return err } return r.ReadAll(&l.Data) } // serverbound const PacketIdLoginPluginResponse = 0x02 type LoginPluginResponse struct { MessageID int32 Sucessful bool Data []byte } func (LoginPluginResponse) ID() int32 { return 0x02 } func (l *LoginPluginResponse) Encode(w encoding.Writer) error { if err := w.VarInt(l.MessageID); err != nil { return err } if err := w.Bool(l.Sucessful); err != nil { return err } if l.Sucessful { if err := w.FixedByteArray(l.Data); err != nil { return err } } return nil } func (l *LoginPluginResponse) Decode(r encoding.Reader) error { if _, err := r.VarInt(&l.MessageID); err != nil { return err } if err := r.Bool(&l.Sucessful); err != nil { return err } if l.Sucessful { if err := r.ReadAll(&l.Data); err != nil { return err } } return nil } ================================================ FILE: protocol/net/packet/login/setCompression.go ================================================ package login import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdSetCompression = 0x03 type SetCompression struct { Threshold int32 } func (SetCompression) ID() int32 { return 0x03 } func (s *SetCompression) Encode(w encoding.Writer) error { return w.VarInt(s.Threshold) } func (s *SetCompression) Decode(r encoding.Reader) error { _, err := r.VarInt(&s.Threshold) return err } ================================================ FILE: protocol/net/packet/packet.go ================================================ package packet import "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" // Encodeable is a clientbound packet type Encodeable interface { ID() int32 Encode(encoding.Writer) error } // Decodeable is a serverbound packet type Decodeable interface { ID() int32 Decode(encoding.Reader) error } // Error is a dummy decodeable packet that is simply an error type Error struct { Error error } func (Error) ID() int32 { return -1 } func (Error) Decode(encoding.Reader) error { return nil } var _ Decodeable = (*Error)(nil) type UnknownPacket struct { Id int32 Length int32 Payload encoding.Reader } func (u UnknownPacket) ID() int32 { return u.Id } func (u UnknownPacket) Decode(encoding.Reader) error { return nil } func (u UnknownPacket) Encode(encoding.Writer) error { return nil } type EmptyPacket struct { } func (pk EmptyPacket) Encode(encoding.Writer) error { return nil } func (pk EmptyPacket) Decode(encoding.Reader) error { return nil } ================================================ FILE: protocol/net/packet/play/acknowledgeBlockChange.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdAcknowledgeBlockChange = 0x05 type AcknowledgeBlockChange struct { SequenceId int32 } func (AcknowledgeBlockChange) ID() int32 { return PacketIdAcknowledgeBlockChange } func (b *AcknowledgeBlockChange) Encode(w encoding.Writer) error { return w.VarInt(b.SequenceId) } func (b *AcknowledgeBlockChange) Decode(r encoding.Reader) error { _, err := r.VarInt(&b.SequenceId) return err } ================================================ FILE: protocol/net/packet/play/blockAction.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdBlockAction = 0x08 type BlockAction struct { X, Y, Z int32 ActionId, ActionParameter byte BlockType int32 } func (BlockAction) ID() int32 { return PacketIdBlockAction } func (b *BlockAction) Encode(w encoding.Writer) error { if err := w.Position(b.X, b.Y, b.Z); err != nil { return err } if err := w.Ubyte(b.ActionId); err != nil { return err } if err := w.Ubyte(b.ActionParameter); err != nil { return err } return w.VarInt(b.BlockType) } func (b *BlockAction) Decode(r encoding.Reader) error { if err := r.Position(&b.X, &b.Y, &b.Z); err != nil { return err } if err := r.Ubyte(&b.ActionId); err != nil { return err } if err := r.Ubyte(&b.ActionParameter); err != nil { return err } _, err := r.VarInt(&b.BlockType) return err } ================================================ FILE: protocol/net/packet/play/blockEntityData.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/nbt" "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdBlockEntityData = 0x07 type BlockEntityData struct { X, Y, Z int32 Type int32 Data any } func (BlockEntityData) ID() int32 { return PacketIdBlockEntityData } func (b *BlockEntityData) Encode(w encoding.Writer) error { if err := w.Position(b.X, b.Y, b.Z); err != nil { return err } if err := w.VarInt(b.Type); err != nil { return err } if b.Data == nil { return w.Byte(nbt.End) } return w.NBT(b.Data) } func (b *BlockEntityData) Decode(r encoding.Reader) error { return nil //TODO } ================================================ FILE: protocol/net/packet/play/blockUpdate.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdBlockUpdate = 0x09 type BlockUpdate struct { X, Y, Z int32 BlockId int32 } func (BlockUpdate) ID() int32 { return PacketIdBlockUpdate } func (b *BlockUpdate) Encode(w encoding.Writer) error { if err := w.Position(b.X, b.Y, b.Z); err != nil { return err } return w.VarInt(b.BlockId) } func (b *BlockUpdate) Decode(r encoding.Reader) error { if err := r.Position(&b.X, &b.Y, &b.Z); err != nil { return err } _, err := r.VarInt(&b.BlockId) return err } ================================================ FILE: protocol/net/packet/play/bundleDelimiter.go ================================================ package play import "github.com/zeppelinmc/zeppelin/protocol/net/packet" // clientbound const PacketIdBundleDelimiter = 0x00 type BundleDelimiter struct{ packet.EmptyPacket } func (BundleDelimiter) ID() int32 { return PacketIdBundleDelimiter } ================================================ FILE: protocol/net/packet/play/changeDifficulty.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdChangeDifficulty = 0x0B type ChangeDifficulty struct { Difficulty byte Locked bool } func (ChangeDifficulty) ID() int32 { return PacketIdChangeDifficulty } func (c *ChangeDifficulty) Encode(w encoding.Writer) error { if err := w.Ubyte(c.Difficulty); err != nil { return err } return w.Bool(c.Locked) } func (c *ChangeDifficulty) Decode(r encoding.Reader) error { if err := r.Ubyte(&c.Difficulty); err != nil { return err } return r.Bool(&c.Locked) } ================================================ FILE: protocol/net/packet/play/chatCommand.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // serverbound const PacketIdChatCommand = 0x04 type ChatCommand struct { Command string } func (ChatCommand) ID() int32 { return PacketIdChatCommand } func (c *ChatCommand) Encode(w encoding.Writer) error { return w.String(c.Command) } func (c *ChatCommand) Decode(r encoding.Reader) error { return r.String(&c.Command) } ================================================ FILE: protocol/net/packet/play/chatMessage.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // serverbound const PacketIdChatMessage = 0x06 type ChatMessage struct { Message string Timestamp, Salt int64 HasSignature bool Signature [256]byte MessageCount int32 Acknowledged encoding.FixedBitSet } func (ChatMessage) ID() int32 { return 0x06 } func (c *ChatMessage) Encode(w encoding.Writer) error { if err := w.String(c.Message); err != nil { return err } if err := w.Long(c.Timestamp); err != nil { return err } if err := w.Long(c.Salt); err != nil { return err } if err := w.Bool(c.HasSignature); err != nil { return err } if c.HasSignature { if err := w.FixedByteArray(c.Signature[:]); err != nil { return err } } if err := w.VarInt(c.MessageCount); err != nil { return err } return w.FixedBitSet(c.Acknowledged) } func (c *ChatMessage) Decode(r encoding.Reader) error { if err := r.String(&c.Message); err != nil { return err } if err := r.Long(&c.Timestamp); err != nil { return err } if err := r.Long(&c.Salt); err != nil { return err } if err := r.Bool(&c.HasSignature); err != nil { return err } if c.HasSignature { if err := r.FixedByteArray(c.Signature[:]); err != nil { return err } } if _, err := r.VarInt(&c.MessageCount); err != nil { return err } return r.FixedBitSet(&c.Acknowledged, 20) } ================================================ FILE: protocol/net/packet/play/chunkBatch.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/net/packet" ) // clientbound const PacketIdChunkBatchFinished = 0x0C type ChunkBatchFinished struct { BatchSize int32 } func (ChunkBatchFinished) ID() int32 { return PacketIdChunkBatchFinished } func (c *ChunkBatchFinished) Encode(w encoding.Writer) error { return w.VarInt(c.BatchSize) } func (c *ChunkBatchFinished) Decode(r encoding.Reader) error { _, err := r.VarInt(&c.BatchSize) return err } // clientbound const PacketIdChunkBatchStart = 0x0D type ChunkBatchStart struct{ packet.EmptyPacket } func (ChunkBatchStart) ID() int32 { return PacketIdChunkBatchStart } // serverbound const PacketIdChunkBatchReceived = 0x08 type ChunkBatchReceived struct { ChunksPerTick float32 } func (ChunkBatchReceived) ID() int32 { return PacketIdChunkBatchReceived } func (c *ChunkBatchReceived) Encode(w encoding.Writer) error { return w.Float(c.ChunksPerTick) } func (c *ChunkBatchReceived) Decode(r encoding.Reader) error { return r.Float(&c.ChunksPerTick) } ================================================ FILE: protocol/net/packet/play/chunkData.go ================================================ package play import ( "bytes" "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) type BlockEntity struct { X, Y, Z int32 Type int32 Data any } // clientbound const PacketIdChunkDataUpdateLight = 0x27 type Heightmaps struct { MOTION_BLOCKING, WORLD_SURFACE []int64 } type ChunkDataUpdateLight struct { CX, CZ int32 Heightmaps Heightmaps Data *bytes.Buffer //[]byte BlockEntities []BlockEntity SkyLightMask, BlockLightMask, EmptySkyLightMask, EmptyBlockLightMask encoding.BitSet SkyLightArrays [][]byte BlockLightArrays [][]byte } func (ChunkDataUpdateLight) ID() int32 { return 0x27 } func (c *ChunkDataUpdateLight) Encode(w encoding.Writer) error { if err := w.Int(c.CX); err != nil { return err } if err := w.Int(c.CZ); err != nil { return err } if err := w.NBT(c.Heightmaps); err != nil { return err } if err := w.VarInt(int32(c.Data.Len())); err != nil { return err } if _, err := c.Data.WriteTo(w); err != nil { return err } if err := w.VarInt(int32(len(c.BlockEntities))); err != nil { return err } for _, blockEntity := range c.BlockEntities { if err := w.Ubyte(((byte(blockEntity.X) & 0x0f) << 4) | (byte(blockEntity.Z) & 0x0f)); err != nil { return err } if err := w.Short(int16(blockEntity.Y)); err != nil { return err } if err := w.VarInt(blockEntity.Type); err != nil { return err } if err := w.NBT(blockEntity.Data); err != nil { return err } } if err := w.BitSet(c.SkyLightMask); err != nil { return err } if err := w.BitSet(c.BlockLightMask); err != nil { return err } if err := w.BitSet(c.EmptySkyLightMask); err != nil { return err } if err := w.BitSet(c.EmptyBlockLightMask); err != nil { return err } if err := w.VarInt(int32(len(c.SkyLightArrays))); err != nil { return err } for _, array := range c.SkyLightArrays { if err := w.ByteArray(array); err != nil { return err } } if err := w.VarInt(int32(len(c.BlockLightArrays))); err != nil { return err } for _, array := range c.BlockLightArrays { if err := w.ByteArray(array); err != nil { return err } } return nil } func (c *ChunkDataUpdateLight) Decode(encoding.Reader) error { return nil } ================================================ FILE: protocol/net/packet/play/clickContainer.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/net/slot" ) // serverbound const PacketIdClickContainer = 0x0E type ClickContainer struct { WindowId byte State int32 Slot int16 Button int8 Mode int32 ChangedSlots []ChangedSlot CarriedItem slot.Slot } type ChangedSlot struct { slot.Slot Num int16 } func (ClickContainer) ID() int32 { return PacketIdClickContainer } func (c *ClickContainer) Decode(r encoding.Reader) error { if err := r.Ubyte(&c.WindowId); err != nil { return err } if _, err := r.VarInt(&c.State); err != nil { return err } if err := r.Short(&c.Slot); err != nil { return err } if err := r.Byte(&c.Button); err != nil { return err } if _, err := r.VarInt(&c.Mode); err != nil { return err } var len int32 if _, err := r.VarInt(&len); err != nil { return err } c.ChangedSlots = make([]ChangedSlot, len) for i := int32(0); i < len; i++ { if err := r.Short(&c.ChangedSlots[i].Num); err != nil { return err } if err := c.ChangedSlots[i].Decode(r); err != nil { return err } } return c.CarriedItem.Decode(r) } ================================================ FILE: protocol/net/packet/play/clientInfo.go ================================================ package play import "github.com/zeppelinmc/zeppelin/protocol/net/packet/configuration" //serverbound const PacketIdClientInformation = 0x0A type ClientInformation struct { configuration.ClientInformation } func (ClientInformation) ID() int32 { return 0x0A } ================================================ FILE: protocol/net/packet/play/closeContainer.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // serverbound const PacketIdCloseContainer = 0x0F type CloseContainer struct { WindowId byte } func (CloseContainer) ID() int32 { return PacketIdCloseContainer } func (c *CloseContainer) Encode(w encoding.Writer) error { return w.Ubyte(c.WindowId) } func (c *CloseContainer) Decode(r encoding.Reader) error { return r.Ubyte(&c.WindowId) } ================================================ FILE: protocol/net/packet/play/commands.go ================================================ package play import ( "fmt" "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) type Node struct { Flags int8 Children []int32 RedirectNode int32 Name string ParserId int32 /* float64 = Double float32 = Float int8 = Byte int32 = Int int64 = Long string = Identifier int = VarInt */ Properties []any SuggestionsType string } const NodeRoot = iota const ( NodeLiteral = 1 << iota NodeArgument NodeExecutable NodeRedirect NodeHasSuggestionsType ) const NodeType = 0x03 // clientbound const PacketIdCommands = 0x11 type Commands struct { Nodes []Node RootIndex int32 } func (Commands) ID() int32 { return PacketIdCommands } func (c *Commands) Encode(w encoding.Writer) error { if err := w.VarInt(int32(len(c.Nodes))); err != nil { return err } for _, node := range c.Nodes { if err := c.encodeNode(w, node); err != nil { return err } } return w.VarInt(c.RootIndex) } func (c *Commands) encodeNode(w encoding.Writer, node Node) error { if err := w.Byte(node.Flags); err != nil { return err } if err := w.VarInt(int32(len(node.Children))); err != nil { return err } for _, child := range node.Children { if err := w.VarInt(child); err != nil { return err } } if node.Flags&NodeRedirect != 0 { if err := w.VarInt(node.RedirectNode); err != nil { return err } } if node.Flags&NodeType > 0 { if err := w.String(node.Name); err != nil { return err } } if node.Flags&NodeArgument != 0 { if err := w.VarInt(node.ParserId); err != nil { return err } } if node.Flags&NodeArgument != 0 { for _, p := range node.Properties { switch prop := p.(type) { case float64: if err := w.Double(prop); err != nil { return err } case float32: if err := w.Float(prop); err != nil { return err } case int8: if err := w.Byte(prop); err != nil { return err } case int32: if err := w.Int(prop); err != nil { return err } case int64: if err := w.Long(prop); err != nil { return err } case string: if err := w.Identifier(prop); err != nil { return err } case int: if err := w.VarInt(int32(prop)); err != nil { return err } default: return fmt.Errorf("unrecognized node property type %T", p) } } } if node.Flags&NodeHasSuggestionsType != 0 { if err := w.Identifier(node.SuggestionsType); err != nil { return err } } return nil } ================================================ FILE: protocol/net/packet/play/confirmTeleport.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // serverbound const PacketIdConfirmTeleportation = 0x00 type ConfirmTeleportation struct { TeleportId int32 } func (ConfirmTeleportation) ID() int32 { return PacketIdConfirmTeleportation } func (c *ConfirmTeleportation) Encode(w encoding.Writer) error { return w.VarInt(c.TeleportId) } func (c *ConfirmTeleportation) Decode(r encoding.Reader) error { _, err := r.VarInt(&c.TeleportId) return err } ================================================ FILE: protocol/net/packet/play/damageEvent.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdDamageEvent = 0x1A type DamageEvent struct { EntityId int32 SourceTypeId int32 SourceCauseId int32 //-1 for none SourceDirectId int32 //-1 for none HasSourcePosition bool SourceX, SourceY, SourceZ float64 } func (DamageEvent) ID() int32 { return PacketIdDamageEvent } func (d *DamageEvent) Encode(w encoding.Writer) error { if err := w.VarInt(d.EntityId); err != nil { return err } if err := w.VarInt(d.SourceTypeId); err != nil { return err } if err := w.VarInt(d.SourceDirectId + 1); err != nil { return err } if err := w.VarInt(d.SourceCauseId + 1); err != nil { return err } if err := w.Bool(d.HasSourcePosition); err != nil { return err } if d.HasSourcePosition { if err := w.Double(d.SourceX); err != nil { return err } if err := w.Double(d.SourceY); err != nil { return err } if err := w.Double(d.SourceZ); err != nil { return err } } return nil } func (d *DamageEvent) Decode(r encoding.Reader) error { return nil //TODO } ================================================ FILE: protocol/net/packet/play/deleteMessage.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdDeleteMessage = 0x1C type DeleteMessage struct { MessageId int32 Signature [256]byte } func (DeleteMessage) ID() int32 { return PacketIdDeleteMessage } func (b *DeleteMessage) Encode(w encoding.Writer) error { if err := w.VarInt(b.MessageId + 1); err != nil { return err } if b.MessageId == -1 { return w.FixedByteArray(b.Signature[:]) } return nil } func (b *DeleteMessage) Decode(r encoding.Reader) error { if _, err := r.VarInt(&b.MessageId); err != nil { return err } if b.MessageId == -1 { return r.FixedByteArray(b.Signature[:]) } return nil } ================================================ FILE: protocol/net/packet/play/disconnect.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/text" ) // clientbound const PacketIdDisconnect = 0x1D type Disconnect struct { Reason text.TextComponent } func (Disconnect) ID() int32 { return 0x1D } func (d *Disconnect) Encode(w encoding.Writer) error { return w.TextComponent(d.Reason) } func (d *Disconnect) Decode(r encoding.Reader) error { return r.TextComponent(&d.Reason) } ================================================ FILE: protocol/net/packet/play/disguisedChatMessage.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/text" ) // clientbound const PacketIdDisguisedChatMessage = 0x1E type DisguisedChatMessage struct { Message text.TextComponent ChatType int32 SenderName text.TextComponent TargetName *text.TextComponent } func (DisguisedChatMessage) ID() int32 { return PacketIdDisguisedChatMessage } func (p *DisguisedChatMessage) Encode(w encoding.Writer) error { if err := w.TextComponent(p.Message); err != nil { return err } if err := w.VarInt(p.ChatType); err != nil { return err } if err := w.TextComponent(p.SenderName); err != nil { return err } if err := w.Bool(p.TargetName != nil); err != nil { return err } if p.TargetName != nil { if err := w.TextComponent(*p.TargetName); err != nil { return err } } return nil } func (p *DisguisedChatMessage) Decode(r encoding.Reader) error { if err := r.TextComponent(&p.Message); err != nil { return err } if _, err := r.VarInt(&p.ChatType); err != nil { return err } if err := r.TextComponent(&p.SenderName); err != nil { return err } var hasTgt bool if err := r.Bool(&hasTgt); err != nil { return err } if hasTgt { if err := r.TextComponent(p.TargetName); err != nil { return err } } return nil } ================================================ FILE: protocol/net/packet/play/entityAnimation.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdEntityAnimation = 0x03 const ( AnimationSwingMainArm = iota _ AnimationLeaveBed AnimationSwingOffhand AnimationCriticalEffect AnimationMagicCriticalEffect ) type EntityAnimation struct { EntityId int32 Animation byte } func (EntityAnimation) ID() int32 { return PacketIdEntityAnimation } func (e *EntityAnimation) Encode(w encoding.Writer) error { if err := w.VarInt(e.EntityId); err != nil { return err } return w.Ubyte(e.Animation) } func (e *EntityAnimation) Decode(r encoding.Reader) error { if _, err := r.VarInt(&e.EntityId); err != nil { return err } return r.Ubyte(&e.Animation) } ================================================ FILE: protocol/net/packet/play/entityEvent.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdEntityEvent = 0x1F type EntityEvent struct { EntityId int32 EntityStatus int8 } func (EntityEvent) ID() int32 { return PacketIdEntityEvent } func (e *EntityEvent) Encode(w encoding.Writer) error { if err := w.Int(e.EntityId); err != nil { return err } return w.Byte(e.EntityStatus) } func (e *EntityEvent) Decode(r encoding.Reader) error { if err := r.Int(&e.EntityId); err != nil { return err } return r.Byte(&e.EntityStatus) } ================================================ FILE: protocol/net/packet/play/entitySoundEffect.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdEntitySoundEffect = 0x67 type EntitySoundEffect struct { SoundId int32 // -1 for custom SoundName string // only if sound id -1 FixedRange bool // only if sound id -1 Range float32 // only if fixed range SoundCategory int32 // one of the above constants EntityId int32 Volume float32 Pitch float32 Seed int64 } func (EntitySoundEffect) ID() int32 { return PacketIdEntitySoundEffect } func (s *EntitySoundEffect) Encode(w encoding.Writer) error { if err := w.VarInt(s.SoundId + 1); err != nil { return err } if s.SoundId == -1 { if err := w.Identifier(s.SoundName); err != nil { return err } if err := w.Bool(s.FixedRange); err != nil { return err } if s.FixedRange { if err := w.Float(s.Range); err != nil { return err } } } if err := w.VarInt(s.SoundCategory); err != nil { return err } if err := w.VarInt(s.EntityId); err != nil { return err } if err := w.Float(s.Volume); err != nil { return err } if err := w.Float(s.Pitch); err != nil { return err } return w.Long(s.Seed) } func (s *EntitySoundEffect) Decode(r encoding.Reader) error { return nil //TODO } ================================================ FILE: protocol/net/packet/play/gameEvent.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) const ( GameEventNoRespawnBlockAvailable = iota GameEventBeginRaining GameEventEndRaining GameEventChangeGamemode GameEventWinGame GameEventDemoEvent GameEventArrowHitPlayer GameEventRainLevelChange GameEventThunderLevelChange GameEventPlayPufferfishStingSound GameEventPlayElderGuardianMobAppearance GameEventEnableRespawnScreen GameEventLimitedCrafting GameEventStartWaitingChunks ) // clientbound const PacketIdGameEvent = 0x22 type GameEvent struct { Event byte Value float32 } func (GameEvent) ID() int32 { return 0x22 } func (g *GameEvent) Encode(w encoding.Writer) error { if err := w.Ubyte(g.Event); err != nil { return err } return w.Float(g.Value) } func (g *GameEvent) Decode(r encoding.Reader) error { if err := r.Ubyte(&g.Event); err != nil { return err } return r.Float(&g.Value) } ================================================ FILE: protocol/net/packet/play/hurtAnimation.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdHurtAnimation = 0x24 type HurtAnimation struct { EntityId int32 Yaw float32 } func (HurtAnimation) ID() int32 { return PacketIdHurtAnimation } func (d *HurtAnimation) Encode(w encoding.Writer) error { if err := w.VarInt(d.EntityId); err != nil { return err } return w.Float(d.Yaw) } func (d *HurtAnimation) Decode(r encoding.Reader) error { if _, err := r.VarInt(&d.EntityId); err != nil { return err } return r.Float(&d.Yaw) } ================================================ FILE: protocol/net/packet/play/interact.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // serverbound const PacketIdInteract = 0x16 const ( InteractTypeInteract = iota InteractTypeAttack InteractTypeInteractAt ) type Interact struct { EntityId int32 Type int32 TargetX, TargetY, TargetZ float32 Hand int32 Sneaking bool } func (Interact) ID() int32 { return PacketIdInteract } func (i *Interact) Encode(w encoding.Writer) error { if err := w.VarInt(i.EntityId); err != nil { return err } if err := w.VarInt(i.Type); err != nil { return err } if i.Type == InteractTypeInteractAt { if err := w.Float(i.TargetX); err != nil { return err } if err := w.Float(i.TargetY); err != nil { return err } if err := w.Float(i.TargetZ); err != nil { return err } } if i.Type == InteractTypeInteractAt || i.Type == InteractTypeInteract { if err := w.VarInt(i.Hand); err != nil { return err } } return w.Bool(i.Sneaking) } func (i *Interact) Decode(r encoding.Reader) error { if _, err := r.VarInt(&i.EntityId); err != nil { return err } if _, err := r.VarInt(&i.Type); err != nil { return err } if i.Type == InteractTypeInteractAt { if err := r.Float(&i.TargetX); err != nil { return err } if err := r.Float(&i.TargetY); err != nil { return err } if err := r.Float(&i.TargetZ); err != nil { return err } } if i.Type == InteractTypeInteractAt || i.Type == InteractTypeInteract { if _, err := r.VarInt(&i.Hand); err != nil { return err } } return r.Bool(&i.Sneaking) } ================================================ FILE: protocol/net/packet/play/keepAlive.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // serverbound const PacketIdServerboundKeepAlive = 0x18 type ServerboundKeepAlive struct { KeepAliveID int64 } func (ServerboundKeepAlive) ID() int32 { return 0x18 } func (k *ServerboundKeepAlive) Encode(w encoding.Writer) error { return w.Long(k.KeepAliveID) } func (k *ServerboundKeepAlive) Decode(r encoding.Reader) error { return r.Long(&k.KeepAliveID) } // clientbound const PacketIdClientboundKeepAlive = 0x26 type ClientboundKeepAlive struct { KeepAliveID int64 } func (ClientboundKeepAlive) ID() int32 { return 0x26 } func (k *ClientboundKeepAlive) Encode(w encoding.Writer) error { return w.Long(k.KeepAliveID) } func (k *ClientboundKeepAlive) Decode(r encoding.Reader) error { return r.Long(&k.KeepAliveID) } ================================================ FILE: protocol/net/packet/play/login.go ================================================ package play import ( "fmt" "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdLogin = 0x2B type Login struct { EntityID int32 Hardcore bool MaxPlayers int32 ViewDistance, SimulationDistance int32 ReducedDebugInfo, EnableRespawnScreen, DoLimitedCrafting bool Dimensions []string DimensionType int32 DimensionName string HashedSeed int64 GameMode byte PreviousGameMode int8 IsDebug, IsFlat bool DeathDimensionName string DeathLocationX, DeathLocationY, DeathLocationZ int32 PortalCooldown int32 EnforcesSecureChat bool } func (Login) ID() int32 { return PacketIdLogin } func (l *Login) Encode(w encoding.Writer) error { if err := w.Int(l.EntityID); err != nil { return err } if err := w.Bool(l.Hardcore); err != nil { return err } if err := w.VarInt(int32(len(l.Dimensions))); err != nil { return err } for _, dim := range l.Dimensions { if err := w.Identifier(dim); err != nil { return err } } if err := w.VarInt(l.MaxPlayers); err != nil { return err } if err := w.VarInt(l.ViewDistance); err != nil { return err } if err := w.VarInt(l.SimulationDistance); err != nil { return err } if err := w.Bool(l.ReducedDebugInfo); err != nil { return err } if err := w.Bool(l.EnableRespawnScreen); err != nil { return err } if err := w.Bool(l.DoLimitedCrafting); err != nil { return err } if err := w.VarInt(l.DimensionType); err != nil { return err } if err := w.Identifier(l.DimensionName); err != nil { return err } if err := w.Long(l.HashedSeed); err != nil { return err } if err := w.Ubyte(l.GameMode); err != nil { return err } if err := w.Byte(l.PreviousGameMode); err != nil { return err } if err := w.Bool(l.IsDebug); err != nil { return err } if err := w.Bool(l.IsFlat); err != nil { return err } if err := w.Bool(l.DeathDimensionName != ""); err != nil { return err } if l.DeathDimensionName != "" { if err := w.Identifier(l.DeathDimensionName); err != nil { return err } if err := w.Position(l.DeathLocationX, l.DeathLocationY, l.DeathLocationZ); err != nil { return err } } if err := w.VarInt(l.PortalCooldown); err != nil { return err } return w.Bool(l.EnforcesSecureChat) } func (l *Login) Decode(r encoding.Reader) error { if err := r.Int(&l.EntityID); err != nil { return err } if err := r.Bool(&l.Hardcore); err != nil { return err } var dimlen int32 if _, err := r.VarInt(&dimlen); err != nil { return err } if dimlen < 0 { return fmt.Errorf("negative length for make (login decode)") } l.Dimensions = make([]string, dimlen) for _, dim := range l.Dimensions { if err := r.Identifier(&dim); err != nil { return err } } if _, err := r.VarInt(&l.MaxPlayers); err != nil { return err } if _, err := r.VarInt(&l.ViewDistance); err != nil { return err } if _, err := r.VarInt(&l.SimulationDistance); err != nil { return err } if err := r.Bool(&l.ReducedDebugInfo); err != nil { return err } if err := r.Bool(&l.EnableRespawnScreen); err != nil { return err } if err := r.Bool(&l.DoLimitedCrafting); err != nil { return err } if _, err := r.VarInt(&l.DimensionType); err != nil { return err } if err := r.Identifier(&l.DimensionName); err != nil { return err } if err := r.Long(&l.HashedSeed); err != nil { return err } if err := r.Ubyte(&l.GameMode); err != nil { return err } if err := r.Byte(&l.PreviousGameMode); err != nil { return err } if err := r.Bool(&l.IsDebug); err != nil { return err } if err := r.Bool(&l.IsFlat); err != nil { return err } var hasDeathDim bool if err := r.Bool(&hasDeathDim); err != nil { return err } if hasDeathDim { if err := r.Identifier(&l.DeathDimensionName); err != nil { return err } if err := r.Position(&l.DeathLocationX, &l.DeathLocationY, &l.DeathLocationZ); err != nil { return err } } if _, err := r.VarInt(&l.PortalCooldown); err != nil { return err } return r.Bool(&l.EnforcesSecureChat) } ================================================ FILE: protocol/net/packet/play/openScreen.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/text" ) // clientbound const PacketIdOpenScreen = 0x33 type OpenScreen struct { WindowId int32 WindowType int32 WindowTitle text.TextComponent } func (OpenScreen) ID() int32 { return PacketIdOpenScreen } func (o *OpenScreen) Encode(w encoding.Writer) error { if err := w.VarInt(o.WindowId); err != nil { return err } if err := w.VarInt(o.WindowType); err != nil { return err } return w.TextComponent(o.WindowTitle) } func (o *OpenScreen) Decode(r encoding.Reader) error { if _, err := r.VarInt(&o.WindowId); err != nil { return err } if _, err := r.VarInt(&o.WindowType); err != nil { return err } return r.TextComponent(&o.WindowTitle) } ================================================ FILE: protocol/net/packet/play/playerAbilitiesCB.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdPlayerAbilitiesClientbound = 0x38 const ( PlayerAbsInvulenrable = 1 << iota PlayerAbsFlying PlayerAbsCreativeMode ) type PlayerAbilitiesClientbound struct { Flags int8 FlyingSpeed float32 FOVModifier float32 } func (PlayerAbilitiesClientbound) ID() int32 { return PacketIdPlayerAbilitiesClientbound } func (a *PlayerAbilitiesClientbound) Encode(w encoding.Writer) error { if err := w.Byte(a.Flags); err != nil { return err } if err := w.Float(a.FlyingSpeed); err != nil { return err } return w.Float(a.FOVModifier) } func (a *PlayerAbilitiesClientbound) Decode(r encoding.Reader) error { if err := r.Byte(&a.Flags); err != nil { return err } if err := r.Float(&a.FlyingSpeed); err != nil { return err } return r.Float(&a.FOVModifier) } ================================================ FILE: protocol/net/packet/play/playerAbilitiesSB.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdPlayerAbilitiesServerbound = 0x23 type PlayerAbilitiesServerbound struct { Flags int8 } func (PlayerAbilitiesServerbound) ID() int32 { return PacketIdPlayerAbilitiesServerbound } func (a *PlayerAbilitiesServerbound) Encode(w encoding.Writer) error { return w.Byte(a.Flags) } func (a *PlayerAbilitiesServerbound) Decode(r encoding.Reader) error { return r.Byte(&a.Flags) } ================================================ FILE: protocol/net/packet/play/playerChatMessage.go ================================================ package play import ( "github.com/google/uuid" "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/text" ) const ( FilterTypePassThrough = iota FilterTypeFullyFiltered FilterTypePartiallyFiltered ) type PreviousMessage struct { MessageID int32 Signature *[256]byte } // clientbound const PacketIdPlayerChatMessage = 0x39 type PlayerChatMessage struct { Sender uuid.UUID Index int32 HasMessageSignature bool MessageSignature [256]byte Message string Timestamp, Salt int64 PreviousMessages []PreviousMessage UnsignedContent *text.TextComponent FilterType int32 FilterBits encoding.BitSet ChatType int32 SenderName text.TextComponent TargetName *text.TextComponent } func (PlayerChatMessage) ID() int32 { return PacketIdPlayerChatMessage } func (p *PlayerChatMessage) Encode(w encoding.Writer) error { if err := w.UUID(p.Sender); err != nil { return err } if err := w.VarInt(p.Index); err != nil { return err } if err := w.Bool(p.HasMessageSignature); err != nil { return err } if p.HasMessageSignature { if err := w.FixedByteArray(p.MessageSignature[:]); err != nil { return err } } if err := w.String(p.Message); err != nil { return err } if err := w.Long(p.Timestamp); err != nil { return err } if err := w.Long(p.Salt); err != nil { return err } if err := w.VarInt(int32(len(p.PreviousMessages))); err != nil { return err } for _, sig := range p.PreviousMessages { if err := w.VarInt(sig.MessageID + 1); err != nil { return err } if sig.MessageID+1 == 0 { if err := w.FixedByteArray(sig.Signature[:]); err != nil { return err } } } if err := w.Bool(p.UnsignedContent != nil); err != nil { return err } if p.UnsignedContent != nil { if err := w.TextComponent(*p.UnsignedContent); err != nil { return err } } if err := w.VarInt(p.FilterType); err != nil { return err } if p.FilterType == FilterTypePartiallyFiltered { if err := w.BitSet(p.FilterBits); err != nil { return err } } if err := w.VarInt(p.ChatType); err != nil { return err } if err := w.TextComponent(p.SenderName); err != nil { return err } if err := w.Bool(p.TargetName != nil); err != nil { return err } if p.TargetName != nil { if err := w.TextComponent(*p.TargetName); err != nil { return err } } return nil } func (p *PlayerChatMessage) Decode(r encoding.Reader) error { return nil //TODO } ================================================ FILE: protocol/net/packet/play/playerCommand.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // serverbound const PacketIdPlayerCommand = 0x25 const ( ActionIdStartSneaking = iota ActionIdStopSneaking ActionIdLeaveBed ActionIdStartSprinting ActionIdStopSprinting ActionIdStartJumpWithHorse ActionIdStopJumpWithHorse ActionIdOpenVehicleInventory ActionIdStartFlyingWithElytra ) type PlayerCommand struct { EntityId int32 ActionId int32 JumpBoost int32 } func (PlayerCommand) ID() int32 { return PacketIdPlayerCommand } func (p *PlayerCommand) Encode(w encoding.Writer) error { if err := w.VarInt(p.EntityId); err != nil { return err } if err := w.VarInt(p.ActionId); err != nil { return err } return w.VarInt(p.JumpBoost) } func (p *PlayerCommand) Decode(r encoding.Reader) error { if _, err := r.VarInt(&p.EntityId); err != nil { return err } if _, err := r.VarInt(&p.ActionId); err != nil { return err } _, err := r.VarInt(&p.JumpBoost) return err } ================================================ FILE: protocol/net/packet/play/playerInfoRemove.go ================================================ package play import ( "fmt" "github.com/google/uuid" "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) const PacketIdPlayerInfoRemove = 0x3D type PlayerInfoRemove struct { UUIDs []uuid.UUID } func (PlayerInfoRemove) ID() int32 { return 0x3D } func (p *PlayerInfoRemove) Encode(w encoding.Writer) error { if err := w.VarInt(int32(len(p.UUIDs))); err != nil { return err } for _, uuid := range p.UUIDs { if err := w.UUID(uuid); err != nil { return err } } return nil } func (p *PlayerInfoRemove) Decode(r encoding.Reader) error { var length int32 if _, err := r.VarInt(&length); err != nil { return err } if length < 0 { return fmt.Errorf("negative length for make (player info remove decode)") } p.UUIDs = make([]uuid.UUID, length) for _, uuid := range p.UUIDs { if err := r.UUID(&uuid); err != nil { return err } } return nil } ================================================ FILE: protocol/net/packet/play/playerInfoUpdate.go ================================================ package play import ( "github.com/google/uuid" "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/net/packet/login" "github.com/zeppelinmc/zeppelin/protocol/text" ) const ( ActionAddPlayer = 1 << iota ActionInitializeChat ActionUpdateGameMode ActionUpdateListed ActionUpdateLatency ActionUpdateDisplayName ) type PlayerAction struct { // Add Player Name string Properties []login.Property // Initialize Chat HasSignatureData bool Session PlayerSession // Update Game Mode GameMode int32 // Update Listed Listed bool // Update Latency Ping int32 // Update Display Name HasDisplayName bool DisplayName text.TextComponent } // clientbound const PacketIdPlayerInfoUpdate = 0x3E type PlayerInfoUpdate struct { Actions int8 Players map[uuid.UUID]PlayerAction } func (PlayerInfoUpdate) ID() int32 { return 0x3E } func (p *PlayerInfoUpdate) Encode(w encoding.Writer) error { if err := w.Byte(p.Actions); err != nil { return err } if err := w.VarInt(int32(len(p.Players))); err != nil { return err } for uuid, player := range p.Players { if err := w.UUID(uuid); err != nil { return err } if p.Actions&ActionAddPlayer != 0 { if err := w.String(player.Name); err != nil { return err } if err := w.VarInt(int32(len(player.Properties))); err != nil { return err } for _, property := range player.Properties { if err := w.String(property.Name); err != nil { return err } if err := w.String(property.Value); err != nil { return err } if err := w.Bool(property.Signature != ""); err != nil { return err } if property.Signature != "" { if err := w.String(property.Signature); err != nil { return err } } } } if p.Actions&ActionInitializeChat != 0 { if err := w.Bool(player.HasSignatureData); err != nil { return err } if player.HasSignatureData { if err := w.UUID(player.Session.SessionID); err != nil { return err } if err := w.Long(player.Session.ExpiresAt); err != nil { return err } if err := w.ByteArray(player.Session.PublicKey); err != nil { return err } if err := w.ByteArray(player.Session.KeySignature); err != nil { return err } } } if p.Actions&ActionUpdateGameMode != 0 { if err := w.VarInt(player.GameMode); err != nil { return err } } if p.Actions&ActionUpdateListed != 0 { if err := w.Bool(player.Listed); err != nil { return err } } if p.Actions&ActionUpdateLatency != 0 { if err := w.VarInt(player.Ping); err != nil { return err } } if p.Actions&ActionUpdateDisplayName != 0 { if err := w.Bool(player.HasDisplayName); err != nil { return err } return w.TextComponent(player.DisplayName) } } return nil } func (p *PlayerInfoUpdate) Decode(r encoding.Reader) error { return nil //TODO } ================================================ FILE: protocol/net/packet/play/playerSession.go ================================================ package play import ( "github.com/google/uuid" "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // serverbound const PacketIdPlayerSession = 0x07 type PlayerSession struct { SessionID uuid.UUID ExpiresAt int64 PublicKey []byte KeySignature []byte } func (PlayerSession) ID() int32 { return 0x07 } func (p *PlayerSession) Encode(w encoding.Writer) error { if err := w.UUID(p.SessionID); err != nil { return err } if err := w.Long(p.ExpiresAt); err != nil { return err } if err := w.ByteArray(p.PublicKey); err != nil { return err } return w.ByteArray(p.KeySignature) } func (p *PlayerSession) Decode(r encoding.Reader) error { if err := r.UUID(&p.SessionID); err != nil { return err } if err := r.Long(&p.ExpiresAt); err != nil { return err } if err := r.ByteArray(&p.PublicKey); err != nil { return err } return r.ByteArray(&p.KeySignature) } ================================================ FILE: protocol/net/packet/play/plugin.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/net/packet/configuration" ) // clientbound const PacketIdClientboundPluginMessage = 0x19 type ClientboundPluginMessage configuration.ClientboundPluginMessage func (ClientboundPluginMessage) ID() int32 { return 0x19 } func (c *ClientboundPluginMessage) Encode(w encoding.Writer) error { if err := w.Identifier(c.Channel); err != nil { return err } return w.FixedByteArray(c.Data) } func (c *ClientboundPluginMessage) Decode(r encoding.Reader) error { if err := r.Identifier(&c.Channel); err != nil { return err } return r.ReadAll(&c.Data) } // serverbound const PacketIdServerboundPluginMessage = 0x12 type ServerboundPluginMessage struct { configuration.ServerboundPluginMessage } func (ServerboundPluginMessage) ID() int32 { return 0x12 } ================================================ FILE: protocol/net/packet/play/removeEntities.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdRemoveEntities = 0x42 type RemoveEntities struct { EntityIDs []int32 } func (RemoveEntities) ID() int32 { return PacketIdRemoveEntities } func (r *RemoveEntities) Encode(w encoding.Writer) error { if err := w.VarInt(int32(len(r.EntityIDs))); err != nil { return err } for _, entityId := range r.EntityIDs { if err := w.VarInt(entityId); err != nil { return err } } return nil } func (e *RemoveEntities) Decode(r encoding.Reader) error { var length int32 if _, err := r.VarInt(&length); err != nil { return err } e.EntityIDs = make([]int32, length) for _, entityId := range e.EntityIDs { if _, err := r.VarInt(&entityId); err != nil { return err } } return nil } ================================================ FILE: protocol/net/packet/play/serverData.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/text" ) // clientbound const PacketIdServerData = 0x4B type ServerData struct { MOTD text.TextComponent Icon []byte } func (ServerData) ID() int32 { return PacketIdServerData } func (d *ServerData) Encode(w encoding.Writer) error { if err := w.TextComponent(d.MOTD); err != nil { return err } if err := w.Bool(d.Icon != nil); err != nil { return err } if d.Icon != nil { return w.ByteArray(d.Icon) } return nil } func (d *ServerData) Decode(r encoding.Reader) error { if err := r.TextComponent(&d.MOTD); err != nil { return err } var hasIcon bool if err := r.Bool(&hasIcon); err != nil { return err } if hasIcon { return r.ByteArray(&d.Icon) } return nil } ================================================ FILE: protocol/net/packet/play/serverLinks.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/text" ) // clientbound const PacketIdServerLinks = 0x7B const ( LabelBugRepot = iota LabelCommunityGuidelines LabelSupport LabelStatus LabelFeedback LabelCommunity LabelWebsite LabelForums LabelNews LabelAnnouncements ) type Link struct { BuiltIn bool BuiltInLabel int32 // used if built in is true Label text.TextComponent // used if built in is false URL string } type ServerLinks struct { Links []Link } func (ServerLinks) ID() int32 { return PacketIdServerLinks } func (s *ServerLinks) Encode(w encoding.Writer) error { if err := w.VarInt(int32(len(s.Links))); err != nil { return err } for _, link := range s.Links { if err := w.Bool(link.BuiltIn); err != nil { return err } if link.BuiltIn { if err := w.VarInt(link.BuiltInLabel); err != nil { return err } } else { if err := w.TextComponent(link.Label); err != nil { return err } } if err := w.String(link.URL); err != nil { return err } } return nil } func (s *ServerLinks) Decode(r encoding.Reader) error { return nil //TODO } ================================================ FILE: protocol/net/packet/play/setCenterChunk.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdSetCenterChunk = 0x54 type SetCenterChunk struct { ChunkX, ChunkZ int32 } func (SetCenterChunk) ID() int32 { return 0x54 } func (s *SetCenterChunk) Encode(w encoding.Writer) error { if err := w.VarInt(s.ChunkX); err != nil { return err } return w.VarInt(s.ChunkZ) } func (s *SetCenterChunk) Decode(r encoding.Reader) error { if _, err := r.VarInt(&s.ChunkX); err != nil { return err } _, err := r.VarInt(&s.ChunkZ) return err } ================================================ FILE: protocol/net/packet/play/setContainerContent.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/net/slot" ) // clientbound const PacketIdSetContainerContent = 0x13 type SetContainerContent struct { WindowID byte StateId int32 Slots []slot.Slot CarriedItem slot.Slot } func (SetContainerContent) ID() int32 { return PacketIdSetContainerContent } func (s *SetContainerContent) Encode(w encoding.Writer) error { if err := w.Ubyte(s.WindowID); err != nil { return err } if err := w.VarInt(s.StateId); err != nil { return err } if err := w.VarInt(int32(len(s.Slots))); err != nil { return err } for _, slot := range s.Slots { if err := slot.Encode(w); err != nil { return err } } return s.CarriedItem.Encode(w) } func (s *SetContainerContent) Decode(r encoding.Reader) error { return nil //TODO } ================================================ FILE: protocol/net/packet/play/setCreativeModeSlot.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/net/slot" ) // clientbound const PacketIdSetCreativeModeSlot = 0x32 type SetCreativeModeSlot struct { Slot int16 ClickedItem slot.Slot } func (SetCreativeModeSlot) ID() int32 { return PacketIdSetCreativeModeSlot } func (s *SetCreativeModeSlot) Encode(w encoding.Writer) error { if err := w.Short(s.Slot); err != nil { return err } return s.ClickedItem.Encode(w) } func (s *SetCreativeModeSlot) Decode(r encoding.Reader) error { if err := r.Short(&s.Slot); err != nil { return err } return s.ClickedItem.Decode(r) } ================================================ FILE: protocol/net/packet/play/setDefaultSpawnPosition.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdSetDefaultSpawnPosition = 0x56 type SetDefaultSpawnPosition struct { X, Y, Z int32 Angle float32 } func (SetDefaultSpawnPosition) ID() int32 { return PacketIdSetDefaultSpawnPosition } func (s *SetDefaultSpawnPosition) Encode(w encoding.Writer) error { if err := w.Position(s.X, s.Y, s.Z); err != nil { return err } return w.Float(s.Angle) } func (s *SetDefaultSpawnPosition) Decode(r encoding.Reader) error { if err := r.Position(&s.X, &s.Y, &s.Z); err != nil { return err } return r.Float(&s.Angle) } ================================================ FILE: protocol/net/packet/play/setEntityMetadata.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/net/metadata" "github.com/zeppelinmc/zeppelin/protocol/text" ) // clientbound const PacketIdSetEntityMetadata = 0x58 type SetEntityMetadata struct { EntityId int32 Metadata metadata.Metadata } func (SetEntityMetadata) ID() int32 { return PacketIdSetEntityMetadata } func (s *SetEntityMetadata) Encode(w encoding.Writer) error { if err := w.VarInt(s.EntityId); err != nil { return err } for index, value := range s.Metadata { if err := w.Ubyte(index); err != nil { return err } switch val := value.(type) { case metadata.Byte: if err := w.VarInt(0); err != nil { return err } if err := w.Byte(int8(val)); err != nil { return err } case metadata.VarInt: if err := w.VarInt(1); err != nil { return err } if err := w.VarInt(int32(val)); err != nil { return err } case metadata.VarLong: if err := w.VarInt(2); err != nil { return err } if err := w.VarLong(int64(val)); err != nil { return err } case metadata.Float: if err := w.VarInt(3); err != nil { return err } if err := w.Float(float32(val)); err != nil { return err } case metadata.String: if err := w.VarInt(4); err != nil { return err } if err := w.String(string(val)); err != nil { return err } case metadata.TextComponent: if err := w.VarInt(5); err != nil { return err } if err := w.TextComponent(text.TextComponent(val)); err != nil { return err } case metadata.OptionalTextComponent: if err := w.VarInt(6); err != nil { return err } if err := w.Bool(val != nil); err != nil { return err } if val != nil { if err := w.TextComponent(text.TextComponent(*val)); err != nil { return err } } case metadata.Slot: if err := w.VarInt(7); err != nil { return err } if err := val.Encode(w); err != nil { return err } case metadata.Boolean: if err := w.VarInt(8); err != nil { return err } if err := w.Bool(bool(val)); err != nil { return err } case metadata.Rotations: if err := w.VarInt(9); err != nil { return err } if err := w.Float(float32(val[0])); err != nil { return err } if err := w.Float(float32(val[1])); err != nil { return err } if err := w.Float(float32(val[2])); err != nil { return err } case metadata.Position: if err := w.VarInt(10); err != nil { return err } if err := w.Position(val[0], val[1], val[2]); err != nil { return err } case metadata.OptionalPosition: if err := w.VarInt(11); err != nil { return err } if err := w.Bool(val != nil); err != nil { return err } if val != nil { if err := w.Position(val[0], val[1], val[2]); err != nil { return err } } case metadata.Direction: if err := w.VarInt(12); err != nil { return err } if err := w.VarInt(int32(val)); err != nil { return err } case metadata.OptionalUUID: if err := w.VarInt(13); err != nil { return err } if err := w.Bool(val != nil); err != nil { return err } if val != nil { if err := w.UUID(*val); err != nil { return err } } case metadata.BlockState: if err := w.VarInt(14); err != nil { return err } if err := w.VarInt(int32(val)); err != nil { return err } case metadata.OptionalBlockState: if err := w.VarInt(15); err != nil { return err } if err := w.VarInt(int32(val)); err != nil { return err } case metadata.VillagerData: if err := w.VarInt(18); err != nil { return err } if err := w.Float(float32(val[0])); err != nil { return err } if err := w.Float(float32(val[1])); err != nil { return err } if err := w.Float(float32(val[2])); err != nil { return err } case metadata.OptionalVarInt: if err := w.VarInt(19); err != nil { return err } if err := w.VarInt(int32(val)); err != nil { return err } case metadata.Pose: if err := w.VarInt(21); err != nil { return err } if err := w.VarInt(int32(val)); err != nil { return err } case metadata.CatVariant: if err := w.VarInt(21); err != nil { return err } if err := w.VarInt(int32(val)); err != nil { return err } case metadata.FrogVariant: if err := w.VarInt(22); err != nil { return err } if err := w.VarInt(int32(val)); err != nil { return err } case metadata.OptionalGlobalPosition: if err := w.VarInt(23); err != nil { return err } if err := w.Bool(val != nil); err != nil { return err } if val != nil { if err := w.Identifier(string(val.DimensionIdentifier)); err != nil { return err } if err := w.Position(val.Position[0], val.Position[1], val.Position[2]); err != nil { return err } } case metadata.PaintingVariant: if err := w.VarInt(24); err != nil { return err } if err := w.VarInt(int32(val)); err != nil { return err } case metadata.SnifferState: if err := w.VarInt(25); err != nil { return err } if err := w.VarInt(int32(val)); err != nil { return err } case metadata.Vector3: if err := w.VarInt(26); err != nil { return err } if err := w.Float(float32(val[0])); err != nil { return err } if err := w.Float(float32(val[1])); err != nil { return err } if err := w.Float(float32(val[2])); err != nil { return err } case metadata.Quatermion: if err := w.VarInt(27); err != nil { return err } if err := w.Float(float32(val[0])); err != nil { return err } if err := w.Float(float32(val[1])); err != nil { return err } if err := w.Float(float32(val[2])); err != nil { return err } if err := w.Float(float32(val[3])); err != nil { return err } case metadata.NBT: if err := w.VarInt(16); err != nil { return err } if err := w.NBT(val); err != nil { return err } default: continue } } return w.Ubyte(0xFF) } func (*SetEntityMetadata) Decode(r encoding.Reader) error { return nil //TODO } ================================================ FILE: protocol/net/packet/play/setEntityVelocity.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdSetEntityVelocity = 0x5A type SetEntityVelocity struct { EntityId int32 X, Y, Z int16 } func (SetEntityVelocity) ID() int32 { return PacketIdSetEntityVelocity } func (d *SetEntityVelocity) Encode(w encoding.Writer) error { if err := w.VarInt(d.EntityId); err != nil { return err } if err := w.Short(d.X); err != nil { return err } if err := w.Short(d.Y); err != nil { return err } return w.Short(d.Z) } func (d *SetEntityVelocity) Decode(r encoding.Reader) error { if _, err := r.VarInt(&d.EntityId); err != nil { return err } if err := r.Short(&d.X); err != nil { return err } if err := r.Short(&d.Y); err != nil { return err } return r.Short(&d.Z) } ================================================ FILE: protocol/net/packet/play/setHeadRotation.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdSetHeadRotation = 0x48 type SetHeadRotation struct { EntityId int32 HeadYaw byte } func (SetHeadRotation) ID() int32 { return PacketIdSetHeadRotation } func (s *SetHeadRotation) Encode(w encoding.Writer) error { if err := w.VarInt(s.EntityId); err != nil { return err } return w.Ubyte(s.HeadYaw) } func (s *SetHeadRotation) Decode(r encoding.Reader) error { if _, err := r.VarInt(&s.EntityId); err != nil { return err } return r.Ubyte(&s.HeadYaw) } ================================================ FILE: protocol/net/packet/play/setHeldItemCB.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdSetHeldItemClientbound = 0x53 type SetHeldItemClientbound struct { Slot int8 } func (SetHeldItemClientbound) ID() int32 { return PacketIdSetHeldItemClientbound } func (s *SetHeldItemClientbound) Encode(w encoding.Writer) error { return w.Byte(s.Slot) } func (s *SetHeldItemClientbound) Decode(r encoding.Reader) error { return r.Byte(&s.Slot) } ================================================ FILE: protocol/net/packet/play/setHeldItemSB.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // serverbound const PacketIdSetHeldItemServerbound = 0x2F type SetHeldItemServerbound struct { Slot int16 } func (SetHeldItemServerbound) ID() int32 { return PacketIdSetHeldItemServerbound } func (s *SetHeldItemServerbound) Encode(w encoding.Writer) error { return w.Short(s.Slot) } func (s *SetHeldItemServerbound) Decode(r encoding.Reader) error { return r.Short(&s.Slot) } ================================================ FILE: protocol/net/packet/play/setPlayerOnGround.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // serverbound const PacketIdSetPlayerOnGround = 0x1D type SetPlayerOnGround struct { OnGround bool } func (SetPlayerOnGround) ID() int32 { return PacketIdSetPlayerOnGround } func (s *SetPlayerOnGround) Encode(w encoding.Writer) error { return w.Bool(s.OnGround) } func (s *SetPlayerOnGround) Decode(r encoding.Reader) error { return r.Bool(&s.OnGround) } ================================================ FILE: protocol/net/packet/play/setPlayerPosition.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // serverbound const PacketIdSetPlayerPosition = 0x1A type SetPlayerPosition struct { X, Y, Z float64 OnGround bool } func (SetPlayerPosition) ID() int32 { return 0x1A } func (s *SetPlayerPosition) Encode(w encoding.Writer) error { if err := w.Double(s.X); err != nil { return err } if err := w.Double(s.Y); err != nil { return err } if err := w.Double(s.Z); err != nil { return err } return w.Bool(s.OnGround) } func (s *SetPlayerPosition) Decode(r encoding.Reader) error { if err := r.Double(&s.X); err != nil { return err } if err := r.Double(&s.Y); err != nil { return err } if err := r.Double(&s.Z); err != nil { return err } return r.Bool(&s.OnGround) } ================================================ FILE: protocol/net/packet/play/setPlayerPositionAndRotation.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // serverbound const PacketIdSetPlayerPositionAndRotation = 0x1B type SetPlayerPositionAndRotation struct { X, Y, Z float64 Yaw, Pitch float32 OnGround bool } func (SetPlayerPositionAndRotation) ID() int32 { return 0x1B } func (s *SetPlayerPositionAndRotation) Encode(w encoding.Writer) error { if err := w.Double(s.X); err != nil { return err } if err := w.Double(s.Y); err != nil { return err } if err := w.Double(s.Z); err != nil { return err } if err := w.Float(s.Yaw); err != nil { return err } if err := w.Float(s.Pitch); err != nil { return err } return w.Bool(s.OnGround) } func (s *SetPlayerPositionAndRotation) Decode(r encoding.Reader) error { if err := r.Double(&s.X); err != nil { return err } if err := r.Double(&s.Y); err != nil { return err } if err := r.Double(&s.Z); err != nil { return err } if err := r.Float(&s.Yaw); err != nil { return err } if err := r.Float(&s.Pitch); err != nil { return err } return r.Bool(&s.OnGround) } ================================================ FILE: protocol/net/packet/play/setPlayerRotation.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // serverbound const PacketIdSetPlayerRotation = 0x1C type SetPlayerRotation struct { Yaw, Pitch float32 OnGround bool } func (SetPlayerRotation) ID() int32 { return 0x1C } func (s *SetPlayerRotation) Encode(w encoding.Writer) error { if err := w.Float(s.Yaw); err != nil { return err } if err := w.Float(s.Pitch); err != nil { return err } return w.Bool(s.OnGround) } func (s *SetPlayerRotation) Decode(r encoding.Reader) error { if err := r.Float(&s.Yaw); err != nil { return err } if err := r.Float(&s.Pitch); err != nil { return err } return r.Bool(&s.OnGround) } ================================================ FILE: protocol/net/packet/play/setTickingState.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdSetTickingState = 0x71 type SetTickingState struct { TickRate float32 IsFrozen bool } func (SetTickingState) ID() int32 { return PacketIdSetTickingState } func (s *SetTickingState) Encode(w encoding.Writer) error { if err := w.Float(s.TickRate); err != nil { return err } return w.Bool(s.IsFrozen) } ================================================ FILE: protocol/net/packet/play/signedChatCommand.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdSignedChatCommand = 0x05 type SignedChatCommand struct { Command string Timestamp, Salt int64 Arguments []SignedArgument MessageCount int32 Acknowledged encoding.FixedBitSet } type SignedArgument struct { Name string Signature [256]byte } func (SignedChatCommand) ID() int32 { return PacketIdChatCommand } func (c *SignedChatCommand) Encode(w encoding.Writer) error { if err := w.String(c.Command); err != nil { return err } if err := w.Long(c.Timestamp); err != nil { return err } if err := w.Long(c.Salt); err != nil { return err } if err := w.VarInt(int32(len(c.Arguments))); err != nil { return err } for _, arg := range c.Arguments { if err := w.String(arg.Name); err != nil { return err } if err := w.FixedByteArray(arg.Signature[:]); err != nil { return err } } if err := w.VarInt(c.MessageCount); err != nil { return err } return w.FixedBitSet(c.Acknowledged) } func (c *SignedChatCommand) Decode(r encoding.Reader) error { if err := r.String(&c.Command); err != nil { return err } if err := r.Long(&c.Timestamp); err != nil { return err } if err := r.Long(&c.Salt); err != nil { return err } var length int32 if _, err := r.VarInt(&length); err != nil { return err } c.Arguments = make([]SignedArgument, length) for _, arg := range c.Arguments { if err := r.String(&arg.Name); err != nil { return err } if err := r.FixedByteArray(arg.Signature[:]); err != nil { return err } } if _, err := r.VarInt(&c.MessageCount); err != nil { return err } return r.FixedBitSet(&c.Acknowledged, 20) } ================================================ FILE: protocol/net/packet/play/soundEffect.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdSoundEffect = 0x68 const ( SoundCategoryMaster = iota SoundCategoryMusic SoundCategoryRecord SoundCategoryWeather SoundCategoryBlock SoundCategoryHostile SoundCategoryNeutral SoundCategoryPlayer SoundCategoryAmbient SoundCategoryVoice ) type SoundEffect struct { SoundId int32 // -1 for custom SoundName string // only if sound id -1 FixedRange bool // only if sound id -1 Range float32 // only if fixed range SoundCategory int32 // one of the above constants X, Y, Z int32 // the original position of this sound. Calculations are done on encoding Volume float32 Pitch float32 Seed int64 } func (SoundEffect) ID() int32 { return PacketIdSoundEffect } func (s *SoundEffect) Encode(w encoding.Writer) error { if err := w.VarInt(s.SoundId + 1); err != nil { return err } if s.SoundId == -1 { if err := w.Identifier(s.SoundName); err != nil { return err } if err := w.Bool(s.FixedRange); err != nil { return err } if s.FixedRange { if err := w.Float(s.Range); err != nil { return err } } } if err := w.VarInt(s.SoundCategory); err != nil { return err } if err := w.Int(s.X * 8); err != nil { return err } if err := w.Int(s.Y * 8); err != nil { return err } if err := w.Int(s.Z * 8); err != nil { return err } if err := w.Float(s.Volume); err != nil { return err } if err := w.Float(s.Pitch); err != nil { return err } return w.Long(s.Seed) } func (s *SoundEffect) Decode(r encoding.Reader) error { return nil //TODO } ================================================ FILE: protocol/net/packet/play/spawnEntity.go ================================================ package play import ( "github.com/google/uuid" "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) const ( ObjectDataItemFrameDown = iota ObjectDataItemFrameUp ObjectDataNorth ObjectDataSouth ObjectDataWest ObjectDataEast ) // clientbound const PacketIdSpawnEntity = 0x01 type SpawnEntity struct { EntityId int32 EntityUUID uuid.UUID Type int32 X, Y, Z float64 Pitch, Yaw, HeadYaw byte Data int32 VelX, VelY, VelZ int16 } func (SpawnEntity) ID() int32 { return 0x01 } func (s *SpawnEntity) Encode(w encoding.Writer) error { if err := w.VarInt(s.EntityId); err != nil { return err } if err := w.UUID(s.EntityUUID); err != nil { return err } if err := w.VarInt(s.Type); err != nil { return err } if err := w.Double(s.X); err != nil { return err } if err := w.Double(s.Y); err != nil { return err } if err := w.Double(s.Z); err != nil { return err } if err := w.Ubyte(s.Pitch); err != nil { return err } if err := w.Ubyte(s.Yaw); err != nil { return err } if err := w.Ubyte(s.HeadYaw); err != nil { return err } if err := w.VarInt(s.Data); err != nil { return err } if err := w.Short(s.VelX); err != nil { return err } if err := w.Short(s.VelY); err != nil { return err } return w.Short(s.VelZ) } func (s *SpawnEntity) Decode(r encoding.Reader) error { if _, err := r.VarInt(&s.EntityId); err != nil { return err } if err := r.UUID(&s.EntityUUID); err != nil { return err } if _, err := r.VarInt(&s.Type); err != nil { return err } if err := r.Double(&s.X); err != nil { return err } if err := r.Double(&s.Y); err != nil { return err } if err := r.Double(&s.Z); err != nil { return err } if err := r.Ubyte(&s.Pitch); err != nil { return err } if err := r.Ubyte(&s.Yaw); err != nil { return err } if err := r.Ubyte(&s.HeadYaw); err != nil { return err } if _, err := r.VarInt(&s.Data); err != nil { return err } if err := r.Short(&s.VelX); err != nil { return err } if err := r.Short(&s.VelY); err != nil { return err } return r.Short(&s.VelZ) } ================================================ FILE: protocol/net/packet/play/stepTick.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdStepTick = 0x72 type StepTick struct { TickSteps int32 } func (StepTick) ID() int32 { return PacketIdStepTick } func (s *StepTick) Encode(w encoding.Writer) error { return w.VarInt(s.TickSteps) } ================================================ FILE: protocol/net/packet/play/swingArm.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // serverbound const PacketIdSwingArm = 0x36 const ( MainHand = iota Offhand ) type SwingArm struct { Hand int32 } func (SwingArm) ID() int32 { return PacketIdSwingArm } func (e *SwingArm) Encode(w encoding.Writer) error { return w.VarInt(e.Hand) } func (e *SwingArm) Decode(r encoding.Reader) error { _, err := r.VarInt(&e.Hand) return err } ================================================ FILE: protocol/net/packet/play/synchronizePlayerPosition.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // serverbound const PacketIdSynchronizePlayerPosition = 0x40 const ( SyncPosRelX = 1 << iota SyncPosRelY SyncPosRelZ SyncPosRelPitch SyncPosRelYaw ) type SynchronizePlayerPosition struct { X, Y, Z float64 Yaw, Pitch float32 Flags int8 TeleportID int32 } func (SynchronizePlayerPosition) ID() int32 { return PacketIdSynchronizePlayerPosition } func (s *SynchronizePlayerPosition) Encode(w encoding.Writer) error { if err := w.Double(s.X); err != nil { return err } if err := w.Double(s.Y); err != nil { return err } if err := w.Double(s.Z); err != nil { return err } if err := w.Float(s.Yaw); err != nil { return err } if err := w.Float(s.Pitch); err != nil { return err } if err := w.Byte(s.Flags); err != nil { return err } return w.VarInt(s.TeleportID) } func (s *SynchronizePlayerPosition) Decode(r encoding.Reader) error { if err := r.Double(&s.X); err != nil { return err } if err := r.Double(&s.Y); err != nil { return err } if err := r.Double(&s.Z); err != nil { return err } if err := r.Float(&s.Yaw); err != nil { return err } if err := r.Float(&s.Pitch); err != nil { return err } if err := r.Byte(&s.Flags); err != nil { return err } _, err := r.VarInt(&s.TeleportID) return err } ================================================ FILE: protocol/net/packet/play/systemChatMessage.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/text" ) // clientbound const PacketIdSystemChatMessage = 0x6C type SystemChatMessage struct { Content text.TextComponent Overlay bool } func (SystemChatMessage) ID() int32 { return PacketIdSystemChatMessage } func (s *SystemChatMessage) Encode(w encoding.Writer) error { if err := w.TextComponent(s.Content); err != nil { return err } return w.Bool(s.Overlay) } func (s *SystemChatMessage) Decode(r encoding.Reader) error { if err := r.TextComponent(&s.Content); err != nil { return err } return r.Bool(&s.Overlay) } ================================================ FILE: protocol/net/packet/play/updateEntityPosition.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdUpdateEntityPosition = 0x2E type UpdateEntityPosition struct { EntityId int32 DeltaX, DeltaY, DeltaZ int16 OnGround bool } func (UpdateEntityPosition) ID() int32 { return PacketIdUpdateEntityPosition } func (s *UpdateEntityPosition) Encode(w encoding.Writer) error { if err := w.VarInt(s.EntityId); err != nil { return err } if err := w.Short(s.DeltaX); err != nil { return err } if err := w.Short(s.DeltaY); err != nil { return err } if err := w.Short(s.DeltaZ); err != nil { return err } return w.Bool(s.OnGround) } func (s *UpdateEntityPosition) Decode(r encoding.Reader) error { if _, err := r.VarInt(&s.EntityId); err != nil { return err } if err := r.Short(&s.DeltaX); err != nil { return err } if err := r.Short(&s.DeltaY); err != nil { return err } if err := r.Short(&s.DeltaZ); err != nil { return err } return r.Bool(&s.OnGround) } ================================================ FILE: protocol/net/packet/play/updateEntityPositionAndRotation.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdUpdateEntityPositionAndRotation = 0x2F type UpdateEntityPositionAndRotation struct { EntityId int32 DeltaX, DeltaY, DeltaZ int16 Yaw, Pitch byte OnGround bool } func (UpdateEntityPositionAndRotation) ID() int32 { return PacketIdUpdateEntityPositionAndRotation } func (s *UpdateEntityPositionAndRotation) Encode(w encoding.Writer) error { if err := w.VarInt(s.EntityId); err != nil { return err } if err := w.Short(s.DeltaX); err != nil { return err } if err := w.Short(s.DeltaY); err != nil { return err } if err := w.Short(s.DeltaZ); err != nil { return err } if err := w.Ubyte(s.Yaw); err != nil { return err } if err := w.Ubyte(s.Pitch); err != nil { return err } return w.Bool(s.OnGround) } func (s *UpdateEntityPositionAndRotation) Decode(r encoding.Reader) error { if _, err := r.VarInt(&s.EntityId); err != nil { return err } if err := r.Short(&s.DeltaX); err != nil { return err } if err := r.Short(&s.DeltaY); err != nil { return err } if err := r.Short(&s.DeltaZ); err != nil { return err } if err := r.Ubyte(&s.Yaw); err != nil { return err } if err := r.Ubyte(&s.Pitch); err != nil { return err } return r.Bool(&s.OnGround) } ================================================ FILE: protocol/net/packet/play/updateEntityRotation.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdUpdateEntityRotation = 0x30 type UpdateEntityRotation struct { EntityId int32 Yaw, Pitch byte OnGround bool } func (UpdateEntityRotation) ID() int32 { return PacketIdUpdateEntityRotation } func (s *UpdateEntityRotation) Encode(w encoding.Writer) error { if err := w.VarInt(s.EntityId); err != nil { return err } if err := w.Ubyte(s.Yaw); err != nil { return err } if err := w.Ubyte(s.Pitch); err != nil { return err } return w.Bool(s.OnGround) } func (s *UpdateEntityRotation) Decode(r encoding.Reader) error { if _, err := r.VarInt(&s.EntityId); err != nil { return err } if err := r.Ubyte(&s.Yaw); err != nil { return err } if err := r.Ubyte(&s.Pitch); err != nil { return err } return r.Bool(&s.OnGround) } ================================================ FILE: protocol/net/packet/play/updateRecipeBook.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) const ( UpdateRecipeBookActionInit = iota UpdateRecipeBookActionAdd UpdateRecipeBookActionRemove ) // clientbound const PacketIdUpdateRecipeBook = 0x41 type UpdateRecipeBook struct { Action int32 CraftingRecipeBookOpen bool CraftingRecipeBookFilterActive bool SmeltingRecipeBookOpen bool SmeltingRecipeBookFilterActive bool BlastFurnaceRecipeBookOpen bool BlastFurnaceRecipeBookFilterActive bool SmokerRecipeBookOpen bool SmokerRecipeBookFilterActive bool Array1 []string //init: to be displayed, add/rem: recipes Array2 []string //init: recipes, add/rem: unused } func (UpdateRecipeBook) ID() int32 { return PacketIdUpdateRecipeBook } func (u *UpdateRecipeBook) Encode(w encoding.Writer) error { if err := w.VarInt(u.Action); err != nil { return err } if err := w.Bool(u.CraftingRecipeBookOpen); err != nil { return err } if err := w.Bool(u.CraftingRecipeBookFilterActive); err != nil { return err } if err := w.Bool(u.SmeltingRecipeBookOpen); err != nil { return err } if err := w.Bool(u.SmeltingRecipeBookFilterActive); err != nil { return err } if err := w.Bool(u.BlastFurnaceRecipeBookOpen); err != nil { return err } if err := w.Bool(u.BlastFurnaceRecipeBookFilterActive); err != nil { return err } if err := w.Bool(u.SmokerRecipeBookOpen); err != nil { return err } if err := w.Bool(u.SmokerRecipeBookFilterActive); err != nil { return err } if err := w.VarInt(int32(len(u.Array1))); err != nil { return err } for _, str := range u.Array1 { if err := w.Identifier(str); err != nil { return err } } if u.Action == UpdateRecipeBookActionInit { if err := w.VarInt(int32(len(u.Array2))); err != nil { return err } for _, str := range u.Array2 { if err := w.Identifier(str); err != nil { return err } } } return nil } func (*UpdateRecipeBook) Decode(encoding.Reader) error { return nil //TODO } ================================================ FILE: protocol/net/packet/play/updateSectionBlocks.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdUpdateSectionBlocks = 0x49 type UpdateSectionBlocks struct { ChunkX, ChunkY, ChunkZ int32 // [x, y, z] -> state id Blocks map[[3]int32]int32 } func (UpdateSectionBlocks) ID() int32 { return PacketIdUpdateSectionBlocks } func (b *UpdateSectionBlocks) Encode(w encoding.Writer) error { if err := w.Long(((int64(b.ChunkX) & 0x3FFFFF) << 42) | (int64(b.ChunkY) & 0xFFFFF) | ((int64(b.ChunkZ) & 0x3FFFFF) << 20)); err != nil { return err } if err := w.VarInt(int32(len(b.Blocks))); err != nil { return err } for pos, state := range b.Blocks { blockLocalX, blockLocalY, blockLocalZ := int64(pos[0]), int64(pos[1]), int64(pos[2]) if err := w.VarLong(int64(state)<<12 | (blockLocalX<<8 | blockLocalZ<<4 | blockLocalY)); err != nil { return err } } return nil } func (b *UpdateSectionBlocks) Decode(r encoding.Reader) error { var sectionPos int64 if err := r.Long(§ionPos); err != nil { return err } b.ChunkX = int32(sectionPos >> 42) b.ChunkY = int32(sectionPos << 44 >> 44) b.ChunkZ = int32(sectionPos << 22 >> 42) var blocksLen int32 if _, err := r.VarInt(&blocksLen); err != nil { return err } b.Blocks = make(map[[3]int32]int32, blocksLen) for i := 0; i < int(blocksLen); i++ { var blockId int64 if err := r.Long(&blockId); err != nil { return err } var pos = [3]int32{ int32((blockId >> 8) & 0xF), int32(blockId & 0xF), int32((blockId >> 4) & 0xF), } b.Blocks[pos] = int32(blockId >> 12) } return nil } ================================================ FILE: protocol/net/packet/play/updateTags.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdUpdateTags = 0x78 type UpdateTags struct { Tags map[string]map[string][]int32 } func (UpdateTags) ID() int32 { return PacketIdUpdateTags } func (u *UpdateTags) Encode(w encoding.Writer) error { if err := w.VarInt(int32(len(u.Tags))); err != nil { return err } for reg, tag := range u.Tags { if err := w.Identifier(reg); err != nil { return err } if err := w.VarInt(int32(len(tag))); err != nil { return err } for id, tag := range tag { if err := w.Identifier(id); err != nil { return err } if err := w.VarInt(int32(len(tag))); err != nil { return err } for _, entry := range tag { if err := w.VarInt(entry); err != nil { return err } } } } return nil } func (u *UpdateTags) Decode(r encoding.Reader) error { var length int32 if _, err := r.VarInt(&length); err != nil { return err } u.Tags = make(map[string]map[string][]int32, length) for i := int32(0); i < length; i++ { var registry string if err := r.String(®istry); err != nil { return err } var length int32 if _, err := r.VarInt(&length); err != nil { return err } u.Tags[registry] = make(map[string][]int32, length) for i := int32(0); i < length; i++ { var tagName string if err := r.String(&tagName); err != nil { return err } var count int32 if _, err := r.VarInt(&count); err != nil { return err } u.Tags[registry][tagName] = make([]int32, count) for i := int32(0); i < count; i++ { if _, err := r.VarInt(&u.Tags[registry][tagName][i]); err != nil { return err } } } } return nil } ================================================ FILE: protocol/net/packet/play/updateTime.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // clientbound const PacketIdUpdateTime = 0x64 type UpdateTime struct { WorldAge int64 TimeOfDay int64 } func (UpdateTime) ID() int32 { return PacketIdUpdateTime } func (u *UpdateTime) Encode(w encoding.Writer) error { if err := w.Long(u.WorldAge); err != nil { return err } return w.Long(u.TimeOfDay) } func (u *UpdateTime) Decode(r encoding.Reader) error { if err := r.Long(&u.WorldAge); err != nil { return err } return r.Long(&u.TimeOfDay) } ================================================ FILE: protocol/net/packet/play/useItemOn.go ================================================ package play import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) // serverbound const PacketIdUseItemOn = 0x38 type UseItemOn struct { Hand int32 BlockX, BlockY, BlockZ int32 Face int32 CursorPosX, CursorPosY, CursorPosZ float32 InsideBlock bool Sequence int32 } const ( FaceBottom = iota FaceTop FaceNorth FaceSouth FaceWest FaceEast ) func (UseItemOn) ID() int32 { return PacketIdUseItemOn } func (u *UseItemOn) Encode(w encoding.Writer) error { if err := w.VarInt(u.Hand); err != nil { return err } if err := w.Position(u.BlockX, u.BlockY, u.BlockZ); err != nil { return err } if err := w.VarInt(u.Face); err != nil { return err } if err := w.Float(u.CursorPosX); err != nil { return err } if err := w.Float(u.CursorPosY); err != nil { return err } if err := w.Float(u.CursorPosZ); err != nil { return err } if err := w.Bool(u.InsideBlock); err != nil { return err } return w.VarInt(u.Sequence) } func (u *UseItemOn) Decode(r encoding.Reader) error { if _, err := r.VarInt(&u.Hand); err != nil { return err } if err := r.Position(&u.BlockX, &u.BlockY, &u.BlockZ); err != nil { return err } if _, err := r.VarInt(&u.Face); err != nil { return err } if err := r.Float(&u.CursorPosX); err != nil { return err } if err := r.Float(&u.CursorPosY); err != nil { return err } if err := r.Float(&u.CursorPosZ); err != nil { return err } if err := r.Bool(&u.InsideBlock); err != nil { return err } _, err := r.VarInt(&u.Sequence) return err } ================================================ FILE: protocol/net/packet/status/ping.go ================================================ package status import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) type Ping struct { Payload int64 } func (Ping) ID() int32 { return 0x01 } func (p Ping) Encode(w encoding.Writer) error { return w.Long(p.Payload) } func (p *Ping) Decode(r encoding.Reader) error { return r.Long(&p.Payload) } ================================================ FILE: protocol/net/packet/status/status.go ================================================ package status import ( "encoding/base64" "encoding/json" "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/text" ) type StatusVersion struct { Name string `json:"name"` Protocol int `json:"protocol"` } type StatusSample struct { Name string `json:"name"` ID string `json:"id"` } type StatusPlayers struct { Max int `json:"max"` Online int `json:"online"` Sample []StatusSample `json:"sample,omitempty"` } type Favicon []byte func (f Favicon) MarshalJSON() ([]byte, error) { if len(f) == 0 { return []byte{'"', '"'}, nil } data := make([]byte, len(dimgpnb64txt)+base64.StdEncoding.EncodedLen(len(f))+1) copy(data, []byte(dimgpnb64txt)) base64.StdEncoding.Encode(data[len(dimgpnb64txt):], f) data[len(data)-1] = '"' return data, nil } const dimgpnb64txt = `"data:image/png;base64,` type StatusResponseData struct { Version StatusVersion `json:"version"` Players StatusPlayers `json:"players"` Description text.TextComponent `json:"description"` Favicon Favicon `json:"favicon,omitempty"` EnforcesSecureChat bool `json:"enforcesSecureChat"` } type StatusResponse struct { Data StatusResponseData } func (StatusResponse) ID() int32 { return 0x00 } func (s StatusResponse) Encode(w encoding.Writer) error { data, err := json.Marshal(s.Data) if err != nil { return err } return w.ByteArray(data) } func (s *StatusResponse) Decode(r encoding.Reader) error { var data []byte if err := r.ByteArray(&data); err != nil { return err } return json.Unmarshal(data, &s.Data) } type StatusRequest struct { } func (StatusRequest) ID() int32 { return 0x00 } func (StatusRequest) Encode(encoding.Writer) error { return nil } func (StatusRequest) Decode(r encoding.Reader) error { return nil } ================================================ FILE: protocol/net/pool.go ================================================ package net import ( "github.com/zeppelinmc/zeppelin/protocol/net/packet" "github.com/zeppelinmc/zeppelin/protocol/net/packet/configuration" "github.com/zeppelinmc/zeppelin/protocol/net/packet/handshake" "github.com/zeppelinmc/zeppelin/protocol/net/packet/login" "github.com/zeppelinmc/zeppelin/protocol/net/packet/play" "github.com/zeppelinmc/zeppelin/protocol/net/packet/status" ) var ServerboundPool = map[int32]map[int32]func() packet.Decodeable{ HandshakingState: { 0x00: func() packet.Decodeable { return &handshake.Handshaking{} }, }, StatusState: { 0x00: func() packet.Decodeable { return &status.StatusRequest{} }, 0x01: func() packet.Decodeable { return &status.Ping{} }, }, LoginState: { 0x00: func() packet.Decodeable { return &login.LoginStart{} }, 0x02: func() packet.Decodeable { return &login.LoginPluginResponse{} }, 0x01: func() packet.Decodeable { return &login.EncryptionResponse{} }, 0x03: func() packet.Decodeable { return &login.LoginAcknowledged{} }, 0x04: func() packet.Decodeable { return &login.CookieResponse{} }, }, ConfigurationState: { 0x00: func() packet.Decodeable { return &configuration.ClientInformation{} }, 0x01: func() packet.Decodeable { return &configuration.CookieResponse{} }, 0x02: func() packet.Decodeable { return &configuration.ServerboundPluginMessage{} }, 0x03: func() packet.Decodeable { return &configuration.AcknowledgeFinishConfiguration{} }, 0x04: func() packet.Decodeable { return &configuration.KeepAlive{} }, 0x05: func() packet.Decodeable { return &configuration.Pong{} }, }, PlayState: { 0x00: func() packet.Decodeable { return &play.ConfirmTeleportation{} }, 0x04: func() packet.Decodeable { return &play.ChatCommand{} }, 0x05: func() packet.Decodeable { return &play.SignedChatCommand{} }, 0x06: func() packet.Decodeable { return &play.ChatMessage{} }, 0x08: func() packet.Decodeable { return &play.ChunkBatchReceived{} }, 0x07: func() packet.Decodeable { return &play.PlayerSession{} }, 0x0A: func() packet.Decodeable { return &play.ClientInformation{} }, 0x0E: func() packet.Decodeable { return &play.ClickContainer{} }, 0x0F: func() packet.Decodeable { return &play.CloseContainer{} }, 0x12: func() packet.Decodeable { return &play.ServerboundPluginMessage{} }, 0x16: func() packet.Decodeable { return &play.Interact{} }, 0x18: func() packet.Decodeable { return &play.ServerboundKeepAlive{} }, 0x1A: func() packet.Decodeable { return &play.SetPlayerPosition{} }, 0x1B: func() packet.Decodeable { return &play.SetPlayerPositionAndRotation{} }, 0x1C: func() packet.Decodeable { return &play.SetPlayerRotation{} }, 0x1D: func() packet.Decodeable { return &play.SetPlayerOnGround{} }, 0x23: func() packet.Decodeable { return &play.PlayerAbilitiesServerbound{} }, 0x25: func() packet.Decodeable { return &play.PlayerCommand{} }, 0x2F: func() packet.Decodeable { return &play.SetHeldItemServerbound{} }, 0x32: func() packet.Decodeable { return &play.SetCreativeModeSlot{} }, 0x36: func() packet.Decodeable { return &play.SwingArm{} }, 0x38: func() packet.Decodeable { return &play.UseItemOn{} }, }, } ================================================ FILE: protocol/net/registry/embed.go ================================================ package registry var Registries = map[string]interface{}{"minecraft:banner_pattern": map[string]struct { AssetId string "nbt:\"asset_id\"" TranslationKey string "nbt:\"translation_key\"" }{"minecraft:base": {AssetId: "minecraft:base", TranslationKey: "block.minecraft.banner.base"}, "minecraft:border": {AssetId: "minecraft:border", TranslationKey: "block.minecraft.banner.border"}, "minecraft:bricks": {AssetId: "minecraft:bricks", TranslationKey: "block.minecraft.banner.bricks"}, "minecraft:circle": {AssetId: "minecraft:circle", TranslationKey: "block.minecraft.banner.circle"}, "minecraft:creeper": {AssetId: "minecraft:creeper", TranslationKey: "block.minecraft.banner.creeper"}, "minecraft:cross": {AssetId: "minecraft:cross", TranslationKey: "block.minecraft.banner.cross"}, "minecraft:curly_border": {AssetId: "minecraft:curly_border", TranslationKey: "block.minecraft.banner.curly_border"}, "minecraft:diagonal_left": {AssetId: "minecraft:diagonal_left", TranslationKey: "block.minecraft.banner.diagonal_left"}, "minecraft:diagonal_right": {AssetId: "minecraft:diagonal_right", TranslationKey: "block.minecraft.banner.diagonal_right"}, "minecraft:diagonal_up_left": {AssetId: "minecraft:diagonal_up_left", TranslationKey: "block.minecraft.banner.diagonal_up_left"}, "minecraft:diagonal_up_right": {AssetId: "minecraft:diagonal_up_right", TranslationKey: "block.minecraft.banner.diagonal_up_right"}, "minecraft:flow": {AssetId: "minecraft:flow", TranslationKey: "block.minecraft.banner.flow"}, "minecraft:flower": {AssetId: "minecraft:flower", TranslationKey: "block.minecraft.banner.flower"}, "minecraft:globe": {AssetId: "minecraft:globe", TranslationKey: "block.minecraft.banner.globe"}, "minecraft:gradient": {AssetId: "minecraft:gradient", TranslationKey: "block.minecraft.banner.gradient"}, "minecraft:gradient_up": {AssetId: "minecraft:gradient_up", TranslationKey: "block.minecraft.banner.gradient_up"}, "minecraft:guster": {AssetId: "minecraft:guster", TranslationKey: "block.minecraft.banner.guster"}, "minecraft:half_horizontal": {AssetId: "minecraft:half_horizontal", TranslationKey: "block.minecraft.banner.half_horizontal"}, "minecraft:half_horizontal_bottom": {AssetId: "minecraft:half_horizontal_bottom", TranslationKey: "block.minecraft.banner.half_horizontal_bottom"}, "minecraft:half_vertical": {AssetId: "minecraft:half_vertical", TranslationKey: "block.minecraft.banner.half_vertical"}, "minecraft:half_vertical_right": {AssetId: "minecraft:half_vertical_right", TranslationKey: "block.minecraft.banner.half_vertical_right"}, "minecraft:mojang": {AssetId: "minecraft:mojang", TranslationKey: "block.minecraft.banner.mojang"}, "minecraft:piglin": {AssetId: "minecraft:piglin", TranslationKey: "block.minecraft.banner.piglin"}, "minecraft:rhombus": {AssetId: "minecraft:rhombus", TranslationKey: "block.minecraft.banner.rhombus"}, "minecraft:skull": {AssetId: "minecraft:skull", TranslationKey: "block.minecraft.banner.skull"}, "minecraft:small_stripes": {AssetId: "minecraft:small_stripes", TranslationKey: "block.minecraft.banner.small_stripes"}, "minecraft:square_bottom_left": {AssetId: "minecraft:square_bottom_left", TranslationKey: "block.minecraft.banner.square_bottom_left"}, "minecraft:square_bottom_right": {AssetId: "minecraft:square_bottom_right", TranslationKey: "block.minecraft.banner.square_bottom_right"}, "minecraft:square_top_left": {AssetId: "minecraft:square_top_left", TranslationKey: "block.minecraft.banner.square_top_left"}, "minecraft:square_top_right": {AssetId: "minecraft:square_top_right", TranslationKey: "block.minecraft.banner.square_top_right"}, "minecraft:straight_cross": {AssetId: "minecraft:straight_cross", TranslationKey: "block.minecraft.banner.straight_cross"}, "minecraft:stripe_bottom": {AssetId: "minecraft:stripe_bottom", TranslationKey: "block.minecraft.banner.stripe_bottom"}, "minecraft:stripe_center": {AssetId: "minecraft:stripe_center", TranslationKey: "block.minecraft.banner.stripe_center"}, "minecraft:stripe_downleft": {AssetId: "minecraft:stripe_downleft", TranslationKey: "block.minecraft.banner.stripe_downleft"}, "minecraft:stripe_downright": {AssetId: "minecraft:stripe_downright", TranslationKey: "block.minecraft.banner.stripe_downright"}, "minecraft:stripe_left": {AssetId: "minecraft:stripe_left", TranslationKey: "block.minecraft.banner.stripe_left"}, "minecraft:stripe_middle": {AssetId: "minecraft:stripe_middle", TranslationKey: "block.minecraft.banner.stripe_middle"}, "minecraft:stripe_right": {AssetId: "minecraft:stripe_right", TranslationKey: "block.minecraft.banner.stripe_right"}, "minecraft:stripe_top": {AssetId: "minecraft:stripe_top", TranslationKey: "block.minecraft.banner.stripe_top"}, "minecraft:triangle_bottom": {AssetId: "minecraft:triangle_bottom", TranslationKey: "block.minecraft.banner.triangle_bottom"}, "minecraft:triangle_top": {AssetId: "minecraft:triangle_top", TranslationKey: "block.minecraft.banner.triangle_top"}, "minecraft:triangles_bottom": {AssetId: "minecraft:triangles_bottom", TranslationKey: "block.minecraft.banner.triangles_bottom"}, "minecraft:triangles_top": {AssetId: "minecraft:triangles_top", TranslationKey: "block.minecraft.banner.triangles_top"}}, "minecraft:chat_type": map[string]ChatType{"minecraft:chat": {Chat: struct { Parameters []string "nbt:\"parameters\"" TranslationKey string "nbt:\"translation_key\"" Style struct { Color string "nbt:\"color\"" Italic bool "nbt:\"italic\"" } "nbt:\"style,omitempty\"" }{Parameters: []string{"sender", "content"}, TranslationKey: "chat.type.text", Style: struct { Color string "nbt:\"color\"" Italic bool "nbt:\"italic\"" }{Color: "", Italic: false}}, Narration: struct { Parameters []string "nbt:\"parameters\"" TranslationKey string "nbt:\"translation_key\"" }{Parameters: []string{"sender", "content"}, TranslationKey: "chat.type.text.narrate"}}, "minecraft:emote_command": {Chat: struct { Parameters []string "nbt:\"parameters\"" TranslationKey string "nbt:\"translation_key\"" Style struct { Color string "nbt:\"color\"" Italic bool "nbt:\"italic\"" } "nbt:\"style,omitempty\"" }{Parameters: []string{"sender", "content"}, TranslationKey: "chat.type.emote", Style: struct { Color string "nbt:\"color\"" Italic bool "nbt:\"italic\"" }{Color: "", Italic: false}}, Narration: struct { Parameters []string "nbt:\"parameters\"" TranslationKey string "nbt:\"translation_key\"" }{Parameters: []string{"sender", "content"}, TranslationKey: "chat.type.emote"}}, "minecraft:msg_command_incoming": {Chat: struct { Parameters []string "nbt:\"parameters\"" TranslationKey string "nbt:\"translation_key\"" Style struct { Color string "nbt:\"color\"" Italic bool "nbt:\"italic\"" } "nbt:\"style,omitempty\"" }{Parameters: []string{"sender", "content"}, TranslationKey: "commands.message.display.incoming", Style: struct { Color string "nbt:\"color\"" Italic bool "nbt:\"italic\"" }{Color: "", Italic: false}}, Narration: struct { Parameters []string "nbt:\"parameters\"" TranslationKey string "nbt:\"translation_key\"" }{Parameters: []string{"sender", "content"}, TranslationKey: "chat.type.text.narrate"}}, "minecraft:msg_command_outgoing": {Chat: struct { Parameters []string "nbt:\"parameters\"" TranslationKey string "nbt:\"translation_key\"" Style struct { Color string "nbt:\"color\"" Italic bool "nbt:\"italic\"" } "nbt:\"style,omitempty\"" }{Parameters: []string{"target", "content"}, TranslationKey: "commands.message.display.outgoing", Style: struct { Color string "nbt:\"color\"" Italic bool "nbt:\"italic\"" }{Color: "", Italic: false}}, Narration: struct { Parameters []string "nbt:\"parameters\"" TranslationKey string "nbt:\"translation_key\"" }{Parameters: []string{"sender", "content"}, TranslationKey: "chat.type.text.narrate"}}, "minecraft:say_command": {Chat: struct { Parameters []string "nbt:\"parameters\"" TranslationKey string "nbt:\"translation_key\"" Style struct { Color string "nbt:\"color\"" Italic bool "nbt:\"italic\"" } "nbt:\"style,omitempty\"" }{Parameters: []string{"sender", "content"}, TranslationKey: "chat.type.announcement", Style: struct { Color string "nbt:\"color\"" Italic bool "nbt:\"italic\"" }{Color: "", Italic: false}}, Narration: struct { Parameters []string "nbt:\"parameters\"" TranslationKey string "nbt:\"translation_key\"" }{Parameters: []string{"sender", "content"}, TranslationKey: "chat.type.text.narrate"}}, "minecraft:team_msg_command_incoming": {Chat: struct { Parameters []string "nbt:\"parameters\"" TranslationKey string "nbt:\"translation_key\"" Style struct { Color string "nbt:\"color\"" Italic bool "nbt:\"italic\"" } "nbt:\"style,omitempty\"" }{Parameters: []string{"target", "sender", "content"}, TranslationKey: "chat.type.team.text", Style: struct { Color string "nbt:\"color\"" Italic bool "nbt:\"italic\"" }{Color: "", Italic: false}}, Narration: struct { Parameters []string "nbt:\"parameters\"" TranslationKey string "nbt:\"translation_key\"" }{Parameters: []string{"sender", "content"}, TranslationKey: "chat.type.text.narrate"}}, "minecraft:team_msg_command_outgoing": {Chat: struct { Parameters []string "nbt:\"parameters\"" TranslationKey string "nbt:\"translation_key\"" Style struct { Color string "nbt:\"color\"" Italic bool "nbt:\"italic\"" } "nbt:\"style,omitempty\"" }{Parameters: []string{"target", "sender", "content"}, TranslationKey: "chat.type.team.sent", Style: struct { Color string "nbt:\"color\"" Italic bool "nbt:\"italic\"" }{Color: "", Italic: false}}, Narration: struct { Parameters []string "nbt:\"parameters\"" TranslationKey string "nbt:\"translation_key\"" }{Parameters: []string{"sender", "content"}, TranslationKey: "chat.type.text.narrate"}}}, "minecraft:damage_type": map[string]struct { Exhaustion float32 "nbt:\"exhaustion\"" MessageID string "nbt:\"message_id\"" Scaling string "nbt:\"scaling\"" DeathMessageType string "nbt:\"death_message_type,omitempty\"" Effects string "nbt:\"effects,omitempty\"" }{"minecraft:arrow": {Exhaustion: 0.1, MessageID: "arrow", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:bad_respawn_point": {Exhaustion: 0.1, MessageID: "badRespawnPoint", Scaling: "always", DeathMessageType: "", Effects: ""}, "minecraft:cactus": {Exhaustion: 0.1, MessageID: "cactus", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:campfire": {Exhaustion: 0.1, MessageID: "inFire", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:cramming": {Exhaustion: 0, MessageID: "cramming", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:dragon_breath": {Exhaustion: 0, MessageID: "dragonBreath", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:drown": {Exhaustion: 0, MessageID: "drown", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:dry_out": {Exhaustion: 0.1, MessageID: "dryout", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:explosion": {Exhaustion: 0.1, MessageID: "explosion", Scaling: "always", DeathMessageType: "", Effects: ""}, "minecraft:fall": {Exhaustion: 0, MessageID: "fall", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:falling_anvil": {Exhaustion: 0.1, MessageID: "anvil", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:falling_block": {Exhaustion: 0.1, MessageID: "fallingBlock", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:falling_stalactite": {Exhaustion: 0.1, MessageID: "fallingStalactite", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:fireball": {Exhaustion: 0.1, MessageID: "fireball", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:fireworks": {Exhaustion: 0.1, MessageID: "fireworks", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:fly_into_wall": {Exhaustion: 0, MessageID: "flyIntoWall", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:freeze": {Exhaustion: 0, MessageID: "freeze", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:generic": {Exhaustion: 0, MessageID: "generic", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:generic_kill": {Exhaustion: 0, MessageID: "genericKill", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:hot_floor": {Exhaustion: 0.1, MessageID: "hotFloor", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:in_fire": {Exhaustion: 0.1, MessageID: "inFire", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:in_wall": {Exhaustion: 0, MessageID: "inWall", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:indirect_magic": {Exhaustion: 0, MessageID: "indirectMagic", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:lava": {Exhaustion: 0.1, MessageID: "lava", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:lightning_bolt": {Exhaustion: 0.1, MessageID: "lightningBolt", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:magic": {Exhaustion: 0, MessageID: "magic", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:mob_attack": {Exhaustion: 0.1, MessageID: "mob", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:mob_attack_no_aggro": {Exhaustion: 0.1, MessageID: "mob", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:mob_projectile": {Exhaustion: 0.1, MessageID: "mob", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:on_fire": {Exhaustion: 0, MessageID: "onFire", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:out_of_world": {Exhaustion: 0, MessageID: "outOfWorld", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:outside_border": {Exhaustion: 0, MessageID: "outsideBorder", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:player_attack": {Exhaustion: 0.1, MessageID: "player", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:player_explosion": {Exhaustion: 0.1, MessageID: "explosion.player", Scaling: "always", DeathMessageType: "", Effects: ""}, "minecraft:sonic_boom": {Exhaustion: 0, MessageID: "sonic_boom", Scaling: "always", DeathMessageType: "", Effects: ""}, "minecraft:spit": {Exhaustion: 0.1, MessageID: "mob", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:stalagmite": {Exhaustion: 0, MessageID: "stalagmite", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:starve": {Exhaustion: 0, MessageID: "starve", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:sting": {Exhaustion: 0.1, MessageID: "sting", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:sweet_berry_bush": {Exhaustion: 0.1, MessageID: "sweetBerryBush", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:thorns": {Exhaustion: 0.1, MessageID: "thorns", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:thrown": {Exhaustion: 0.1, MessageID: "thrown", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:trident": {Exhaustion: 0.1, MessageID: "trident", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:unattributed_fireball": {Exhaustion: 0.1, MessageID: "onFire", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:wind_charge": {Exhaustion: 0.1, MessageID: "mob", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:wither": {Exhaustion: 0, MessageID: "wither", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}, "minecraft:wither_skull": {Exhaustion: 0.1, MessageID: "witherSkull", Scaling: "when_caused_by_living_non_player", DeathMessageType: "", Effects: ""}}, "minecraft:dimension_type": struct { Overworld Dimension "nbt:\"minecraft:overworld\"" OverworldCaves Dimension "nbt:\"minecraft:overworld_caves\"" TheEnd Dimension "nbt:\"minecraft:the_end\"" TheNether Dimension1 "nbt:\"minecraft:the_nether\"" }{Overworld: Dimension{AmbientLight: 0, BedWorks: true, CoordinateScale: 1, Effects: "minecraft:overworld", HasCeiling: false, HasRaids: true, HasSkylight: true, Height: 384, Infiniburn: "#minecraft:infiniburn_overworld", LogicalHeight: 384, MinY: -64, MonsterSpawnBlockLightLimit: 0, Natural: true, Ultrawarm: false, PiglinSafe: false, RespawnAnchorWorks: false, MonsterSpawnLightLevel: struct { MaxInclusive int32 "nbt:\"max_inclusive\"" MinInclusive int32 "nbt:\"min_inclusive\"" Type string "nbt:\"type\"" }{MaxInclusive: 7, MinInclusive: 0, Type: "minecraft:uniform"}}, OverworldCaves: Dimension{AmbientLight: 0, BedWorks: true, CoordinateScale: 1, Effects: "minecraft:overworld", HasCeiling: true, HasRaids: true, HasSkylight: true, Height: 384, Infiniburn: "#minecraft:infiniburn_overworld", LogicalHeight: 384, MinY: -64, MonsterSpawnBlockLightLimit: 0, Natural: true, Ultrawarm: false, PiglinSafe: false, RespawnAnchorWorks: false, MonsterSpawnLightLevel: struct { MaxInclusive int32 "nbt:\"max_inclusive\"" MinInclusive int32 "nbt:\"min_inclusive\"" Type string "nbt:\"type\"" }{MaxInclusive: 7, MinInclusive: 0, Type: "minecraft:uniform"}}, TheEnd: Dimension{FixedTime: 6000, AmbientLight: 0, BedWorks: false, CoordinateScale: 1, Effects: "minecraft:the_end", HasCeiling: false, HasRaids: true, HasSkylight: false, Height: 256, Infiniburn: "#minecraft:infiniburn_end", LogicalHeight: 256, MinY: 0, MonsterSpawnBlockLightLimit: 0, Natural: false, Ultrawarm: false, PiglinSafe: false, RespawnAnchorWorks: false, MonsterSpawnLightLevel: struct { MaxInclusive int32 "nbt:\"max_inclusive\"" MinInclusive int32 "nbt:\"min_inclusive\"" Type string "nbt:\"type\"" }{MaxInclusive: 7, MinInclusive: 0, Type: "minecraft:uniform"}}, TheNether: Dimension1{FixedTime: 18000, AmbientLight: 0.1, BedWorks: false, CoordinateScale: 8, Effects: "minecraft:the_nether", HasCeiling: true, HasRaids: false, HasSkylight: false, Height: 256, Infiniburn: "#minecraft:infiniburn_nether", LogicalHeight: 128, MinY: 0, MonsterSpawnBlockLightLimit: 15, Natural: false, Ultrawarm: true, PiglinSafe: true, RespawnAnchorWorks: true, MonsterSpawnLightLevel: 7}}, "minecraft:enchantment": map[string]struct { AnvilCost int32 "nbt:\"anvil_cost\"" Description struct { Translate string "nbt:\"translate\"" } "nbt:\"description\"" Effects struct { SmashDamagePerFallenBlock []struct { Effect struct { Type string "nbt:\"type\"" Value struct { Base float32 "nbt:\"base\"" PerLevelAboveFirst float32 "nbt:\"per_level_above_first\"" Type string "nbt:\"type\"" } "nbt:\"value\"" } "nbt:\"effect\"" } "nbt:\"minecraft:smash_damage_per_fallen_block\"" PreventArmorChange struct{} "nbt:\"minecraft:prevent_armor_change\"" HitBlock []struct { Effect struct { Effects []struct { Type string "nbt:\"type\"" Entity string "nbt:\"state\"" Pitch float32 "nbt:\"pitch\"" Sound string "nbt:\"sound\"" Volume float32 "nbt:\"volume\"" } "nbt:\"effects\"" Type string "nbt:\"type\"" } "nbt:\"effect\"" Requirements struct { Condition string "nbt:\"condition\"" Terms []struct { Block string "nbt:\"block\"" Condition string "nbt:\"condition\"" Thundering bool "nbt:\"thundering\"" Entity string "nbt:\"state\"" Predicate struct { Type string "nbt:\"type\"" CanSeeSky bool "nbt:\"can_see_sky\"" } "nbt:\"predicate\"" } "nbt:\"terms\"" } "nbt:\"requirements\"" } "nbt:\"minecraft:hit_block\"" ArmorEffectiveness []struct { Effect struct { Type string "nbt:\"type\"" Value struct { Base float32 "nbt:\"base\"" PerLevelAboveFirst float32 "nbt:\"per_level_above_first\"" Type string "nbt:\"type\"" } "nbt:\"value\"" } "nbt:\"effect\"" } "nbt:\"minecraft:armor_effectiveness\"" Attributes []struct { Amount struct { Added float32 "nbt:\"added\"" Base float32 "nbt:\"base\"" PerLevelAboveFirst float32 "nbt:\"per_level_above_first\"" Type string "nbt:\"type\"" } "nbt:\"amount\"" Atrribute string "nbt:\"attribute\"" Id string "nbt:\"id\"" Operation string "nbt:\"operation\"" } "nbt:\"minecraft:attributes\"" AmmoUse []struct { Effect struct { Type string "nbt:\"type\"" Value float32 "nbt:\"value\"" } "nbt:\"effect\"" Requirements struct { Condition string "nbt:\"condition\"" Predicate struct { Items string "nbt:\"items\"" } "nbt:\"predicate\"" } "nbt:\"requirements\"" } "nbt:\"minecraft:ammo_use\"" ProjectileSpawned []struct { Effect struct { Duration float32 "nbt:\"duration\"" Type string "nbt:\"type\"" } "nbt:\"effect\"" } "nbt:\"minecraft:projectile_spawned\"" LocationChanged []struct { Effect struct { BlockState struct { State struct { Name string Properties map[string]interface{} } "nbt:\"state\"" Type string "nbt:\"type\"" } "nbt:\"block_state\"" Height float32 "nbt:\"height\"" Offset []int32 "nbt:\"offset\"" Predicate struct { Predicates []struct { Offset []int32 "nbt:\"offset\"" Tag string "nbt:\"tag\"" Type string "nbt:\"type\"" Blocks string "nbt:\"blocks\"" Fluids string "nbt:\"fluids\"" } "nbt:\"predicates\"" Radius struct { Max float32 "nbt:\"max\"" Min float32 "nbt:\"min\"" Type string "nbt:\"type\"" Value struct { Base float32 "nbt:\"base\"" PerLevelAboveFirst float32 "nbt:\"per_level_above_first\"" Type string "nbt:\"type\"" } "nbt:\"value\"" } "nbt:\"radius\"" Type string "nbt:\"type\"" } "nbt:\"predicate\"" TriggerGameEvent string "nbt:\"trigger_game_event\"" Type string "nbt:\"type\"" } "nbt:\"effect\"" Requirements struct { Condition string "nbt:\"condition\"" Entity string "nbt:\"state\"" Predicate struct { Flags struct { IsOnGround bool "nbt:\"is_on_ground\"" } "nbt:\"flags\"" } "nbt:\"predicate\"" } "nbt:\"requirements\"" } "nbt:\"minecraft:location_changed\"" DamageImmunity []struct { Effect struct{} Requirements struct { Condition string "nbt:\"condition\"" Predicate struct { Tags []struct { Expected bool "nbt:\"expected\"" Id string "nbt:\"id\"" } "nbt:\"tags\"" } "nbt:\"predicate\"" } "nbt:\"requirements\"" } "nbt:\"minecraft:damage_immunity\"" DamageProtection []struct { Effect struct { Type string "nbt:\"type\"" Value struct { Base float32 "nbt:\"base\"" PerLevelAboveFirst float32 "nbt:\"per_level_above_first\"" Type string "nbt:\"type\"" } "nbt:\"value\"" } "nbt:\"effect\"" Requirements struct { Condition string "nbt:\"condition\"" Predicate struct { Tags []struct { Expected bool "nbt:\"expected\"" Id string "nbt:\"id\"" } "nbt:\"tags\"" } "nbt:\"predicate\"" Terms []struct { Condition string "nbt:\"condition\"" Predicate struct { Tags []struct { Expected bool "nbt:\"expected\"" Id string "nbt:\"id\"" } "nbt:\"tags\"" } "nbt:\"predicate\"" } "nbt:\"terms\"" } "nbt:\"requirements\"" } "nbt:\"minecraft:damage_protection\"" Damage []struct { Effect struct { Type string "nbt:\"type\"" Value struct { Base float32 "nbt:\"base\"" PerLevelAboveFirst float32 "nbt:\"per_level_above_first\"" Type string "nbt:\"type\"" } "nbt:\"value\"" } "nbt:\"effect\"" Requirements struct { Condition string "nbt:\"condition\"" Entity string "nbt:\"state\"" Predicate struct { Type string "nbt:\"type\"" } "nbt:\"predicate\"" } "nbt:\"requirements\"" } "nbt:\"minecraft:damage\"" PostAttack []struct { Affected string "nbt:\"affected\"" Effect struct { MaxAmplifier float32 "nbt:\"max_amplifier\"" MaxDuration struct { Base float32 "nbt:\"base\"" PerLevelAboveFirst float32 "nbt:\"per_level_above_first\"" Type string "nbt:\"type\"" } "nbt:\"max_duration\"" Duration struct { Base float32 "nbt:\"base\"" PerLevelAboveFirst float32 "nbt:\"per_level_above_first\"" Type string "nbt:\"type\"" } "nbt:\"duration\"" MinAmplifier float32 "nbt:\"min_amplifier\"" MinDuration float32 "nbt:\"min_duration\"" ToApply string "nbt:\"to_apply\"" Type string "nbt:\"type\"" Effects []struct { Type string "nbt:\"type\"" Entity string "nbt:\"state\"" Pitch float32 "nbt:\"pitch\"" Sound string "nbt:\"sound\"" Volume float32 "nbt:\"volume\"" } "nbt:\"effects\"" } "nbt:\"effect\"" Enchanted string "nbt:\"enchanted\"" Requirements struct { Condition string "nbt:\"condition\"" Predicate struct { IsDirect bool "nbt:\"is_direct\"" } "nbt:\"predicate\"" Terms []struct { Condition string "nbt:\"condition\"" Thundering bool "nbt:\"thundering\"" Entity string "nbt:\"state\"" Predicate struct { IsDirect bool "nbt:\"is_direct\"" Type string "nbt:\"type\"" Location struct { CanSeeSky bool "nbt:\"can_see_sky\"" } "nbt:\"location\"" } "nbt:\"predicate\"" } "nbt:\"terms\"" } "nbt:\"requirements\"" } "nbt:\"minecraft:post_attack\"" } "nbt:\"effects\"" MaxCost struct { Base int32 "nbt:\"base\"" PerLevelAboveFirst int32 "nbt:\"per_level_above_first\"" } "nbt:\"max_cost\"" MinCost struct { Base int32 "nbt:\"base\"" PerLevelAboveFirst int32 "nbt:\"per_level_above_first\"" } "nbt:\"min_cost\"" MaxLevel int32 "nbt:\"max_level\"" Slots []string "nbt:\"slots\"" SupportedItems string "nbt:\"supported_items\"" Weight int32 "nbt:\"weight\"" ExclusiveSet string "nbt:\"exclusive_set\"" PrimaryItems string "nbt:\"primary_items\"" }(nil), "minecraft:jukebox_song": map[string]struct { ComparatorOutput int32 "nbt:\"comparator_output\"" Description struct { Translate string "nbt:\"translate\"" } "nbt:\"description\"" LengthInSeconds float32 "nbt:\"length_in_seconds\"" SoundEvent string "nbt:\"sound_event\"" }{"minecraft:11": {ComparatorOutput: 11, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.11"}, LengthInSeconds: 71, SoundEvent: "minecraft:music_disc.11"}, "minecraft:13": {ComparatorOutput: 1, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.13"}, LengthInSeconds: 178, SoundEvent: "minecraft:music_disc.13"}, "minecraft:5": {ComparatorOutput: 15, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.5"}, LengthInSeconds: 178, SoundEvent: "minecraft:music_disc.5"}, "minecraft:blocks": {ComparatorOutput: 3, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.blocks"}, LengthInSeconds: 345, SoundEvent: "minecraft:music_disc.blocks"}, "minecraft:cat": {ComparatorOutput: 2, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.cat"}, LengthInSeconds: 185, SoundEvent: "minecraft:music_disc.cat"}, "minecraft:chirp": {ComparatorOutput: 4, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.chirp"}, LengthInSeconds: 185, SoundEvent: "minecraft:music_disc.chirp"}, "minecraft:creator": {ComparatorOutput: 12, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.creator"}, LengthInSeconds: 176, SoundEvent: "minecraft:music_disc.creator"}, "minecraft:creator_music_box": {ComparatorOutput: 11, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.creator_music_box"}, LengthInSeconds: 73, SoundEvent: "minecraft:music_disc.creator_music_box"}, "minecraft:far": {ComparatorOutput: 5, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.far"}, LengthInSeconds: 174, SoundEvent: "minecraft:music_disc.far"}, "minecraft:mall": {ComparatorOutput: 6, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.mall"}, LengthInSeconds: 197, SoundEvent: "minecraft:music_disc.mall"}, "minecraft:mellohi": {ComparatorOutput: 7, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.mellohi"}, LengthInSeconds: 96, SoundEvent: "minecraft:music_disc.mellohi"}, "minecraft:otherside": {ComparatorOutput: 14, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.otherside"}, LengthInSeconds: 195, SoundEvent: "minecraft:music_disc.otherside"}, "minecraft:pigstep": {ComparatorOutput: 13, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.pigstep"}, LengthInSeconds: 149, SoundEvent: "minecraft:music_disc.pigstep"}, "minecraft:precipice": {ComparatorOutput: 13, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.precipice"}, LengthInSeconds: 299, SoundEvent: "minecraft:music_disc.precipice"}, "minecraft:relic": {ComparatorOutput: 14, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.relic"}, LengthInSeconds: 218, SoundEvent: "minecraft:music_disc.relic"}, "minecraft:stal": {ComparatorOutput: 8, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.stal"}, LengthInSeconds: 150, SoundEvent: "minecraft:music_disc.stal"}, "minecraft:strad": {ComparatorOutput: 9, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.strad"}, LengthInSeconds: 188, SoundEvent: "minecraft:music_disc.strad"}, "minecraft:wait": {ComparatorOutput: 12, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.wait"}, LengthInSeconds: 238, SoundEvent: "minecraft:music_disc.wait"}, "minecraft:ward": {ComparatorOutput: 10, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "jukebox_song.minecraft.ward"}, LengthInSeconds: 251, SoundEvent: "minecraft:music_disc.ward"}}, "minecraft:painting_variant": map[string]struct { AssetId string "nbt:\"asset_id\"" Height int32 "nbt:\"height\"" Weight int32 "nbt:\"width\"" }{"minecraft:alban": {AssetId: "minecraft:alban", Height: 1, Weight: 1}, "minecraft:aztec": {AssetId: "minecraft:aztec", Height: 1, Weight: 1}, "minecraft:aztec2": {AssetId: "minecraft:aztec2", Height: 1, Weight: 1}, "minecraft:backyard": {AssetId: "minecraft:backyard", Height: 4, Weight: 3}, "minecraft:baroque": {AssetId: "minecraft:baroque", Height: 2, Weight: 2}, "minecraft:bomb": {AssetId: "minecraft:bomb", Height: 1, Weight: 1}, "minecraft:bouquet": {AssetId: "minecraft:bouquet", Height: 3, Weight: 3}, "minecraft:burning_skull": {AssetId: "minecraft:burning_skull", Height: 4, Weight: 4}, "minecraft:bust": {AssetId: "minecraft:bust", Height: 2, Weight: 2}, "minecraft:cavebird": {AssetId: "minecraft:cavebird", Height: 3, Weight: 3}, "minecraft:changing": {AssetId: "minecraft:changing", Height: 2, Weight: 4}, "minecraft:cotan": {AssetId: "minecraft:cotan", Height: 3, Weight: 3}, "minecraft:courbet": {AssetId: "minecraft:courbet", Height: 1, Weight: 2}, "minecraft:creebet": {AssetId: "minecraft:creebet", Height: 1, Weight: 2}, "minecraft:donkey_kong": {AssetId: "minecraft:donkey_kong", Height: 3, Weight: 4}, "minecraft:earth": {AssetId: "minecraft:earth", Height: 2, Weight: 2}, "minecraft:endboss": {AssetId: "minecraft:endboss", Height: 3, Weight: 3}, "minecraft:fern": {AssetId: "minecraft:fern", Height: 3, Weight: 3}, "minecraft:fighters": {AssetId: "minecraft:fighters", Height: 2, Weight: 4}, "minecraft:finding": {AssetId: "minecraft:finding", Height: 2, Weight: 4}, "minecraft:fire": {AssetId: "minecraft:fire", Height: 2, Weight: 2}, "minecraft:graham": {AssetId: "minecraft:graham", Height: 2, Weight: 1}, "minecraft:humble": {AssetId: "minecraft:humble", Height: 2, Weight: 2}, "minecraft:kebab": {AssetId: "minecraft:kebab", Height: 1, Weight: 1}, "minecraft:lowmist": {AssetId: "minecraft:lowmist", Height: 2, Weight: 4}, "minecraft:match": {AssetId: "minecraft:match", Height: 2, Weight: 2}, "minecraft:meditative": {AssetId: "minecraft:meditative", Height: 1, Weight: 1}, "minecraft:orb": {AssetId: "minecraft:orb", Height: 4, Weight: 4}, "minecraft:owlemons": {AssetId: "minecraft:owlemons", Height: 3, Weight: 3}, "minecraft:passage": {AssetId: "minecraft:passage", Height: 2, Weight: 4}, "minecraft:pigscene": {AssetId: "minecraft:pigscene", Height: 4, Weight: 4}, "minecraft:plant": {AssetId: "minecraft:plant", Height: 1, Weight: 1}, "minecraft:pointer": {AssetId: "minecraft:pointer", Height: 4, Weight: 4}, "minecraft:pond": {AssetId: "minecraft:pond", Height: 4, Weight: 3}, "minecraft:pool": {AssetId: "minecraft:pool", Height: 1, Weight: 2}, "minecraft:prairie_ride": {AssetId: "minecraft:prairie_ride", Height: 2, Weight: 1}, "minecraft:sea": {AssetId: "minecraft:sea", Height: 1, Weight: 2}, "minecraft:skeleton": {AssetId: "minecraft:skeleton", Height: 3, Weight: 4}, "minecraft:skull_and_roses": {AssetId: "minecraft:skull_and_roses", Height: 2, Weight: 2}, "minecraft:stage": {AssetId: "minecraft:stage", Height: 2, Weight: 2}, "minecraft:sunflowers": {AssetId: "minecraft:sunflowers", Height: 3, Weight: 3}, "minecraft:sunset": {AssetId: "minecraft:sunset", Height: 1, Weight: 2}, "minecraft:tides": {AssetId: "minecraft:tides", Height: 3, Weight: 3}, "minecraft:unpacked": {AssetId: "minecraft:unpacked", Height: 4, Weight: 4}, "minecraft:void": {AssetId: "minecraft:void", Height: 2, Weight: 2}, "minecraft:wanderer": {AssetId: "minecraft:wanderer", Height: 2, Weight: 1}, "minecraft:wasteland": {AssetId: "minecraft:wasteland", Height: 1, Weight: 1}, "minecraft:water": {AssetId: "minecraft:water", Height: 2, Weight: 2}, "minecraft:wind": {AssetId: "minecraft:wind", Height: 2, Weight: 2}, "minecraft:wither": {AssetId: "minecraft:wither", Height: 2, Weight: 2}}, "minecraft:trim_material": map[string]struct { AssetName string "nbt:\"asset_name\"" Description struct { Color string "nbt:\"color\"" Translate string "nbt:\"translate\"" } "nbt:\"description\"" Ingredient string "nbt:\"ingredient\"" ItemModelIndex float32 "nbt:\"item_model_index\"" OverrideArmorMaterials struct { Diamond string "nbt:\"minecraft:diamond,omitempty\"" Gold string "nbt:\"minecraft:gold,omitempty\"" Iron string "nbt:\"minecraft:iron,omitempty\"" } "nbt:\"override_armor_materials,omitempty\"" }{"minecraft:amethyst": {AssetName: "amethyst", Description: struct { Color string "nbt:\"color\"" Translate string "nbt:\"translate\"" }{Color: "#9A5CC6", Translate: "trim_material.minecraft.amethyst"}, Ingredient: "minecraft:amethyst_shard", ItemModelIndex: 1, OverrideArmorMaterials: struct { Diamond string "nbt:\"minecraft:diamond,omitempty\"" Gold string "nbt:\"minecraft:gold,omitempty\"" Iron string "nbt:\"minecraft:iron,omitempty\"" }{Diamond: "", Gold: "", Iron: ""}}, "minecraft:copper": {AssetName: "copper", Description: struct { Color string "nbt:\"color\"" Translate string "nbt:\"translate\"" }{Color: "#B4684D", Translate: "trim_material.minecraft.copper"}, Ingredient: "minecraft:copper_ingot", ItemModelIndex: 0.5, OverrideArmorMaterials: struct { Diamond string "nbt:\"minecraft:diamond,omitempty\"" Gold string "nbt:\"minecraft:gold,omitempty\"" Iron string "nbt:\"minecraft:iron,omitempty\"" }{Diamond: "", Gold: "", Iron: ""}}, "minecraft:diamond": {AssetName: "diamond", Description: struct { Color string "nbt:\"color\"" Translate string "nbt:\"translate\"" }{Color: "#6EECD2", Translate: "trim_material.minecraft.diamond"}, Ingredient: "minecraft:diamond", ItemModelIndex: 0.8, OverrideArmorMaterials: struct { Diamond string "nbt:\"minecraft:diamond,omitempty\"" Gold string "nbt:\"minecraft:gold,omitempty\"" Iron string "nbt:\"minecraft:iron,omitempty\"" }{Diamond: "", Gold: "", Iron: ""}}, "minecraft:emerald": {AssetName: "emerald", Description: struct { Color string "nbt:\"color\"" Translate string "nbt:\"translate\"" }{Color: "#11A036", Translate: "trim_material.minecraft.emerald"}, Ingredient: "minecraft:emerald", ItemModelIndex: 0.7, OverrideArmorMaterials: struct { Diamond string "nbt:\"minecraft:diamond,omitempty\"" Gold string "nbt:\"minecraft:gold,omitempty\"" Iron string "nbt:\"minecraft:iron,omitempty\"" }{Diamond: "", Gold: "", Iron: ""}}, "minecraft:gold": {AssetName: "gold", Description: struct { Color string "nbt:\"color\"" Translate string "nbt:\"translate\"" }{Color: "#DEB12D", Translate: "trim_material.minecraft.gold"}, Ingredient: "minecraft:gold_ingot", ItemModelIndex: 0.6, OverrideArmorMaterials: struct { Diamond string "nbt:\"minecraft:diamond,omitempty\"" Gold string "nbt:\"minecraft:gold,omitempty\"" Iron string "nbt:\"minecraft:iron,omitempty\"" }{Diamond: "", Gold: "", Iron: ""}}, "minecraft:iron": {AssetName: "iron", Description: struct { Color string "nbt:\"color\"" Translate string "nbt:\"translate\"" }{Color: "#ECECEC", Translate: "trim_material.minecraft.iron"}, Ingredient: "minecraft:iron_ingot", ItemModelIndex: 0.2, OverrideArmorMaterials: struct { Diamond string "nbt:\"minecraft:diamond,omitempty\"" Gold string "nbt:\"minecraft:gold,omitempty\"" Iron string "nbt:\"minecraft:iron,omitempty\"" }{Diamond: "", Gold: "", Iron: ""}}, "minecraft:lapis": {AssetName: "lapis", Description: struct { Color string "nbt:\"color\"" Translate string "nbt:\"translate\"" }{Color: "#416E97", Translate: "trim_material.minecraft.lapis"}, Ingredient: "minecraft:lapis_lazuli", ItemModelIndex: 0.9, OverrideArmorMaterials: struct { Diamond string "nbt:\"minecraft:diamond,omitempty\"" Gold string "nbt:\"minecraft:gold,omitempty\"" Iron string "nbt:\"minecraft:iron,omitempty\"" }{Diamond: "", Gold: "", Iron: ""}}, "minecraft:netherite": {AssetName: "netherite", Description: struct { Color string "nbt:\"color\"" Translate string "nbt:\"translate\"" }{Color: "#625859", Translate: "trim_material.minecraft.netherite"}, Ingredient: "minecraft:netherite_ingot", ItemModelIndex: 0.3, OverrideArmorMaterials: struct { Diamond string "nbt:\"minecraft:diamond,omitempty\"" Gold string "nbt:\"minecraft:gold,omitempty\"" Iron string "nbt:\"minecraft:iron,omitempty\"" }{Diamond: "", Gold: "", Iron: ""}}, "minecraft:quartz": {AssetName: "quartz", Description: struct { Color string "nbt:\"color\"" Translate string "nbt:\"translate\"" }{Color: "#E3D4C4", Translate: "trim_material.minecraft.quartz"}, Ingredient: "minecraft:quartz", ItemModelIndex: 0.1, OverrideArmorMaterials: struct { Diamond string "nbt:\"minecraft:diamond,omitempty\"" Gold string "nbt:\"minecraft:gold,omitempty\"" Iron string "nbt:\"minecraft:iron,omitempty\"" }{Diamond: "", Gold: "", Iron: ""}}, "minecraft:redstone": {AssetName: "redstone", Description: struct { Color string "nbt:\"color\"" Translate string "nbt:\"translate\"" }{Color: "#971607", Translate: "trim_material.minecraft.redstone"}, Ingredient: "minecraft:redstone", ItemModelIndex: 0.4, OverrideArmorMaterials: struct { Diamond string "nbt:\"minecraft:diamond,omitempty\"" Gold string "nbt:\"minecraft:gold,omitempty\"" Iron string "nbt:\"minecraft:iron,omitempty\"" }{Diamond: "", Gold: "", Iron: ""}}}, "minecraft:trim_pattern": map[string]struct { AssetId string "nbt:\"asset_id\"" Decal bool "nbt:\"decal\"" Description struct { Translate string "nbt:\"translate\"" } "nbt:\"description\"" TemplateItem string "nbt:\"template_item\"" }{"minecraft:bolt": {AssetId: "minecraft:bolt", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.bolt"}, TemplateItem: "minecraft:bolt_armor_trim_smithing_template"}, "minecraft:coast": {AssetId: "minecraft:coast", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.coast"}, TemplateItem: "minecraft:coast_armor_trim_smithing_template"}, "minecraft:dune": {AssetId: "minecraft:dune", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.dune"}, TemplateItem: "minecraft:dune_armor_trim_smithing_template"}, "minecraft:eye": {AssetId: "minecraft:eye", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.eye"}, TemplateItem: "minecraft:eye_armor_trim_smithing_template"}, "minecraft:flow": {AssetId: "minecraft:flow", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.flow"}, TemplateItem: "minecraft:flow_armor_trim_smithing_template"}, "minecraft:host": {AssetId: "minecraft:host", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.host"}, TemplateItem: "minecraft:host_armor_trim_smithing_template"}, "minecraft:raiser": {AssetId: "minecraft:raiser", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.raiser"}, TemplateItem: "minecraft:raiser_armor_trim_smithing_template"}, "minecraft:rib": {AssetId: "minecraft:rib", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.rib"}, TemplateItem: "minecraft:rib_armor_trim_smithing_template"}, "minecraft:sentry": {AssetId: "minecraft:sentry", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.sentry"}, TemplateItem: "minecraft:sentry_armor_trim_smithing_template"}, "minecraft:shaper": {AssetId: "minecraft:shaper", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.shaper"}, TemplateItem: "minecraft:shaper_armor_trim_smithing_template"}, "minecraft:silence": {AssetId: "minecraft:silence", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.silence"}, TemplateItem: "minecraft:silence_armor_trim_smithing_template"}, "minecraft:snout": {AssetId: "minecraft:snout", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.snout"}, TemplateItem: "minecraft:snout_armor_trim_smithing_template"}, "minecraft:spire": {AssetId: "minecraft:spire", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.spire"}, TemplateItem: "minecraft:spire_armor_trim_smithing_template"}, "minecraft:tide": {AssetId: "minecraft:tide", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.tide"}, TemplateItem: "minecraft:tide_armor_trim_smithing_template"}, "minecraft:vex": {AssetId: "minecraft:vex", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.vex"}, TemplateItem: "minecraft:vex_armor_trim_smithing_template"}, "minecraft:ward": {AssetId: "minecraft:ward", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.ward"}, TemplateItem: "minecraft:ward_armor_trim_smithing_template"}, "minecraft:wayfinder": {AssetId: "minecraft:wayfinder", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.wayfinder"}, TemplateItem: "minecraft:wayfinder_armor_trim_smithing_template"}, "minecraft:wild": {AssetId: "minecraft:wild", Decal: false, Description: struct { Translate string "nbt:\"translate\"" }{Translate: "trim_pattern.minecraft.wild"}, TemplateItem: "minecraft:wild_armor_trim_smithing_template"}}, "minecraft:wolf_variant": map[string]struct { AngryTexture string "nbt:\"angry_texture\"" Biomes string "nbt:\"biomes\"" TameTexture string "nbt:\"tame_texture\"" WildTexture string "nbt:\"wild_texture\"" }{"minecraft:ashen": {AngryTexture: "minecraft:state/wolf/wolf_ashen_angry", Biomes: "minecraft:snowy_taiga", TameTexture: "minecraft:state/wolf/wolf_ashen_tame", WildTexture: "minecraft:state/wolf/wolf_ashen"}, "minecraft:black": {AngryTexture: "minecraft:state/wolf/wolf_black_angry", Biomes: "minecraft:old_growth_pine_taiga", TameTexture: "minecraft:state/wolf/wolf_black_tame", WildTexture: "minecraft:state/wolf/wolf_black"}, "minecraft:chestnut": {AngryTexture: "minecraft:state/wolf/wolf_chestnut_angry", Biomes: "minecraft:old_growth_spruce_taiga", TameTexture: "minecraft:state/wolf/wolf_chestnut_tame", WildTexture: "minecraft:state/wolf/wolf_chestnut"}, "minecraft:pale": {AngryTexture: "minecraft:state/wolf/wolf_angry", Biomes: "minecraft:taiga", TameTexture: "minecraft:state/wolf/wolf_tame", WildTexture: "minecraft:state/wolf/wolf"}, "minecraft:rusty": {AngryTexture: "minecraft:state/wolf/wolf_rusty_angry", Biomes: "#minecraft:is_jungle", TameTexture: "minecraft:state/wolf/wolf_rusty_tame", WildTexture: "minecraft:state/wolf/wolf_rusty"}, "minecraft:snowy": {AngryTexture: "minecraft:state/wolf/wolf_snowy_angry", Biomes: "minecraft:grove", TameTexture: "minecraft:state/wolf/wolf_snowy_tame", WildTexture: "minecraft:state/wolf/wolf_snowy"}, "minecraft:spotted": {AngryTexture: "minecraft:state/wolf/wolf_spotted_angry", Biomes: "#minecraft:is_savanna", TameTexture: "minecraft:state/wolf/wolf_spotted_tame", WildTexture: "minecraft:state/wolf/wolf_spotted"}, "minecraft:striped": {AngryTexture: "minecraft:state/wolf/wolf_striped_angry", Biomes: "#minecraft:is_badlands", TameTexture: "minecraft:state/wolf/wolf_striped_tame", WildTexture: "minecraft:state/wolf/wolf_striped"}, "minecraft:woods": {AngryTexture: "minecraft:state/wolf/wolf_woods_angry", Biomes: "minecraft:forest", TameTexture: "minecraft:state/wolf/wolf_woods_tame", WildTexture: "minecraft:state/wolf/wolf_woods"}}, "minecraft:worldgen/biome": map[string]struct { Downfall float32 "nbt:\"downfall\"" Effects struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" } "nbt:\"effects\"" HasPrecipitation bool "nbt:\"has_precipitation\"" Temperature float32 "nbt:\"temperature\"" }{"minecraft:badlands": {Downfall: 0, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7254527, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 2}, "minecraft:bamboo_jungle": {Downfall: 0.9, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7842047, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.95}, "minecraft:basalt_deltas": {Downfall: 0, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 6840176, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.basalt_deltas.mood", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7254527, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 2}, "minecraft:beach": {Downfall: 0.4, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7907327, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.8}, "minecraft:birch_forest": {Downfall: 0.6, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8037887, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.6}, "minecraft:cherry_grove": {Downfall: 0.8, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8103167, WaterColor: 6141935, WaterFogColor: 6141935}, HasPrecipitation: true, Temperature: 0.5}, "minecraft:cold_ocean": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8103167, WaterColor: 4020182, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.5}, "minecraft:crimson_forest": {Downfall: 0, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 3343107, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.crimson_forest.mood", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7254527, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 2}, "minecraft:dark_forest": {Downfall: 0.8, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7972607, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.7}, "minecraft:deep_cold_ocean": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8103167, WaterColor: 4020182, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.5}, "minecraft:deep_dark": {Downfall: 0.4, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7907327, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.8}, "minecraft:deep_frozen_ocean": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8103167, WaterColor: 3750089, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.5}, "minecraft:deep_lukewarm_ocean": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8103167, WaterColor: 4566514, WaterFogColor: 267827}, HasPrecipitation: true, Temperature: 0.5}, "minecraft:deep_ocean": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8103167, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.5}, "minecraft:desert": {Downfall: 0, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7254527, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 2}, "minecraft:dripstone_caves": {Downfall: 0.4, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7907327, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.8}, "minecraft:end_barrens": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 10518688, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 0, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 0.5}, "minecraft:end_highlands": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 10518688, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 0, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 0.5}, "minecraft:end_midlands": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 10518688, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 0, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 0.5}, "minecraft:eroded_badlands": {Downfall: 0, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7254527, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 2}, "minecraft:flower_forest": {Downfall: 0.8, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7972607, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.7}, "minecraft:forest": {Downfall: 0.8, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7972607, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.7}, "minecraft:frozen_ocean": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8364543, WaterColor: 3750089, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0}, "minecraft:frozen_peaks": {Downfall: 0.9, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8756735, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: -0.7}, "minecraft:frozen_river": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8364543, WaterColor: 3750089, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0}, "minecraft:grove": {Downfall: 0.8, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8495359, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: -0.2}, "minecraft:ice_spikes": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8364543, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0}, "minecraft:jagged_peaks": {Downfall: 0.9, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8756735, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: -0.7}, "minecraft:jungle": {Downfall: 0.9, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7842047, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.95}, "minecraft:lukewarm_ocean": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8103167, WaterColor: 4566514, WaterFogColor: 267827}, HasPrecipitation: true, Temperature: 0.5}, "minecraft:lush_caves": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8103167, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.5}, "minecraft:mangrove_swamp": {Downfall: 0.9, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7907327, WaterColor: 3832426, WaterFogColor: 5077600}, HasPrecipitation: true, Temperature: 0.8}, "minecraft:meadow": {Downfall: 0.8, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8103167, WaterColor: 937679, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.5}, "minecraft:mushroom_fields": {Downfall: 1, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7842047, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.9}, "minecraft:nether_wastes": {Downfall: 0, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 3344392, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.nether_wastes.mood", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7254527, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 2}, "minecraft:ocean": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8103167, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.5}, "minecraft:old_growth_birch_forest": {Downfall: 0.6, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8037887, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.6}, "minecraft:old_growth_pine_taiga": {Downfall: 0.8, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8168447, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.3}, "minecraft:old_growth_spruce_taiga": {Downfall: 0.8, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8233983, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.25}, "minecraft:plains": {Downfall: 0.4, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7907327, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.8}, "minecraft:river": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8103167, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.5}, "minecraft:savanna": {Downfall: 0, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7254527, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 2}, "minecraft:savanna_plateau": {Downfall: 0, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7254527, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 2}, "minecraft:small_end_islands": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 10518688, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 0, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 0.5}, "minecraft:snowy_beach": {Downfall: 0.3, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8364543, WaterColor: 4020182, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.05}, "minecraft:snowy_plains": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8364543, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0}, "minecraft:snowy_slopes": {Downfall: 0.9, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8560639, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: -0.3}, "minecraft:snowy_taiga": {Downfall: 0.4, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8625919, WaterColor: 4020182, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: -0.5}, "minecraft:soul_sand_valley": {Downfall: 0, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 1787717, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.soul_sand_valley.mood", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7254527, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 2}, "minecraft:sparse_jungle": {Downfall: 0.8, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7842047, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.95}, "minecraft:stony_peaks": {Downfall: 0.3, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7776511, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 1}, "minecraft:stony_shore": {Downfall: 0.3, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8233727, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.2}, "minecraft:sunflower_plains": {Downfall: 0.4, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7907327, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.8}, "minecraft:swamp": {Downfall: 0.9, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7907327, WaterColor: 6388580, WaterFogColor: 2302743}, HasPrecipitation: true, Temperature: 0.8}, "minecraft:taiga": {Downfall: 0.8, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8233983, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.25}, "minecraft:the_end": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 10518688, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 0, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 0.5}, "minecraft:the_void": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8103167, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 0.5}, "minecraft:warm_ocean": {Downfall: 0.5, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8103167, WaterColor: 4445678, WaterFogColor: 270131}, HasPrecipitation: true, Temperature: 0.5}, "minecraft:warped_forest": {Downfall: 0, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 1705242, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.warped_forest.mood", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7254527, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 2}, "minecraft:windswept_forest": {Downfall: 0.3, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8233727, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.2}, "minecraft:windswept_gravelly_hills": {Downfall: 0.3, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8233727, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.2}, "minecraft:windswept_hills": {Downfall: 0.3, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 8233727, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: true, Temperature: 0.2}, "minecraft:windswept_savanna": {Downfall: 0, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7254527, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 2}, "minecraft:wooded_badlands": {Downfall: 0, Effects: struct { FogColor int32 "nbt:\"fog_color\"" FoliageColor int32 "nbt:\"foliage_color,omitempty\"" GrassColor int32 "nbt:\"grass_color,omitempty\"" MoodSound struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" } "nbt:\"mood_sound\"" Music struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" } "nbt:\"music,omitempty\"" SkyColor int32 "nbt:\"sky_color\"" WaterColor int32 "nbt:\"water_color\"" WaterFogColor int32 "nbt:\"water_fog_color\"" }{FogColor: 12638463, FoliageColor: 0, GrassColor: 0, MoodSound: struct { BlockSearchExtent int32 "nbt:\"block_search_extent\"" Offset float64 "nbt:\"offset\"" Sound string "nbt:\"sound\"" TickDelay int32 "nbt:\"tick_delay\"" }{BlockSearchExtent: 8, Offset: 2, Sound: "minecraft:ambient.cave", TickDelay: 6000}, Music: struct { MaxDelay int32 "nbt:\"max_delay\"" MinDelay int32 "nbt:\"min_delay\"" ReplaceCurrentMusic bool "nbt:\"replace_current_music\"" Sound string "nbt:\"sound\"" }{MaxDelay: 0, MinDelay: 0, ReplaceCurrentMusic: false, Sound: ""}, SkyColor: 7254527, WaterColor: 4159204, WaterFogColor: 329011}, HasPrecipitation: false, Temperature: 2}}} ================================================ FILE: protocol/net/registry/registry.go ================================================ package registry import ( _ "embed" ) // This packet contains registries that are sent to the client. Because Go maps aren't ordered, sending a registry data packet will set its Indexes field to the order in which its entries were encoded, which can then be used to get registry ids type ChatType struct { Chat struct { Parameters []string `nbt:"parameters"` TranslationKey string `nbt:"translation_key"` Style struct { Color string `nbt:"color"` Italic bool `nbt:"italic"` } `nbt:"style,omitempty"` } `nbt:"chat"` Narration struct { Parameters []string `nbt:"parameters"` TranslationKey string `nbt:"translation_key"` } `nbt:"narration"` } type Dimension1 struct { FixedTime int64 `nbt:"fixed_time,omitempty"` AmbientLight float32 `nbt:"ambient_light"` BedWorks bool `nbt:"bed_works"` CoordinateScale float64 `nbt:"coordinate_scale"` Effects string `nbt:"effects"` HasCeiling bool `nbt:"has_ceiling"` HasRaids bool `nbt:"has_raids"` HasSkylight bool `nbt:"has_skylight"` Height int32 `nbt:"height"` Infiniburn string `nbt:"infiniburn"` LogicalHeight int32 `nbt:"logical_height"` MinY int32 `nbt:"min_y"` MonsterSpawnBlockLightLimit int32 `nbt:"monster_spawn_block_light_limit"` Natural bool `nbt:"natural"` Ultrawarm bool `nbt:"ultrawarm"` PiglinSafe bool `nbt:"piglin_safe"` RespawnAnchorWorks bool `nbt:"respawn_anchor_works"` MonsterSpawnLightLevel int32 `nbt:"monster_spawn_light_level"` } type Dimension struct { FixedTime int64 `nbt:"fixed_time,omitempty"` AmbientLight float32 `nbt:"ambient_light"` BedWorks bool `nbt:"bed_works"` CoordinateScale float64 `nbt:"coordinate_scale"` Effects string `nbt:"effects"` HasCeiling bool `nbt:"has_ceiling"` HasRaids bool `nbt:"has_raids"` HasSkylight bool `nbt:"has_skylight"` Height int32 `nbt:"height"` Infiniburn string `nbt:"infiniburn"` LogicalHeight int32 `nbt:"logical_height"` MinY int32 `nbt:"min_y"` MonsterSpawnBlockLightLimit int32 `nbt:"monster_spawn_block_light_limit"` Natural bool `nbt:"natural"` Ultrawarm bool `nbt:"ultrawarm"` PiglinSafe bool `nbt:"piglin_safe"` RespawnAnchorWorks bool `nbt:"respawn_anchor_works"` MonsterSpawnLightLevel struct { MaxInclusive int32 `nbt:"max_inclusive"` MinInclusive int32 `nbt:"min_inclusive"` Type string `nbt:"type"` } `nbt:"monster_spawn_light_level"` } /*type registries struct { BannerPattern map[string]struct { AssetId string `nbt:"asset_id"` TranslationKey string `nbt:"translation_key"` } `nbt:"minecraft:banner_pattern"` ChatType map[string]ChatType `nbt:"minecraft:chat_type"` DamageType map[string]struct { Exhaustion float32 `nbt:"exhaustion"` MessageID string `nbt:"message_id"` Scaling string `nbt:"scaling"` DeathMessageType string `nbt:"death_message_type,omitempty"` Effects string `nbt:"effects,omitempty"` } `nbt:"minecraft:damage_type"` DimensionType struct { Overworld Dimension `nbt:"minecraft:overworld"` OverworldCaves Dimension `nbt:"minecraft:overworld_caves"` TheEnd Dimension `nbt:"minecraft:the_end"` TheNether Dimension1 `nbt:"minecraft:the_nether"` } `nbt:"minecraft:dimension_type"` Enchantment map[string]struct { AnvilCost int32 `nbt:"anvil_cost"` Description struct { Translate string `nbt:"translate"` } `nbt:"description"` Effects struct { SmashDamagePerFallenBlock []struct { Effect struct { Type string `nbt:"type"` Value struct { Base float32 `nbt:"base"` PerLevelAboveFirst float32 `nbt:"per_level_above_first"` Type string `nbt:"type"` } `nbt:"value"` } `nbt:"effect"` } `nbt:"minecraft:smash_damage_per_fallen_block"` PreventArmorChange struct{} `nbt:"minecraft:prevent_armor_change"` HitBlock []struct { Effect struct { Effects []struct { Type string `nbt:"type"` Entity string `nbt:"state"` Pitch float32 `nbt:"pitch"` Sound string `nbt:"sound"` Volume float32 `nbt:"volume"` } `nbt:"effects"` Type string `nbt:"type"` } `nbt:"effect"` Requirements struct { Condition string `nbt:"condition"` Terms []struct { Block string `nbt:"block"` Condition string `nbt:"condition"` Thundering bool `nbt:"thundering"` Entity string `nbt:"state"` Predicate struct { Type string `nbt:"type"` CanSeeSky bool `nbt:"can_see_sky"` } `nbt:"predicate"` } `nbt:"terms"` } `nbt:"requirements"` } `nbt:"minecraft:hit_block"` ArmorEffectiveness []struct { Effect struct { Type string `nbt:"type"` Value struct { Base float32 `nbt:"base"` PerLevelAboveFirst float32 `nbt:"per_level_above_first"` Type string `nbt:"type"` } `nbt:"value"` } `nbt:"effect"` } `nbt:"minecraft:armor_effectiveness"` Attributes []struct { Amount struct { Added float32 `nbt:"added"` Base float32 `nbt:"base"` PerLevelAboveFirst float32 `nbt:"per_level_above_first"` Type string `nbt:"type"` } `nbt:"amount"` Atrribute string `nbt:"attribute"` Id string `nbt:"id"` Operation string `nbt:"operation"` } `nbt:"minecraft:attributes"` AmmoUse []struct { Effect struct { Type string `nbt:"type"` Value float32 `nbt:"value"` } `nbt:"effect"` Requirements struct { Condition string `nbt:"condition"` Predicate struct { Items string `nbt:"items"` } `nbt:"predicate"` } `nbt:"requirements"` } `nbt:"minecraft:ammo_use"` ProjectileSpawned []struct { Effect struct { Duration float32 `nbt:"duration"` Type string `nbt:"type"` } `nbt:"effect"` } `nbt:"minecraft:projectile_spawned"` LocationChanged []struct { Effect struct { BlockState struct { State struct { Name string Properties map[string]any } `nbt:"state"` Type string `nbt:"type"` } `nbt:"block_state"` Height float32 `nbt:"height"` Offset []int32 `nbt:"offset"` Predicate struct { Predicates []struct { Offset []int32 `nbt:"offset"` Tag string `nbt:"tag"` Type string `nbt:"type"` Blocks string `nbt:"blocks"` Fluids string `nbt:"fluids"` } `nbt:"predicates"` Radius struct { Max float32 `nbt:"max"` Min float32 `nbt:"min"` Type string `nbt:"type"` Value struct { Base float32 `nbt:"base"` PerLevelAboveFirst float32 `nbt:"per_level_above_first"` Type string `nbt:"type"` } `nbt:"value"` } `nbt:"radius"` Type string `nbt:"type"` } `nbt:"predicate"` TriggerGameEvent string `nbt:"trigger_game_event"` Type string `nbt:"type"` } `nbt:"effect"` Requirements struct { Condition string `nbt:"condition"` Entity string `nbt:"state"` Predicate struct { Flags struct { IsOnGround bool `nbt:"is_on_ground"` } `nbt:"flags"` } `nbt:"predicate"` } `nbt:"requirements"` } `nbt:"minecraft:location_changed"` DamageImmunity []struct { Effect struct{} Requirements struct { Condition string `nbt:"condition"` Predicate struct { Tags []struct { Expected bool `nbt:"expected"` Id string `nbt:"id"` } `nbt:"tags"` } `nbt:"predicate"` } `nbt:"requirements"` } `nbt:"minecraft:damage_immunity"` DamageProtection []struct { Effect struct { Type string `nbt:"type"` Value struct { Base float32 `nbt:"base"` PerLevelAboveFirst float32 `nbt:"per_level_above_first"` Type string `nbt:"type"` } `nbt:"value"` } `nbt:"effect"` Requirements struct { Condition string `nbt:"condition"` Predicate struct { Tags []struct { Expected bool `nbt:"expected"` Id string `nbt:"id"` } `nbt:"tags"` } `nbt:"predicate"` Terms []struct { Condition string `nbt:"condition"` Predicate struct { Tags []struct { Expected bool `nbt:"expected"` Id string `nbt:"id"` } `nbt:"tags"` } `nbt:"predicate"` } `nbt:"terms"` } `nbt:"requirements"` } `nbt:"minecraft:damage_protection"` Damage []struct { Effect struct { Type string `nbt:"type"` Value struct { Base float32 `nbt:"base"` PerLevelAboveFirst float32 `nbt:"per_level_above_first"` Type string `nbt:"type"` } `nbt:"value"` } `nbt:"effect"` Requirements struct { Condition string `nbt:"condition"` Entity string `nbt:"state"` Predicate struct { Type string `nbt:"type"` } `nbt:"predicate"` } `nbt:"requirements"` } `nbt:"minecraft:damage"` PostAttack []struct { Affected string `nbt:"affected"` Effect struct { MaxAmplifier float32 `nbt:"max_amplifier"` MaxDuration struct { Base float32 `nbt:"base"` PerLevelAboveFirst float32 `nbt:"per_level_above_first"` Type string `nbt:"type"` } `nbt:"max_duration"` Duration struct { Base float32 `nbt:"base"` PerLevelAboveFirst float32 `nbt:"per_level_above_first"` Type string `nbt:"type"` } `nbt:"duration"` MinAmplifier float32 `nbt:"min_amplifier"` MinDuration float32 `nbt:"min_duration"` ToApply string `nbt:"to_apply"` Type string `nbt:"type"` Effects []struct { Type string `nbt:"type"` Entity string `nbt:"state"` Pitch float32 `nbt:"pitch"` Sound string `nbt:"sound"` Volume float32 `nbt:"volume"` } `nbt:"effects"` } `nbt:"effect"` Enchanted string `nbt:"enchanted"` Requirements struct { Condition string `nbt:"condition"` Predicate struct { IsDirect bool `nbt:"is_direct"` } `nbt:"predicate"` Terms []struct { Condition string `nbt:"condition"` Thundering bool `nbt:"thundering"` Entity string `nbt:"state"` Predicate struct { IsDirect bool `nbt:"is_direct"` Type string `nbt:"type"` Location struct { CanSeeSky bool `nbt:"can_see_sky"` } `nbt:"location"` } `nbt:"predicate"` } `nbt:"terms"` } `nbt:"requirements"` } `nbt:"minecraft:post_attack"` } `nbt:"effects"` MaxCost struct { Base int32 `nbt:"base"` PerLevelAboveFirst int32 `nbt:"per_level_above_first"` } `nbt:"max_cost"` MinCost struct { Base int32 `nbt:"base"` PerLevelAboveFirst int32 `nbt:"per_level_above_first"` } `nbt:"min_cost"` MaxLevel int32 `nbt:"max_level"` Slots []string `nbt:"slots"` SupportedItems string `nbt:"supported_items"` Weight int32 `nbt:"weight"` ExclusiveSet string `nbt:"exclusive_set"` PrimaryItems string `nbt:"primary_items"` } `nbt:"minecraft:enchantment"` JukeboxSong map[string]struct { ComparatorOutput int32 `nbt:"comparator_output"` Description struct { Translate string `nbt:"translate"` } `nbt:"description"` LengthInSeconds float32 `nbt:"length_in_seconds"` SoundEvent string `nbt:"sound_event"` } `nbt:"minecraft:jukebox_song"` PaintingVariant map[string]struct { AssetId string `nbt:"asset_id"` Height int32 `nbt:"height"` Weight int32 `nbt:"width"` } `nbt:"minecraft:painting_variant"` TrimMaterial map[string]struct { AssetName string `nbt:"asset_name"` Description struct { Color string `nbt:"color"` Translate string `nbt:"translate"` } `nbt:"description"` Ingredient string `nbt:"ingredient"` ItemModelIndex float32 `nbt:"item_model_index"` OverrideArmorMaterials struct { Diamond string `nbt:"minecraft:diamond,omitempty"` Gold string `nbt:"minecraft:gold,omitempty"` Iron string `nbt:"minecraft:iron,omitempty"` } `nbt:"override_armor_materials,omitempty"` } `nbt:"minecraft:trim_material"` TrimPattern map[string]struct { AssetId string `nbt:"asset_id"` Decal bool `nbt:"decal"` Description struct { Translate string `nbt:"translate"` } `nbt:"description"` TemplateItem string `nbt:"template_item"` } `nbt:"minecraft:trim_pattern"` WolfVariant map[string]struct { AngryTexture string `nbt:"angry_texture"` Biomes string `nbt:"biomes"` TameTexture string `nbt:"tame_texture"` WildTexture string `nbt:"wild_texture"` } `nbt:"minecraft:wolf_variant"` WorldgenBiome map[string]struct { Downfall float32 `nbt:"downfall"` Effects struct { FogColor int32 `nbt:"fog_color"` FoliageColor int32 `nbt:"foliage_color,omitempty"` GrassColor int32 `nbt:"grass_color,omitempty"` MoodSound struct { BlockSearchExtent int32 `nbt:"block_search_extent"` Offset float64 `nbt:"offset"` Sound string `nbt:"sound"` TickDelay int32 `nbt:"tick_delay"` } `nbt:"mood_sound"` Music struct { MaxDelay int32 `nbt:"max_delay"` MinDelay int32 `nbt:"min_delay"` ReplaceCurrentMusic bool `nbt:"replace_current_music"` Sound string `nbt:"sound"` } `nbt:"music,omitempty"` SkyColor int32 `nbt:"sky_color"` WaterColor int32 `nbt:"water_color"` WaterFogColor int32 `nbt:"water_fog_color"` } `nbt:"effects"` HasPrecipitation bool `nbt:"has_precipitation"` Temperature float32 `nbt:"temperature"` } `nbt:"minecraft:worldgen/biome"` }*/ /*func init() { v := reflect.ValueOf(Registries) for i := 0; i < v.NumField(); i++ { RegistryMap[v.Type().Field(i).Tag.Get("nbt")] = v.Field(i).Interface() } os.WriteFile("d.go", fmt.Appendf(nil, "package registry\n\nvar Registries = %#v", RegistryMap), 0755) } */ ================================================ FILE: protocol/net/slot/comp_dec.go ================================================ package slot import ( "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/text" ) func decode(r encoding.Reader, comp *Component) error { switch comp.Type { case CustomData: comp.Data = make(map[string]any) if err := r.NBT(&comp.Data); err != nil { return err } case MaxStackSize, Damage, MaxDamage, Rarity: var data int32 if _, err := r.VarInt(&data); err != nil { return err } comp.Data = data case Unbreakable: var data bool if err := r.Bool(&data); err != nil { return err } comp.Data = data case ItemName, CustomName: var data text.TextComponent if err := r.TextComponent(&data); err != nil { return err } comp.Data = data case Lore: var number int32 if _, err := r.VarInt(&number); err != nil { return err } var data = make([]text.TextComponent, number) for _, line := range data { if err := r.TextComponent(&line); err != nil { return err } } comp.Data = data } return nil } ================================================ FILE: protocol/net/slot/slot.go ================================================ package slot import ( "slices" "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" ) type Slot struct { ItemCount int32 ItemId int32 Add []Component Remove []int32 } func (s Slot) Is(s1 Slot) bool { return s.ItemCount == s1.ItemCount && s.ItemId == s1.ItemId && slices.Equal(s.Add, s1.Add) && slices.Equal(s.Remove, s1.Remove) } var Air Slot type Component struct { Type int32 Data any } func (s *Slot) Encode(w encoding.Writer) error { if err := w.VarInt(s.ItemCount); err != nil { return err } if s.ItemCount > 0 { if err := w.VarInt(s.ItemId); err != nil { return err } if err := w.VarInt(int32(len(s.Add))); err != nil { return err } //TODO ENCODE COMPONENTS if err := w.VarInt(int32(len(s.Remove))); err != nil { return err } for _, i := range s.Remove { if err := w.VarInt(i); err != nil { return err } } } return nil } func (s *Slot) Decode(r encoding.Reader) error { if _, err := r.VarInt(&s.ItemCount); err != nil { return err } if s.ItemCount > 0 { if _, err := r.VarInt(&s.ItemId); err != nil { return err } var componentAddLength int32 if _, err := r.VarInt(&componentAddLength); err != nil { return err } if componentAddLength != 0 { panic("no comp decode!") } s.Add = make([]Component, componentAddLength) for _, comp := range s.Add { if err := decode(r, &comp); err != nil { return err } } var componentRemoveLength int32 if componentRemoveLength != 0 { panic("no comp decode!") } if _, err := r.VarInt(&componentRemoveLength); err != nil { return err } s.Remove = make([]int32, componentRemoveLength) for _, i := range s.Remove { if _, err := r.VarInt(&i); err != nil { return err } } } return nil } const ( CustomData = iota MaxStackSize MaxDamage Damage Unbreakable CustomName ItemName Lore Rarity Enchantments CanPlaceOn CanBreak AttributeModifiers CustomModelData HideAdditionalTooltip HideTooltip RepairCost CreativeSlotLock EnchantmentGlintOverride IntangibleProjectile Food FireResistant Tool StoredEnchantments DyedColor MapColor MapId MapDecorations MapPostProcessing CharjedProjectiles BundleContents PotionContents SuspicousStewEffects WritableBookContent WrittenBookContent Trim DebugStickState EntityData BucketEntityData BlockEntityData Instrument OminousBottleAmplifier JukeboxPlayable Recipes LodestoneTracker FireworkExplosion Fireworks Profile NoteBlockSound BannerPatterns BaseColor PotDecorations Container BlockState Bees Lock ContainerLoot ) // Item's rarity const ( // white Common = iota // yellow Uncommon // aqua Rare // pink Epic ) ================================================ FILE: protocol/net/tags/tags.go ================================================ package tags import "github.com/zeppelinmc/zeppelin/protocol/net/packet/play" var Tags = &play.UpdateTags{Tags: map[string]map[string][]int32{"minecraft:banner_pattern": map[string][]int32{"minecraft:no_item_required": []int32{26, 27, 28, 29, 31, 38, 35, 37, 32, 36, 34, 33, 25, 5, 30, 39, 40, 41, 42, 7, 10, 9, 8, 3, 23, 19, 17, 20, 18, 1, 6, 14, 15, 2}, "minecraft:pattern_item/creeper": []int32{4}, "minecraft:pattern_item/flow": []int32{11}, "minecraft:pattern_item/flower": []int32{12}, "minecraft:pattern_item/globe": []int32{13}, "minecraft:pattern_item/guster": []int32{16}, "minecraft:pattern_item/mojang": []int32{21}, "minecraft:pattern_item/piglin": []int32{22}, "minecraft:pattern_item/skull": []int32{24}}, "minecraft:block": map[string][]int32{"minecraft:acacia_logs": []int32{50, 70, 60, 78}, "minecraft:air": []int32{0, 729, 730}, "minecraft:all_hanging_signs": []int32{208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 227, 228, 226, 229}, "minecraft:all_signs": []int32{186, 187, 188, 189, 191, 192, 828, 829, 193, 194, 190, 199, 200, 201, 202, 204, 205, 830, 831, 206, 207, 203, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 227, 228, 226, 229}, "minecraft:ancient_city_replaceable": []int32{1023, 1036, 1032, 1038, 1034, 1037, 1035, 1039, 1024, 1041, 1042, 137}, "minecraft:animals_spawnable_on": []int32{8}, "minecraft:anvil": []int32{408, 409, 410}, "minecraft:armadillo_spawnable_on": []int32{8, 494, 425, 429, 426, 439, 437, 433, 36, 10}, "minecraft:axolotls_spawnable_on": []int32{251}, "minecraft:azalea_grows_on": []int32{9, 8, 11, 10, 323, 1021, 1016, 1022, 55, 34, 36, 35, 494, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 249, 925}, "minecraft:azalea_root_replaceable": []int32{1, 2, 4, 6, 909, 1023, 9, 8, 11, 10, 323, 1021, 1016, 1022, 55, 494, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 36, 251, 37, 34, 249, 925}, "minecraft:badlands_terracotta": []int32{494, 425, 429, 426, 439, 437, 433}, "minecraft:bamboo_blocks": []int32{56, 65}, "minecraft:bamboo_plantable_on": []int32{34, 36, 35, 9, 8, 11, 10, 323, 1021, 1016, 1022, 55, 727, 726, 37, 38}, "minecraft:banners": []int32{503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534}, "minecraft:base_stone_nether": []int32{255, 258, 849}, "minecraft:base_stone_overworld": []int32{1, 2, 4, 6, 909, 1023}, "minecraft:beacon_base_blocks": []int32{840, 347, 181, 163, 164}, "minecraft:beds": []int32{117, 118, 114, 115, 112, 110, 116, 106, 111, 108, 105, 104, 109, 113, 103, 107}, "minecraft:bee_growables": []int32{601, 383, 384, 183, 316, 315, 598, 599, 788, 1009, 1010}, "minecraft:beehives": []int32{836, 837}, "minecraft:big_dripleaf_placeable": []int32{251, 1016, 9, 8, 11, 10, 323, 1021, 1022, 55, 184}, "minecraft:birch_logs": []int32{48, 68, 58, 76}, "minecraft:blocks_wind_charge_explosions": []int32{464, 31}, "minecraft:buttons": []int32{385, 386, 387, 388, 389, 391, 824, 825, 392, 393, 390, 246, 864}, "minecraft:camel_sand_step_sound_blocks": []int32{34, 36, 35, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677}, "minecraft:campfires": []int32{786, 787}, "minecraft:candle_cakes": []int32{886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902}, "minecraft:candles": []int32{869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885}, "minecraft:cauldrons": []int32{331, 332, 333, 334}, "minecraft:cave_vines": []int32{1010, 1009}, "minecraft:ceiling_hanging_signs": []int32{208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218}, "minecraft:cherry_logs": []int32{51, 71, 61, 79}, "minecraft:climbable": []int32{196, 317, 772, 805, 806, 807, 808, 1009, 1010}, "minecraft:coal_ores": []int32{43, 44}, "minecraft:combination_step_sound_blocks": []int32{478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 1014, 247, 797, 796, 809}, "minecraft:completes_find_tree_tutorial": []int32{52, 72, 62, 80, 46, 66, 63, 74, 50, 70, 60, 78, 48, 68, 58, 76, 49, 69, 59, 77, 47, 67, 57, 75, 53, 73, 64, 81, 51, 71, 61, 79, 798, 799, 800, 801, 789, 790, 791, 792, 85, 82, 83, 88, 86, 84, 90, 91, 89, 87, 608, 795}, "minecraft:concrete_powder": []int32{662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677}, "minecraft:convertable_to_mud": []int32{9, 10, 1021}, "minecraft:copper_ores": []int32{936, 937}, "minecraft:coral_blocks": []int32{688, 689, 690, 691, 692}, "minecraft:coral_plants": []int32{698, 699, 700, 701, 702}, "minecraft:corals": []int32{698, 699, 700, 701, 702, 708, 709, 710, 711, 712}, "minecraft:crimson_stems": []int32{798, 799, 800, 801}, "minecraft:crops": []int32{601, 383, 384, 183, 316, 315, 598, 599}, "minecraft:crystal_sound_blocks": []int32{903, 904}, "minecraft:dampens_vibrations": []int32{130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493}, "minecraft:dark_oak_logs": []int32{52, 72, 62, 80}, "minecraft:dead_bush_may_place_on": []int32{34, 36, 35, 494, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 9, 8, 11, 10, 323, 1021, 1016, 1022, 55}, "minecraft:deepslate_ore_replaceables": []int32{1023, 909}, "minecraft:diamond_ores": []int32{179, 180}, "minecraft:dirt": []int32{9, 8, 11, 10, 323, 1021, 1016, 1022, 55}, "minecraft:does_not_block_hoppers": []int32{836, 837}, "minecraft:doors": []int32{195, 583, 584, 585, 586, 588, 826, 827, 589, 590, 587, 974, 975, 977, 976, 978, 979, 981, 980, 232}, "minecraft:dragon_immune": []int32{464, 31, 335, 336, 603, 351, 604, 605, 832, 833, 146, 170, 842, 337, 308, 843, 1054}, "minecraft:dragon_transparent": []int32{465, 173, 174}, "minecraft:dripstone_replaceable_blocks": []int32{1, 2, 4, 6, 909, 1023}, "minecraft:emerald_ores": []int32{342, 343}, "minecraft:enchantment_power_provider": []int32{167}, "minecraft:enchantment_power_transmitter": []int32{0, 32, 33, 123, 124, 125, 126, 127, 173, 174, 247, 317, 318, 465, 501, 502, 611, 729, 730, 731, 796, 797, 809, 1020}, "minecraft:enderman_holdable": []int32{147, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 159, 148, 9, 8, 11, 10, 323, 1021, 1016, 1022, 55, 34, 36, 37, 161, 162, 166, 250, 251, 311, 264, 312, 803, 802, 809, 794, 793, 796}, "minecraft:fall_damage_resetting": []int32{196, 317, 772, 805, 806, 807, 808, 1009, 1010, 788, 122}, "minecraft:features_cannot_replace": []int32{31, 175, 177, 336, 1054, 1057, 1058}, "minecraft:fence_gates": []int32{570, 568, 572, 569, 319, 567, 820, 821, 573, 574, 571}, "minecraft:fences": []int32{254, 578, 580, 575, 576, 577, 816, 817, 581, 582, 579, 326}, "minecraft:fire": []int32{173, 174}, "minecraft:flower_pots": []int32{355, 367, 368, 369, 370, 371, 372, 373, 374, 375, 366, 357, 358, 359, 360, 361, 363, 379, 380, 381, 365, 382, 376, 377, 378, 728, 844, 845, 846, 847, 1048, 1049, 364, 362, 356}, "minecraft:flowers": []int32{147, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 159, 148, 497, 498, 500, 499, 600, 91, 1013, 30, 87, 1015, 593, 1011}, "minecraft:foxes_spawnable_on": []int32{8, 247, 249, 11, 10}, "minecraft:frog_prefer_jump_to": []int32{324, 1017}, "minecraft:frogs_spawnable_on": []int32{8, 1022, 54, 55}, "minecraft:geode_invalid_blocks": []int32{31, 32, 33, 248, 496, 724}, "minecraft:goats_spawnable_on": []int32{8, 1, 247, 249, 496, 37}, "minecraft:gold_ores": []int32{39, 45, 40}, "minecraft:guarded_by_piglins": []int32{163, 774, 177, 344, 860, 411, 1047, 613, 629, 625, 626, 623, 621, 627, 617, 622, 619, 616, 615, 620, 624, 628, 614, 618, 39, 45, 40}, "minecraft:hoglin_repellents": []int32{794, 845, 263, 843}, "minecraft:ice": []int32{248, 496, 724, 606}, "minecraft:impermeable": []int32{94, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 924}, "minecraft:incorrect_for_diamond_tool": []int32{}, "minecraft:incorrect_for_gold_tool": []int32{170, 842, 840, 843, 841, 181, 179, 180, 342, 343, 347, 163, 1047, 39, 40, 242, 243, 164, 1045, 41, 42, 97, 95, 96, 932, 1046, 936, 937, 957, 953, 941, 934, 955, 951, 939, 935, 954, 950, 938, 933, 956, 952, 940, 958, 973, 969, 965, 959, 971, 967, 963, 960, 972, 968, 964, 961, 970, 966, 962, 1006, 1056, 945, 944, 943, 942, 949, 948, 947, 946, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 982, 983, 985, 984, 986, 987, 989, 988, 974, 975, 977, 976, 978, 979, 981, 980}, "minecraft:incorrect_for_iron_tool": []int32{170, 842, 840, 843, 841}, "minecraft:incorrect_for_netherite_tool": []int32{}, "minecraft:incorrect_for_stone_tool": []int32{170, 842, 840, 843, 841, 181, 179, 180, 342, 343, 347, 163, 1047, 39, 40, 242, 243}, "minecraft:incorrect_for_wooden_tool": []int32{170, 842, 840, 843, 841, 181, 179, 180, 342, 343, 347, 163, 1047, 39, 40, 242, 243, 164, 1045, 41, 42, 97, 95, 96, 932, 1046, 936, 937, 957, 953, 941, 934, 955, 951, 939, 935, 954, 950, 938, 933, 956, 952, 940, 958, 973, 969, 965, 959, 971, 967, 963, 960, 972, 968, 964, 961, 970, 966, 962, 1006, 1056, 945, 944, 943, 942, 949, 948, 947, 946, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 982, 983, 985, 984, 986, 987, 989, 988, 974, 975, 977, 976, 978, 979, 981, 980}, "minecraft:infiniburn_end": []int32{255, 607, 31}, "minecraft:infiniburn_nether": []int32{255, 607}, "minecraft:infiniburn_overworld": []int32{255, 607}, "minecraft:inside_step_sound_blocks": []int32{925, 929, 318, 324, 908, 1015}, "minecraft:invalid_spawn_inside": []int32{335, 603}, "minecraft:iron_ores": []int32{41, 42}, "minecraft:jungle_logs": []int32{49, 69, 59, 77}, "minecraft:lapis_ores": []int32{95, 96}, "minecraft:lava_pool_stone_cannot_replace": []int32{31, 175, 177, 336, 1054, 1057, 1058, 85, 82, 83, 88, 86, 84, 90, 91, 89, 87, 52, 72, 62, 80, 46, 66, 63, 74, 50, 70, 60, 78, 48, 68, 58, 76, 49, 69, 59, 77, 47, 67, 57, 75, 53, 73, 64, 81, 51, 71, 61, 79, 798, 799, 800, 801, 789, 790, 791, 792}, "minecraft:leaves": []int32{85, 82, 83, 88, 86, 84, 90, 91, 89, 87}, "minecraft:logs": []int32{52, 72, 62, 80, 46, 66, 63, 74, 50, 70, 60, 78, 48, 68, 58, 76, 49, 69, 59, 77, 47, 67, 57, 75, 53, 73, 64, 81, 51, 71, 61, 79, 798, 799, 800, 801, 789, 790, 791, 792}, "minecraft:logs_that_burn": []int32{52, 72, 62, 80, 46, 66, 63, 74, 50, 70, 60, 78, 48, 68, 58, 76, 49, 69, 59, 77, 47, 67, 57, 75, 53, 73, 64, 81, 51, 71, 61, 79}, "minecraft:lush_ground_replaceable": []int32{1, 2, 4, 6, 909, 1023, 1010, 1009, 9, 8, 11, 10, 323, 1021, 1016, 1022, 55, 251, 37, 34}, "minecraft:maintains_farmland": []int32{315, 313, 316, 314, 601, 383, 384, 598, 148, 599, 183}, "minecraft:mangrove_logs": []int32{53, 73, 64, 81}, "minecraft:mangrove_logs_can_grow_through": []int32{1022, 55, 54, 89, 53, 30, 1014, 317}, "minecraft:mangrove_roots_can_grow_through": []int32{1022, 55, 54, 1014, 317, 30, 247}, "minecraft:mineable/axe": []int32{102, 314, 313, 1012, 727, 774, 836, 837, 601, 1018, 1017, 167, 305, 161, 786, 383, 777, 264, 1010, 1009, 177, 593, 592, 340, 834, 182, 803, 415, 125, 124, 778, 318, 123, 1020, 265, 253, 196, 502, 780, 324, 773, 316, 312, 307, 328, 384, 315, 311, 306, 162, 772, 1019, 781, 787, 1011, 252, 788, 501, 411, 808, 807, 317, 794, 806, 805, 183, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 570, 568, 572, 569, 319, 567, 820, 821, 573, 574, 571, 52, 72, 62, 80, 46, 66, 63, 74, 50, 70, 60, 78, 48, 68, 58, 76, 49, 69, 59, 77, 47, 67, 57, 75, 53, 73, 64, 81, 51, 71, 61, 79, 798, 799, 800, 801, 789, 790, 791, 792, 13, 14, 15, 16, 17, 19, 810, 811, 20, 21, 18, 23, 24, 25, 26, 27, 29, 1013, 30, 28, 186, 187, 188, 189, 191, 192, 828, 829, 193, 194, 190, 199, 200, 201, 202, 204, 205, 830, 831, 206, 207, 203, 385, 386, 387, 388, 389, 391, 824, 825, 392, 393, 390, 195, 583, 584, 585, 586, 588, 826, 827, 589, 590, 587, 254, 578, 580, 575, 576, 577, 816, 817, 581, 582, 579, 233, 234, 235, 236, 237, 239, 814, 815, 240, 241, 238, 539, 540, 541, 542, 543, 545, 812, 813, 546, 547, 544, 176, 348, 349, 350, 457, 459, 822, 823, 460, 461, 458, 288, 286, 290, 287, 284, 285, 818, 819, 291, 292, 289, 54, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 227, 228, 226, 229, 22, 548, 462, 56, 65, 168}, "minecraft:mineable/hoe": []int32{608, 795, 477, 680, 835, 804, 92, 93, 85, 82, 83, 88, 86, 84, 90, 91, 89, 926, 927, 1016, 1014, 928, 930, 929, 931, 1015, 87}, "minecraft:mineable/pickaxe": []int32{1, 2, 3, 4, 5, 6, 7, 12, 39, 40, 41, 42, 43, 44, 45, 95, 96, 97, 98, 99, 100, 101, 163, 164, 165, 169, 170, 175, 179, 180, 181, 185, 198, 231, 232, 242, 243, 255, 258, 259, 293, 294, 295, 296, 308, 309, 320, 321, 325, 326, 327, 329, 330, 337, 341, 342, 343, 344, 347, 412, 413, 416, 417, 418, 419, 420, 421, 422, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 494, 495, 535, 536, 537, 538, 549, 550, 551, 552, 553, 554, 555, 556, 558, 559, 560, 561, 562, 563, 564, 565, 566, 594, 595, 596, 597, 607, 609, 610, 612, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 703, 704, 705, 706, 707, 713, 714, 715, 716, 717, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 775, 776, 779, 782, 783, 784, 785, 793, 802, 840, 841, 842, 843, 848, 849, 850, 852, 853, 854, 855, 856, 857, 858, 860, 861, 862, 863, 866, 867, 868, 909, 923, 935, 934, 933, 932, 936, 937, 938, 939, 940, 941, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 1006, 1007, 1008, 1023, 1024, 1025, 1026, 1028, 1029, 1030, 1032, 1033, 1034, 1036, 1037, 1038, 1040, 1041, 1042, 1044, 1045, 1046, 1047, 248, 496, 724, 128, 121, 129, 905, 908, 907, 906, 903, 904, 300, 304, 303, 1043, 299, 302, 301, 246, 864, 353, 354, 759, 760, 761, 762, 763, 764, 766, 767, 768, 769, 770, 771, 851, 859, 865, 1027, 1031, 1035, 1039, 765, 912, 916, 921, 613, 629, 625, 626, 623, 621, 627, 617, 622, 619, 616, 615, 620, 624, 628, 614, 618, 408, 409, 410, 331, 332, 333, 334, 197, 119, 120, 423, 725, 298, 322, 557, 297, 1056, 910, 911, 917, 913, 914, 915, 918, 919, 920, 922, 945, 944, 943, 942, 949, 948, 947, 946, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 974, 975, 977, 976, 978, 979, 981, 980, 982, 983, 985, 984, 986, 987, 989, 988, 1059}, "minecraft:mineable/shovel": []int32{251, 9, 10, 11, 184, 8, 37, 323, 34, 36, 249, 247, 256, 602, 257, 1021, 55, 1022, 35, 38, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677}, "minecraft:mob_interactable_doors": []int32{195, 583, 584, 585, 586, 588, 826, 827, 589, 590, 587, 974, 975, 977, 976, 978, 979, 981, 980}, "minecraft:mooshrooms_spawnable_on": []int32{323}, "minecraft:moss_replaceable": []int32{1, 2, 4, 6, 909, 1023, 1010, 1009, 9, 8, 11, 10, 323, 1021, 1016, 1022, 55}, "minecraft:mushroom_grow_block": []int32{323, 11, 802, 793}, "minecraft:needs_diamond_tool": []int32{170, 842, 840, 843, 841}, "minecraft:needs_iron_tool": []int32{181, 179, 180, 342, 343, 347, 163, 1047, 39, 40, 242, 243}, "minecraft:needs_stone_tool": []int32{164, 1045, 41, 42, 97, 95, 96, 932, 1046, 936, 937, 957, 953, 941, 934, 955, 951, 939, 935, 954, 950, 938, 933, 956, 952, 940, 958, 973, 969, 965, 959, 971, 967, 963, 960, 972, 968, 964, 961, 970, 966, 962, 1006, 1056, 945, 944, 943, 942, 949, 948, 947, 946, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 982, 983, 985, 984, 986, 987, 989, 988, 974, 975, 977, 976, 978, 979, 981, 980}, "minecraft:nether_carver_replaceables": []int32{1, 2, 4, 6, 909, 1023, 255, 258, 849, 9, 8, 11, 10, 323, 1021, 1016, 1022, 55, 802, 793, 608, 795, 256, 257}, "minecraft:nylium": []int32{802, 793}, "minecraft:oak_logs": []int32{46, 66, 63, 74}, "minecraft:occludes_vibration_signals": []int32{130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145}, "minecraft:overworld_carver_replaceables": []int32{1, 2, 4, 6, 909, 1023, 9, 8, 11, 10, 323, 1021, 1016, 1022, 55, 34, 36, 35, 494, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 41, 42, 936, 937, 32, 37, 38, 99, 535, 923, 247, 496, 1045, 1046}, "minecraft:overworld_natural_logs": []int32{50, 48, 46, 49, 47, 52, 53, 51}, "minecraft:parrots_spawnable_on": []int32{8, 0, 85, 82, 83, 88, 86, 84, 90, 91, 89, 87, 52, 72, 62, 80, 46, 66, 63, 74, 50, 70, 60, 78, 48, 68, 58, 76, 49, 69, 59, 77, 47, 67, 57, 75, 53, 73, 64, 81, 51, 71, 61, 79, 798, 799, 800, 801, 789, 790, 791, 792}, "minecraft:piglin_repellents": []int32{174, 260, 785, 261, 787}, "minecraft:planks": []int32{13, 14, 15, 16, 17, 19, 810, 811, 20, 21, 18}, "minecraft:polar_bears_spawnable_on_alternate": []int32{248}, "minecraft:portals": []int32{263, 335, 603}, "minecraft:pressure_plates": []int32{412, 413, 233, 234, 235, 236, 237, 239, 814, 815, 240, 241, 238, 231, 863}, "minecraft:prevent_mob_spawning_inside": []int32{197, 119, 120, 423}, "minecraft:rabbits_spawnable_on": []int32{8, 247, 249, 34}, "minecraft:rails": []int32{197, 119, 120, 423}, "minecraft:redstone_ores": []int32{242, 243}, "minecraft:replaceable": []int32{0, 32, 33, 123, 124, 125, 126, 127, 173, 174, 247, 317, 318, 465, 501, 502, 611, 729, 730, 731, 796, 797, 809, 1020}, "minecraft:replaceable_by_trees": []int32{85, 82, 83, 88, 86, 84, 90, 91, 89, 87, 123, 124, 125, 317, 318, 497, 498, 499, 500, 501, 502, 1020, 600, 32, 126, 127, 796, 797, 809}, "minecraft:sand": []int32{34, 36, 35}, "minecraft:saplings": []int32{23, 24, 25, 26, 27, 29, 1012, 1013, 30, 28}, "minecraft:sculk_replaceable": []int32{1, 2, 4, 6, 909, 1023, 9, 8, 11, 10, 323, 1021, 1016, 1022, 55, 494, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 802, 793, 255, 258, 849, 34, 36, 37, 256, 257, 923, 1044, 251, 1008, 337, 535, 99}, "minecraft:sculk_replaceable_world_gen": []int32{1, 2, 4, 6, 909, 1023, 9, 8, 11, 10, 323, 1021, 1016, 1022, 55, 494, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 802, 793, 255, 258, 849, 34, 36, 37, 256, 257, 923, 1044, 251, 1008, 337, 535, 99, 1036, 1032, 1024, 1041, 1042, 1028}, "minecraft:shulker_boxes": []int32{613, 629, 625, 626, 623, 621, 627, 617, 622, 619, 616, 615, 620, 624, 628, 614, 618}, "minecraft:signs": []int32{186, 187, 188, 189, 191, 192, 828, 829, 193, 194, 190, 199, 200, 201, 202, 204, 205, 830, 831, 206, 207, 203}, "minecraft:slabs": []int32{539, 540, 541, 542, 543, 545, 812, 813, 546, 547, 544, 548, 549, 550, 556, 551, 562, 559, 560, 555, 554, 558, 553, 473, 474, 475, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 552, 561, 852, 857, 862, 1026, 1030, 1034, 1038, 971, 972, 973, 954, 955, 956, 957, 970, 557, 910, 914, 919}, "minecraft:small_dripleaf_placeable": []int32{251, 1016}, "minecraft:small_flowers": []int32{147, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 159, 148}, "minecraft:smelts_to_glass": []int32{34, 36}, "minecraft:snaps_goat_horn": []int32{50, 48, 46, 49, 47, 52, 53, 51, 1, 496, 41, 43, 936, 342}, "minecraft:sniffer_diggable_block": []int32{9, 8, 11, 10, 1021, 1016, 1022, 55}, "minecraft:sniffer_egg_hatch_boost": []int32{1016}, "minecraft:snow": []int32{247, 249, 925}, "minecraft:snow_layer_can_survive_on": []int32{838, 256, 1022}, "minecraft:snow_layer_cannot_survive_on": []int32{248, 496, 464}, "minecraft:soul_fire_base_blocks": []int32{256, 257}, "minecraft:soul_speed_blocks": []int32{256, 257}, "minecraft:spruce_logs": []int32{47, 67, 57, 75}, "minecraft:stairs": []int32{176, 348, 349, 350, 457, 459, 822, 823, 460, 461, 458, 462, 198, 341, 327, 321, 320, 596, 422, 538, 471, 470, 472, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 850, 858, 861, 1025, 1029, 1033, 1037, 950, 951, 952, 953, 967, 968, 969, 966, 322, 911, 915, 920}, "minecraft:standing_signs": []int32{186, 187, 188, 189, 191, 192, 828, 829, 193, 194, 190}, "minecraft:stone_bricks": []int32{293, 294, 295, 296}, "minecraft:stone_buttons": []int32{246, 864}, "minecraft:stone_ore_replaceables": []int32{1, 2, 4, 6}, "minecraft:stone_pressure_plates": []int32{231, 863}, "minecraft:strider_warm_blocks": []int32{33}, "minecraft:sword_efficient": []int32{85, 82, 83, 88, 86, 84, 90, 91, 89, 87, 23, 24, 25, 26, 27, 29, 1012, 1013, 30, 28, 147, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 159, 148, 601, 383, 384, 183, 316, 315, 598, 599, 123, 124, 125, 317, 318, 497, 498, 499, 500, 501, 502, 1020, 600, 161, 162, 252, 311, 264, 265, 312, 313, 314, 324, 340, 788, 1009, 1010, 1011, 1014, 1015, 1017, 1018, 1019, 328, 794, 796, 797, 803, 805, 806, 807, 808, 809, 592, 593}, "minecraft:tall_flowers": []int32{497, 498, 500, 499, 600}, "minecraft:terracotta": []int32{494, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440}, "minecraft:trail_ruins_replaceable": []int32{37}, "minecraft:trapdoors": []int32{288, 286, 290, 287, 284, 285, 818, 819, 291, 292, 289, 466, 982, 983, 985, 984, 986, 987, 989, 988}, "minecraft:underwater_bonemeals": []int32{126, 698, 699, 700, 701, 702, 708, 709, 710, 711, 712, 718, 719, 720, 721, 722}, "minecraft:unstable_bottom_center": []int32{570, 568, 572, 569, 319, 567, 820, 821, 573, 574, 571}, "minecraft:valid_spawn": []int32{8, 11}, "minecraft:vibration_resonators": []int32{903}, "minecraft:wall_corals": []int32{718, 719, 720, 721, 722}, "minecraft:wall_hanging_signs": []int32{219, 220, 221, 222, 223, 224, 225, 227, 228, 226, 229}, "minecraft:wall_post_override": []int32{171, 260, 244, 346, 186, 187, 188, 189, 191, 192, 828, 829, 193, 194, 190, 199, 200, 201, 202, 204, 205, 830, 831, 206, 207, 203, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 412, 413, 233, 234, 235, 236, 237, 239, 814, 815, 240, 241, 238, 231, 863}, "minecraft:wall_signs": []int32{199, 200, 201, 202, 204, 205, 830, 831, 206, 207, 203}, "minecraft:walls": []int32{353, 354, 759, 760, 761, 762, 763, 764, 766, 767, 768, 769, 770, 771, 851, 859, 865, 1027, 1031, 1035, 1039, 765, 912, 916, 921}, "minecraft:warped_stems": []int32{789, 790, 791, 792}, "minecraft:wart_blocks": []int32{608, 795}, "minecraft:wither_immune": []int32{464, 31, 335, 336, 603, 351, 604, 605, 832, 833, 146, 465, 1054}, "minecraft:wither_summon_base_blocks": []int32{256, 257}, "minecraft:wolves_spawnable_on": []int32{8, 247, 249, 10, 11}, "minecraft:wooden_buttons": []int32{385, 386, 387, 388, 389, 391, 824, 825, 392, 393, 390}, "minecraft:wooden_doors": []int32{195, 583, 584, 585, 586, 588, 826, 827, 589, 590, 587}, "minecraft:wooden_fences": []int32{254, 578, 580, 575, 576, 577, 816, 817, 581, 582, 579}, "minecraft:wooden_pressure_plates": []int32{233, 234, 235, 236, 237, 239, 814, 815, 240, 241, 238}, "minecraft:wooden_slabs": []int32{539, 540, 541, 542, 543, 545, 812, 813, 546, 547, 544}, "minecraft:wooden_stairs": []int32{176, 348, 349, 350, 457, 459, 822, 823, 460, 461, 458}, "minecraft:wooden_trapdoors": []int32{288, 286, 290, 287, 284, 285, 818, 819, 291, 292, 289}, "minecraft:wool": []int32{130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145}, "minecraft:wool_carpets": []int32{478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493}}, "minecraft:cat_variant": map[string][]int32{"minecraft:default_spawns": []int32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, "minecraft:full_moon_spawns": []int32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}, "minecraft:damage_type": map[string][]int32{"minecraft:always_hurts_ender_dragons": []int32{14, 8, 33, 1}, "minecraft:always_kills_armor_stands": []int32{0, 42, 13, 46, 44}, "minecraft:always_most_significant_fall": []int32{30}, "minecraft:always_triggers_silverfish": []int32{25}, "minecraft:avoids_guardian_thorns": []int32{25, 40, 14, 8, 33, 1}, "minecraft:burn_from_stepping": []int32{3, 19}, "minecraft:burns_armor_stands": []int32{29}, "minecraft:bypasses_armor": []int32{29, 21, 4, 6, 15, 17, 45, 5, 37, 9, 16, 36, 25, 22, 30, 18, 34, 31}, "minecraft:bypasses_effects": []int32{37}, "minecraft:bypasses_enchantments": []int32{34}, "minecraft:bypasses_invulnerability": []int32{30, 18}, "minecraft:bypasses_resistance": []int32{30, 18}, "minecraft:bypasses_shield": []int32{29, 21, 4, 6, 15, 17, 45, 5, 37, 9, 16, 36, 25, 22, 30, 18, 34, 31, 10, 12}, "minecraft:bypasses_wolf_armor": []int32{30, 18, 4, 6, 7, 16, 21, 22, 25, 31, 37, 40, 45}, "minecraft:can_break_armor_stand": []int32{32, 33}, "minecraft:damages_helmet": []int32{10, 11, 12}, "minecraft:ignites_armor_stands": []int32{20, 3}, "minecraft:is_drowning": []int32{6}, "minecraft:is_explosion": []int32{14, 8, 33, 1}, "minecraft:is_fall": []int32{9, 36}, "minecraft:is_fire": []int32{20, 3, 29, 23, 19, 43, 13}, "minecraft:is_freezing": []int32{16}, "minecraft:is_lightning": []int32{24}, "minecraft:is_player_attack": []int32{32}, "minecraft:is_projectile": []int32{0, 42, 28, 43, 13, 46, 41, 44}, "minecraft:no_anger": []int32{27}, "minecraft:no_impact": []int32{6}, "minecraft:no_knockback": []int32{8, 33, 1, 20, 24, 29, 23, 19, 21, 4, 6, 37, 2, 9, 15, 30, 17, 25, 45, 5, 7, 39, 16, 36, 31, 18, 3}, "minecraft:panic_causes": []int32{2, 16, 19, 20, 23, 24, 29, 0, 5, 8, 13, 14, 22, 25, 26, 28, 32, 33, 34, 38, 41, 42, 43, 44, 45, 46}, "minecraft:panic_environmental_causes": []int32{2, 16, 19, 20, 23, 24, 29}, "minecraft:witch_resistant_to": []int32{25, 22, 34, 40}, "minecraft:wither_immune_to": []int32{6}}, "minecraft:enchantment": map[string][]int32{"minecraft:curse": []int32{2, 40}, "minecraft:double_trade_price": []int32{2, 40, 37, 35, 14, 22, 41}, "minecraft:exclusive_set/armor": []int32{27, 3, 11, 26}, "minecraft:exclusive_set/boots": []int32{14, 7}, "minecraft:exclusive_set/bow": []int32{16, 22}, "minecraft:exclusive_set/crossbow": []int32{23, 24}, "minecraft:exclusive_set/damage": []int32{32, 34, 1, 15, 6, 4}, "minecraft:exclusive_set/mining": []int32{13, 33}, "minecraft:exclusive_set/riptide": []int32{19, 5}, "minecraft:in_enchanting_table": []int32{27, 11, 9, 3, 26, 30, 0, 38, 7, 32, 34, 1, 17, 10, 18, 36, 8, 33, 39, 13, 25, 28, 12, 16, 20, 21, 19, 15, 31, 5, 23, 29, 24, 6, 4}, "minecraft:non_treasure": []int32{27, 11, 9, 3, 26, 30, 0, 38, 7, 32, 34, 1, 17, 10, 18, 36, 8, 33, 39, 13, 25, 28, 12, 16, 20, 21, 19, 15, 31, 5, 23, 29, 24, 6, 4}, "minecraft:on_mob_spawn_equipment": []int32{27, 11, 9, 3, 26, 30, 0, 38, 7, 32, 34, 1, 17, 10, 18, 36, 8, 33, 39, 13, 25, 28, 12, 16, 20, 21, 19, 15, 31, 5, 23, 29, 24, 6, 4}, "minecraft:on_random_loot": []int32{27, 11, 9, 3, 26, 30, 0, 38, 7, 32, 34, 1, 17, 10, 18, 36, 8, 33, 39, 13, 25, 28, 12, 16, 20, 21, 19, 15, 31, 5, 23, 29, 24, 6, 4, 2, 40, 14, 22}, "minecraft:on_traded_equipment": []int32{27, 11, 9, 3, 26, 30, 0, 38, 7, 32, 34, 1, 17, 10, 18, 36, 8, 33, 39, 13, 25, 28, 12, 16, 20, 21, 19, 15, 31, 5, 23, 29, 24, 6, 4}, "minecraft:prevents_bee_spawns_when_mining": []int32{33}, "minecraft:prevents_decorated_pot_shattering": []int32{33}, "minecraft:prevents_ice_melting": []int32{33}, "minecraft:prevents_infested_spawns": []int32{33}, "minecraft:smelts_loot": []int32{10}, "minecraft:tooltip_order": []int32{2, 40, 31, 5, 41, 14, 32, 34, 1, 15, 25, 6, 4, 24, 36, 23, 10, 12, 17, 28, 27, 3, 11, 26, 9, 13, 18, 33, 20, 8, 29, 21, 30, 0, 35, 37, 7, 38, 19, 39, 16, 22}, "minecraft:tradeable": []int32{27, 11, 9, 3, 26, 30, 0, 38, 7, 32, 34, 1, 17, 10, 18, 36, 8, 33, 39, 13, 25, 28, 12, 16, 20, 21, 19, 15, 31, 5, 23, 29, 24, 6, 4, 2, 40, 14, 22}, "minecraft:treasure": []int32{2, 40, 37, 35, 14, 22, 41}}, "minecraft:entity_type": map[string][]int32{"minecraft:aquatic": []int32{111, 5, 50, 29, 20, 83, 86, 110, 24, 101, 48, 104}, "minecraft:arrows": []int32{4, 99}, "minecraft:arthropod": []int32{7, 34, 90, 100, 16}, "minecraft:axolotl_always_hostiles": []int32{27, 50, 29}, "minecraft:axolotl_hunt_targets": []int32{110, 83, 86, 20, 101, 48, 104}, "minecraft:beehive_inhabitors": []int32{7}, "minecraft:can_breathe_under_water": []int32{91, 102, 120, 92, 11, 125, 124, 126, 127, 123, 27, 54, 119, 76, 5, 43, 50, 29, 111, 48, 20, 83, 86, 101, 110, 104, 3}, "minecraft:can_turn_in_boats": []int32{12}, "minecraft:deflects_projectiles": []int32{12}, "minecraft:dismounts_underwater": []int32{14, 19, 25, 53, 65, 71, 77, 85, 100, 103, 108, 125}, "minecraft:fall_damage_immune": []int32{57, 96, 88, 0, 6, 7, 8, 15, 19, 45, 76, 67, 72, 75, 119, 12}, "minecraft:freeze_hurts_extra_types": []int32{103, 8, 67}, "minecraft:freeze_immune_entity_types": []int32{102, 81, 96, 119}, "minecraft:frog_food": []int32{93, 67}, "minecraft:ignores_poison_and_regen": []int32{91, 102, 120, 92, 11, 125, 124, 126, 127, 123, 27, 54, 119, 76}, "minecraft:illager": []int32{35, 55, 80, 114}, "minecraft:illager_friends": []int32{35, 55, 80, 114}, "minecraft:immune_to_infested": []int32{90}, "minecraft:immune_to_oozing": []int32{93}, "minecraft:impact_projectiles": []int32{4, 99, 41, 97, 62, 94, 28, 109, 26, 121, 117, 13}, "minecraft:inverted_healing_and_harm": []int32{91, 102, 120, 92, 11, 125, 124, 126, 127, 123, 27, 54, 119, 76}, "minecraft:no_anger_from_wind_charge": []int32{12, 91, 11, 102, 124, 54, 100, 16, 93}, "minecraft:non_controlling_rider": []int32{93, 67}, "minecraft:not_scary_for_pufferfish": []int32{111, 50, 29, 20, 83, 86, 110, 24, 101, 48, 104}, "minecraft:powder_snow_walkable_mobs": []int32{84, 34, 90, 42}, "minecraft:raiders": []int32{35, 80, 85, 114, 55, 118}, "minecraft:redirectable_projectile": []int32{62, 117, 13}, "minecraft:sensitive_to_bane_of_arthropods": []int32{7, 34, 90, 100, 16}, "minecraft:sensitive_to_impaling": []int32{111, 5, 50, 29, 20, 83, 86, 110, 24, 101, 48, 104}, "minecraft:sensitive_to_smite": []int32{91, 102, 120, 92, 11, 125, 124, 126, 127, 123, 27, 54, 119, 76}, "minecraft:skeletons": []int32{91, 102, 120, 92, 11}, "minecraft:undead": []int32{91, 102, 120, 92, 11, 125, 124, 126, 127, 123, 27, 54, 119, 76}, "minecraft:wither_friends": []int32{91, 102, 120, 92, 11, 125, 124, 126, 127, 123, 27, 54, 119, 76}, "minecraft:zombies": []int32{125, 124, 126, 127, 123, 27, 54}}, "minecraft:fluid": map[string][]int32{"minecraft:lava": []int32{4, 3}, "minecraft:water": []int32{2, 1}}, "minecraft:game_event": map[string][]int32{"minecraft:allay_can_listen": []int32{33}, "minecraft:ignore_vibrations_sneaking": []int32{26, 36, 41, 42, 29, 28}, "minecraft:shrieker_can_listen": []int32{37}, "minecraft:vibrations": []int32{1, 2, 3, 5, 6, 7, 8, 0, 4, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 32, 33, 34, 35, 36, 38, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 23}, "minecraft:warden_can_listen": []int32{1, 2, 3, 5, 6, 7, 8, 0, 4, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 32, 33, 34, 35, 36, 38, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 39, 37}}, "minecraft:instrument": map[string][]int32{"minecraft:goat_horns": []int32{0, 1, 2, 3, 4, 5, 6, 7}, "minecraft:regular_goat_horns": []int32{0, 1, 2, 3}, "minecraft:screaming_goat_horns": []int32{4, 5, 6, 7}}, "minecraft:item": map[string][]int32{"minecraft:acacia_logs": []int32{136, 170, 149, 159}, "minecraft:anvil": []int32{419, 420, 421}, "minecraft:armadillo_food": []int32{1000}, "minecraft:arrows": []int32{802, 1160, 1159}, "minecraft:axes": []int32{841, 826, 831, 846, 821, 836}, "minecraft:axolotl_food": []int32{918}, "minecraft:bamboo_blocks": []int32{144, 165}, "minecraft:banners": []int32{1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148}, "minecraft:beacon_payment_items": []int32{816, 806, 805, 815, 811}, "minecraft:beds": []int32{978, 979, 975, 976, 973, 971, 977, 967, 972, 969, 966, 965, 970, 974, 964, 968}, "minecraft:bee_food": []int32{218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 465, 466, 468, 467, 232, 185, 198, 55, 181, 246, 294, 233}, "minecraft:birch_logs": []int32{134, 168, 147, 157}, "minecraft:boats": []int32{774, 776, 778, 780, 782, 786, 788, 790, 784, 775, 777, 779, 781, 783, 787, 789, 791, 785}, "minecraft:bookshelf_books": []int32{925, 1092, 1114, 1091, 1166}, "minecraft:breaks_decorated_pots": []int32{838, 823, 828, 843, 818, 833, 841, 826, 831, 846, 821, 836, 840, 825, 830, 845, 820, 835, 839, 824, 829, 844, 819, 834, 842, 827, 832, 847, 822, 837, 1188, 1093}, "minecraft:buttons": []int32{684, 685, 686, 687, 688, 690, 693, 694, 691, 692, 689, 682, 683}, "minecraft:camel_food": []int32{308}, "minecraft:candles": []int32{1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257}, "minecraft:cat_food": []int32{935, 936}, "minecraft:cherry_logs": []int32{137, 171, 150, 160}, "minecraft:chest_armor": []int32{857, 861, 873, 865, 869, 877}, "minecraft:chest_boats": []int32{775, 777, 779, 781, 783, 787, 789, 791, 785}, "minecraft:chicken_food": []int32{853, 987, 986, 1155, 1152, 1153}, "minecraft:cluster_max_harvestables": []int32{840, 830, 835, 845, 825, 820}, "minecraft:coal_ores": []int32{62, 63}, "minecraft:coals": []int32{803, 804}, "minecraft:compasses": []int32{928, 929}, "minecraft:completes_find_tree_tutorial": []int32{138, 172, 151, 161, 132, 166, 145, 155, 136, 170, 149, 159, 134, 168, 147, 157, 135, 169, 148, 158, 133, 167, 146, 156, 139, 173, 152, 162, 137, 171, 150, 160, 142, 153, 174, 163, 143, 154, 175, 164, 179, 176, 177, 182, 180, 178, 184, 185, 183, 181, 517, 518}, "minecraft:copper_ores": []int32{66, 67}, "minecraft:cow_food": []int32{854}, "minecraft:creeper_drop_music_discs": []int32{1168, 1169, 1170, 1171, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181}, "minecraft:creeper_igniters": []int32{798, 1089}, "minecraft:crimson_stems": []int32{142, 153, 174, 163}, "minecraft:dampens_vibrations": []int32{202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461}, "minecraft:dark_oak_logs": []int32{138, 172, 151, 161}, "minecraft:decorated_pot_ingredients": []int32{921, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1297, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1307, 1308, 1309, 1310, 1296, 1298, 1306}, "minecraft:decorated_pot_sherds": []int32{1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1297, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1307, 1308, 1309, 1310, 1296, 1298, 1306}, "minecraft:diamond_ores": []int32{76, 77}, "minecraft:dirt": []int32{28, 27, 30, 29, 364, 31, 247, 32, 141}, "minecraft:doors": []int32{711, 712, 713, 714, 715, 717, 720, 721, 718, 719, 716, 722, 723, 724, 725, 726, 727, 728, 729, 710}, "minecraft:dyeable": []int32{856, 857, 858, 859, 1127, 797}, "minecraft:emerald_ores": []int32{72, 73}, "minecraft:enchantable/armor": []int32{859, 863, 875, 867, 871, 879, 858, 862, 874, 866, 870, 878, 857, 861, 873, 865, 869, 877, 856, 860, 872, 864, 868, 876, 794}, "minecraft:enchantable/bow": []int32{801}, "minecraft:enchantable/chest_armor": []int32{857, 861, 873, 865, 869, 877}, "minecraft:enchantable/crossbow": []int32{1192}, "minecraft:enchantable/durability": []int32{859, 863, 875, 867, 871, 879, 858, 862, 874, 866, 870, 878, 857, 861, 873, 865, 869, 877, 856, 860, 872, 864, 868, 876, 794, 773, 1162, 838, 823, 828, 843, 818, 833, 841, 826, 831, 846, 821, 836, 840, 825, 830, 845, 820, 835, 839, 824, 829, 844, 819, 834, 842, 827, 832, 847, 822, 837, 801, 1192, 1188, 798, 983, 1268, 931, 771, 772, 1093}, "minecraft:enchantable/equippable": []int32{859, 863, 875, 867, 871, 879, 858, 862, 874, 866, 870, 878, 857, 861, 873, 865, 869, 877, 856, 860, 872, 864, 868, 876, 794, 773, 1105, 1107, 1106, 1103, 1104, 1108, 1109, 323}, "minecraft:enchantable/fire_aspect": []int32{838, 823, 828, 843, 818, 833, 1093}, "minecraft:enchantable/fishing": []int32{931}, "minecraft:enchantable/foot_armor": []int32{859, 863, 875, 867, 871, 879}, "minecraft:enchantable/head_armor": []int32{856, 860, 872, 864, 868, 876, 794}, "minecraft:enchantable/leg_armor": []int32{858, 862, 874, 866, 870, 878}, "minecraft:enchantable/mace": []int32{1093}, "minecraft:enchantable/mining": []int32{841, 826, 831, 846, 821, 836, 840, 825, 830, 845, 820, 835, 839, 824, 829, 844, 819, 834, 842, 827, 832, 847, 822, 837, 983}, "minecraft:enchantable/mining_loot": []int32{841, 826, 831, 846, 821, 836, 840, 825, 830, 845, 820, 835, 839, 824, 829, 844, 819, 834, 842, 827, 832, 847, 822, 837}, "minecraft:enchantable/sharp_weapon": []int32{838, 823, 828, 843, 818, 833, 841, 826, 831, 846, 821, 836}, "minecraft:enchantable/sword": []int32{838, 823, 828, 843, 818, 833}, "minecraft:enchantable/trident": []int32{1188}, "minecraft:enchantable/vanishing": []int32{859, 863, 875, 867, 871, 879, 858, 862, 874, 866, 870, 878, 857, 861, 873, 865, 869, 877, 856, 860, 872, 864, 868, 876, 794, 773, 1162, 838, 823, 828, 843, 818, 833, 841, 826, 831, 846, 821, 836, 840, 825, 830, 845, 820, 835, 839, 824, 829, 844, 819, 834, 842, 827, 832, 847, 822, 837, 801, 1192, 1188, 798, 983, 1268, 931, 771, 772, 1093, 928, 323, 1105, 1107, 1106, 1103, 1104, 1108, 1109}, "minecraft:enchantable/weapon": []int32{838, 823, 828, 843, 818, 833, 841, 826, 831, 846, 821, 836, 1093}, "minecraft:fence_gates": []int32{754, 752, 756, 753, 750, 751, 759, 760, 757, 758, 755}, "minecraft:fences": []int32{311, 315, 317, 312, 313, 314, 320, 321, 318, 319, 316, 369}, "minecraft:fishes": []int32{935, 939, 936, 940, 938, 937}, "minecraft:flowers": []int32{218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 465, 466, 468, 467, 232, 185, 198, 55, 181, 246, 294, 233}, "minecraft:foot_armor": []int32{859, 863, 875, 867, 871, 879}, "minecraft:fox_food": []int32{1216, 1217}, "minecraft:freeze_immune_wearables": []int32{859, 858, 857, 856, 1127}, "minecraft:frog_food": []int32{926}, "minecraft:goat_food": []int32{854}, "minecraft:gold_ores": []int32{68, 78, 69}, "minecraft:hanging_signs": []int32{897, 898, 899, 901, 902, 900, 903, 906, 907, 904, 905}, "minecraft:head_armor": []int32{856, 860, 872, 864, 868, 876, 794}, "minecraft:hoes": []int32{842, 827, 832, 847, 822, 837}, "minecraft:hoglin_food": []int32{236}, "minecraft:horse_food": []int32{854, 962, 445, 800, 1102, 884, 885}, "minecraft:horse_tempt_items": []int32{1102, 884, 885}, "minecraft:ignored_by_piglin_babies": []int32{913}, "minecraft:iron_ores": []int32{64, 65}, "minecraft:jungle_logs": []int32{135, 169, 148, 158}, "minecraft:lapis_ores": []int32{74, 75}, "minecraft:leaves": []int32{179, 176, 177, 182, 180, 178, 184, 185, 183, 181}, "minecraft:lectern_books": []int32{1092, 1091}, "minecraft:leg_armor": []int32{858, 862, 874, 866, 870, 878}, "minecraft:llama_food": []int32{854, 445}, "minecraft:llama_tempt_items": []int32{445}, "minecraft:logs": []int32{138, 172, 151, 161, 132, 166, 145, 155, 136, 170, 149, 159, 134, 168, 147, 157, 135, 169, 148, 158, 133, 167, 146, 156, 139, 173, 152, 162, 137, 171, 150, 160, 142, 153, 174, 163, 143, 154, 175, 164}, "minecraft:logs_that_burn": []int32{138, 172, 151, 161, 132, 166, 145, 155, 136, 170, 149, 159, 134, 168, 147, 157, 135, 169, 148, 158, 133, 167, 146, 156, 139, 173, 152, 162, 137, 171, 150, 160}, "minecraft:mangrove_logs": []int32{139, 173, 152, 162}, "minecraft:meat": []int32{988, 990, 989, 991, 1132, 882, 1119, 1131, 881, 1118, 992}, "minecraft:non_flammable_wood": []int32{143, 154, 175, 164, 142, 153, 174, 163, 45, 46, 262, 263, 708, 709, 320, 321, 740, 741, 759, 760, 393, 394, 693, 694, 720, 721, 895, 896, 907, 906}, "minecraft:noteblock_top_instruments": []int32{1106, 1103, 1107, 1108, 1104, 1109, 1105}, "minecraft:oak_logs": []int32{132, 166, 145, 155}, "minecraft:ocelot_food": []int32{935, 936}, "minecraft:panda_food": []int32{251}, "minecraft:parrot_food": []int32{853, 987, 986, 1155, 1152, 1153}, "minecraft:parrot_poisonous_food": []int32{980}, "minecraft:pickaxes": []int32{840, 825, 830, 845, 820, 835}, "minecraft:pig_food": []int32{1097, 1098, 1154}, "minecraft:piglin_food": []int32{881, 882}, "minecraft:piglin_loved": []int32{68, 78, 69, 90, 1231, 697, 815, 1213, 932, 1102, 1007, 884, 885, 872, 873, 874, 875, 1125, 828, 830, 829, 831, 832, 814, 84}, "minecraft:piglin_repellents": []int32{331, 1215, 1219}, "minecraft:planks": []int32{36, 37, 38, 39, 40, 42, 45, 46, 43, 44, 41}, "minecraft:rabbit_food": []int32{1097, 1102, 218}, "minecraft:rails": []int32{763, 761, 762, 764}, "minecraft:redstone_ores": []int32{70, 71}, "minecraft:sand": []int32{57, 60, 58}, "minecraft:saplings": []int32{48, 49, 50, 51, 52, 54, 197, 198, 55, 53}, "minecraft:sheep_food": []int32{854}, "minecraft:shovels": []int32{839, 824, 829, 844, 819, 834}, "minecraft:signs": []int32{886, 887, 888, 890, 889, 892, 895, 896, 893, 894, 891}, "minecraft:skulls": []int32{1105, 1107, 1106, 1103, 1104, 1108, 1109}, "minecraft:slabs": []int32{252, 253, 254, 255, 256, 258, 262, 263, 259, 260, 257, 261, 264, 265, 271, 266, 277, 274, 275, 270, 269, 273, 268, 278, 279, 280, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 267, 276, 1229, 1237, 1233, 652, 653, 655, 654, 130, 129, 128, 111, 110, 109, 108, 131, 272, 13, 18, 22}, "minecraft:small_flowers": []int32{218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231}, "minecraft:smelts_to_glass": []int32{57, 60}, "minecraft:sniffer_food": []int32{1152}, "minecraft:soul_fire_base_blocks": []int32{326, 327}, "minecraft:spruce_logs": []int32{133, 167, 146, 156}, "minecraft:stairs": []int32{383, 384, 385, 386, 387, 389, 393, 394, 390, 391, 388, 392, 304, 380, 370, 362, 361, 297, 426, 513, 507, 506, 508, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 1230, 1238, 1234, 635, 636, 638, 637, 107, 106, 105, 104, 126, 125, 124, 127, 363, 14, 19, 23}, "minecraft:stone_bricks": []int32{340, 341, 342, 343}, "minecraft:stone_buttons": []int32{682, 683}, "minecraft:stone_crafting_materials": []int32{35, 1228, 9}, "minecraft:stone_tool_materials": []int32{35, 1228, 9}, "minecraft:strider_food": []int32{237}, "minecraft:strider_tempt_items": []int32{237, 772}, "minecraft:swords": []int32{838, 823, 828, 843, 818, 833}, "minecraft:tall_flowers": []int32{465, 466, 468, 467, 232}, "minecraft:terracotta": []int32{462, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442}, "minecraft:trapdoors": []int32{735, 733, 737, 734, 731, 732, 740, 741, 738, 739, 736, 730, 742, 743, 744, 745, 746, 747, 748, 749}, "minecraft:trim_materials": []int32{811, 813, 815, 807, 806, 805, 816, 657, 808, 809}, "minecraft:trim_templates": []int32{1274, 1280, 1272, 1275, 1271, 1273, 1279, 1277, 1270, 1276, 1278, 1281, 1282, 1283, 1284, 1285, 1286, 1287}, "minecraft:trimmable_armor": []int32{859, 863, 875, 867, 871, 879, 858, 862, 874, 866, 870, 878, 857, 861, 873, 865, 869, 877, 856, 860, 872, 864, 868, 876, 794}, "minecraft:turtle_food": []int32{200}, "minecraft:villager_plantable_seeds": []int32{853, 1098, 1097, 1155, 1152, 1153}, "minecraft:walls": []int32{397, 398, 399, 400, 401, 402, 403, 404, 406, 407, 408, 409, 410, 411, 412, 414, 413, 415, 416, 418, 417, 405, 15, 20, 24}, "minecraft:warped_stems": []int32{143, 154, 175, 164}, "minecraft:wart_blocks": []int32{517, 518}, "minecraft:wolf_food": []int32{988, 990, 989, 991, 1132, 882, 1119, 1131, 881, 1118, 992}, "minecraft:wooden_buttons": []int32{684, 685, 686, 687, 688, 690, 693, 694, 691, 692, 689}, "minecraft:wooden_doors": []int32{711, 712, 713, 714, 715, 717, 720, 721, 718, 719, 716}, "minecraft:wooden_fences": []int32{311, 315, 317, 312, 313, 314, 320, 321, 318, 319, 316}, "minecraft:wooden_pressure_plates": []int32{699, 700, 701, 702, 703, 705, 708, 709, 706, 707, 704}, "minecraft:wooden_slabs": []int32{252, 253, 254, 255, 256, 258, 262, 263, 259, 260, 257}, "minecraft:wooden_stairs": []int32{383, 384, 385, 386, 387, 389, 393, 394, 390, 391, 388}, "minecraft:wooden_trapdoors": []int32{735, 733, 737, 734, 731, 732, 740, 741, 738, 739, 736}, "minecraft:wool": []int32{202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217}, "minecraft:wool_carpets": []int32{446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461}}, "minecraft:painting_variant": map[string][]int32{"minecraft:placeable": []int32{23, 1, 0, 2, 5, 31, 46, 34, 12, 36, 41, 13, 45, 21, 25, 8, 39, 44, 38, 49, 18, 32, 30, 7, 37, 14, 4, 22, 26, 35, 43, 3, 6, 9, 10, 11, 16, 17, 19, 24, 27, 28, 29, 33, 40, 42}}, "minecraft:point_of_interest_type": map[string][]int32{"minecraft:acquirable_job_site": []int32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, "minecraft:bee_home": []int32{15, 16}, "minecraft:village": []int32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}}, "minecraft:worldgen/biome": map[string][]int32{"minecraft:allows_surface_slime_spawns": []int32{53, 31}, "minecraft:allows_tropical_fish_spawns_at_any_height": []int32{30}, "minecraft:has_closer_water_fog": []int32{53, 31}, "minecraft:has_structure/ancient_city": []int32{10}, "minecraft:has_structure/bastion_remnant": []int32{7, 34, 48, 58}, "minecraft:has_structure/buried_treasure": []int32{3, 44}, "minecraft:has_structure/desert_pyramid": []int32{14}, "minecraft:has_structure/end_city": []int32{17, 18}, "minecraft:has_structure/igloo": []int32{47, 45, 46}, "minecraft:has_structure/jungle_temple": []int32{1, 28}, "minecraft:has_structure/mineshaft": []int32{11, 9, 13, 12, 22, 35, 6, 29, 57, 40, 24, 3, 44, 32, 23, 27, 50, 46, 5, 61, 59, 60, 54, 47, 37, 38, 1, 28, 49, 21, 20, 4, 36, 8, 25, 51, 33, 26, 62, 14, 41, 45, 39, 52, 53, 31, 42, 15, 30}, "minecraft:has_structure/mineshaft_mesa": []int32{0, 19, 63}, "minecraft:has_structure/nether_fortress": []int32{34, 48, 7, 58, 2}, "minecraft:has_structure/nether_fossil": []int32{48}, "minecraft:has_structure/ocean_monument": []int32{11, 9, 13, 12}, "minecraft:has_structure/ocean_ruin_cold": []int32{22, 6, 35, 11, 9, 13}, "minecraft:has_structure/ocean_ruin_warm": []int32{29, 57, 12}, "minecraft:has_structure/pillager_outpost": []int32{14, 39, 41, 45, 54, 32, 23, 27, 50, 46, 5, 25}, "minecraft:has_structure/ruined_portal_desert": []int32{14}, "minecraft:has_structure/ruined_portal_jungle": []int32{1, 28, 49}, "minecraft:has_structure/ruined_portal_mountain": []int32{0, 19, 63, 61, 59, 60, 42, 62, 51, 32, 23, 27, 50, 46, 5}, "minecraft:has_structure/ruined_portal_nether": []int32{34, 48, 7, 58, 2}, "minecraft:has_structure/ruined_portal_ocean": []int32{11, 9, 13, 12, 22, 35, 6, 29, 57}, "minecraft:has_structure/ruined_portal_standard": []int32{3, 44, 40, 24, 54, 47, 37, 38, 21, 20, 4, 36, 8, 25, 33, 26, 15, 30, 41, 45, 39, 52}, "minecraft:has_structure/ruined_portal_swamp": []int32{53, 31}, "minecraft:has_structure/shipwreck": []int32{11, 9, 13, 12, 22, 35, 6, 29, 57}, "minecraft:has_structure/shipwreck_beached": []int32{3, 44}, "minecraft:has_structure/stronghold": []int32{33, 11, 22, 9, 6, 13, 35, 12, 29, 57, 51, 53, 31, 46, 45, 44, 60, 25, 61, 47, 59, 54, 39, 32, 3, 21, 38, 20, 4, 8, 42, 41, 28, 0, 14, 63, 27, 50, 24, 40, 26, 37, 52, 36, 49, 1, 19, 62, 5, 23, 15, 30, 10}, "minecraft:has_structure/swamp_hut": []int32{53}, "minecraft:has_structure/trail_ruins": []int32{54, 47, 37, 38, 36, 28}, "minecraft:has_structure/trial_chambers": []int32{33, 11, 22, 9, 6, 13, 35, 12, 29, 57, 51, 53, 31, 46, 45, 44, 60, 25, 61, 47, 59, 54, 39, 32, 3, 21, 38, 20, 4, 8, 42, 41, 28, 0, 14, 63, 27, 50, 24, 40, 26, 37, 52, 36, 49, 1, 19, 62, 5, 23, 15, 30}, "minecraft:has_structure/village_desert": []int32{14}, "minecraft:has_structure/village_plains": []int32{39, 32}, "minecraft:has_structure/village_savanna": []int32{41}, "minecraft:has_structure/village_snowy": []int32{45}, "minecraft:has_structure/village_taiga": []int32{54}, "minecraft:has_structure/woodland_mansion": []int32{8}, "minecraft:increased_fire_burnout": []int32{1, 33, 31, 46, 23, 27, 53, 28}, "minecraft:is_badlands": []int32{0, 19, 63}, "minecraft:is_beach": []int32{3, 44}, "minecraft:is_deep_ocean": []int32{11, 9, 13, 12}, "minecraft:is_end": []int32{55, 17, 18, 43, 16}, "minecraft:is_forest": []int32{21, 20, 4, 36, 8, 25}, "minecraft:is_hill": []int32{61, 59, 60}, "minecraft:is_jungle": []int32{1, 28, 49}, "minecraft:is_mountain": []int32{32, 23, 27, 50, 46, 5}, "minecraft:is_nether": []int32{34, 48, 7, 58, 2}, "minecraft:is_ocean": []int32{11, 9, 13, 12, 22, 35, 6, 29, 57}, "minecraft:is_overworld": []int32{33, 11, 22, 9, 6, 13, 35, 12, 29, 57, 51, 53, 31, 46, 45, 44, 60, 25, 61, 47, 59, 54, 39, 32, 3, 21, 38, 20, 4, 8, 42, 41, 28, 0, 14, 63, 27, 50, 24, 40, 26, 37, 52, 36, 49, 1, 19, 62, 5, 23, 15, 30, 10}, "minecraft:is_river": []int32{40, 24}, "minecraft:is_savanna": []int32{41, 42, 62}, "minecraft:is_taiga": []int32{54, 47, 37, 38}, "minecraft:mineshaft_blocking": []int32{10}, "minecraft:more_frequent_drowned_spawns": []int32{40, 24}, "minecraft:plays_underwater_music": []int32{11, 9, 13, 12, 22, 35, 6, 29, 57, 40, 24}, "minecraft:polar_bears_spawn_on_alternate_blocks": []int32{22, 11}, "minecraft:produces_corals_from_bonemeal": []int32{57}, "minecraft:reduce_water_ambient_spawns": []int32{40, 24}, "minecraft:required_ocean_monument_surrounding": []int32{11, 9, 13, 12, 22, 35, 6, 29, 57, 40, 24}, "minecraft:snow_golem_melts": []int32{0, 2, 7, 14, 19, 34, 41, 42, 48, 58, 62, 63}, "minecraft:spawns_cold_variant_frogs": []int32{45, 26, 23, 27, 46, 22, 11, 25, 10, 24, 47, 44, 55, 17, 18, 43, 16}, "minecraft:spawns_gold_rabbits": []int32{14}, "minecraft:spawns_snow_foxes": []int32{45, 26, 22, 47, 24, 44, 23, 27, 46, 25}, "minecraft:spawns_warm_variant_frogs": []int32{14, 57, 1, 28, 49, 41, 42, 62, 34, 48, 7, 58, 2, 0, 19, 63, 31}, "minecraft:spawns_white_rabbits": []int32{45, 26, 22, 47, 24, 44, 23, 27, 46, 25}, "minecraft:stronghold_biased_to": []int32{39, 52, 45, 26, 14, 21, 20, 4, 8, 36, 37, 38, 54, 47, 41, 42, 61, 60, 59, 62, 28, 49, 1, 0, 19, 63, 32, 25, 46, 23, 27, 50, 33, 15, 30}, "minecraft:water_on_map_outlines": []int32{11, 9, 13, 12, 22, 35, 6, 29, 57, 40, 24, 53, 31}, "minecraft:without_patrol_spawns": []int32{33}, "minecraft:without_wandering_trader_spawns": []int32{56}, "minecraft:without_zombie_sieges": []int32{33}}}} ================================================ FILE: protocol/text/builder.go ================================================ package text func New() TextComponent { return TextComponent{} } func (t TextComponent) WithColor(c string) TextComponent { t.Color = c return t } func (t TextComponent) WithText(c string) TextComponent { t.Text = c return t } func (t TextComponent) WithItalic() TextComponent { t.Italic = !t.Italic return t } func (t TextComponent) WithUnderline() TextComponent { t.Underlined = !t.Underlined return t } func (t TextComponent) WithStrikethrough() TextComponent { t.Strikethrough = !t.Strikethrough return t } func (t TextComponent) WithObfuscation() TextComponent { t.Obfuscated = !t.Obfuscated return t } func Color(c string) TextComponent { return TextComponent{Color: c} } func Text(c string) TextComponent { return TextComponent{Text: c} } func Italic() TextComponent { return TextComponent{Italic: true} } func Underline() TextComponent { return TextComponent{Underlined: true} } func Strikethrough() TextComponent { return TextComponent{Strikethrough: true} } func Obfuscation() TextComponent { return TextComponent{Obfuscated: true} } ================================================ FILE: protocol/text/color.go ================================================ package text import ( "fmt" "image/color" ) // colors const ( Black = "black" DarkBlue = "dark_blue" DarkGreen = "dark_green" DarkCyan = "dark_aqua" DarkRed = "dark_red" Purple = "dark_purple" Gold = "gold" Gray = "gray" DarkGray = "dark_gray" Blue = "blue" BrightGreen = "green" Cyan = "aqua" Red = "red" Pink = "light_purple" Yellow = "yellow" White = "white" ) func RGB(r, g, b uint8) string { return fmt.Sprintf("#%02X%02X%02X", r, g, b) } func CustomColor(c color.Color) string { r, g, b, _ := c.RGBA() return RGB(uint8(r>>8), uint8(g>>8), uint8(b>>8)) } ================================================ FILE: protocol/text/text.go ================================================ // Package text provides encoding and decoding of text components package text import "fmt" const ( TypeText = "text" TypeTranslatable = "translatable" TypeKeybind = "keybind" TypeScore = "score" TypeSelector = "selector" TypeNBT = "nbt" ) const ( FontDefault = "minecraft:default" FontUniform = "minecraft:uniform" FontAlt = "minecraft:alt" FontIllageralt = "minecraft:illageralt" ) const ( ClickEventOpenURL = "open_url" ClickEventRunCommand = "run_command" ClickEventSuggestCommand = "suggest_command" ClickEventChangePage = "change_page" ClickEventCopyToClipboard = "copy_to_clipboard" ) const ( HoverEventShowText = "show_text" HoverEventShowItem = "show_item" HoverEventShowEntity = "show_entity" ) type ClickEvent struct { Action string `json:"action" nbt:"action"` Value string `json:"value" nbt:"value"` } type HoverEventContents struct { ID string `json:"id,omitempty" nbt:"id,omitempty"` Count int `json:"count,omitempty" nbt:"count,omitempty"` Tag string `json:"tag,omitempty" nbt:"tag,omitempty"` Type string `json:"type,omitempty" nbt:"type,omitempty"` Name string `json:"name,omitempty" nbt:"name,omitempty"` } type HoverEvent struct { Action string `json:"action" nbt:"action"` Contents HoverEventContents `json:"contents" nbt:"contents"` } type TextComponent struct { Type string `json:"type,omitempty" nbt:"type,omitempty"` Extra []TextComponent `json:"extra,omitempty" nbt:"extra,omitempty"` Color string `json:"color,omitempty" nbt:"color,omitempty"` Bold bool `json:"bold,omitempty" nbt:"bold,omitempty"` Italic bool `json:"italic,omitempty" nbt:"italic,omitempty"` Underlined bool `json:"underlined,omitempty" nbt:"underlined,omitempty"` Strikethrough bool `json:"strikethrough,omitempty" nbt:"strikethrough,omitempty"` Obfuscated bool `json:"obfuscated,omitempty" nbt:"obfuscated,omitempty"` Font string `json:"font,omitempty" nbt:"font,omitempty"` Insertion string `json:"insertion,omitempty" nbt:"insertion,omitempty"` ClickEvent ClickEvent `json:"click_event,omitempty" nbt:"click_event,omitempty"` HoverEvent HoverEvent `json:"hover_event,omitempty" nbt:"hover_event,omitempty"` Text string `json:"text" nbt:"text"` } func Sprint(a ...any) TextComponent { return TextComponent{Text: fmt.Sprint(a...)} } func Sprintf(format string, a ...any) TextComponent { return TextComponent{Text: fmt.Sprintf(format, a...)} } // Unmarshalf is the same as Unmarshal but with formatting func Unmarshalf(codeChar rune, format string, v ...any) TextComponent { return Unmarshal(fmt.Sprintf(format, v...), codeChar) } // Unmarshal parses the text and color codes into a text component. The codeChar argument is what's used for color codes (i.e &) func Unmarshal(text string, codeChar rune) TextComponent { var root TextComponent var component TextComponent var runeText = []rune(text) for i := 0; i < len(runeText); i++ { char := runeText[i] if char == codeChar && runeText[i+1] >= '0' && runeText[i+1] <= 'r' { if component.Text != "" { root.Extra = append(root.Extra, component) component = TextComponent{} } applyStyle(runeText[i+1], &component) i++ continue } component.Text += string(char) } root.Extra = append(root.Extra, component) return root } // Marshal turns the text component to a classic color code message func Marshal(component TextComponent, codeChar rune) string { var components = append([]TextComponent{component}, component.Extra...) var text string for _, comp := range components { componentStyles(comp, &text, codeChar) text += comp.Text } return text } func charColor(char rune) string { switch char { case '0': return "black" case '1': return "dark_blue" case '2': return "dark_green" case '3': return "dark_aqua" case '4': return "dark_red" case '5': return "dark_purple" case '6': return "gold" case '7': return "gray" case '8': return "dark_gray" case '9': return "blue" case 'a': return "green" case 'b': return "aqua" case 'c': return "red" case 'd': return "light_purple" case 'e': return "yellow" default: // case 'f' return "white" } } func colorChar(color string, char string) string { switch color { case "black": return char + "0" case "dark_blue": return char + "1" case "dark_green": return char + "2" case "dark_aqua": return char + "3" case "dark_red": return char + "4" case "dark_purple": return char + "5" case "gold": return char + "6" case "gray": return char + "7" case "dark_gray": return char + "8" case "blue": return char + "9" case "green": return char + "a" case "aqua": return char + "b" case "red": return char + "c" case "light_purple": return char + "d" case "yellow": return char + "e" default: // case "white" return char + "f" } } func applyStyle(char rune, component *TextComponent) { if char >= '0' && char <= 'f' { component.Color = charColor(char) } switch char { case 'k': component.Obfuscated = true case 'l': component.Bold = true case 'm': component.Strikethrough = true case 'n': component.Underlined = true case 'o': component.Italic = true } } func componentStyles(component TextComponent, text *string, codeChar rune) { *text += colorChar(component.Color, string(codeChar)) if component.Obfuscated { *text += string(codeChar) + "k" } if component.Obfuscated { *text += string(codeChar) + "k" } if component.Bold { *text += string(codeChar) + "l" } if component.Strikethrough { *text += string(codeChar) + "m" } if component.Underlined { *text += string(codeChar) + "n" } if component.Italic { *text += string(codeChar) + "o" } } ================================================ FILE: readme.md ================================================ ![zeppelinbanner (1)](https://github.com/user-attachments/assets/21605ec4-1253-460e-84c3-d984df14f212) # Zeppelin Highly optimized server implementation written in [Go](https://go.dev) for Minecraft 1.21.3 [Discord Server](https://discord.gg/T8qEtDWPak) ## Goal A fast, efficient, and reliable server, with a plugin API and clean code ## Protocol Coverage - Packet encryption (AES/CFB8) - Packet compression (Zlib) - Authentication - Named Binary Tag (NBT) - Text formatting - Chat signing ## Progress - Chunk encoding and manipulation - Region/Anvil decoding and encoding (temp disabled) - WIP terrain generation - Player movement including metadata ## API ### Protocol: - NBT: protocol/nbt - .properties: protocol/properties - text formatting: protocol/text - network and packets: protocol/net ### Server: - Commands: server/command (server.CommandManager) - can register custom commands - World: server/world (server.World) - can register custom dimensions, modify chunks etc - Registry: server/registry - shared registry constants - Container (inventory): server/container - Player: server/player (Session.Player()) - Session: server/session (api) | server/session/std (impl) ## Boot Arguments `--no-plugins`: skips plugin loading `--memprof`: uses memory profiler `--cpuprof`: uses cpu profiler `--xmem=`: limits memory usage to `amount`, for example: `--xmem=1gib` ## Acknowledgements [Angel](https://github.com/aimjel) - help with chunk related calculations (0x8D989E86) ================================================ FILE: server/command/builder.go ================================================ package command import ( "github.com/zeppelinmc/zeppelin/protocol/net/packet/play" ) const ( Bool = iota Float Double Integer Long String Entity GameProfile BlockPos ColumnPos Vec3 Vec2 BlockState BlockPredicate ItemStack ItemPredicate Color Component Style Message NBT NBTTag NBTPath Objective ObjectiveCriteria Operation Particle Angle Rotation ScoreboardSlot ScoreHolder Swizzle Team ItemSlot ResourceLocation Function EntityAnchor IntRange FloatRange Dimension Gamemode Time ResourceOrTag ResourceOrTagKey Resource ResourceKey TemplateMirror TemplateRotation Heightmap UUID ) const ( StringSingleWord = iota StringQuotablePhrase StringGreedyPhrase ) type Node struct { play.Node children []Node } func (n *Node) Add(nodes ...Node) { n.children = append(n.children, nodes...) } func NewNode(n play.Node, children ...Node) Node { return Node{n, children} } func NewLiteral(name string, nodes ...Node) Node { return Node{ Node: play.Node{ Flags: play.NodeLiteral, Name: name, }, children: nodes, } } func NewBoolArgument(name string, nodes ...Node) Node { return Node{ Node: play.Node{ Flags: play.NodeArgument, Name: name, ParserId: Bool, }, children: nodes, } } func NewIntegerArgument(name string, min, max *int32, nodes ...Node) Node { flags := int8(0) var props = make([]any, 1, 3) if min != nil { flags &= 0x01 props = append(props, *min) } if max != nil { flags &= 0x02 props = append(props, *max) } props[0] = flags return Node{ Node: play.Node{ Flags: play.NodeArgument, Name: name, ParserId: Integer, Properties: props, }, children: nodes, } } func NewStringArgument(name string, typ int, nodes ...Node) Node { return Node{ Node: play.Node{ Flags: play.NodeArgument, Name: name, ParserId: String, Properties: []any{typ}, }, children: nodes, } } func NewTimeArgument(name string, min int32, nodes ...Node) Node { return Node{ Node: play.Node{ Flags: play.NodeArgument, Name: name, ParserId: Time, Properties: []any{min}, }, children: nodes, } } ================================================ FILE: server/command/command.go ================================================ // Package command provides utilities for handling and registering commands package command import ( "github.com/zeppelinmc/zeppelin/protocol/text" ) type Command struct { Node Node Aliases []string Namespace string Callback func(CommandCallContext) SuggestionCallback func() } type Arguments []string func (a Arguments) At(i int) string { if i < 0 || len(a) <= i { return "" } return a[i] } func (a Arguments) Fallback(i int, fb string) string { if i < 0 || len(a) <= i { return fb } return a[i] } type CommandCallContext struct { Command Command Server any Executor Caller Arguments Arguments } func (c CommandCallContext) Reply(msg text.TextComponent) error { return c.Executor.SystemMessage(msg) } ================================================ FILE: server/command/graph.go ================================================ package command import "github.com/zeppelinmc/zeppelin/protocol/net/packet/play" func (mgr *Manager) Encode() *play.Commands { if mgr.graph != nil { return mgr.graph } pk := play.Commands{ Nodes: make([]play.Node, 1, len(mgr.commands)+1), } pk.Nodes[0] = play.Node{ Children: make([]int32, 0, len(mgr.commands)), } for _, cmd := range mgr.commands { commandNodeIndex := int32(len(pk.Nodes)) pk.Nodes[0].Children = append(pk.Nodes[0].Children, commandNodeIndex) pk.Nodes = append(pk.Nodes, cmd.Node.Node) if cmd.Namespace != "" { pk.Nodes[0].Children = append(pk.Nodes[0].Children, int32(len(pk.Nodes))) pk.Nodes = append(pk.Nodes, play.Node{ Flags: play.NodeLiteral | play.NodeRedirect, Name: cmd.Namespace + ":" + cmd.Node.Name, RedirectNode: commandNodeIndex, }) } for _, alias := range cmd.Aliases { pk.Nodes[0].Children = append(pk.Nodes[0].Children, int32(len(pk.Nodes))) pk.Nodes = append(pk.Nodes, play.Node{ Flags: play.NodeLiteral | play.NodeRedirect, Name: alias, RedirectNode: commandNodeIndex, }) if cmd.Namespace != "" { pk.Nodes[0].Children = append(pk.Nodes[0].Children, int32(len(pk.Nodes))) pk.Nodes = append(pk.Nodes, play.Node{ Flags: play.NodeLiteral | play.NodeRedirect, Name: cmd.Namespace + ":" + alias, RedirectNode: commandNodeIndex, }) } } for _, child := range cmd.Node.children { appendNode(commandNodeIndex, child, &pk.Nodes) } } return &pk } func appendNode(parentIndex int32, n Node, tgt *[]play.Node) { index := int32(len(*tgt)) (*tgt)[parentIndex].Children = append((*tgt)[parentIndex].Children, index) (*tgt) = append((*tgt), n.Node) for _, child := range n.children { appendNode(index, child, tgt) } } ================================================ FILE: server/command/manager.go ================================================ package command import ( "strings" "sync" "github.com/zeppelinmc/zeppelin/protocol/net/packet/play" "github.com/zeppelinmc/zeppelin/protocol/text" ) type Manager struct { commands []Command mu sync.RWMutex srv any graph *play.Commands } type Caller interface { SystemMessage(text.TextComponent) error } func NewManager(srv any, cmds ...Command) *Manager { return &Manager{commands: cmds, srv: srv} } func (mgr *Manager) Register(cmds ...Command) { mgr.mu.Lock() defer mgr.mu.Unlock() mgr.commands = append(mgr.commands, cmds...) mgr.graph = nil } func (mgr *Manager) Call(command string, caller Caller) { arguments := strings.Split(command, " ") if len(arguments) == 0 { caller.SystemMessage( text.Unmarshal( "&cInvalid command", '&', ), ) return } cmd := mgr.findCommand(arguments[0]) if cmd == nil { caller.SystemMessage( text.Unmarshalf( '&', "&cUnknown command %s", command, ), ) return } ctx := CommandCallContext{ Command: *cmd, Executor: caller, Server: mgr.srv, } if len(arguments) > 1 { ctx.Arguments = arguments[1:] } if cmd.Callback == nil { return } cmd.Callback(ctx) } func (mgr *Manager) findCommand(name string) *Command { mgr.mu.RLock() defer mgr.mu.RUnlock() var namespace string if i := strings.Index(name, ":"); i != -1 && i != len(name) { namespace = name[:i] name = name[i+1:] } for _, cmd := range mgr.commands { if namespace != "" && cmd.Namespace != namespace { continue } if cmd.Node.Name == name { return &cmd } for _, alias := range cmd.Aliases { if alias == name { return &cmd } } } return nil } ================================================ FILE: server/container/container.go ================================================ package container import ( "fmt" "github.com/zeppelinmc/zeppelin/protocol/net/slot" "github.com/zeppelinmc/zeppelin/server/registry" "github.com/zeppelinmc/zeppelin/server/world/level/item" ) // A container that holds items type Container []item.Item // NetworkConvert encodes the container with the specified size and changes the slot from data slots to network slots. This should be used for inventories func (c Container) EncodeResize(size int) []slot.Slot { s := make([]slot.Slot, size) for _, item := range c { id, ok := registry.Item.Lookup(item.Id) if !ok { continue } s[item.Slot.Network()] = slot.Slot{ ItemCount: item.Count, ItemId: id, } } return s } func (c Container) Encode() []slot.Slot { s := make([]slot.Slot, len(c)) for _, item := range c { id, ok := registry.Item.Lookup(item.Id) if !ok { continue } s[item.Slot] = slot.Slot{ ItemCount: item.Count, ItemId: id, } } return s } // Set adds the item to the container and replaces the existing one if found, and returns if the operation was successful func (c *Container) Set(item item.Item) { for x, i := range *c { if i.Slot == item.Slot { (*c)[x] = item return } } *c = append(*c, item) } // Add adds the item to the container and replaces the existing one if found, and returns if the operation was successful func (c *Container) SetAt(item item.Item, slot item.DataSlot) { item.Slot = slot c.Set(item) } // finds the item at the specified data slot func (c Container) Slot(slot item.DataSlot) (item.Item, bool) { for _, item := range c { if item.Slot == slot { return item, true } } return item.Air, false } func (c *Container) Merge(slot item.DataSlot, carriedItem *item.Item) { if carriedItem.Is(item.Air) { return } it, ok := c.Slot(slot) if !ok { fmt.Println("nothing occupies slot! setting to", slot, *carriedItem) c.SetAt(*carriedItem, slot) s, _ := c.Slot(slot) fmt.Println("new item:", slot, s) return } if !carriedItem.Is(it) || it.Count > 64 { fmt.Println("swap", it, "with", *carriedItem) c.SetAt(*carriedItem, slot) *carriedItem = it s, _ := c.Slot(slot) fmt.Println("new item:", slot, s) return } it.Count += carriedItem.Count carriedItem.Count = 0 if it.Count > 64 { carriedItem.Count = it.Count - 64 it.Count = 64 } if carriedItem.Count == 0 { *carriedItem = item.Air } fmt.Println("new item:", it) c.SetAt(it, slot) } ================================================ FILE: server/entity/entity.go ================================================ package entity import ( "maps" "math" "slices" "sync" "sync/atomic" a "github.com/zeppelinmc/zeppelin/util/atomic" "github.com/google/uuid" "github.com/zeppelinmc/zeppelin/protocol/net/metadata" ) var entityId atomic.Int32 func NewEntityId() int32 { return entityId.Add(1) } func New(uuid uuid.UUID, typ int32, metadata metadata.Metadata, attributes []Attribute) *Entity { return &Entity{ uuid: uuid, typ: typ, metadata: metadata, attributes: attributes, } } func NewLiving(e *Entity) LivingEntity { return LivingEntity{Entity: *e} } // Entity is the base state for entities type Entity struct { uuid uuid.UUID typ int32 x, y, z atomic.Uint64 // the position of the state vx, vy, vz atomic.Uint64 // the velocity of the state yaw, pitch atomic.Uint32 // the rotation of the state onGround atomic.Bool md_mu sync.RWMutex metadata metadata.Metadata attr_mu sync.RWMutex attributes []Attribute dimensionName a.AtomicValue[string] } func (p *Entity) Attribute(id string) *Attribute { p.attr_mu.Lock() defer p.attr_mu.Unlock() i := slices.IndexFunc(p.attributes, func(att Attribute) bool { return att.Id == id }) if i == -1 { attr, ok := DefaultAttributes[id] if !ok { return nil } a := Attribute{ Id: id, Base: attr, } p.attributes = append(p.attributes, a) return &a } attr := &p.attributes[i] return attr } // Attributes returns a clone of the attributes of this state func (p *Entity) Attributes() []Attribute { p.attr_mu.RLock() defer p.attr_mu.RUnlock() return slices.Clone(p.attributes) } func (p *Entity) SetAttribute(id string, base float64) { p.attr_mu.Lock() defer p.attr_mu.Unlock() i := slices.IndexFunc(p.attributes, func(att Attribute) bool { return att.Id == id }) if i == -1 { return } p.attributes[i].Base = base } // Metadata returns a clone of the metadata of this state func (p *Entity) Metadata() metadata.Metadata { p.md_mu.RLock() defer p.md_mu.RUnlock() return maps.Clone(p.metadata) } func (p *Entity) SetMetadata(md metadata.Metadata) { p.md_mu.Lock() defer p.md_mu.Unlock() p.metadata = md } func (p *Entity) MetadataIndex(i byte) any { p.md_mu.RLock() defer p.md_mu.RUnlock() return p.metadata[i] } func (p *Entity) SetMetadataIndex(i byte, v any) { p.md_mu.Lock() defer p.md_mu.Unlock() p.metadata[i] = v } func (p *Entity) SetMetadataIndexes(md metadata.Metadata) { p.md_mu.Lock() defer p.md_mu.Unlock() for index, value := range md { p.metadata[index] = value } } func (p *Entity) DimensionName() string { return p.dimensionName.Get() } func (p *Entity) SetDimensionName(v string) { p.dimensionName.Set(v) } func (p *Entity) SetMotion(x, y, z float64) { p.vx.Store(math.Float64bits(x)) p.vy.Store(math.Float64bits(y)) p.vz.Store(math.Float64bits(z)) } func (p *Entity) SetPosition(x, y, z float64) { p.x.Store(math.Float64bits(x)) p.y.Store(math.Float64bits(y)) p.z.Store(math.Float64bits(z)) } func (p *Entity) SetRotation(yaw, pitch float32) { p.yaw.Store(math.Float32bits(yaw)) p.pitch.Store(math.Float32bits(pitch)) } func (p *Entity) SetOnGround(v bool) { p.onGround.Store(v) } func (p *Entity) Position() (x, y, z float64) { return math.Float64frombits(p.x.Load()), math.Float64frombits(p.y.Load()), math.Float64frombits(p.z.Load()) } func (p *Entity) Motion() (vx, vy, vz float64) { return math.Float64frombits(p.vx.Load()), math.Float64frombits(p.vy.Load()), math.Float64frombits(p.vz.Load()) } func (p *Entity) Rotation() (yaw, pitch float32) { return math.Float32frombits(p.yaw.Load()), math.Float32frombits(p.pitch.Load()) } func (p *Entity) OnGround() bool { return p.onGround.Load() } func (p *Entity) UUID() uuid.UUID { return p.uuid } func (p *Entity) Type() int32 { return p.typ } type LivingEntity struct { Entity health, food, foodSaturation, foodExhaustion atomic.Uint32 } func (l *LivingEntity) SetHealth(h float32) { l.health.Store(math.Float32bits(h)) } func (l *LivingEntity) SetFood(food int32, saturation, exhaustion float32) { l.food.Store(uint32(food)) l.foodSaturation.Store(math.Float32bits(saturation)) l.foodExhaustion.Store(math.Float32bits(exhaustion)) } func (l *LivingEntity) Health() float32 { return math.Float32frombits(l.health.Load()) } func (l *LivingEntity) Food() (food int32, saturation, exhaustion float32) { return int32(l.food.Load()), math.Float32frombits(l.foodSaturation.Load()), math.Float32frombits(l.foodExhaustion.Load()) } type Attribute struct { Base float64 `nbt:"base"` Id string `nbt:"id"` } var DefaultAttributes = map[string]float64{ "minecraft:generic.armor": 0, "minecraft:generic.armor_toughness": 0, "minecraft:generic.attack_damage": 2, "minecraft:generic.attack_knockback": 0, "minecraft:generic.attack_speed": 2, "minecraft:generic.block_break_speed": 1, "minecraft:generic.block_interaction_range": 4.5, "minecraft:generic.entity_interaction_range": 3, "minecraft:generic.fall_damage_multiplier": 1, "minecraft:generic.flying_speed": 0.4, "minecraft:generic.follow_range": 32, "minecraft:generic.gravity": 0.08, "minecraft:generic.jump_strength": 0.42, "minecraft:generic.knockback_resistance": 0, "minecraft:generic.luck": 0, "minecraft:generic.max_absorption": 0, "minecraft:generic.max_health": 20, "minecraft:generic.movement_speed": 0.7, "minecraft:generic.safe_fall_distance": 3, "minecraft:generic.scale": 1, "minecraft:zombie.spawn_reinforcements": 0, "minecraft:generic.step_height": 0.6, "minecraft:generic.submerged_mining_speed": 0.2, "minecraft:generic.sweeping_damage_ratio": 0, "minecraft:generic.water_movement_efficiency": 0, } ================================================ FILE: server/entity/levelEntity.go ================================================ package entity import "github.com/zeppelinmc/zeppelin/server/world/level/uuid" type LevelEntity struct { Air int16 CustomName string CustomNameVisible bool FallDistance float32 Fire int16 Glowing bool HasVisualFire bool Id string `nbt:"id"` Invulnerable bool Motion [3]float64 NoGravity bool OnGround bool Passengers []Entity PortalCooldown int32 Pos [3]float64 Rotation [2]float32 Silent bool `nbt:"Silent,omitempty"` Tags []string TicksFrozen int32 `nbt:"TicksFrozen,omitempty"` UUID uuid.UUID //TODO add state subclasses } ================================================ FILE: server/player/chunks.go ================================================ package player import ( "bytes" "github.com/zeppelinmc/zeppelin/protocol/net/io/buffers" "github.com/zeppelinmc/zeppelin/protocol/net/packet/play" "github.com/zeppelinmc/zeppelin/server/world/dimension" ) // Dimension returns the dimension struct this player is in func (p *Player) Dimension() *dimension.Dimension { return p.dimensionManager.Dimension(p.DimensionName()) } func (p *Player) sendSpawnChunks() error { viewDistance := p.ViewDistance() x, _, z := p.Position() chunkX, chunkZ := int32(x)>>4, int32(z)>>4 if err := p.WritePacket(&play.SetCenterChunk{ChunkX: chunkX, ChunkZ: chunkZ}); err != nil { return err } var chunks int32 if err := p.WritePacket(&play.ChunkBatchStart{}); err != nil { return err } buf := buffers.Buffers.Get().(*bytes.Buffer) for x := chunkX - viewDistance; x < chunkX+viewDistance; x++ { for z := chunkZ - viewDistance; z < chunkZ+viewDistance; z++ { buf.Reset() c, err := p.Dimension().GetChunkBuf(x, z, buf) if err != nil { continue } buf.Reset() if err := p.WritePacket(c.EncodeBuf(p.registryIndexes["minecraft:worldgen/biome"], buf)); err != nil { return err } chunks++ } } buffers.Buffers.Put(buf) if err := p.WritePacket(&play.ChunkBatchFinished{ BatchSize: chunks, }); err != nil { return err } _, err := p.awaitPacket(play.PacketIdChunkBatchReceived) return err } ================================================ FILE: server/player/conn.go ================================================ package player import ( "github.com/zeppelinmc/zeppelin/protocol/net/packet" "github.com/zeppelinmc/zeppelin/protocol/net/packet/configuration" "github.com/zeppelinmc/zeppelin/protocol/net/packet/play" "github.com/zeppelinmc/zeppelin/util/log" "time" "unsafe" ) // registeredHandlers maps all handler functions by their state[0] and id[1] var registeredHandlers = make(map[[2]int32]func(*Player, packet.Decodeable) error) func RegisterHandler(state, id int32, handler func(*Player, packet.Decodeable) error) struct{} { registeredHandlers[[2]int32{state, id}] = handler return struct{}{} } // awaitPacket waits for the packet with the id to be received func (p *Player) awaitPacket(id int32) (packet.Decodeable, error) { p.packetAwaited.Store(id) c := make(chan packet.Decodeable) p.packetAwaitedChan.Store(&c) pk := <-c if pk, ok := pk.(packet.Error); ok { return nil, pk.Error } return pk, nil } func interfaceAssert[T any](v any) T { return *(*T)(unsafe.Add(unsafe.Pointer(&v), unsafe.Sizeof(0))) } func (p *Player) keepAlive() error { l := time.Now().UnixMilli() p.cbLastKeepAlive.Store(l) return p.WritePacket(&play.ClientboundKeepAlive{KeepAliveID: l}) } // isConnectionDead checks if more than 15 seconds have passed since the client sent a keep alive packet func (p *Player) isConnectionDead() bool { lastKeepAliveByClient := p.sbLastKeepalive.Load() return lastKeepAliveByClient != 0 && time.Now().UnixMilli()-lastKeepAliveByClient > (15*1000) } func (p *Player) listenPackets() { keepAliveTicker := time.NewTicker(time.Second * 20) for { select { case <-keepAliveTicker.C: if err := p.keepAlive(); err != nil { p.killConnection(false, "lost connection") return } default: if p.isConnectionDead() { //todo disconnect p.killConnection(false, "timed out") return } pk, s, err := p.ReadPacket() awaitId := p.packetAwaited.Load() if err != nil { p.killConnection(false, "lost connection") if awaitId != -1 { *p.packetAwaitedChan.Swap(nil) <- packet.Error{Error: err} p.packetAwaited.Store(-1) } return } if s { // The packet was stopped mid-interception, and shouldn't be handled continue } state, id := p.State(), pk.ID() // This packet is awaited by another goroutine if awaitId == id { *p.packetAwaitedChan.Swap(nil) <- pk p.packetAwaited.Store(-1) } handler, ok := registeredHandlers[[2]int32{state, id}] if !ok { switch pk := pk.(type) { case *configuration.ClientInformation, *play.ClientInformation: p.ClientInformation.Store(interfaceAssert[*configuration.ClientInformation](pk)) } continue } if err := handler(p, pk); err != nil { p.killConnection(false, "packet handling error: "+err.Error()) return } } } } // killConnection kills the player's connection func (p *Player) killConnection(serverError bool, reason string) { var logFunction = log.Infolnf if serverError { // if an error happened on the server's side, the log message will be an error logFunction = log.Errorlnf } logFunction("%sPlayer %s disconnected: %s", log.FormatAddr(true /*TODO replace*/, p.RemoteAddr()), p.Username(), reason) } ================================================ FILE: server/player/handler_chat_command.go ================================================ package player import ( "github.com/zeppelinmc/zeppelin/protocol/net" "github.com/zeppelinmc/zeppelin/protocol/net/packet" "github.com/zeppelinmc/zeppelin/protocol/net/packet/play" "github.com/zeppelinmc/zeppelin/util/log" ) var _ = RegisterHandler(net.PlayState, play.PacketIdChatCommand, func(p *Player, packet packet.Decodeable) error { pk := packet.(*play.ChatCommand) log.Infolnf("%sPlayer %s (%s) issued server command: /%s", log.FormatAddr(p.serverProperties.LogIPs, p.RemoteAddr()), p.Username(), p.UUID(), pk.Command) p.commandManager.Call(pk.Command, p) return nil }) ================================================ FILE: server/player/player.go ================================================ package player import ( "github.com/zeppelinmc/zeppelin/properties" "github.com/zeppelinmc/zeppelin/protocol/net" "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/net/packet" "github.com/zeppelinmc/zeppelin/protocol/net/packet/configuration" "github.com/zeppelinmc/zeppelin/protocol/net/packet/play" "github.com/zeppelinmc/zeppelin/protocol/net/tags" "github.com/zeppelinmc/zeppelin/protocol/text" "github.com/zeppelinmc/zeppelin/server/command" "github.com/zeppelinmc/zeppelin/server/entity" "github.com/zeppelinmc/zeppelin/server/player/state" "github.com/zeppelinmc/zeppelin/server/world/dimension" "github.com/zeppelinmc/zeppelin/server/world/level" "slices" "sync/atomic" "unsafe" ) type Player struct { *net.Conn *state.PlayerEntity playerList *PlayerList // the entity id for this player entityId int32 Unlisted bool ClientInformation atomic.Pointer[configuration.ClientInformation] dimensionManager *dimension.DimensionManager worldLevel *level.Level serverProperties *properties.ServerProperties commandManager *command.Manager // the time in milliseconds that the keep alive packet was sent to the server from the client sbLastKeepalive atomic.Int64 // the time in milliseconds that the keep alive packet was sent to the client from the server cbLastKeepAlive atomic.Int64 registryIndexes map[string][]string // the packet currently awaited packetAwaited atomic.Int32 packetAwaitedChan atomic.Pointer[chan packet.Decodeable] } func int32toAtomic(i int32) atomic.Int32 { // int32 and atomic.Int32 are the same structure and size return *(*atomic.Int32)(unsafe.Pointer(&i)) } func (list *PlayerList) New(conn *net.Conn, en *state.PlayerEntity, dimensionManager *dimension.DimensionManager, worldLevel *level.Level, serverProperties *properties.ServerProperties, commandManager *command.Manager) *Player { p := &Player{ entityId: entity.NewEntityId(), PlayerEntity: en, dimensionManager: dimensionManager, worldLevel: worldLevel, serverProperties: serverProperties, commandManager: commandManager, registryIndexes: make(map[string][]string), packetAwaited: int32toAtomic(-1), playerList: list, Conn: conn, } p.ClientInformation.Store(&configuration.ClientInformation{}) return p } /* ViewDistance returns the view distance of the client, in chunks, or the server's render distance if the client's view distance is bigger or not set */ func (p *Player) ViewDistance() int32 { plVd := int32(p.ClientInformation.Load().ViewDistance) if plVd == 0 || plVd > p.serverProperties.ViewDistance { return p.serverProperties.ViewDistance } return plVd } // writeOrKill tries to write the packet to the player and kills the connection on failure func (p *Player) writeOrKill(pk packet.Encodeable) { if err := p.WritePacket(pk); err != nil { p.killConnection(false, "lost connection") } } // finishConfiguration finishes the configuration phase by sending the server brand, registries and tags func (p *Player) finishConfiguration() error { // begin packet reading in the background go p.listenPackets() // send the server brand (shows in F3) if err := p.WritePacket(&configuration.ClientboundPluginMessage{ Channel: "minecraft:brand", Data: encoding.AppendString(nil, "Zeppelin"), }); err != nil { return err } // send the registry packets configuration.RegistryPacketsMutex.Lock() for _, pk := range configuration.RegistryPackets { if err := p.WritePacket(pk); err != nil { return err } p.registryIndexes[pk.RegistryId] = slices.Clone(pk.Indexes) } configuration.RegistryPacketsMutex.Unlock() // finish the configuration phase if err := p.WritePacket(configuration.FinishConfiguration{}); err != nil { return err } // wait for the client to acknowledge the finish configuration packet if _, err := p.awaitPacket(configuration.PacketIdAcknowledgeFinishConfiguration); err != nil { return err } // switch to play state p.SetState(net.PlayState) // send tags (blocks, fluids, etc) return p.WritePacket(tags.Tags) } // startGame finishes the initialization for the player and logs it into the world func (p *Player) startGame() error { if err := p.sendCommandGraph(); err != nil { return err } if err := p.WritePacket(&play.Login{ EntityID: p.entityId, DimensionName: p.DimensionName(), GameMode: byte(p.GameMode()), DimensionType: int32(slices.Index(p.registryIndexes["minecraft:dimension_type"], p.DimensionName())), ViewDistance: p.serverProperties.ViewDistance, SimulationDistance: p.serverProperties.SimulationDistance, HashedSeed: p.worldLevel.Data.WorldGenSettings.Seed.Hash(), EnforcesSecureChat: p.serverProperties.EnforceSecureProfile, }); err != nil { return err } // todo add all other stuff if err := p.WritePacket(&play.SetDefaultSpawnPosition{ X: p.worldLevel.Data.SpawnX, Y: p.worldLevel.Data.SpawnY, Z: p.worldLevel.Data.SpawnZ, Angle: p.worldLevel.Data.SpawnAngle, }); err != nil { return err } x, y, z := p.Position() yaw, pitch := p.Rotation() if err := p.SynchronizePosition(x, y, z, yaw, pitch); err != nil { return err } if err := p.sendSpawnChunks(); err != nil { return err } if err := p.SynchronizePosition(x, y, z, yaw, pitch); err != nil { return err } if err := p.WritePacket(&play.GameEvent{Event: play.GameEventStartWaitingChunks}); err != nil { return err } p.playerList.AddPlayer(p) return nil } // SynchronizePosition teleports the player to the specified coordinates func (p *Player) SynchronizePosition(x, y, z float64, yaw, pitch float32) error { p.SetPosition(x, y, z) p.SetRotation(yaw, pitch) if err := p.WritePacket(&play.SynchronizePlayerPosition{X: x, Y: y, Z: z, Yaw: yaw, Pitch: pitch}); err != nil { return err } _, err := p.awaitPacket(play.PacketIdConfirmTeleportation) return err } // Login logs the player into the game func (p *Player) Login() error { if err := p.finishConfiguration(); err != nil { return err } return p.startGame() } // SystemMessage sends a system message (unsigned) to the player func (p *Player) SystemMessage(msg text.TextComponent) error { return p.WritePacket(&play.SystemChatMessage{Content: msg}) } // sendCommandGraph sends the command graph to the player func (p *Player) sendCommandGraph() error { return p.WritePacket(p.commandManager.Encode()) } ================================================ FILE: server/player/playerlist.go ================================================ package player import ( "github.com/google/uuid" "github.com/zeppelinmc/zeppelin/protocol/net/packet/play" "github.com/zeppelinmc/zeppelin/util/atomic" "unsafe" ) func NewPlayerList(cap uintptr) PlayerList { return PlayerList{ playerList: atomic.Make(0, cap, atomic.Pointer), } } type PlayerList struct { playerList atomic.Slice } func (list *PlayerList) NumPlayers() int { return int(list.playerList.Len()) } func (list *PlayerList) Player(uuid uuid.UUID) *Player { for i := uintptr(0); i < list.playerList.Len(); i++ { player := list.playerAtIndex(i) if player.UUID() == uuid { return player } } return nil } func (list *PlayerList) PlayerByUsername(name string) *Player { for i := uintptr(0); i < list.playerList.Len(); i++ { player := list.playerAtIndex(i) if player.Username() == name { return player } } return nil } func (list *PlayerList) playerAtIndex(index uintptr) *Player { return *(**Player)(list.playerList.Element(index)) } func (list *PlayerList) AddPlayer(player *Player) { list.addPlayerToSlice(player) update := &play.PlayerInfoUpdate{ Actions: play.ActionAddPlayer | play.ActionUpdateListed, //todo: add the rest Players: make(map[uuid.UUID]play.PlayerAction, list.NumPlayers()), } for i := uintptr(0); i < list.playerList.Len(); i++ { player := list.playerAtIndex(i) update.Players[player.UUID()] = play.PlayerAction{ Name: player.Username(), Listed: !player.Unlisted, Properties: player.Properties(), } } for i := uintptr(0); i < list.playerList.Len(); i++ { player := list.playerAtIndex(i) player.writeOrKill(update) } } func (list *PlayerList) addPlayerToSlice(player *Player) { pointerOfPlayer := unsafe.Pointer(player) list.playerList.Append(unsafe.Pointer(&pointerOfPlayer)) } ================================================ FILE: server/player/state/list/playerlist.go ================================================ // Package list provides parsing of playerlist files (whitelist.json, ops.json etc) package list type WhitelistPlayer struct { UUID string `json:"uuid"` Name string `json:"name"` } type OperatorPlayer struct { UUID string `json:"uuid"` Name string `json:"name"` Level int32 `json:"level"` BypassesPlayerLimit bool `json:"bypassesPlayerLimit"` } ================================================ FILE: server/player/state/playerEntity.go ================================================ package state import ( a "sync/atomic" "github.com/zeppelinmc/zeppelin/protocol/net/metadata" "github.com/zeppelinmc/zeppelin/server/container" "github.com/zeppelinmc/zeppelin/server/entity" "github.com/zeppelinmc/zeppelin/server/registry" "github.com/zeppelinmc/zeppelin/server/world/level" "github.com/zeppelinmc/zeppelin/util/atomic" ) type PlayerEntity struct { entity.LivingEntity data level.Player abilities atomic.AtomicValue[level.PlayerAbilities] gameMode a.Int32 selectedItemSlot a.Int32 //recipeBook atomic.AtomicValue[level.RecipeBook] inventory *container.Container } // New looks up a player state in the cache or creates one if not found func (mgr *PlayerEntityManager) New(data level.Player) *PlayerEntity { if p, ok := mgr.lookup(data.UUID.UUID()); ok { return p } pl := &PlayerEntity{ LivingEntity: entity.NewLiving(entity.New(data.UUID.UUID(), registry.EntityType.Get("minecraft:player"), metadata.Player(data.Health), data.Attributes)), //recipeBook: atomic.Value(data.RecipeBook), abilities: atomic.Value(data.Abilities), inventory: &data.Inventory, data: data, } pl.gameMode.Store(int32(data.PlayerGameType)) pl.selectedItemSlot.Store(data.SelectedItemSlot) pl.SetPosition(data.Pos[0], data.Pos[1], data.Pos[2]) pl.SetMotion(data.Motion[0], data.Motion[1], data.Motion[2]) pl.SetRotation(data.Rotation[0], data.Rotation[1]) pl.SetOnGround(data.OnGround) pl.SetDimensionName(data.Dimension) pl.SetHealth(data.Health) pl.SetFood(data.FoodLevel, data.FoodSaturationLevel, data.FoodExhaustionLevel) mgr.add(pl) return pl } func (p *PlayerEntity) Abilities() level.PlayerAbilities { return p.abilities.Get() } func (p *PlayerEntity) SetAbilities(abs level.PlayerAbilities) { p.abilities.Set(abs) } func (p *PlayerEntity) GameMode() level.GameMode { return level.GameMode(p.gameMode.Load()) } func (p *PlayerEntity) SetGameMode(mode level.GameMode) { p.gameMode.Store(int32(mode)) } /*func (p *PlayerEntity) RecipeBook() level.RecipeBook { return p.recipeBook.Get() } func (p *PlayerEntity) SetRecipeBook(book level.RecipeBook) { p.recipeBook.Set(book) }*/ func (p *PlayerEntity) Inventory() *container.Container { return p.inventory } // if negative, returns 0 and if over 8, returns 8 func (p *PlayerEntity) SelectedItemSlot() int32 { slot := p.selectedItemSlot.Load() if slot < 0 { slot = 0 } if slot > 8 { slot = 8 } return slot } // if negative, set to 0 and if over 8, set to 8 func (p *PlayerEntity) SetSelectedItemSlot(slot int32) { if slot < 0 { slot = 0 } if slot > 8 { slot = 8 } p.selectedItemSlot.Store(slot) } func (p *PlayerEntity) sync() { x, y, z := p.Position() yaw, pitch := p.Rotation() vx, vy, vz := p.Motion() p.data.Abilities = p.abilities.Get() p.data.Pos = [3]float64{x, y, z} p.data.Rotation = [2]float32{yaw, pitch} p.data.OnGround = p.OnGround() p.data.Dimension = p.DimensionName() p.data.Inventory = *p.inventory //p.data.RecipeBook = p.recipeBook.Get() p.data.Motion = [3]float64{vx, vy, vz} p.data.Attributes = p.Attributes() p.data.Health = p.Health() p.data.FoodLevel, p.data.FoodSaturationLevel, p.data.FoodExhaustionLevel = p.Food() p.data.PlayerGameType = level.GameMode(p.gameMode.Load()) p.data.SelectedItemSlot = p.selectedItemSlot.Load() } ================================================ FILE: server/player/state/playerEntityManager.go ================================================ package state import ( "sync" "github.com/google/uuid" ) // the player cache is used when saving the world playerdata type PlayerEntityManager struct { m map[uuid.UUID]*PlayerEntity mu sync.RWMutex } func (mgr *PlayerEntityManager) lookup(id uuid.UUID) (*PlayerEntity, bool) { mgr.mu.RLock() defer mgr.mu.RUnlock() p, ok := mgr.m[id] return p, ok } func (mgr *PlayerEntityManager) add(p *PlayerEntity) { mgr.mu.Lock() defer mgr.mu.Unlock() mgr.m[p.UUID()] = p } // saves all the players in the manager to the path specified in their data file func (mgr *PlayerEntityManager) SaveAll() { mgr.mu.RLock() defer mgr.mu.RUnlock() for _, player := range mgr.m { player.sync() player.data.Save() } } func NewPlayerEntityManager() *PlayerEntityManager { return &PlayerEntityManager{m: make(map[uuid.UUID]*PlayerEntity)} } ================================================ FILE: server/plugin.go ================================================ package server import ( "io/fs" "os" "plugin" "github.com/zeppelinmc/zeppelin/util/log" ) type Plugin struct { basePluginsPath string srv *Server Identifier string OnLoad func(*Plugin) Unload func(*Plugin) } func (p Plugin) FS() fs.FS { return os.DirFS(p.Dir()) } // Dir returns the base directory for the plugin (plugins/) func (p Plugin) Dir() string { return p.basePluginsPath + "/" + p.Identifier } func (p Plugin) Server() *Server { return p.srv } func (srv *Server) loadPlugins() { os.Mkdir("plugins", 0755) dir, _ := os.ReadDir("plugins") for _, entry := range dir { if entry.IsDir() { continue } srv.loadPlugin("plugins/" + entry.Name()) } } func (srv *Server) loadPlugin(name string) { pl, err := plugin.Open(name) if err != nil { log.Errorlnf("Error loading plugin %s: %v", name, err) return } sym, err := pl.Lookup("ZeppelinPluginExport") if err != nil { log.Errorlnf("Couldn't find plugin export for %s: %v", name, err) return } plugin, ok := sym.(*Plugin) if !ok { log.Errorlnf("Invalid plugin export for %s", name) return } plugin.basePluginsPath = "plugins" plugin.srv = srv os.Mkdir(plugin.Dir(), 0755) plugin.OnLoad(plugin) } ================================================ FILE: server/registry/activity.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var Activity = Registry{ Default: "", Entries: map[string]int32{ "minecraft:fight": 10, "minecraft:idle": 1, "minecraft:long_jump": 16, "minecraft:ram": 17, "minecraft:swim": 19, "minecraft:admire_item": 12, "minecraft:celebrate": 11, "minecraft:dig": 25, "minecraft:play_dead": 15, "minecraft:pre_raid": 8, "minecraft:rest": 4, "minecraft:roar": 23, "minecraft:lay_spawn": 20, "minecraft:meet": 5, "minecraft:panic": 6, "minecraft:ride": 14, "minecraft:tongue": 18, "minecraft:avoid": 13, "minecraft:core": 0, "minecraft:play": 3, "minecraft:raid": 7, "minecraft:sniff": 21, "minecraft:work": 2, "minecraft:emerge": 24, "minecraft:hide": 9, "minecraft:investigate": 22, }, } ================================================ FILE: server/registry/armor_material.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var ArmorMaterial = Registry{ Default: "", Entries: map[string]int32{ "minecraft:gold": 3, "minecraft:iron": 2, "minecraft:leather": 0, "minecraft:netherite": 6, "minecraft:turtle": 5, "minecraft:armadillo": 7, "minecraft:chainmail": 1, "minecraft:diamond": 4, }, } ================================================ FILE: server/registry/attribute.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var Attribute = Registry{ Default: "", Entries: map[string]int32{ "minecraft:generic.jump_strength": 14, "minecraft:generic.armor": 0, "minecraft:generic.explosion_knockback_resistance": 8, "minecraft:generic.fall_damage_multiplier": 10, "minecraft:generic.gravity": 13, "minecraft:generic.luck": 16, "minecraft:generic.oxygen_bonus": 22, "minecraft:player.block_interaction_range": 6, "minecraft:player.mining_efficiency": 19, "minecraft:generic.attack_damage": 2, "minecraft:generic.follow_range": 12, "minecraft:player.entity_interaction_range": 9, "minecraft:player.sweeping_damage_ratio": 29, "minecraft:generic.armor_toughness": 1, "minecraft:generic.attack_knockback": 3, "minecraft:generic.attack_speed": 4, "minecraft:generic.knockback_resistance": 15, "minecraft:generic.max_health": 18, "minecraft:generic.water_movement_efficiency": 30, "minecraft:player.block_break_speed": 5, "minecraft:player.sneaking_speed": 25, "minecraft:zombie.spawn_reinforcements": 26, "minecraft:generic.movement_speed": 21, "minecraft:generic.step_height": 27, "minecraft:player.submerged_mining_speed": 28, "minecraft:generic.flying_speed": 11, "minecraft:generic.max_absorption": 17, "minecraft:generic.scale": 24, "minecraft:generic.burning_time": 7, "minecraft:generic.movement_efficiency": 20, "minecraft:generic.safe_fall_distance": 23, }, } ================================================ FILE: server/registry/block.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var Block = Registry{ Default: "minecraft:air", Entries: map[string]int32{ "minecraft:command_block": 351, "minecraft:mangrove_wall_hanging_sign": 226, "minecraft:muddy_mangrove_roots": 55, "minecraft:waxed_weathered_copper_trapdoor": 989, "minecraft:attached_melon_stem": 314, "minecraft:cobweb": 122, "minecraft:dark_oak_stairs": 459, "minecraft:snow_block": 249, "minecraft:cherry_planks": 18, "minecraft:crimson_roots": 809, "minecraft:fern": 124, "minecraft:potted_poppy": 367, "minecraft:sweet_berry_bush": 788, "minecraft:beetroots": 601, "minecraft:deepslate_tile_slab": 1034, "minecraft:gray_banner": 510, "minecraft:oxidized_copper_trapdoor": 984, "minecraft:cherry_slab": 544, "minecraft:cobblestone_stairs": 198, "minecraft:purple_stained_glass_pane": 451, "minecraft:bamboo_trapdoor": 292, "minecraft:chiseled_red_sandstone": 536, "minecraft:polished_deepslate_slab": 1030, "minecraft:trial_spawner": 1057, "minecraft:infested_deepslate": 1043, "minecraft:light_blue_stained_glass_pane": 444, "minecraft:mangrove_planks": 20, "minecraft:shroomlight": 804, "minecraft:sunflower": 497, "minecraft:waxed_copper_bulb": 1002, "minecraft:crimson_door": 826, "minecraft:magenta_candle": 872, "minecraft:brown_banner": 515, "minecraft:crimson_fence_gate": 820, "minecraft:crimson_fungus": 803, "minecraft:dead_tube_coral_block": 683, "minecraft:light_blue_bed": 106, "minecraft:redstone_lamp": 339, "minecraft:barrier": 464, "minecraft:black_carpet": 493, "minecraft:warped_button": 825, "minecraft:warped_hanging_sign": 216, "minecraft:deepslate_redstone_ore": 243, "minecraft:end_stone_bricks": 597, "minecraft:potted_allium": 369, "minecraft:acacia_fence_gate": 570, "minecraft:cracked_deepslate_bricks": 1041, "minecraft:orange_carpet": 479, "minecraft:pink_concrete_powder": 668, "minecraft:player_wall_head": 401, "minecraft:polished_tuff": 913, "minecraft:dropper": 424, "minecraft:magenta_carpet": 480, "minecraft:jungle_wall_hanging_sign": 224, "minecraft:light_blue_wool": 133, "minecraft:orange_candle_cake": 888, "minecraft:spruce_wood": 67, "minecraft:bell": 783, "minecraft:chorus_flower": 593, "minecraft:oak_pressure_plate": 233, "minecraft:spore_blossom": 1011, "minecraft:copper_block": 932, "minecraft:gray_concrete_powder": 669, "minecraft:dead_fire_coral_block": 686, "minecraft:ender_chest": 344, "minecraft:light_blue_glazed_terracotta": 633, "minecraft:blue_candle": 881, "minecraft:clay": 251, "minecraft:red_candle": 884, "minecraft:structure_block": 832, "minecraft:mud_brick_stairs": 322, "minecraft:orange_candle": 871, "minecraft:red_sand": 36, "minecraft:stripped_crimson_stem": 799, "minecraft:warped_hyphae": 791, "minecraft:waxed_oxidized_cut_copper_stairs": 966, "minecraft:cyan_bed": 112, "minecraft:deepslate_lapis_ore": 96, "minecraft:lime_candle": 875, "minecraft:tnt": 166, "minecraft:torchflower_crop": 598, "minecraft:dead_fire_coral_fan": 706, "minecraft:dead_tube_coral": 693, "minecraft:dark_oak_hanging_sign": 214, "minecraft:dead_bubble_coral_block": 685, "minecraft:waxed_exposed_copper": 960, "minecraft:brown_shulker_box": 626, "minecraft:crimson_button": 824, "minecraft:sniffer_egg": 682, "minecraft:tuff_wall": 912, "minecraft:vault": 1058, "minecraft:mossy_stone_brick_slab": 748, "minecraft:pink_terracotta": 431, "minecraft:fire_coral_wall_fan": 721, "minecraft:black_shulker_box": 629, "minecraft:diorite_slab": 758, "minecraft:honeycomb_block": 839, "minecraft:mud_brick_slab": 557, "minecraft:warped_wart_block": 795, "minecraft:waxed_weathered_copper": 959, "minecraft:acacia_leaves": 86, "minecraft:gold_ore": 39, "minecraft:exposed_chiseled_copper": 944, "minecraft:cherry_trapdoor": 289, "minecraft:dark_oak_wall_hanging_sign": 225, "minecraft:deepslate_emerald_ore": 343, "minecraft:dripstone_block": 1008, "minecraft:magma_block": 607, "minecraft:spruce_log": 47, "minecraft:spruce_hanging_sign": 209, "minecraft:potted_flowering_azalea_bush": 1049, "minecraft:potted_lily_of_the_valley": 377, "minecraft:soul_torch": 260, "minecraft:bamboo_stairs": 461, "minecraft:purple_glazed_terracotta": 640, "minecraft:magenta_concrete": 648, "minecraft:rail": 197, "minecraft:bamboo_button": 393, "minecraft:lever": 230, "minecraft:horn_coral_block": 692, "minecraft:bee_nest": 836, "minecraft:frogspawn": 1053, "minecraft:cave_air": 730, "minecraft:end_stone_brick_wall": 770, "minecraft:dark_oak_fence_gate": 572, "minecraft:twisting_vines_plant": 808, "minecraft:warped_fungus": 794, "minecraft:black_concrete_powder": 677, "minecraft:cyan_stained_glass": 277, "minecraft:flowering_azalea_leaves": 91, "minecraft:smoker": 775, "minecraft:tinted_glass": 924, "minecraft:brown_candle_cake": 899, "minecraft:dispenser": 98, "minecraft:orange_shulker_box": 615, "minecraft:yellow_concrete": 650, "minecraft:kelp": 678, "minecraft:lime_wall_banner": 524, "minecraft:green_banner": 516, "minecraft:soul_wall_torch": 261, "minecraft:cherry_wall_sign": 203, "minecraft:dead_bubble_coral_wall_fan": 715, "minecraft:cyan_candle": 879, "minecraft:waxed_copper_grate": 994, "minecraft:lantern": 784, "minecraft:mangrove_sign": 193, "minecraft:mossy_stone_brick_wall": 762, "minecraft:red_wall_banner": 533, "minecraft:bamboo_planks": 21, "minecraft:dark_oak_door": 588, "minecraft:tube_coral_block": 688, "minecraft:cut_sandstone": 101, "minecraft:lily_of_the_valley": 160, "minecraft:waxed_oxidized_copper_door": 980, "minecraft:waxed_weathered_copper_bulb": 1004, "minecraft:weathered_cut_copper_stairs": 951, "minecraft:crimson_hanging_sign": 215, "minecraft:end_stone": 337, "minecraft:heavy_weighted_pressure_plate": 413, "minecraft:potted_cactus": 382, "minecraft:red_nether_brick_wall": 768, "minecraft:sculk_shrieker": 931, "minecraft:sticky_piston": 121, "minecraft:waxed_weathered_cut_copper": 963, "minecraft:acacia_wood": 70, "minecraft:budding_amethyst": 904, "minecraft:oak_fence": 254, "minecraft:red_sandstone_slab": 560, "minecraft:blue_wool": 141, "minecraft:brown_bed": 115, "minecraft:tall_grass": 501, "minecraft:deepslate_gold_ore": 40, "minecraft:light_gray_stained_glass": 276, "minecraft:pumpkin": 311, "minecraft:birch_hanging_sign": 210, "minecraft:chorus_plant": 592, "minecraft:birch_stairs": 349, "minecraft:dark_oak_button": 391, "minecraft:light_blue_candle_cake": 890, "minecraft:magenta_shulker_box": 616, "minecraft:cobbled_deepslate_slab": 1026, "minecraft:jungle_wood": 69, "minecraft:stripped_acacia_wood": 78, "minecraft:acacia_fence": 578, "minecraft:pink_petals": 1015, "minecraft:light_gray_glazed_terracotta": 638, "minecraft:spruce_stairs": 348, "minecraft:white_candle": 870, "minecraft:brick_slab": 555, "minecraft:dead_bush": 125, "minecraft:yellow_candle_cake": 891, "minecraft:light_gray_candle": 878, "minecraft:light_gray_wall_banner": 527, "minecraft:mossy_cobblestone_slab": 750, "minecraft:potted_crimson_roots": 846, "minecraft:purpur_block": 594, "minecraft:skeleton_skull": 394, "minecraft:white_concrete_powder": 662, "minecraft:dead_horn_coral_block": 687, "minecraft:packed_mud": 297, "minecraft:emerald_ore": 342, "minecraft:jungle_stairs": 350, "minecraft:lapis_ore": 95, "minecraft:large_fern": 502, "minecraft:polished_blackstone_slab": 862, "minecraft:blackstone_wall": 851, "minecraft:brown_mushroom": 161, "minecraft:sandstone_wall": 769, "minecraft:smooth_quartz_slab": 753, "minecraft:wall_torch": 172, "minecraft:waxed_exposed_copper_bulb": 1003, "minecraft:gray_candle_cake": 894, "minecraft:purpur_stairs": 596, "minecraft:amethyst_block": 903, "minecraft:nether_wart": 328, "minecraft:potted_wither_rose": 378, "minecraft:purple_wall_banner": 529, "minecraft:spruce_fence": 575, "minecraft:trapped_chest": 411, "minecraft:warped_wall_hanging_sign": 228, "minecraft:birch_pressure_plate": 235, "minecraft:ladder": 196, "minecraft:deepslate_tiles": 1032, "minecraft:polished_basalt": 259, "minecraft:waxed_cut_copper": 965, "minecraft:yellow_carpet": 482, "minecraft:acacia_log": 50, "minecraft:air": 0, "minecraft:blue_terracotta": 436, "minecraft:nether_portal": 263, "minecraft:stone_stairs": 738, "minecraft:andesite_stairs": 742, "minecraft:birch_fence_gate": 568, "minecraft:smooth_stone": 563, "minecraft:cyan_carpet": 487, "minecraft:smooth_sandstone_slab": 752, "minecraft:potted_pink_tulip": 374, "minecraft:cake": 266, "minecraft:oak_log": 46, "minecraft:granite_stairs": 741, "minecraft:nether_bricks": 325, "minecraft:polished_tuff_slab": 914, "minecraft:weathered_copper_trapdoor": 985, "minecraft:brown_stained_glass_pane": 453, "minecraft:creeper_head": 402, "minecraft:jigsaw": 833, "minecraft:large_amethyst_bud": 906, "minecraft:glowstone": 262, "minecraft:honey_block": 838, "minecraft:turtle_egg": 681, "minecraft:bubble_column": 731, "minecraft:packed_ice": 496, "minecraft:water_cauldron": 332, "minecraft:iron_trapdoor": 466, "minecraft:purple_stained_glass": 278, "minecraft:lime_candle_cake": 892, "minecraft:mangrove_wall_sign": 206, "minecraft:cracked_deepslate_tiles": 1042, "minecraft:deepslate_iron_ore": 42, "minecraft:magenta_wall_banner": 521, "minecraft:yellow_wall_banner": 523, "minecraft:birch_wall_hanging_sign": 221, "minecraft:gray_bed": 110, "minecraft:cactus": 250, "minecraft:cyan_banner": 512, "minecraft:dark_oak_trapdoor": 290, "minecraft:jungle_sapling": 26, "minecraft:waxed_oxidized_copper_bulb": 1005, "minecraft:attached_pumpkin_stem": 313, "minecraft:blue_ice": 724, "minecraft:mud_bricks": 298, "minecraft:purple_candle_cake": 897, "minecraft:brown_concrete": 658, "minecraft:ice": 248, "minecraft:lime_concrete": 651, "minecraft:lime_wool": 135, "minecraft:podzol": 11, "minecraft:sandstone_slab": 551, "minecraft:sandstone_stairs": 341, "minecraft:tuff_stairs": 911, "minecraft:weathered_copper": 934, "minecraft:green_candle_cake": 900, "minecraft:green_stained_glass_pane": 454, "minecraft:mangrove_hanging_sign": 217, "minecraft:tube_coral_fan": 708, "minecraft:dragon_egg": 338, "minecraft:gravel": 37, "minecraft:kelp_plant": 679, "minecraft:smithing_table": 781, "minecraft:cut_sandstone_slab": 552, "minecraft:gray_concrete": 653, "minecraft:potted_azalea_bush": 1048, "minecraft:spruce_fence_gate": 567, "minecraft:waxed_oxidized_copper_trapdoor": 988, "minecraft:zombie_wall_head": 399, "minecraft:blast_furnace": 776, "minecraft:cherry_button": 390, "minecraft:poppy": 149, "minecraft:cobbled_deepslate_wall": 1027, "minecraft:oak_wall_hanging_sign": 219, "minecraft:dead_brain_coral_block": 684, "minecraft:potted_bamboo": 728, "minecraft:potted_dandelion": 366, "minecraft:tall_seagrass": 127, "minecraft:blue_concrete_powder": 673, "minecraft:dark_oak_wood": 72, "minecraft:warped_stairs": 823, "minecraft:weeping_vines": 805, "minecraft:lightning_rod": 1006, "minecraft:stripped_spruce_wood": 75, "minecraft:moving_piston": 146, "minecraft:tripwire_hook": 345, "minecraft:chiseled_quartz_block": 420, "minecraft:mangrove_door": 589, "minecraft:warped_fence": 817, "minecraft:waxed_weathered_copper_door": 981, "minecraft:yellow_shulker_box": 618, "minecraft:zombie_head": 398, "minecraft:oxidized_chiseled_copper": 942, "minecraft:sea_lantern": 476, "minecraft:smooth_sandstone_stairs": 739, "minecraft:spawner": 175, "minecraft:black_stained_glass_pane": 456, "minecraft:green_glazed_terracotta": 643, "minecraft:dead_bubble_coral": 695, "minecraft:end_stone_brick_stairs": 737, "minecraft:waxed_exposed_cut_copper_slab": 972, "minecraft:weathered_cut_copper_slab": 955, "minecraft:yellow_wool": 134, "minecraft:birch_door": 584, "minecraft:cherry_sign": 190, "minecraft:polished_deepslate_wall": 1031, "minecraft:sea_pickle": 723, "minecraft:torchflower": 148, "minecraft:exposed_copper_trapdoor": 983, "minecraft:light_gray_concrete": 654, "minecraft:mangrove_wood": 73, "minecraft:obsidian": 170, "minecraft:pink_tulip": 156, "minecraft:quartz_stairs": 422, "minecraft:smooth_red_sandstone": 566, "minecraft:spruce_sapling": 24, "minecraft:dead_brain_coral_fan": 704, "minecraft:mangrove_stairs": 460, "minecraft:stripped_crimson_hyphae": 801, "minecraft:warped_roots": 796, "minecraft:cave_vines": 1009, "minecraft:crimson_nylium": 802, "minecraft:crimson_stairs": 822, "minecraft:polished_tuff_stairs": 915, "minecraft:smooth_red_sandstone_slab": 747, "minecraft:bamboo_sapling": 726, "minecraft:birch_button": 387, "minecraft:potted_red_mushroom": 379, "minecraft:purple_shulker_box": 624, "minecraft:magenta_stained_glass": 270, "minecraft:orange_glazed_terracotta": 631, "minecraft:dead_fire_coral": 696, "minecraft:nether_brick_stairs": 327, "minecraft:brown_carpet": 490, "minecraft:cobblestone": 12, "minecraft:piston": 128, "minecraft:polished_granite": 3, "minecraft:tube_coral_wall_fan": 718, "minecraft:andesite": 6, "minecraft:deepslate_brick_slab": 1038, "minecraft:oak_stairs": 176, "minecraft:yellow_stained_glass": 272, "minecraft:diamond_ore": 179, "minecraft:dragon_head": 404, "minecraft:bubble_coral": 700, "minecraft:dark_prismarine": 469, "minecraft:verdant_froglight": 1051, "minecraft:brain_coral": 699, "minecraft:brick_stairs": 320, "minecraft:purpur_slab": 562, "minecraft:red_sandstone_stairs": 538, "minecraft:flowering_azalea": 1013, "minecraft:pitcher_crop": 599, "minecraft:magenta_terracotta": 427, "minecraft:pink_concrete": 652, "minecraft:waxed_cut_copper_stairs": 969, "minecraft:jungle_log": 49, "minecraft:magenta_stained_glass_pane": 443, "minecraft:light_gray_carpet": 486, "minecraft:exposed_cut_copper_slab": 956, "minecraft:green_terracotta": 438, "minecraft:cobblestone_slab": 554, "minecraft:jungle_slab": 542, "minecraft:polished_blackstone_button": 864, "minecraft:spruce_planks": 14, "minecraft:big_dripleaf_stem": 1018, "minecraft:bubble_coral_fan": 710, "minecraft:crimson_stem": 798, "minecraft:white_stained_glass_pane": 441, "minecraft:redstone_torch": 244, "minecraft:torch": 171, "minecraft:yellow_banner": 507, "minecraft:blue_shulker_box": 625, "minecraft:purple_wool": 140, "minecraft:purple_carpet": 488, "minecraft:raw_copper_block": 1046, "minecraft:cornflower": 158, "minecraft:powder_snow": 925, "minecraft:exposed_cut_copper_stairs": 952, "minecraft:potted_orange_tulip": 372, "minecraft:prismarine_brick_stairs": 471, "minecraft:sculk_vein": 929, "minecraft:stripped_jungle_wood": 77, "minecraft:black_wall_banner": 534, "minecraft:dead_brain_coral": 694, "minecraft:detector_rail": 120, "minecraft:gray_carpet": 485, "minecraft:green_carpet": 491, "minecraft:mangrove_leaves": 89, "minecraft:quartz_pillar": 421, "minecraft:vine": 317, "minecraft:coarse_dirt": 10, "minecraft:conduit": 725, "minecraft:green_wall_banner": 532, "minecraft:oxidized_copper_door": 976, "minecraft:polished_andesite_slab": 757, "minecraft:cracked_nether_bricks": 867, "minecraft:dark_prismarine_stairs": 472, "minecraft:dead_horn_coral_wall_fan": 717, "minecraft:granite_slab": 754, "minecraft:lily_pad": 324, "minecraft:stone_pressure_plate": 231, "minecraft:tuff_bricks": 918, "minecraft:brain_coral_fan": 709, "minecraft:cyan_concrete": 655, "minecraft:diamond_block": 181, "minecraft:green_shulker_box": 627, "minecraft:stripped_birch_log": 58, "minecraft:activator_rail": 423, "minecraft:chiseled_polished_blackstone": 856, "minecraft:dark_oak_planks": 19, "minecraft:infested_cobblestone": 300, "minecraft:lime_concrete_powder": 667, "minecraft:birch_trapdoor": 286, "minecraft:bookshelf": 167, "minecraft:wither_skeleton_skull": 396, "minecraft:cyan_glazed_terracotta": 639, "minecraft:dark_oak_wall_sign": 205, "minecraft:pink_candle": 876, "minecraft:repeating_command_block": 604, "minecraft:gray_shulker_box": 621, "minecraft:void_air": 729, "minecraft:waxed_exposed_cut_copper_stairs": 968, "minecraft:white_wall_banner": 519, "minecraft:birch_sign": 188, "minecraft:black_stained_glass": 283, "minecraft:end_stone_brick_slab": 751, "minecraft:stripped_dark_oak_log": 62, "minecraft:tuff_slab": 910, "minecraft:fire_coral_block": 691, "minecraft:oxidized_copper": 935, "minecraft:netherite_block": 840, "minecraft:oak_fence_gate": 319, "minecraft:red_glazed_terracotta": 644, "minecraft:rose_bush": 499, "minecraft:waxed_exposed_cut_copper": 964, "minecraft:brown_concrete_powder": 674, "minecraft:lime_glazed_terracotta": 635, "minecraft:potted_oxeye_daisy": 375, "minecraft:warped_door": 827, "minecraft:crimson_wall_hanging_sign": 227, "minecraft:deepslate": 1023, "minecraft:oak_trapdoor": 284, "minecraft:piston_head": 129, "minecraft:quartz_block": 419, "minecraft:black_candle": 885, "minecraft:dead_tube_coral_wall_fan": 713, "minecraft:mushroom_stem": 307, "minecraft:polished_diorite_stairs": 735, "minecraft:black_glazed_terracotta": 645, "minecraft:furnace": 185, "minecraft:lime_banner": 508, "minecraft:nether_brick_fence": 326, "minecraft:raw_gold_block": 1047, "minecraft:spruce_wall_hanging_sign": 220, "minecraft:blue_banner": 514, "minecraft:crafting_table": 182, "minecraft:soul_lantern": 785, "minecraft:bubble_coral_block": 690, "minecraft:cyan_concrete_powder": 671, "minecraft:deepslate_tile_stairs": 1033, "minecraft:warped_trapdoor": 819, "minecraft:cut_copper_stairs": 953, "minecraft:nether_brick_wall": 766, "minecraft:potted_cornflower": 376, "minecraft:black_terracotta": 440, "minecraft:bricks": 165, "minecraft:sand": 34, "minecraft:spruce_leaves": 83, "minecraft:waxed_chiseled_copper": 949, "minecraft:blackstone": 849, "minecraft:quartz_bricks": 868, "minecraft:stripped_mangrove_log": 64, "minecraft:warped_planks": 811, "minecraft:oak_wood": 66, "minecraft:potted_torchflower": 356, "minecraft:nether_sprouts": 797, "minecraft:spruce_wall_sign": 200, "minecraft:chiseled_copper": 945, "minecraft:cocoa": 340, "minecraft:powered_rail": 119, "minecraft:stone_brick_stairs": 321, "minecraft:magenta_banner": 505, "minecraft:warped_wall_sign": 831, "minecraft:redstone_wire": 178, "minecraft:bamboo_wall_hanging_sign": 229, "minecraft:powder_snow_cauldron": 334, "minecraft:red_terracotta": 439, "minecraft:sculk_sensor": 926, "minecraft:brain_coral_wall_fan": 719, "minecraft:orange_terracotta": 426, "minecraft:stripped_warped_hyphae": 792, "minecraft:mossy_cobblestone_stairs": 736, "minecraft:polished_blackstone_stairs": 861, "minecraft:end_portal_frame": 336, "minecraft:jungle_hanging_sign": 213, "minecraft:orange_tulip": 154, "minecraft:pink_shulker_box": 620, "minecraft:prismarine": 467, "minecraft:reinforced_deepslate": 1054, "minecraft:white_carpet": 478, "minecraft:blue_stained_glass": 279, "minecraft:brown_mushroom_block": 305, "minecraft:dragon_wall_head": 405, "minecraft:iron_bars": 308, "minecraft:polished_andesite_stairs": 744, "minecraft:red_stained_glass_pane": 455, "minecraft:waxed_weathered_cut_copper_stairs": 967, "minecraft:ancient_debris": 841, "minecraft:bamboo_pressure_plate": 241, "minecraft:red_concrete": 660, "minecraft:warped_sign": 829, "minecraft:wither_rose": 159, "minecraft:dark_oak_slab": 545, "minecraft:infested_mossy_stone_bricks": 302, "minecraft:stone_slab": 549, "minecraft:stripped_jungle_log": 59, "minecraft:stripped_oak_log": 63, "minecraft:polished_andesite": 7, "minecraft:slime_block": 463, "minecraft:red_wool": 144, "minecraft:warped_fence_gate": 821, "minecraft:weathered_copper_door": 977, "minecraft:lime_shulker_box": 619, "minecraft:potted_mangrove_propagule": 364, "minecraft:gray_candle": 877, "minecraft:infested_stone_bricks": 301, "minecraft:waxed_cut_copper_slab": 973, "minecraft:acacia_button": 389, "minecraft:grass_block": 8, "minecraft:potted_crimson_fungus": 844, "minecraft:white_tulip": 155, "minecraft:bamboo_fence": 582, "minecraft:cyan_wool": 139, "minecraft:pink_stained_glass_pane": 447, "minecraft:pumpkin_stem": 315, "minecraft:small_amethyst_bud": 908, "minecraft:tuff_brick_stairs": 920, "minecraft:acacia_wall_sign": 202, "minecraft:light_blue_candle": 873, "minecraft:horn_coral_wall_fan": 722, "minecraft:stripped_mangrove_wood": 81, "minecraft:tuff_brick_slab": 919, "minecraft:brown_wall_banner": 531, "minecraft:lime_carpet": 483, "minecraft:white_stained_glass": 268, "minecraft:polished_blackstone_brick_wall": 859, "minecraft:yellow_terracotta": 429, "minecraft:azure_bluet": 152, "minecraft:copper_ore": 936, "minecraft:pink_wall_banner": 525, "minecraft:exposed_copper_door": 975, "minecraft:gray_wall_banner": 526, "minecraft:iron_block": 164, "minecraft:tuff": 909, "minecraft:acacia_wall_hanging_sign": 222, "minecraft:crimson_hyphae": 800, "minecraft:birch_log": 48, "minecraft:glass_pane": 310, "minecraft:waxed_exposed_copper_trapdoor": 987, "minecraft:amethyst_cluster": 905, "minecraft:cherry_door": 587, "minecraft:cracked_polished_blackstone_bricks": 855, "minecraft:dark_oak_sign": 192, "minecraft:jungle_fence": 577, "minecraft:mangrove_roots": 54, "minecraft:mangrove_slab": 546, "minecraft:red_shulker_box": 628, "minecraft:allium": 151, "minecraft:cherry_pressure_plate": 238, "minecraft:yellow_stained_glass_pane": 445, "minecraft:waxed_oxidized_copper_grate": 997, "minecraft:weeping_vines_plant": 806, "minecraft:oak_wall_sign": 199, "minecraft:polished_blackstone_brick_stairs": 858, "minecraft:potted_birch_sapling": 359, "minecraft:prismarine_wall": 760, "minecraft:waxed_exposed_chiseled_copper": 948, "minecraft:bamboo_fence_gate": 574, "minecraft:chiseled_nether_bricks": 866, "minecraft:mud": 1022, "minecraft:oak_hanging_sign": 208, "minecraft:potted_blue_orchid": 368, "minecraft:light": 465, "minecraft:magenta_bed": 105, "minecraft:fire": 173, "minecraft:gray_stained_glass": 275, "minecraft:horn_coral_fan": 712, "minecraft:moss_carpet": 1014, "minecraft:black_concrete": 661, "minecraft:deepslate_copper_ore": 937, "minecraft:potted_azure_bluet": 370, "minecraft:raw_iron_block": 1045, "minecraft:red_stained_glass": 282, "minecraft:yellow_bed": 107, "minecraft:cherry_sapling": 28, "minecraft:dirt": 9, "minecraft:mossy_stone_brick_stairs": 734, "minecraft:polished_diorite": 5, "minecraft:white_terracotta": 425, "minecraft:blue_bed": 114, "minecraft:melon": 312, "minecraft:lime_stained_glass": 273, "minecraft:pink_banner": 509, "minecraft:acacia_planks": 17, "minecraft:light_weighted_pressure_plate": 412, "minecraft:damaged_anvil": 410, "minecraft:brick_wall": 759, "minecraft:cherry_fence": 579, "minecraft:light_gray_bed": 111, "minecraft:composter": 834, "minecraft:exposed_copper": 933, "minecraft:polished_diorite_slab": 749, "minecraft:red_nether_brick_slab": 756, "minecraft:weathered_copper_bulb": 1000, "minecraft:netherrack": 255, "minecraft:orange_banner": 504, "minecraft:shulker_box": 613, "minecraft:suspicious_sand": 35, "minecraft:blue_stained_glass_pane": 452, "minecraft:brewing_stand": 330, "minecraft:green_bed": 116, "minecraft:jungle_trapdoor": 287, "minecraft:waxed_oxidized_copper": 961, "minecraft:black_wool": 145, "minecraft:dead_brain_coral_wall_fan": 714, "minecraft:light_gray_stained_glass_pane": 449, "minecraft:candle_cake": 886, "minecraft:emerald_block": 347, "minecraft:black_banner": 518, "minecraft:potted_dead_bush": 381, "minecraft:loom": 773, "minecraft:potted_warped_fungus": 845, "minecraft:brown_stained_glass": 280, "minecraft:brown_terracotta": 437, "minecraft:brown_glazed_terracotta": 642, "minecraft:cyan_shulker_box": 623, "minecraft:deepslate_coal_ore": 44, "minecraft:mossy_stone_bricks": 294, "minecraft:prismarine_brick_slab": 474, "minecraft:soul_campfire": 787, "minecraft:acacia_slab": 543, "minecraft:acacia_stairs": 457, "minecraft:lime_bed": 108, "minecraft:nether_quartz_ore": 417, "minecraft:note_block": 102, "minecraft:white_wool": 130, "minecraft:yellow_concrete_powder": 666, "minecraft:yellow_glazed_terracotta": 634, "minecraft:candle": 869, "minecraft:cherry_leaves": 87, "minecraft:cyan_wall_banner": 528, "minecraft:short_grass": 123, "minecraft:sponge": 92, "minecraft:brown_candle": 882, "minecraft:comparator": 414, "minecraft:scaffolding": 772, "minecraft:player_head": 400, "minecraft:polished_blackstone_pressure_plate": 863, "minecraft:stripped_spruce_log": 57, "minecraft:warped_stem": 789, "minecraft:weathered_chiseled_copper": 943, "minecraft:cyan_terracotta": 434, "minecraft:red_tulip": 153, "minecraft:light_gray_wool": 138, "minecraft:pearlescent_froglight": 1052, "minecraft:potted_dark_oak_sapling": 363, "minecraft:calibrated_sculk_sensor": 927, "minecraft:dark_oak_log": 52, "minecraft:coal_ore": 43, "minecraft:purple_terracotta": 435, "minecraft:waxed_copper_door": 978, "minecraft:waxed_weathered_copper_grate": 996, "minecraft:bamboo": 727, "minecraft:blackstone_stairs": 850, "minecraft:infested_cracked_stone_bricks": 303, "minecraft:oak_button": 385, "minecraft:birch_sapling": 25, "minecraft:cave_vines_plant": 1010, "minecraft:stripped_warped_stem": 790, "minecraft:iron_door": 232, "minecraft:mangrove_fence": 581, "minecraft:moss_block": 1016, "minecraft:skeleton_wall_skull": 395, "minecraft:bamboo_block": 56, "minecraft:green_candle": 883, "minecraft:azalea": 1012, "minecraft:jungle_planks": 16, "minecraft:lilac": 498, "minecraft:polished_granite_slab": 746, "minecraft:potted_white_tulip": 373, "minecraft:purple_banner": 513, "minecraft:weathered_copper_grate": 992, "minecraft:bamboo_mosaic_stairs": 462, "minecraft:heavy_core": 1059, "minecraft:mangrove_button": 392, "minecraft:pink_candle_cake": 893, "minecraft:respawn_anchor": 843, "minecraft:soul_sand": 256, "minecraft:yellow_candle": 874, "minecraft:enchanting_table": 329, "minecraft:light_gray_terracotta": 433, "minecraft:brown_wool": 142, "minecraft:cherry_fence_gate": 571, "minecraft:crimson_slab": 812, "minecraft:waxed_copper_trapdoor": 986, "minecraft:white_candle_cake": 887, "minecraft:acacia_hanging_sign": 211, "minecraft:andesite_slab": 755, "minecraft:potted_jungle_sapling": 360, "minecraft:stripped_cherry_wood": 79, "minecraft:green_wool": 143, "minecraft:infested_stone": 299, "minecraft:acacia_pressure_plate": 237, "minecraft:cartography_table": 777, "minecraft:fire_coral_fan": 711, "minecraft:chain": 309, "minecraft:cherry_stairs": 458, "minecraft:campfire": 786, "minecraft:white_banner": 503, "minecraft:birch_slab": 541, "minecraft:bubble_coral_wall_fan": 720, "minecraft:light_blue_carpet": 481, "minecraft:observer": 612, "minecraft:cherry_wall_hanging_sign": 223, "minecraft:deepslate_diamond_ore": 180, "minecraft:green_stained_glass": 281, "minecraft:hay_block": 477, "minecraft:jungle_door": 585, "minecraft:jungle_sign": 191, "minecraft:potted_brown_mushroom": 380, "minecraft:calcite": 923, "minecraft:deepslate_brick_wall": 1039, "minecraft:stone_button": 246, "minecraft:purpur_pillar": 595, "minecraft:soul_soil": 257, "minecraft:smooth_red_sandstone_stairs": 733, "minecraft:white_bed": 103, "minecraft:glow_lichen": 318, "minecraft:polished_blackstone": 853, "minecraft:daylight_detector": 415, "minecraft:mossy_cobblestone_wall": 354, "minecraft:red_nether_bricks": 609, "minecraft:smooth_sandstone": 564, "minecraft:stripped_dark_oak_wood": 80, "minecraft:bamboo_sign": 194, "minecraft:cut_copper_slab": 957, "minecraft:exposed_copper_grate": 991, "minecraft:sculk": 928, "minecraft:black_bed": 118, "minecraft:crimson_pressure_plate": 814, "minecraft:deepslate_tile_wall": 1035, "minecraft:hanging_roots": 1020, "minecraft:polished_tuff_wall": 916, "minecraft:barrel": 774, "minecraft:cyan_stained_glass_pane": 450, "minecraft:mangrove_log": 53, "minecraft:potatoes": 384, "minecraft:prismarine_bricks": 468, "minecraft:cauldron": 331, "minecraft:grindstone": 779, "minecraft:mossy_cobblestone": 169, "minecraft:nether_wart_block": 608, "minecraft:twisting_vines": 807, "minecraft:blue_carpet": 489, "minecraft:jukebox": 253, "minecraft:waxed_exposed_copper_door": 979, "minecraft:waxed_weathered_chiseled_copper": 947, "minecraft:jungle_fence_gate": 569, "minecraft:nether_brick_slab": 558, "minecraft:smooth_basalt": 1044, "minecraft:acacia_sign": 189, "minecraft:small_dripleaf": 1019, "minecraft:exposed_cut_copper": 940, "minecraft:flower_pot": 355, "minecraft:waxed_oxidized_cut_copper": 962, "minecraft:chain_command_block": 605, "minecraft:cut_red_sandstone_slab": 561, "minecraft:light_gray_banner": 511, "minecraft:coal_block": 495, "minecraft:light_blue_stained_glass": 271, "minecraft:snow": 247, "minecraft:soul_fire": 174, "minecraft:deepslate_brick_stairs": 1037, "minecraft:red_concrete_powder": 676, "minecraft:magenta_glazed_terracotta": 632, "minecraft:polished_granite_stairs": 732, "minecraft:dried_kelp_block": 680, "minecraft:farmland": 184, "minecraft:hopper": 418, "minecraft:orange_wall_banner": 520, "minecraft:smooth_stone_slab": 550, "minecraft:tuff_brick_wall": 921, "minecraft:gray_stained_glass_pane": 448, "minecraft:magenta_concrete_powder": 664, "minecraft:jungle_leaves": 85, "minecraft:light_blue_concrete": 649, "minecraft:light_blue_wall_banner": 522, "minecraft:mangrove_fence_gate": 573, "minecraft:potted_spruce_sapling": 358, "minecraft:diorite_stairs": 745, "minecraft:diorite_wall": 771, "minecraft:cherry_wood": 71, "minecraft:crafter": 1056, "minecraft:dark_oak_pressure_plate": 239, "minecraft:purple_concrete": 656, "minecraft:carved_pumpkin": 264, "minecraft:cherry_hanging_sign": 212, "minecraft:nether_gold_ore": 45, "minecraft:orange_bed": 104, "minecraft:spruce_sign": 187, "minecraft:terracotta": 494, "minecraft:gilded_blackstone": 860, "minecraft:gray_wool": 137, "minecraft:end_rod": 591, "minecraft:lapis_block": 97, "minecraft:spruce_trapdoor": 285, "minecraft:blue_orchid": 150, "minecraft:dark_prismarine_slab": 475, "minecraft:waxed_oxidized_chiseled_copper": 946, "minecraft:medium_amethyst_bud": 907, "minecraft:stripped_acacia_log": 60, "minecraft:horn_coral": 702, "minecraft:red_sandstone_wall": 761, "minecraft:birch_planks": 15, "minecraft:chiseled_tuff": 917, "minecraft:polished_deepslate_stairs": 1029, "minecraft:stone_bricks": 293, "minecraft:beacon": 352, "minecraft:big_dripleaf": 1017, "minecraft:light_blue_concrete_powder": 665, "minecraft:light_gray_shulker_box": 622, "minecraft:pink_bed": 109, "minecraft:red_sandstone": 535, "minecraft:sculk_catalyst": 930, "minecraft:stripped_bamboo_block": 65, "minecraft:lava": 33, "minecraft:oxidized_copper_grate": 993, "minecraft:orange_stained_glass": 269, "minecraft:peony": 500, "minecraft:red_mushroom": 162, "minecraft:rooted_dirt": 1021, "minecraft:bamboo_hanging_sign": 218, "minecraft:blue_wall_banner": 530, "minecraft:red_banner": 517, "minecraft:weathered_cut_copper": 939, "minecraft:black_candle_cake": 902, "minecraft:iron_ore": 41, "minecraft:redstone_ore": 242, "minecraft:water": 32, "minecraft:glass": 94, "minecraft:green_concrete_powder": 675, "minecraft:pink_glazed_terracotta": 636, "minecraft:stone_brick_slab": 556, "minecraft:bone_block": 610, "minecraft:dead_bubble_coral_fan": 705, "minecraft:spruce_slab": 540, "minecraft:oak_sign": 186, "minecraft:quartz_slab": 559, "minecraft:oxidized_cut_copper_stairs": 950, "minecraft:sandstone": 99, "minecraft:warped_pressure_plate": 815, "minecraft:frosted_ice": 606, "minecraft:light_blue_shulker_box": 617, "minecraft:oak_sapling": 23, "minecraft:piglin_wall_head": 407, "minecraft:smooth_quartz": 565, "minecraft:bamboo_slab": 547, "minecraft:beehive": 837, "minecraft:end_gateway": 603, "minecraft:spruce_button": 386, "minecraft:mangrove_trapdoor": 291, "minecraft:bamboo_mosaic": 22, "minecraft:lectern": 780, "minecraft:red_carpet": 492, "minecraft:stripped_cherry_log": 61, "minecraft:dark_oak_sapling": 29, "minecraft:jungle_wall_sign": 204, "minecraft:crimson_wall_sign": 830, "minecraft:azalea_leaves": 90, "minecraft:chiseled_bookshelf": 168, "minecraft:stripped_birch_wood": 76, "minecraft:waxed_exposed_copper_grate": 995, "minecraft:blue_glazed_terracotta": 641, "minecraft:crimson_sign": 828, "minecraft:warped_nylium": 793, "minecraft:chipped_anvil": 409, "minecraft:melon_stem": 316, "minecraft:dirt_path": 602, "minecraft:fire_coral": 701, "minecraft:granite": 2, "minecraft:waxed_copper_block": 958, "minecraft:dark_oak_leaves": 88, "minecraft:gold_block": 163, "minecraft:magenta_wool": 132, "minecraft:ochre_froglight": 1050, "minecraft:orange_stained_glass_pane": 442, "minecraft:spruce_door": 583, "minecraft:tripwire": 346, "minecraft:wither_skeleton_wall_skull": 397, "minecraft:acacia_door": 586, "minecraft:chiseled_deepslate": 1040, "minecraft:purple_candle": 880, "minecraft:red_mushroom_block": 306, "minecraft:stone": 1, "minecraft:cut_copper": 941, "minecraft:polished_blackstone_wall": 865, "minecraft:blue_candle_cake": 898, "minecraft:red_bed": 117, "minecraft:orange_concrete": 647, "minecraft:pink_stained_glass": 274, "minecraft:polished_deepslate": 1028, "minecraft:redstone_wall_torch": 245, "minecraft:lava_cauldron": 333, "minecraft:light_blue_banner": 506, "minecraft:light_gray_candle_cake": 895, "minecraft:cherry_log": 51, "minecraft:end_portal": 335, "minecraft:dead_fire_coral_wall_fan": 716, "minecraft:polished_blackstone_brick_slab": 857, "minecraft:magenta_candle_cake": 889, "minecraft:oak_leaves": 82, "minecraft:repeater": 267, "minecraft:structure_void": 611, "minecraft:warped_slab": 813, "minecraft:copper_trapdoor": 982, "minecraft:dead_horn_coral": 697, "minecraft:tube_coral": 698, "minecraft:prismarine_slab": 473, "minecraft:purple_concrete_powder": 672, "minecraft:jungle_pressure_plate": 236, "minecraft:oak_door": 195, "minecraft:pitcher_plant": 600, "minecraft:stonecutter": 782, "minecraft:basalt": 258, "minecraft:dark_oak_fence": 580, "minecraft:oxidized_cut_copper_slab": 954, "minecraft:pointed_dripstone": 1007, "minecraft:sugar_cane": 252, "minecraft:bamboo_wall_sign": 207, "minecraft:jungle_button": 388, "minecraft:lime_terracotta": 430, "minecraft:bamboo_mosaic_slab": 548, "minecraft:gray_terracotta": 432, "minecraft:diorite": 4, "minecraft:gray_glazed_terracotta": 637, "minecraft:potted_oak_sapling": 357, "minecraft:white_glazed_terracotta": 630, "minecraft:andesite_wall": 767, "minecraft:crimson_fence": 816, "minecraft:oxeye_daisy": 157, "minecraft:blue_concrete": 657, "minecraft:orange_wool": 131, "minecraft:mud_brick_wall": 765, "minecraft:wheat": 183, "minecraft:decorated_pot": 1055, "minecraft:deepslate_bricks": 1036, "minecraft:potted_red_tulip": 371, "minecraft:purple_bed": 113, "minecraft:birch_wood": 68, "minecraft:stripped_oak_wood": 74, "minecraft:copper_grate": 990, "minecraft:jack_o_lantern": 265, "minecraft:potted_acacia_sapling": 361, "minecraft:birch_fence": 576, "minecraft:birch_wall_sign": 201, "minecraft:dandelion": 147, "minecraft:light_gray_concrete_powder": 670, "minecraft:acacia_sapling": 27, "minecraft:crying_obsidian": 842, "minecraft:red_candle_cake": 901, "minecraft:exposed_copper_bulb": 999, "minecraft:granite_wall": 763, "minecraft:bamboo_door": 590, "minecraft:red_nether_brick_stairs": 743, "minecraft:crimson_trapdoor": 818, "minecraft:prismarine_stairs": 470, "minecraft:pink_carpet": 484, "minecraft:potted_cherry_sapling": 362, "minecraft:dead_horn_coral_fan": 707, "minecraft:oxidized_copper_bulb": 1001, "minecraft:anvil": 408, "minecraft:orange_concrete_powder": 663, "minecraft:lime_stained_glass_pane": 446, "minecraft:mangrove_propagule": 30, "minecraft:chiseled_tuff_bricks": 922, "minecraft:crimson_planks": 810, "minecraft:oxidized_cut_copper": 938, "minecraft:bedrock": 31, "minecraft:carrots": 383, "minecraft:creeper_wall_head": 403, "minecraft:cut_red_sandstone": 537, "minecraft:waxed_oxidized_cut_copper_slab": 970, "minecraft:wet_sponge": 93, "minecraft:green_concrete": 659, "minecraft:suspicious_gravel": 38, "minecraft:chiseled_stone_bricks": 296, "minecraft:cyan_candle_cake": 896, "minecraft:fletching_table": 778, "minecraft:birch_leaves": 84, "minecraft:chest": 177, "minecraft:potted_warped_roots": 847, "minecraft:waxed_weathered_cut_copper_slab": 971, "minecraft:cracked_stone_bricks": 295, "minecraft:infested_chiseled_stone_bricks": 304, "minecraft:piglin_head": 406, "minecraft:white_shulker_box": 614, "minecraft:chiseled_sandstone": 100, "minecraft:copper_bulb": 998, "minecraft:mycelium": 323, "minecraft:redstone_block": 416, "minecraft:cobblestone_wall": 353, "minecraft:dead_tube_coral_fan": 703, "minecraft:spruce_pressure_plate": 234, "minecraft:acacia_trapdoor": 288, "minecraft:brain_coral_block": 689, "minecraft:lodestone": 848, "minecraft:oak_slab": 539, "minecraft:smooth_quartz_stairs": 740, "minecraft:cobbled_deepslate": 1024, "minecraft:light_blue_terracotta": 428, "minecraft:stone_brick_wall": 764, "minecraft:target": 835, "minecraft:white_concrete": 646, "minecraft:oak_planks": 13, "minecraft:pink_wool": 136, "minecraft:polished_blackstone_bricks": 854, "minecraft:potted_fern": 365, "minecraft:cobbled_deepslate_stairs": 1025, "minecraft:petrified_oak_slab": 553, "minecraft:seagrass": 126, "minecraft:copper_door": 974, "minecraft:mangrove_pressure_plate": 240, "minecraft:blackstone_slab": 852, }, } ================================================ FILE: server/registry/block_entity_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var BlockEntityType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:banner": 19, "minecraft:campfire": 32, "minecraft:sign": 7, "minecraft:beehive": 33, "minecraft:calibrated_sculk_sensor": 35, "minecraft:jukebox": 4, "minecraft:comparator": 18, "minecraft:daylight_detector": 16, "minecraft:dispenser": 5, "minecraft:ender_chest": 3, "minecraft:sculk_shrieker": 37, "minecraft:trapped_chest": 2, "minecraft:chest": 1, "minecraft:command_block": 22, "minecraft:piston": 10, "minecraft:crafter": 41, "minecraft:hopper": 17, "minecraft:jigsaw": 31, "minecraft:lectern": 29, "minecraft:sculk_sensor": 34, "minecraft:skull": 15, "minecraft:smoker": 27, "minecraft:structure_block": 20, "minecraft:beacon": 14, "minecraft:blast_furnace": 28, "minecraft:end_portal": 13, "minecraft:mob_spawner": 9, "minecraft:trial_spawner": 42, "minecraft:barrel": 26, "minecraft:conduit": 25, "minecraft:enchanting_table": 12, "minecraft:end_gateway": 21, "minecraft:vault": 43, "minecraft:bed": 24, "minecraft:bell": 30, "minecraft:brewing_stand": 11, "minecraft:brushable_block": 39, "minecraft:chiseled_bookshelf": 38, "minecraft:decorated_pot": 40, "minecraft:dropper": 6, "minecraft:furnace": 0, "minecraft:hanging_sign": 8, "minecraft:sculk_catalyst": 36, "minecraft:shulker_box": 23, }, } ================================================ FILE: server/registry/block_predicate_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var BlockPredicateType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:replaceable": 5, "minecraft:true": 11, "minecraft:unobstructed": 12, "minecraft:all_of": 9, "minecraft:any_of": 8, "minecraft:has_sturdy_face": 3, "minecraft:inside_world_bounds": 7, "minecraft:matching_block_tag": 1, "minecraft:matching_blocks": 0, "minecraft:matching_fluids": 2, "minecraft:not": 10, "minecraft:solid": 4, "minecraft:would_survive": 6, }, } ================================================ FILE: server/registry/block_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var BlockType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:budding_amethyst": 26, "minecraft:sapling": 164, "minecraft:mangrove_propagule": 125, "minecraft:moss": 127, "minecraft:vine": 216, "minecraft:wall_skull": 220, "minecraft:amethyst": 2, "minecraft:base_coral_fan": 12, "minecraft:cartography_table": 36, "minecraft:frogspawn": 88, "minecraft:waterlogged_transparent": 224, "minecraft:weathering_copper_bulb": 225, "minecraft:crafter": 60, "minecraft:glazed_terracotta": 92, "minecraft:sculk_sensor": 168, "minecraft:wall_torch": 221, "minecraft:big_dripleaf": 20, "minecraft:leaves": 116, "minecraft:observer": 138, "minecraft:wither_rose": 237, "minecraft:chest": 44, "minecraft:redstone_ore": 155, "minecraft:redstone_wire": 158, "minecraft:rotated_pillar": 163, "minecraft:end_portal": 78, "minecraft:furnace": 91, "minecraft:powered": 149, "minecraft:wither_wall_skull": 239, "minecraft:wither_skull": 238, "minecraft:candle": 33, "minecraft:smithing_table": 178, "minecraft:stained_glass_pane": 188, "minecraft:stonecutter": 193, "minecraft:small_dripleaf": 177, "minecraft:target": 201, "minecraft:respawn_anchor": 160, "minecraft:big_dripleaf_stem": 21, "minecraft:jukebox": 109, "minecraft:liquid": 121, "minecraft:magma": 123, "minecraft:sweet_berry_bush": 197, "minecraft:wall_hanging_sign": 218, "minecraft:honey": 100, "minecraft:lava_cauldron": 114, "minecraft:powder_snow": 148, "minecraft:scaffolding": 165, "minecraft:attached_stem": 5, "minecraft:concrete_powder": 53, "minecraft:kelp_plant": 111, "minecraft:sugar_cane": 196, "minecraft:fence": 82, "minecraft:weathering_copper_stair": 230, "minecraft:cauldron": 38, "minecraft:mushroom": 130, "minecraft:slime": 176, "minecraft:enchantment_table": 75, "minecraft:piston_base": 141, "minecraft:weathering_copper_full": 227, "minecraft:chorus_flower": 46, "minecraft:composter": 52, "minecraft:daylight_detector": 64, "minecraft:dirt_path": 68, "minecraft:rooted_dirt": 161, "minecraft:cake": 29, "minecraft:flower": 86, "minecraft:nether_wart": 135, "minecraft:pointed_dripstone": 146, "minecraft:grass": 94, "minecraft:pink_petals": 140, "minecraft:transparent": 206, "minecraft:jack_o_lantern": 107, "minecraft:mangrove_leaves": 124, "minecraft:vault": 215, "minecraft:light": 119, "minecraft:soul_fire": 183, "minecraft:carrot": 35, "minecraft:smoker": 179, "minecraft:tnt": 203, "minecraft:cave_vines": 39, "minecraft:dispenser": 69, "minecraft:heavy_core": 99, "minecraft:layered_cauldron": 115, "minecraft:hopper": 101, "minecraft:weathering_copper_grate": 228, "minecraft:chain": 42, "minecraft:cocoa": 48, "minecraft:coral_wall_fan": 59, "minecraft:barrel": 10, "minecraft:chiseled_book_shelf": 45, "minecraft:loom": 122, "minecraft:turtle_egg": 212, "minecraft:chorus_plant": 47, "minecraft:end_gateway": 77, "minecraft:pressure_plate": 151, "minecraft:torchflower_crop": 204, "minecraft:amethyst_cluster": 3, "minecraft:bamboo_sapling": 7, "minecraft:button": 27, "minecraft:tall_seagrass": 200, "minecraft:sponge": 186, "minecraft:trial_spawner": 209, "minecraft:twisting_vines": 214, "minecraft:wall_banner": 217, "minecraft:azalea": 6, "minecraft:block": 0, "minecraft:lectern": 117, "minecraft:sniffer_egg": 180, "minecraft:redstone_lamp": 154, "minecraft:weathering_copper_slab": 229, "minecraft:brewing_stand": 23, "minecraft:bubble_column": 25, "minecraft:calibrated_sculk_sensor": 30, "minecraft:hay": 98, "minecraft:carved_pumpkin": 37, "minecraft:jigsaw": 108, "minecraft:slab": 175, "minecraft:trapdoor": 207, "minecraft:end_portal_frame": 79, "minecraft:iron_bars": 106, "minecraft:twisting_vines_plant": 213, "minecraft:sculk_catalyst": 166, "minecraft:bell": 19, "minecraft:drop_experience": 73, "minecraft:piston_head": 142, "minecraft:repeater": 159, "minecraft:decorated_pot": 66, "minecraft:nylium": 137, "minecraft:roots": 162, "minecraft:trip_wire_hook": 210, "minecraft:tall_flower": 198, "minecraft:weeping_vines_plant": 233, "minecraft:campfire": 31, "minecraft:coral_plant": 58, "minecraft:detector_rail": 67, "minecraft:spore_blossom": 187, "minecraft:piglinwallskull": 139, "minecraft:player_head": 144, "minecraft:powered_rail": 150, "minecraft:trapped_chest": 208, "minecraft:weeping_vines": 234, "minecraft:candle_cake": 32, "minecraft:infested": 104, "minecraft:redstone_wall_torch": 157, "minecraft:sculk": 167, "minecraft:snowy_dirt": 182, "minecraft:spawner": 185, "minecraft:structure": 194, "minecraft:tall_grass": 199, "minecraft:banner": 9, "minecraft:coral": 56, "minecraft:farm": 81, "minecraft:kelp": 110, "minecraft:weighted_pressure_plate": 235, "minecraft:netherrack": 133, "minecraft:frosted_ice": 89, "minecraft:tinted_glass": 202, "minecraft:weathering_copper_door": 226, "minecraft:carpet": 34, "minecraft:dropper": 74, "minecraft:end_rod": 80, "minecraft:nether_sprouts": 134, "minecraft:mud": 129, "minecraft:player_wall_head": 145, "minecraft:sculk_shrieker": 169, "minecraft:waterlily": 223, "minecraft:beetroot": 18, "minecraft:double_plant": 71, "minecraft:grindstone": 95, "minecraft:mycelium": 131, "minecraft:torch": 205, "minecraft:weathering_copper_trap_door": 231, "minecraft:beehive": 17, "minecraft:copper_bulb_block": 55, "minecraft:dragon_egg": 72, "minecraft:pumpkin": 152, "minecraft:air": 1, "minecraft:barrier": 11, "minecraft:fletching_table": 85, "minecraft:wall_sign": 219, "minecraft:conduit": 54, "minecraft:tripwire": 211, "minecraft:wall": 222, "minecraft:ceiling_hanging_sign": 41, "minecraft:command": 50, "minecraft:sea_pickle": 172, "minecraft:stained_glass": 189, "minecraft:door": 70, "minecraft:rail": 153, "minecraft:mangrove_roots": 126, "minecraft:nether_portal": 132, "minecraft:seagrass": 171, "minecraft:pitcher_crop": 143, "minecraft:structure_void": 195, "minecraft:cactus": 28, "minecraft:glow_lichen": 93, "minecraft:infested_rotated_pillar": 105, "minecraft:lightning_rod": 120, "minecraft:fungus": 90, "minecraft:lever": 118, "minecraft:standing_sign": 191, "minecraft:brushable": 24, "minecraft:fire": 84, "minecraft:wool_carpet": 240, "minecraft:web": 232, "minecraft:comparator": 51, "minecraft:crop": 62, "minecraft:flower_pot": 87, "minecraft:hanging_roots": 97, "minecraft:cave_vines_plant": 40, "minecraft:lantern": 113, "minecraft:skull": 174, "minecraft:bamboo_stalk": 8, "minecraft:bed": 16, "minecraft:colored_falling": 49, "minecraft:half_transparent": 96, "minecraft:cherry_leaves": 43, "minecraft:crafting_table": 61, "minecraft:stair": 190, "minecraft:wet_sponge": 236, "minecraft:base_coral_wall_fan": 14, "minecraft:potato": 147, "minecraft:shulker_box": 173, "minecraft:soul_sand": 184, "minecraft:beacon": 15, "minecraft:coral_fan": 57, "minecraft:dead_bush": 65, "minecraft:moving_piston": 128, "minecraft:ladder": 112, "minecraft:redstone_torch": 156, "minecraft:snow_layer": 181, "minecraft:anvil": 4, "minecraft:crying_obsidian": 63, "minecraft:ender_chest": 76, "minecraft:fence_gate": 83, "minecraft:note": 136, "minecraft:sculk_vein": 170, "minecraft:stem": 192, "minecraft:base_coral_plant": 13, "minecraft:blast_furnace": 22, "minecraft:huge_mushroom": 102, "minecraft:ice": 103, }, } ================================================ FILE: server/registry/cat_variant.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var CatVariant = Registry{ Default: "", Entries: map[string]int32{ "minecraft:all_black": 10, "minecraft:black": 1, "minecraft:calico": 5, "minecraft:jellie": 9, "minecraft:persian": 6, "minecraft:siamese": 3, "minecraft:british_shorthair": 4, "minecraft:ragdoll": 7, "minecraft:red": 2, "minecraft:tabby": 0, "minecraft:white": 8, }, } ================================================ FILE: server/registry/chunk_status.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var ChunkStatus = Registry{ Default: "minecraft:empty", Entries: map[string]int32{ "minecraft:noise": 4, "minecraft:structure_starts": 1, "minecraft:surface": 5, "minecraft:biomes": 3, "minecraft:empty": 0, "minecraft:full": 11, "minecraft:light": 9, "minecraft:spawn": 10, "minecraft:structure_references": 2, "minecraft:carvers": 6, "minecraft:features": 7, "minecraft:initialize_light": 8, }, } ================================================ FILE: server/registry/command_argument_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var CommandArgumentType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:particle": 26, "minecraft:nbt_path": 22, "minecraft:gamemode": 41, "minecraft:resource_or_tag": 43, "minecraft:angle": 27, "minecraft:float_range": 39, "minecraft:template_mirror": 47, "minecraft:nbt_compound_tag": 20, "minecraft:scoreboard_slot": 29, "minecraft:column_pos": 9, "minecraft:entity_anchor": 37, "minecraft:loot_modifier": 52, "minecraft:function": 36, "minecraft:resource": 45, "brigadier:string": 5, "minecraft:component": 17, "minecraft:loot_predicate": 51, "minecraft:objective": 23, "brigadier:bool": 0, "brigadier:double": 2, "minecraft:block_predicate": 13, "minecraft:state": 6, "minecraft:item_slots": 34, "minecraft:objective_criteria": 24, "brigadier:long": 4, "minecraft:block_state": 12, "minecraft:heightmap": 49, "minecraft:template_rotation": 48, "minecraft:uuid": 53, "minecraft:block_pos": 8, "minecraft:operation": 25, "minecraft:int_range": 38, "minecraft:rotation": 28, "minecraft:swizzle": 31, "minecraft:game_profile": 7, "minecraft:nbt_tag": 21, "minecraft:message": 19, "minecraft:dimension": 40, "minecraft:item_stack": 14, "minecraft:resource_or_tag_key": 44, "brigadier:integer": 3, "minecraft:item_predicate": 15, "minecraft:style": 18, "minecraft:time": 42, "brigadier:float": 1, "minecraft:item_slot": 33, "minecraft:loot_table": 50, "minecraft:team": 32, "minecraft:color": 16, "minecraft:resource_key": 46, "minecraft:resource_location": 35, "minecraft:score_holder": 30, "minecraft:vec2": 11, "minecraft:vec3": 10, }, } ================================================ FILE: server/registry/creative_mode_tab.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var CreativeModeTab = Registry{ Default: "", Entries: map[string]int32{ "minecraft:natural_blocks": 2, "minecraft:redstone_blocks": 4, "minecraft:tools_and_utilities": 7, "minecraft:building_blocks": 0, "minecraft:hotbar": 5, "minecraft:ingredients": 10, "minecraft:inventory": 13, "minecraft:colored_blocks": 1, "minecraft:combat": 8, "minecraft:functional_blocks": 3, "minecraft:op_blocks": 12, "minecraft:food_and_drinks": 9, "minecraft:search": 6, "minecraft:spawn_eggs": 11, }, } ================================================ FILE: server/registry/custom_stat.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var CustomStat = Registry{ Default: "", Entries: map[string]int32{ "minecraft:climb_one_cm": 11, "minecraft:raid_trigger": 69, "minecraft:play_record": 54, "minecraft:walk_on_water_one_cm": 9, "minecraft:interact_with_crafting_table": 56, "minecraft:interact_with_loom": 66, "minecraft:play_noteblock": 48, "minecraft:damage_resisted": 29, "minecraft:interact_with_stonecutter": 67, "minecraft:fly_one_cm": 12, "minecraft:trigger_trapped_chest": 51, "minecraft:interact_with_brewingstand": 43, "minecraft:damage_dealt_resisted": 25, "minecraft:damage_taken": 26, "minecraft:drop": 22, "minecraft:enchant_item": 53, "minecraft:horse_one_cm": 17, "minecraft:sprint_one_cm": 8, "minecraft:interact_with_smoker": 62, "minecraft:swim_one_cm": 19, "minecraft:interact_with_beacon": 44, "minecraft:interact_with_grindstone": 72, "minecraft:interact_with_smithing_table": 74, "minecraft:clean_banner": 41, "minecraft:damage_absorbed": 28, "minecraft:damage_dealt_absorbed": 24, "minecraft:interact_with_cartography_table": 65, "minecraft:open_enderchest": 52, "minecraft:animals_bred": 32, "minecraft:aviate_one_cm": 18, "minecraft:clean_armor": 40, "minecraft:walk_one_cm": 6, "minecraft:target_hit": 73, "minecraft:traded_with_villager": 36, "minecraft:use_cauldron": 39, "minecraft:inspect_dropper": 45, "minecraft:interact_with_lectern": 63, "minecraft:open_shulker_box": 59, "minecraft:open_chest": 57, "minecraft:pot_flower": 50, "minecraft:damage_dealt": 23, "minecraft:fall_one_cm": 10, "minecraft:mob_kills": 31, "minecraft:damage_blocked_by_shield": 27, "minecraft:eat_cake_slice": 37, "minecraft:interact_with_anvil": 71, "minecraft:open_barrel": 60, "minecraft:tune_noteblock": 49, "minecraft:bell_ring": 68, "minecraft:boat_one_cm": 15, "minecraft:clean_shulker_box": 42, "minecraft:raid_win": 70, "minecraft:time_since_death": 3, "minecraft:fill_cauldron": 38, "minecraft:inspect_hopper": 46, "minecraft:pig_one_cm": 16, "minecraft:sneak_time": 5, "minecraft:fish_caught": 34, "minecraft:inspect_dispenser": 47, "minecraft:play_time": 1, "minecraft:strider_one_cm": 20, "minecraft:deaths": 30, "minecraft:interact_with_campfire": 64, "minecraft:minecart_one_cm": 14, "minecraft:walk_under_water_one_cm": 13, "minecraft:interact_with_blast_furnace": 61, "minecraft:interact_with_furnace": 55, "minecraft:sleep_in_bed": 58, "minecraft:player_kills": 33, "minecraft:talked_to_villager": 35, "minecraft:time_since_rest": 4, "minecraft:total_world_time": 2, "minecraft:crouch_one_cm": 7, "minecraft:jump": 21, "minecraft:leave_game": 0, }, } ================================================ FILE: server/registry/data_component_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var DataComponentType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:writable_book_content": 33, "minecraft:custom_data": 0, "minecraft:container_loot": 56, "minecraft:damage": 3, "minecraft:hide_tooltip": 15, "minecraft:container": 52, "minecraft:enchantment_glint_override": 18, "minecraft:tool": 22, "minecraft:instrument": 40, "minecraft:max_damage": 2, "minecraft:stored_enchantments": 23, "minecraft:base_color": 50, "minecraft:bucket_entity_data": 38, "minecraft:debug_stick_state": 36, "minecraft:dyed_color": 24, "minecraft:banner_patterns": 49, "minecraft:block_entity_data": 39, "minecraft:bundle_contents": 30, "minecraft:can_break": 11, "minecraft:rarity": 8, "minecraft:creative_slot_lock": 17, "minecraft:food": 20, "minecraft:firework_explosion": 45, "minecraft:attribute_modifiers": 12, "minecraft:block_state": 53, "minecraft:charged_projectiles": 29, "minecraft:custom_name": 5, "minecraft:pot_decorations": 51, "minecraft:bees": 54, "minecraft:hide_additional_tooltip": 14, "minecraft:item_name": 6, "minecraft:map_id": 26, "minecraft:can_place_on": 10, "minecraft:lock": 55, "minecraft:map_color": 25, "minecraft:max_stack_size": 1, "minecraft:suspicious_stew_effects": 32, "minecraft:custom_model_data": 13, "minecraft:fire_resistant": 21, "minecraft:lodestone_tracker": 44, "minecraft:map_post_processing": 28, "minecraft:written_book_content": 34, "minecraft:lore": 7, "minecraft:ominous_bottle_amplifier": 41, "minecraft:profile": 47, "minecraft:repair_cost": 16, "minecraft:fireworks": 46, "minecraft:intangible_projectile": 19, "minecraft:jukebox_playable": 42, "minecraft:note_block_sound": 48, "minecraft:enchantments": 9, "minecraft:trim": 35, "minecraft:unbreakable": 4, "minecraft:potion_contents": 31, "minecraft:recipes": 43, "minecraft:entity_data": 37, "minecraft:map_decorations": 27, }, } ================================================ FILE: server/registry/decorated_pot_pattern.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var DecoratedPotPattern = Registry{ Default: "", Entries: map[string]int32{ "minecraft:heart": 11, "minecraft:sheaf": 19, "minecraft:archer": 1, "minecraft:brewer": 4, "minecraft:explorer": 7, "minecraft:friend": 9, "minecraft:guster": 10, "minecraft:shelter": 20, "minecraft:danger": 6, "minecraft:heartbreak": 12, "minecraft:miner": 14, "minecraft:prize": 17, "minecraft:scrape": 18, "minecraft:howl": 13, "minecraft:mourner": 15, "minecraft:plenty": 16, "minecraft:arms_up": 2, "minecraft:blade": 3, "minecraft:blank": 23, "minecraft:burn": 5, "minecraft:flow": 8, "minecraft:angler": 0, "minecraft:skull": 21, "minecraft:snort": 22, }, } ================================================ FILE: server/registry/enchantment_effect_component_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var EnchantmentEffectComponentType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:post_attack": 6, "minecraft:projectile_spread": 16, "minecraft:equipment_drops": 10, "minecraft:fishing_time_reduction": 19, "minecraft:projectile_spawned": 15, "minecraft:trident_spin_attack_strength": 29, "minecraft:trident_sound": 26, "minecraft:damage": 2, "minecraft:damage_protection": 0, "minecraft:location_changed": 11, "minecraft:prevent_armor_change": 28, "minecraft:projectile_count": 17, "minecraft:armor_effectiveness": 5, "minecraft:hit_block": 7, "minecraft:item_damage": 8, "minecraft:prevent_equipment_drop": 27, "minecraft:damage_immunity": 1, "minecraft:ammo_use": 13, "minecraft:repair_with_xp": 23, "minecraft:smash_damage_per_fallen_block": 3, "minecraft:trident_return_acceleration": 18, "minecraft:attributes": 9, "minecraft:crossbow_charge_time": 24, "minecraft:crossbow_charging_sounds": 25, "minecraft:mob_experience": 22, "minecraft:projectile_piercing": 14, "minecraft:block_experience": 21, "minecraft:fishing_luck_bonus": 20, "minecraft:knockback": 4, "minecraft:tick": 12, }, } ================================================ FILE: server/registry/enchantment_entity_effect_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var EnchantmentEntityEffectType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:spawn_particles": 11, "minecraft:summon_entity": 12, "minecraft:all_of": 0, "minecraft:damage_entity": 2, "minecraft:explode": 4, "minecraft:play_sound": 6, "minecraft:replace_block": 7, "minecraft:replace_disk": 8, "minecraft:apply_mob_effect": 1, "minecraft:damage_item": 3, "minecraft:ignite": 5, "minecraft:run_function": 9, "minecraft:set_block_properties": 10, }, } ================================================ FILE: server/registry/enchantment_level_based_value_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var EnchantmentLevelBasedValueType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:clamped": 0, "minecraft:fraction": 1, "minecraft:levels_squared": 2, "minecraft:linear": 3, "minecraft:lookup": 4, }, } ================================================ FILE: server/registry/enchantment_location_based_effect_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var EnchantmentLocationBasedEffectType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:play_sound": 7, "minecraft:summon_entity": 13, "minecraft:all_of": 0, "minecraft:damage_item": 4, "minecraft:replace_block": 8, "minecraft:run_function": 10, "minecraft:attribute": 2, "minecraft:ignite": 6, "minecraft:replace_disk": 9, "minecraft:spawn_particles": 12, "minecraft:apply_mob_effect": 1, "minecraft:damage_entity": 3, "minecraft:explode": 5, "minecraft:set_block_properties": 11, }, } ================================================ FILE: server/registry/enchantment_provider_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var EnchantmentProviderType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:by_cost": 0, "minecraft:by_cost_with_difficulty": 1, "minecraft:single": 2, }, } ================================================ FILE: server/registry/enchantment_value_effect_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var EnchantmentValueEffectType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:remove_binomial": 3, "minecraft:set": 4, "minecraft:add": 0, "minecraft:all_of": 1, "minecraft:multiply": 2, }, } ================================================ FILE: server/registry/entity_sub_predicate_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var EntitySubPredicateType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:parrot": 13, "minecraft:rabbit": 9, "minecraft:wolf": 18, "minecraft:axolotl": 5, "minecraft:fox": 7, "minecraft:mooshroom": 8, "minecraft:painting": 15, "minecraft:player": 2, "minecraft:raider": 4, "minecraft:boat": 6, "minecraft:horse": 10, "minecraft:llama": 11, "minecraft:slime": 3, "minecraft:cat": 16, "minecraft:fishing_hook": 1, "minecraft:frog": 17, "minecraft:lightning": 0, "minecraft:tropical_fish": 14, "minecraft:villager": 12, }, } ================================================ FILE: server/registry/entity_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var EntityType = Registry{ Default: "minecraft:pig", Entries: map[string]int32{ "minecraft:panda": 74, "minecraft:skeleton_horse": 92, "minecraft:spider": 100, "minecraft:cod": 20, "minecraft:firework_rocket": 41, "minecraft:ghast": 45, "minecraft:iron_golem": 57, "minecraft:donkey": 25, "minecraft:cow": 22, "minecraft:falling_block": 40, "minecraft:pillager": 80, "minecraft:vex": 112, "minecraft:creeper": 23, "minecraft:husk": 54, "minecraft:tadpole": 104, "minecraft:wither": 119, "minecraft:allay": 0, "minecraft:glow_squid": 48, "minecraft:text_display": 105, "minecraft:zombie_horse": 125, "minecraft:axolotl": 5, "minecraft:chicken": 19, "minecraft:evoker": 35, "minecraft:piglin": 78, "minecraft:shulker": 88, "minecraft:command_block_minecart": 21, "minecraft:glow_item_frame": 47, "minecraft:horse": 53, "minecraft:mule": 71, "minecraft:magma_cube": 67, "minecraft:ominous_item_spawner": 61, "minecraft:bogged": 11, "minecraft:fishing_bobber": 129, "minecraft:item": 58, "minecraft:leash_knot": 63, "minecraft:zombie": 124, "minecraft:zombie_villager": 126, "minecraft:elder_guardian": 29, "minecraft:furnace_minecart": 44, "minecraft:silverfish": 90, "minecraft:wandering_trader": 115, "minecraft:hoglin": 51, "minecraft:player": 128, "minecraft:wind_charge": 117, "minecraft:bat": 6, "minecraft:camel": 14, "minecraft:vindicator": 114, "minecraft:egg": 28, "minecraft:illusioner": 55, "minecraft:item_display": 59, "minecraft:piglin_brute": 79, "minecraft:warden": 116, "minecraft:mooshroom": 70, "minecraft:ocelot": 72, "minecraft:painting": 73, "minecraft:stray": 102, "minecraft:chest_minecart": 18, "minecraft:llama": 65, "minecraft:wolf": 122, "minecraft:dolphin": 24, "minecraft:ravager": 85, "minecraft:strider": 103, "minecraft:trader_llama": 108, "minecraft:goat": 49, "minecraft:interaction": 56, "minecraft:potion": 82, "minecraft:slime": 93, "minecraft:rabbit": 84, "minecraft:parrot": 75, "minecraft:shulker_bullet": 89, "minecraft:trident": 109, "minecraft:wither_skull": 121, "minecraft:tropical_fish": 110, "minecraft:zombified_piglin": 127, "minecraft:evoker_fangs": 36, "minecraft:item_frame": 60, "minecraft:lightning_bolt": 64, "minecraft:sniffer": 95, "minecraft:arrow": 4, "minecraft:drowned": 27, "minecraft:spawner_minecart": 98, "minecraft:tnt_minecart": 107, "minecraft:cave_spider": 16, "minecraft:ender_dragon": 31, "minecraft:experience_orb": 38, "minecraft:tnt": 106, "minecraft:endermite": 34, "minecraft:experience_bottle": 37, "minecraft:area_effect_cloud": 1, "minecraft:block_display": 9, "minecraft:end_crystal": 30, "minecraft:ender_pearl": 32, "minecraft:dragon_fireball": 26, "minecraft:polar_bear": 81, "minecraft:turtle": 111, "minecraft:cat": 15, "minecraft:minecart": 69, "minecraft:villager": 113, "minecraft:bee": 7, "minecraft:small_fireball": 94, "minecraft:snowball": 97, "minecraft:breeze_wind_charge": 13, "minecraft:sheep": 87, "minecraft:wither_skeleton": 120, "minecraft:zoglin": 123, "minecraft:witch": 118, "minecraft:boat": 10, "minecraft:eye_of_ender": 39, "minecraft:giant": 46, "minecraft:guardian": 50, "minecraft:squid": 101, "minecraft:chest_boat": 17, "minecraft:enderman": 33, "minecraft:pig": 77, "minecraft:snow_golem": 96, "minecraft:skeleton": 91, "minecraft:armor_stand": 3, "minecraft:blaze": 8, "minecraft:hopper_minecart": 52, "minecraft:marker": 68, "minecraft:fox": 42, "minecraft:pufferfish": 83, "minecraft:spectral_arrow": 99, "minecraft:fireball": 62, "minecraft:phantom": 76, "minecraft:salmon": 86, "minecraft:armadillo": 2, "minecraft:breeze": 12, "minecraft:frog": 43, "minecraft:llama_spit": 66, }, } ================================================ FILE: server/registry/float_provider_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var FloatProviderType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:clamped_normal": 2, "minecraft:constant": 0, "minecraft:trapezoid": 3, "minecraft:uniform": 1, }, } ================================================ FILE: server/registry/fluid.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var Fluid = Registry{ Default: "minecraft:empty", Entries: map[string]int32{ "minecraft:empty": 0, "minecraft:flowing_lava": 3, "minecraft:flowing_water": 1, "minecraft:lava": 4, "minecraft:water": 2, }, } ================================================ FILE: server/registry/frog_variant.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var FrogVariant = Registry{ Default: "", Entries: map[string]int32{ "minecraft:warm": 1, "minecraft:cold": 2, "minecraft:temperate": 0, }, } ================================================ FILE: server/registry/game_event.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var GameEvent = Registry{ Default: "minecraft:step", Entries: map[string]int32{ "minecraft:item_interact_finish": 28, "minecraft:prime_fuse": 34, "minecraft:sculk_sensor_tendrils_clicking": 37, "minecraft:shear": 38, "minecraft:drink": 11, "minecraft:entity_dismount": 16, "minecraft:resonate_10": 54, "minecraft:resonate_2": 46, "minecraft:splash": 40, "minecraft:block_detach": 6, "minecraft:eat": 12, "minecraft:equip": 21, "minecraft:resonate_11": 55, "minecraft:resonate_5": 49, "minecraft:jukebox_play": 30, "minecraft:resonate_7": 51, "minecraft:step": 41, "minecraft:block_activate": 0, "minecraft:block_close": 3, "minecraft:block_deactivate": 4, "minecraft:entity_interact": 17, "minecraft:resonate_6": 50, "minecraft:resonate_15": 59, "minecraft:shriek": 39, "minecraft:block_destroy": 5, "minecraft:block_place": 8, "minecraft:entity_damage": 14, "minecraft:entity_mount": 18, "minecraft:explode": 22, "minecraft:hit_ground": 26, "minecraft:container_open": 10, "minecraft:note_block_play": 33, "minecraft:resonate_12": 56, "minecraft:resonate_14": 58, "minecraft:resonate_3": 47, "minecraft:fluid_place": 25, "minecraft:resonate_9": 53, "minecraft:teleport": 43, "minecraft:block_attach": 1, "minecraft:entity_die": 15, "minecraft:projectile_land": 35, "minecraft:swim": 42, "minecraft:unequip": 44, "minecraft:container_close": 9, "minecraft:entity_place": 19, "minecraft:elytra_glide": 13, "minecraft:instrument_play": 27, "minecraft:item_interact_start": 29, "minecraft:projectile_shoot": 36, "minecraft:resonate_1": 45, "minecraft:fluid_pickup": 24, "minecraft:jukebox_stop_play": 31, "minecraft:lightning_strike": 32, "minecraft:block_change": 2, "minecraft:block_open": 7, "minecraft:flap": 23, "minecraft:resonate_13": 57, "minecraft:resonate_4": 48, "minecraft:resonate_8": 52, "minecraft:entity_action": 20, }, } ================================================ FILE: server/registry/height_provider_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var HeightProviderType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:biased_to_bottom": 2, "minecraft:constant": 0, "minecraft:trapezoid": 4, "minecraft:uniform": 1, "minecraft:very_biased_to_bottom": 3, "minecraft:weighted_list": 5, }, } ================================================ FILE: server/registry/instrument.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var Instrument = Registry{ Default: "", Entries: map[string]int32{ "minecraft:sing_goat_horn": 1, "minecraft:yearn_goat_horn": 6, "minecraft:admire_goat_horn": 4, "minecraft:call_goat_horn": 5, "minecraft:dream_goat_horn": 7, "minecraft:feel_goat_horn": 3, "minecraft:ponder_goat_horn": 0, "minecraft:seek_goat_horn": 2, }, } ================================================ FILE: server/registry/int_provider_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var IntProviderType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:weighted_list": 4, "minecraft:biased_to_bottom": 2, "minecraft:clamped": 3, "minecraft:clamped_normal": 5, "minecraft:constant": 0, "minecraft:uniform": 1, }, } ================================================ FILE: server/registry/item.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var Item = Registry{ Default: "minecraft:air", Entries: map[string]int32{ "minecraft:diamond_axe": 841, "minecraft:polished_blackstone_stairs": 1234, "minecraft:snow": 305, "minecraft:stone_bricks": 340, "minecraft:wind_charge": 1090, "minecraft:brown_stained_glass": 483, "minecraft:crimson_button": 693, "minecraft:pointed_dripstone": 1262, "minecraft:red_sandstone_slab": 275, "minecraft:respawn_anchor": 1240, "minecraft:snow_block": 307, "minecraft:sugar_cane": 243, "minecraft:bamboo_mosaic_stairs": 392, "minecraft:danger_pottery_sherd": 1294, "minecraft:candle": 1241, "minecraft:composter": 1204, "minecraft:orange_bed": 965, "minecraft:polished_andesite_slab": 650, "minecraft:slime_spawn_egg": 1063, "minecraft:warped_fence": 321, "minecraft:bamboo_mosaic_slab": 261, "minecraft:blade_pottery_sherd": 1291, "minecraft:mushroom_stem": 354, "minecraft:mutton": 1131, "minecraft:cherry_door": 716, "minecraft:fermented_spider_eye": 1001, "minecraft:diamond_horse_armor": 1126, "minecraft:enchanted_golden_apple": 885, "minecraft:ender_chest": 381, "minecraft:eye_armor_trim_smithing_template": 1275, "minecraft:golden_apple": 884, "minecraft:nether_sprouts": 240, "minecraft:cherry_log": 137, "minecraft:diamond_hoe": 842, "minecraft:stone_hoe": 827, "minecraft:turtle_spawn_egg": 1073, "minecraft:wooden_sword": 818, "minecraft:obsidian": 290, "minecraft:quartz_block": 423, "minecraft:creeper_banner_pattern": 1196, "minecraft:warped_fungus": 237, "minecraft:tripwire_hook": 677, "minecraft:waxed_weathered_chiseled_copper": 118, "minecraft:blackstone_stairs": 1230, "minecraft:light_blue_banner": 1136, "minecraft:red_wool": 216, "minecraft:weathered_cut_copper_stairs": 106, "minecraft:black_banner": 1148, "minecraft:music_disc_5": 1184, "minecraft:exposed_chiseled_copper": 97, "minecraft:waxed_exposed_cut_copper_stairs": 125, "minecraft:raiser_armor_trim_smithing_template": 1284, "minecraft:redstone_block": 659, "minecraft:cookie": 980, "minecraft:quartz_bricks": 424, "minecraft:green_stained_glass_pane": 500, "minecraft:polished_blackstone_button": 683, "minecraft:quartz": 808, "minecraft:red_concrete_powder": 585, "minecraft:bedrock": 56, "minecraft:chiseled_stone_bricks": 343, "minecraft:salmon_spawn_egg": 1057, "minecraft:tuff_brick_wall": 24, "minecraft:cut_copper_stairs": 104, "minecraft:infested_deepslate": 339, "minecraft:netherite_pickaxe": 845, "minecraft:red_banner": 1147, "minecraft:bone": 961, "minecraft:lime_candle": 1247, "minecraft:dark_oak_wood": 172, "minecraft:music_disc_creator": 1172, "minecraft:acacia_slab": 256, "minecraft:cartography_table": 1208, "minecraft:cracked_deepslate_bricks": 347, "minecraft:spruce_wood": 167, "minecraft:bundle": 930, "minecraft:cobblestone_wall": 397, "minecraft:light_gray_carpet": 454, "minecraft:polished_deepslate": 10, "minecraft:big_dripleaf": 249, "minecraft:light_blue_shulker_box": 526, "minecraft:mangrove_hanging_sign": 904, "minecraft:ominous_trial_key": 1329, "minecraft:brick_slab": 270, "minecraft:glow_squid_spawn_egg": 1034, "minecraft:weathered_copper_grate": 1313, "minecraft:acacia_button": 688, "minecraft:black_stained_glass_pane": 502, "minecraft:light_gray_shulker_box": 531, "minecraft:wither_rose": 230, "minecraft:cherry_fence": 316, "minecraft:heavy_core": 85, "minecraft:ender_dragon_spawn_egg": 1027, "minecraft:rabbit_foot": 1121, "minecraft:wither_spawn_egg": 1080, "minecraft:archer_pottery_sherd": 1289, "minecraft:camel_spawn_egg": 1017, "minecraft:blue_shulker_box": 534, "minecraft:dark_oak_leaves": 182, "minecraft:pufferfish_spawn_egg": 1054, "minecraft:allium": 221, "minecraft:black_shulker_box": 538, "minecraft:nether_star": 1110, "minecraft:raw_copper": 812, "minecraft:blaze_powder": 1002, "minecraft:dead_bush": 199, "minecraft:music_disc_creator_music_box": 1173, "minecraft:skull_banner_pattern": 1197, "minecraft:waxed_weathered_cut_copper": 122, "minecraft:diamond": 805, "minecraft:mud_bricks": 345, "minecraft:bubble_coral": 601, "minecraft:crying_obsidian": 1227, "minecraft:drowned_spawn_egg": 1025, "minecraft:stripped_bamboo_block": 165, "minecraft:acacia_boat": 782, "minecraft:activator_rail": 764, "minecraft:hay_block": 445, "minecraft:mossy_stone_brick_slab": 641, "minecraft:prize_pottery_sherd": 1305, "minecraft:turtle_helmet": 794, "minecraft:golden_sword": 828, "minecraft:gray_glazed_terracotta": 546, "minecraft:smooth_red_sandstone_slab": 640, "minecraft:dead_tube_coral_fan": 614, "minecraft:iron_horse_armor": 1124, "minecraft:bread": 855, "minecraft:waxed_oxidized_cut_copper_stairs": 127, "minecraft:yellow_stained_glass_pane": 491, "minecraft:large_amethyst_bud": 1260, "minecraft:white_dye": 944, "minecraft:horn_coral_fan": 613, "minecraft:phantom_spawn_egg": 1048, "minecraft:small_amethyst_bud": 1258, "minecraft:tuff_wall": 15, "minecraft:white_terracotta": 427, "minecraft:acacia_fence_gate": 754, "minecraft:brown_bed": 976, "minecraft:flow_banner_pattern": 1201, "minecraft:goat_horn": 1203, "minecraft:conduit": 620, "minecraft:elder_guardian_spawn_egg": 1026, "minecraft:mangrove_roots": 140, "minecraft:music_disc_relic": 1183, "minecraft:paper": 924, "minecraft:chiseled_quartz_block": 422, "minecraft:clay": 309, "minecraft:light_blue_bed": 967, "minecraft:warped_stem": 143, "minecraft:bamboo_door": 719, "minecraft:cherry_chest_boat": 785, "minecraft:warped_fence_gate": 760, "minecraft:cobbled_deepslate_wall": 415, "minecraft:dead_horn_coral_block": 593, "minecraft:stone_slab": 264, "minecraft:polished_basalt": 329, "minecraft:rooted_dirt": 31, "minecraft:bricks": 285, "minecraft:brown_shulker_box": 535, "minecraft:crimson_fence": 320, "minecraft:dead_fire_coral": 606, "minecraft:globe_banner_pattern": 1199, "minecraft:mule_spawn_egg": 1044, "minecraft:bamboo_trapdoor": 739, "minecraft:black_glazed_terracotta": 554, "minecraft:white_shulker_box": 523, "minecraft:grass_block": 27, "minecraft:pink_petals": 246, "minecraft:poppy": 219, "minecraft:glass_pane": 357, "minecraft:glow_item_frame": 1095, "minecraft:oak_pressure_plate": 699, "minecraft:prismarine_bricks": 504, "minecraft:waxed_weathered_copper_trapdoor": 748, "minecraft:green_concrete": 568, "minecraft:ladder": 303, "minecraft:brown_mushroom_block": 352, "minecraft:smooth_sandstone_stairs": 628, "minecraft:trial_spawner": 1327, "minecraft:cyan_stained_glass_pane": 496, "minecraft:iron_helmet": 864, "minecraft:cobweb": 194, "minecraft:iron_ingot": 811, "minecraft:tropical_fish": 937, "minecraft:blue_stained_glass_pane": 498, "minecraft:chain": 356, "minecraft:light": 444, "minecraft:tuff": 12, "minecraft:gray_dye": 951, "minecraft:oxeye_daisy": 227, "minecraft:pink_bed": 970, "minecraft:stripped_oak_log": 145, "minecraft:bamboo_block": 144, "minecraft:dark_oak_chest_boat": 787, "minecraft:cherry_stairs": 388, "minecraft:iron_bars": 355, "minecraft:polished_tuff": 17, "minecraft:vault": 1330, "minecraft:brick_wall": 399, "minecraft:dark_oak_button": 690, "minecraft:diamond_pickaxe": 840, "minecraft:salmon_bucket": 916, "minecraft:tuff_slab": 13, "minecraft:birch_chest_boat": 779, "minecraft:blackstone": 1228, "minecraft:beacon": 396, "minecraft:blue_ice": 619, "minecraft:campfire": 1218, "minecraft:diamond_helmet": 868, "minecraft:netherrack": 325, "minecraft:purple_candle": 1252, "minecraft:acacia_pressure_plate": 703, "minecraft:acacia_stairs": 387, "minecraft:white_bed": 964, "minecraft:wither_skeleton_spawn_egg": 1081, "minecraft:red_glazed_terracotta": 553, "minecraft:spruce_sapling": 49, "minecraft:hanging_roots": 248, "minecraft:wolf_armor": 797, "minecraft:bamboo_slab": 260, "minecraft:beef": 988, "minecraft:cyan_carpet": 455, "minecraft:gray_candle": 1249, "minecraft:iron_shovel": 834, "minecraft:lilac": 466, "minecraft:lime_wool": 207, "minecraft:orange_tulip": 224, "minecraft:bee_nest": 1222, "minecraft:carrot_on_a_stick": 771, "minecraft:totem_of_undying": 1163, "minecraft:warped_stairs": 394, "minecraft:coarse_dirt": 29, "minecraft:diamond_leggings": 870, "minecraft:smooth_quartz_stairs": 629, "minecraft:bamboo_raft": 790, "minecraft:barrel": 1205, "minecraft:smooth_quartz_slab": 646, "minecraft:stray_spawn_egg": 1068, "minecraft:twisting_vines": 242, "minecraft:coal_ore": 62, "minecraft:oak_sign": 886, "minecraft:mourner_pottery_sherd": 1303, "minecraft:seagrass": 200, "minecraft:stripped_crimson_stem": 153, "minecraft:end_stone": 377, "minecraft:howl_pottery_sherd": 1301, "minecraft:tube_coral": 599, "minecraft:black_carpet": 461, "minecraft:nether_wart_block": 517, "minecraft:bow": 801, "minecraft:end_rod": 292, "minecraft:smooth_sandstone": 283, "minecraft:bamboo_planks": 44, "minecraft:birch_button": 686, "minecraft:golden_axe": 831, "minecraft:red_carpet": 460, "minecraft:stripped_acacia_log": 149, "minecraft:azure_bluet": 222, "minecraft:birch_fence_gate": 752, "minecraft:mangrove_pressure_plate": 706, "minecraft:oak_trapdoor": 731, "minecraft:red_tulip": 223, "minecraft:splash_potion": 1158, "minecraft:black_terracotta": 442, "minecraft:iron_nugget": 1165, "minecraft:azalea_leaves": 184, "minecraft:gray_stained_glass": 478, "minecraft:mycelium": 364, "minecraft:orange_wool": 203, "minecraft:pumpkin_seeds": 986, "minecraft:purple_wool": 212, "minecraft:exposed_cut_copper_slab": 109, "minecraft:guardian_spawn_egg": 1036, "minecraft:item_frame": 1094, "minecraft:jungle_fence_gate": 753, "minecraft:jungle_sapling": 51, "minecraft:ocelot_spawn_egg": 1045, "minecraft:rib_armor_trim_smithing_template": 1279, "minecraft:wooden_shovel": 819, "minecraft:flint": 880, "minecraft:iron_axe": 836, "minecraft:sand": 57, "minecraft:tuff_brick_slab": 22, "minecraft:magenta_wool": 204, "minecraft:raw_copper_block": 83, "minecraft:gray_bed": 971, "minecraft:sheaf_pottery_sherd": 1307, "minecraft:stone_pickaxe": 825, "minecraft:acacia_wood": 170, "minecraft:diamond_sword": 838, "minecraft:crimson_planks": 45, "minecraft:cut_red_sandstone_slab": 276, "minecraft:spruce_log": 133, "minecraft:waxed_exposed_chiseled_copper": 117, "minecraft:brown_banner": 1145, "minecraft:chiseled_red_sandstone": 511, "minecraft:guster_pottery_sherd": 1298, "minecraft:knowledge_book": 1166, "minecraft:lime_shulker_box": 528, "minecraft:mossy_stone_bricks": 341, "minecraft:structure_block": 792, "minecraft:witch_spawn_egg": 1079, "minecraft:cyan_wool": 211, "minecraft:firework_star": 1113, "minecraft:waxed_oxidized_copper_grate": 1318, "minecraft:dolphin_spawn_egg": 1023, "minecraft:heart_pottery_sherd": 1299, "minecraft:golden_carrot": 1102, "minecraft:magenta_terracotta": 429, "minecraft:melon_slice": 984, "minecraft:red_sandstone_wall": 401, "minecraft:sculk_vein": 372, "minecraft:trapped_chest": 678, "minecraft:breeze_spawn_egg": 1015, "minecraft:copper_trapdoor": 742, "minecraft:warped_nylium": 34, "minecraft:piglin_brute_spawn_egg": 1051, "minecraft:yellow_candle": 1246, "minecraft:cut_sandstone": 193, "minecraft:gray_concrete": 562, "minecraft:orange_concrete": 556, "minecraft:nether_brick_wall": 406, "minecraft:suspicious_gravel": 59, "minecraft:mossy_cobblestone_stairs": 625, "minecraft:acacia_sapling": 52, "minecraft:end_stone_brick_stairs": 626, "minecraft:panda_spawn_egg": 1046, "minecraft:polished_blackstone_bricks": 1236, "minecraft:polished_deepslate_wall": 416, "minecraft:birch_log": 134, "minecraft:hopper_minecart": 770, "minecraft:cherry_boat": 784, "minecraft:glow_ink_sac": 942, "minecraft:miner_pottery_sherd": 1302, "minecraft:scaffolding": 656, "minecraft:stone": 1, "minecraft:brown_carpet": 458, "minecraft:cave_spider_spawn_egg": 1018, "minecraft:jungle_boat": 780, "minecraft:mossy_cobblestone": 289, "minecraft:music_disc_13": 1168, "minecraft:polished_deepslate_slab": 653, "minecraft:stone_axe": 826, "minecraft:waxed_weathered_copper_grate": 1317, "minecraft:chicken_spawn_egg": 1019, "minecraft:clock": 932, "minecraft:cherry_hanging_sign": 902, "minecraft:dead_bubble_coral": 605, "minecraft:fern": 196, "minecraft:repeating_command_block": 514, "minecraft:armadillo_spawn_egg": 1008, "minecraft:bone_meal": 960, "minecraft:waxed_oxidized_copper_bulb": 1326, "minecraft:dark_oak_stairs": 389, "minecraft:golden_horse_armor": 1125, "minecraft:purple_carpet": 456, "minecraft:lingering_potion": 1161, "minecraft:yellow_bed": 968, "minecraft:beehive": 1223, "minecraft:dark_oak_hanging_sign": 903, "minecraft:cyan_terracotta": 436, "minecraft:frog_spawn_egg": 1032, "minecraft:prismarine_shard": 1116, "minecraft:redstone_ore": 70, "minecraft:white_tulip": 225, "minecraft:acacia_sign": 890, "minecraft:blue_concrete_powder": 582, "minecraft:mossy_cobblestone_wall": 398, "minecraft:nether_wart": 997, "minecraft:petrified_oak_slab": 268, "minecraft:anvil": 419, "minecraft:goat_spawn_egg": 1035, "minecraft:gray_wool": 209, "minecraft:pufferfish_bucket": 915, "minecraft:white_candle": 1242, "minecraft:experience_bottle": 1088, "minecraft:gray_concrete_powder": 578, "minecraft:silence_armor_trim_smithing_template": 1283, "minecraft:stripped_spruce_wood": 156, "minecraft:tropical_fish_bucket": 918, "minecraft:andesite_slab": 648, "minecraft:donkey_spawn_egg": 1024, "minecraft:gravel": 61, "minecraft:horn_coral": 603, "minecraft:oak_wood": 166, "minecraft:warped_hyphae": 175, "minecraft:wooden_hoe": 822, "minecraft:crimson_fungus": 236, "minecraft:enchanting_table": 375, "minecraft:crimson_fence_gate": 759, "minecraft:cyan_bed": 973, "minecraft:cyan_concrete_powder": 580, "minecraft:heavy_weighted_pressure_plate": 698, "minecraft:light_gray_concrete_powder": 579, "minecraft:raw_iron": 810, "minecraft:brown_terracotta": 439, "minecraft:cocoa_beans": 943, "minecraft:green_terracotta": 440, "minecraft:zombie_head": 1106, "minecraft:end_stone_brick_slab": 644, "minecraft:evoker_spawn_egg": 1030, "minecraft:light_gray_banner": 1141, "minecraft:packed_ice": 463, "minecraft:piglin_head": 1109, "minecraft:player_head": 1105, "minecraft:polished_granite_stairs": 621, "minecraft:spruce_stairs": 384, "minecraft:bamboo_sign": 894, "minecraft:calcite": 11, "minecraft:infested_chiseled_stone_bricks": 338, "minecraft:netherite_axe": 846, "minecraft:red_terracotta": 441, "minecraft:bamboo_chest_raft": 791, "minecraft:debug_stick": 1167, "minecraft:jungle_planks": 39, "minecraft:music_disc_chirp": 1171, "minecraft:music_disc_mellohi": 1176, "minecraft:oak_fence_gate": 750, "minecraft:oxidized_cut_copper_slab": 111, "minecraft:warped_sign": 896, "minecraft:chainmail_boots": 863, "minecraft:endermite_spawn_egg": 1029, "minecraft:diorite_wall": 411, "minecraft:flint_and_steel": 798, "minecraft:golden_helmet": 872, "minecraft:ochre_froglight": 1263, "minecraft:orange_concrete_powder": 572, "minecraft:pink_candle": 1248, "minecraft:cooked_salmon": 940, "minecraft:deepslate_tile_stairs": 638, "minecraft:trader_llama_spawn_egg": 1071, "minecraft:rose_bush": 467, "minecraft:spruce_pressure_plate": 700, "minecraft:phantom_membrane": 1189, "minecraft:red_stained_glass_pane": 501, "minecraft:spruce_sign": 887, "minecraft:deepslate_lapis_ore": 75, "minecraft:iron_block": 88, "minecraft:dirt": 28, "minecraft:lava_bucket": 910, "minecraft:polished_diorite_slab": 642, "minecraft:cyan_banner": 1142, "minecraft:diamond_chestplate": 869, "minecraft:potion": 998, "minecraft:deepslate_iron_ore": 65, "minecraft:pink_tulip": 226, "minecraft:dark_oak_sapling": 54, "minecraft:feather": 851, "minecraft:jungle_slab": 255, "minecraft:pink_stained_glass_pane": 493, "minecraft:red_concrete": 569, "minecraft:cactus": 308, "minecraft:cherry_button": 689, "minecraft:sheep_spawn_egg": 1058, "minecraft:sniffer_spawn_egg": 1064, "minecraft:blue_concrete": 566, "minecraft:oxidized_copper_grate": 1314, "minecraft:chest_minecart": 767, "minecraft:copper_bulb": 1319, "minecraft:ghast_spawn_egg": 1033, "minecraft:glass_bottle": 999, "minecraft:green_carpet": 459, "minecraft:husk_spawn_egg": 1039, "minecraft:brown_wool": 214, "minecraft:cauldron": 1005, "minecraft:rabbit": 1118, "minecraft:structure_void": 521, "minecraft:suspicious_stew": 1193, "minecraft:warped_planks": 46, "minecraft:jack_o_lantern": 324, "minecraft:oak_door": 711, "minecraft:crimson_stem": 142, "minecraft:dandelion": 218, "minecraft:heart_of_the_sea": 1191, "minecraft:orange_terracotta": 428, "minecraft:redstone_lamp": 680, "minecraft:rotten_flesh": 992, "minecraft:bamboo_button": 692, "minecraft:bubble_coral_fan": 611, "minecraft:shulker_spawn_egg": 1059, "minecraft:weathered_copper": 94, "minecraft:raw_gold": 814, "minecraft:stripped_dark_oak_wood": 161, "minecraft:deepslate_gold_ore": 69, "minecraft:mangrove_propagule": 55, "minecraft:mossy_stone_brick_stairs": 623, "minecraft:command_block_minecart": 1130, "minecraft:fishing_rod": 931, "minecraft:potato": 1098, "minecraft:red_nether_brick_wall": 408, "minecraft:blue_orchid": 220, "minecraft:crimson_nylium": 33, "minecraft:beetroot": 1154, "minecraft:dead_horn_coral": 607, "minecraft:deepslate_copper_ore": 67, "minecraft:sentry_armor_trim_smithing_template": 1270, "minecraft:amethyst_block": 86, "minecraft:bamboo_mosaic": 47, "minecraft:magenta_carpet": 448, "minecraft:blue_terracotta": 438, "minecraft:hopper": 667, "minecraft:light_gray_wool": 210, "minecraft:lightning_rod": 673, "minecraft:shaper_armor_trim_smithing_template": 1282, "minecraft:tnt": 679, "minecraft:tuff_stairs": 14, "minecraft:turtle_egg": 587, "minecraft:chiseled_nether_bricks": 368, "minecraft:deepslate_brick_slab": 654, "minecraft:orange_glazed_terracotta": 540, "minecraft:oxidized_copper_trapdoor": 745, "minecraft:stone_stairs": 627, "minecraft:yellow_shulker_box": 527, "minecraft:zombie_horse_spawn_egg": 1085, "minecraft:budding_amethyst": 87, "minecraft:iron_ore": 64, "minecraft:honeycomb": 1221, "minecraft:mangrove_stairs": 390, "minecraft:snort_pottery_sherd": 1310, "minecraft:spider_spawn_egg": 1066, "minecraft:stone_button": 682, "minecraft:waxed_exposed_cut_copper": 121, "minecraft:crimson_sign": 895, "minecraft:granite": 2, "minecraft:iron_boots": 867, "minecraft:mud_brick_stairs": 363, "minecraft:netherite_ingot": 816, "minecraft:carrot": 1097, "minecraft:deepslate": 8, "minecraft:ender_pearl": 993, "minecraft:fire_coral_fan": 612, "minecraft:netherite_helmet": 876, "minecraft:birch_trapdoor": 733, "minecraft:cooked_mutton": 1132, "minecraft:exposed_copper_door": 723, "minecraft:polished_deepslate_stairs": 636, "minecraft:prismarine_crystals": 1117, "minecraft:sea_pickle": 201, "minecraft:stripped_cherry_wood": 160, "minecraft:tropical_fish_spawn_egg": 1072, "minecraft:chiseled_copper": 96, "minecraft:dark_prismarine": 505, "minecraft:fletching_table": 1209, "minecraft:iron_chestplate": 865, "minecraft:bubble_coral_block": 596, "minecraft:exposed_copper_trapdoor": 743, "minecraft:chainmail_helmet": 860, "minecraft:copper_block": 89, "minecraft:iron_hoe": 837, "minecraft:mangrove_slab": 259, "minecraft:moss_block": 247, "minecraft:observer": 666, "minecraft:birch_wood": 168, "minecraft:bowl": 799, "minecraft:redstone": 657, "minecraft:stripped_birch_wood": 157, "minecraft:purpur_stairs": 297, "minecraft:rabbit_hide": 1122, "minecraft:soul_lantern": 1215, "minecraft:birch_fence": 313, "minecraft:dark_oak_fence_gate": 756, "minecraft:infested_stone_bricks": 335, "minecraft:red_mushroom_block": 353, "minecraft:bamboo_fence_gate": 758, "minecraft:birch_sapling": 50, "minecraft:brown_stained_glass_pane": 499, "minecraft:dark_oak_fence": 317, "minecraft:leather": 913, "minecraft:music_disc_precipice": 1186, "minecraft:netherite_leggings": 878, "minecraft:red_shulker_box": 537, "minecraft:acacia_trapdoor": 735, "minecraft:blaze_spawn_egg": 1013, "minecraft:spruce_fence": 312, "minecraft:chorus_plant": 293, "minecraft:lime_glazed_terracotta": 544, "minecraft:spore_blossom": 233, "minecraft:mossy_cobblestone_slab": 643, "minecraft:music_disc_mall": 1175, "minecraft:decorated_pot": 288, "minecraft:dripstone_block": 26, "minecraft:echo_shard": 1267, "minecraft:kelp": 244, "minecraft:magma_cube_spawn_egg": 1042, "minecraft:soul_soil": 327, "minecraft:black_candle": 1257, "minecraft:command_block": 395, "minecraft:stone_pressure_plate": 695, "minecraft:dead_fire_coral_fan": 617, "minecraft:flow_armor_trim_smithing_template": 1286, "minecraft:pink_concrete": 561, "minecraft:polished_granite_slab": 639, "minecraft:red_nether_bricks": 519, "minecraft:ward_armor_trim_smithing_template": 1274, "minecraft:birch_leaves": 178, "minecraft:cobblestone_stairs": 304, "minecraft:cooked_cod": 939, "minecraft:flow_pottery_sherd": 1296, "minecraft:pink_dye": 950, "minecraft:sticky_piston": 663, "minecraft:trial_key": 1328, "minecraft:white_stained_glass": 471, "minecraft:book": 925, "minecraft:chorus_flower": 294, "minecraft:crafter": 981, "minecraft:green_candle": 1255, "minecraft:pitcher_pod": 1153, "minecraft:blue_carpet": 457, "minecraft:blue_stained_glass": 482, "minecraft:lime_concrete": 560, "minecraft:shroomlight": 1220, "minecraft:tnt_minecart": 769, "minecraft:torchflower": 231, "minecraft:cyan_dye": 953, "minecraft:dead_bubble_coral_fan": 616, "minecraft:diorite_stairs": 634, "minecraft:iron_pickaxe": 835, "minecraft:magenta_stained_glass": 473, "minecraft:mangrove_planks": 43, "minecraft:bolt_armor_trim_smithing_template": 1287, "minecraft:chicken": 990, "minecraft:mangrove_fence_gate": 757, "minecraft:stripped_crimson_hyphae": 163, "minecraft:basalt": 328, "minecraft:fire_coral_block": 597, "minecraft:crimson_trapdoor": 740, "minecraft:mossy_stone_brick_wall": 402, "minecraft:netherite_upgrade_smithing_template": 1269, "minecraft:shelter_pottery_sherd": 1308, "minecraft:terracotta": 462, "minecraft:acacia_hanging_sign": 901, "minecraft:crimson_slab": 262, "minecraft:repeater": 660, "minecraft:yellow_wool": 206, "minecraft:infested_mossy_stone_bricks": 336, "minecraft:light_gray_terracotta": 435, "minecraft:oxidized_copper_door": 725, "minecraft:pink_shulker_box": 529, "minecraft:popped_chorus_fruit": 1151, "minecraft:redstone_torch": 658, "minecraft:flowering_azalea": 198, "minecraft:hoglin_spawn_egg": 1037, "minecraft:salmon": 936, "minecraft:melon": 358, "minecraft:ominous_bottle": 1331, "minecraft:gray_terracotta": 434, "minecraft:jungle_fence": 314, "minecraft:honey_bottle": 1224, "minecraft:name_tag": 1129, "minecraft:nether_gold_ore": 78, "minecraft:oxidized_cut_copper_stairs": 107, "minecraft:cherry_trapdoor": 736, "minecraft:diamond_boots": 871, "minecraft:purple_stained_glass_pane": 497, "minecraft:red_candle": 1256, "minecraft:stone_brick_stairs": 362, "minecraft:weeping_vines": 241, "minecraft:wheat_seeds": 853, "minecraft:white_banner": 1133, "minecraft:dead_horn_coral_fan": 618, "minecraft:pink_carpet": 452, "minecraft:squid_spawn_egg": 1067, "minecraft:waxed_copper_trapdoor": 746, "minecraft:yellow_glazed_terracotta": 543, "minecraft:amethyst_shard": 809, "minecraft:pink_wool": 208, "minecraft:lime_carpet": 451, "minecraft:oak_sapling": 48, "minecraft:polished_blackstone_brick_slab": 1237, "minecraft:shulker_box": 522, "minecraft:stone_sword": 823, "minecraft:tadpole_spawn_egg": 1070, "minecraft:bookshelf": 286, "minecraft:jungle_log": 135, "minecraft:waxed_weathered_copper_bulb": 1325, "minecraft:ink_sac": 941, "minecraft:painting": 883, "minecraft:clay_ball": 922, "minecraft:diorite_slab": 651, "minecraft:glistering_melon_slice": 1007, "minecraft:lapis_lazuli": 807, "minecraft:light_blue_candle": 1245, "minecraft:lime_terracotta": 432, "minecraft:orange_shulker_box": 524, "minecraft:pufferfish": 938, "minecraft:blue_wool": 213, "minecraft:brain_coral_fan": 610, "minecraft:quartz_slab": 274, "minecraft:magenta_dye": 946, "minecraft:spectral_arrow": 1159, "minecraft:gray_banner": 1140, "minecraft:leather_horse_armor": 1127, "minecraft:music_disc_otherside": 1182, "minecraft:torch": 291, "minecraft:jungle_stairs": 386, "minecraft:polished_tuff_wall": 20, "minecraft:warped_roots": 239, "minecraft:chiseled_sandstone": 192, "minecraft:dead_tube_coral": 608, "minecraft:writable_book": 1091, "minecraft:cobblestone_slab": 269, "minecraft:gold_ore": 68, "minecraft:shulker_shell": 1164, "minecraft:stripped_birch_log": 147, "minecraft:stripped_jungle_log": 148, "minecraft:tuff_brick_stairs": 23, "minecraft:cracked_deepslate_tiles": 349, "minecraft:green_bed": 977, "minecraft:green_glazed_terracotta": 552, "minecraft:light_blue_concrete_powder": 574, "minecraft:mud_brick_wall": 405, "minecraft:pitcher_plant": 232, "minecraft:bamboo_fence": 319, "minecraft:end_crystal": 1149, "minecraft:gold_nugget": 996, "minecraft:mangrove_wood": 173, "minecraft:stripped_mangrove_wood": 162, "minecraft:white_carpet": 446, "minecraft:cracked_stone_bricks": 342, "minecraft:deepslate_coal_ore": 63, "minecraft:orange_candle": 1243, "minecraft:spire_armor_trim_smithing_template": 1280, "minecraft:stripped_jungle_wood": 158, "minecraft:waxed_cut_copper_stairs": 124, "minecraft:horn_coral_block": 598, "minecraft:magenta_banner": 1135, "minecraft:magenta_bed": 966, "minecraft:waxed_copper_door": 726, "minecraft:gray_shulker_box": 530, "minecraft:leather_boots": 859, "minecraft:netherite_block": 92, "minecraft:oxidized_copper_bulb": 1322, "minecraft:purpur_pillar": 296, "minecraft:dark_oak_log": 138, "minecraft:emerald_block": 382, "minecraft:raw_iron_block": 82, "minecraft:skeleton_spawn_egg": 1061, "minecraft:waxed_copper_bulb": 1323, "minecraft:comparator": 661, "minecraft:cooked_porkchop": 882, "minecraft:granite_wall": 403, "minecraft:piglin_banner_pattern": 1200, "minecraft:blue_glazed_terracotta": 550, "minecraft:copper_ore": 66, "minecraft:glass": 188, "minecraft:red_mushroom": 235, "minecraft:spruce_chest_boat": 777, "minecraft:stonecutter": 1212, "minecraft:waxed_exposed_copper_bulb": 1324, "minecraft:crafting_table": 300, "minecraft:detector_rail": 762, "minecraft:netherite_sword": 843, "minecraft:blackstone_wall": 412, "minecraft:mangrove_fence": 318, "minecraft:cobblestone": 35, "minecraft:leather_leggings": 858, "minecraft:oak_log": 132, "minecraft:polished_blackstone_wall": 413, "minecraft:stripped_dark_oak_log": 151, "minecraft:sugar": 962, "minecraft:cracked_polished_blackstone_bricks": 1239, "minecraft:deepslate_brick_wall": 417, "minecraft:plenty_pottery_sherd": 1304, "minecraft:stripped_acacia_wood": 159, "minecraft:warped_door": 721, "minecraft:emerald": 806, "minecraft:oak_button": 684, "minecraft:nether_brick_stairs": 370, "minecraft:brown_concrete_powder": 583, "minecraft:lime_bed": 969, "minecraft:deepslate_bricks": 346, "minecraft:exposed_copper": 93, "minecraft:bell": 1213, "minecraft:black_dye": 959, "minecraft:light_gray_dye": 952, "minecraft:light_weighted_pressure_plate": 697, "minecraft:mangrove_log": 139, "minecraft:short_grass": 195, "minecraft:exposed_copper_bulb": 1320, "minecraft:granite_stairs": 630, "minecraft:prismarine_wall": 400, "minecraft:quartz_pillar": 425, "minecraft:red_stained_glass": 485, "minecraft:black_bed": 979, "minecraft:cherry_sign": 891, "minecraft:mangrove_sign": 893, "minecraft:reinforced_deepslate": 351, "minecraft:brush": 1268, "minecraft:cyan_shulker_box": 532, "minecraft:dead_tube_coral_block": 589, "minecraft:pink_terracotta": 433, "minecraft:shield": 1162, "minecraft:target": 671, "minecraft:waxed_weathered_cut_copper_stairs": 126, "minecraft:acacia_door": 715, "minecraft:copper_ingot": 813, "minecraft:light_blue_stained_glass": 474, "minecraft:mooshroom_spawn_egg": 1043, "minecraft:podzol": 30, "minecraft:spruce_slab": 253, "minecraft:stick": 848, "minecraft:written_book": 1092, "minecraft:birch_door": 713, "minecraft:blue_dye": 955, "minecraft:iron_golem_spawn_egg": 1040, "minecraft:lime_stained_glass": 476, "minecraft:turtle_scute": 795, "minecraft:wayfinder_armor_trim_smithing_template": 1281, "minecraft:bee_spawn_egg": 1012, "minecraft:crossbow": 1192, "minecraft:iron_sword": 833, "minecraft:lily_pad": 365, "minecraft:magma_block": 516, "minecraft:tinted_glass": 189, "minecraft:black_concrete": 570, "minecraft:cracked_nether_bricks": 367, "minecraft:infested_cracked_stone_bricks": 337, "minecraft:oak_stairs": 383, "minecraft:spruce_boat": 776, "minecraft:yellow_carpet": 450, "minecraft:birch_sign": 888, "minecraft:golden_pickaxe": 830, "minecraft:smoker": 1206, "minecraft:coal": 803, "minecraft:exposed_copper_grate": 1312, "minecraft:golden_chestplate": 873, "minecraft:lime_banner": 1138, "minecraft:pink_glazed_terracotta": 545, "minecraft:dried_kelp": 985, "minecraft:filled_map": 982, "minecraft:oak_fence": 311, "minecraft:saddle": 765, "minecraft:crimson_door": 720, "minecraft:jungle_leaves": 179, "minecraft:cyan_stained_glass": 480, "minecraft:farmland": 301, "minecraft:golden_boots": 875, "minecraft:leather_chestplate": 857, "minecraft:mangrove_leaves": 183, "minecraft:music_disc_blocks": 1170, "minecraft:birch_pressure_plate": 701, "minecraft:creeper_head": 1107, "minecraft:nether_quartz_ore": 79, "minecraft:warped_fungus_on_a_stick": 772, "minecraft:flowering_azalea_leaves": 185, "minecraft:lily_of_the_valley": 229, "minecraft:andesite_wall": 407, "minecraft:copper_door": 722, "minecraft:pillager_spawn_egg": 1052, "minecraft:porkchop": 881, "minecraft:stone_brick_wall": 404, "minecraft:warped_pressure_plate": 709, "minecraft:waxed_oxidized_chiseled_copper": 119, "minecraft:waxed_oxidized_cut_copper_slab": 131, "minecraft:disc_fragment_5": 1187, "minecraft:ender_eye": 1006, "minecraft:deepslate_tile_slab": 655, "minecraft:exposed_cut_copper": 101, "minecraft:prismarine_brick_slab": 279, "minecraft:purple_banner": 1143, "minecraft:slime_ball": 926, "minecraft:spawner": 298, "minecraft:birch_slab": 254, "minecraft:brown_dye": 956, "minecraft:lime_stained_glass_pane": 492, "minecraft:pink_concrete_powder": 577, "minecraft:yellow_stained_glass": 475, "minecraft:furnace_minecart": 768, "minecraft:jungle_trapdoor": 734, "minecraft:spyglass": 933, "minecraft:tipped_arrow": 1160, "minecraft:vex_spawn_egg": 1074, "minecraft:wither_skeleton_skull": 1104, "minecraft:elytra": 773, "minecraft:iron_leggings": 866, "minecraft:dragon_breath": 1157, "minecraft:horse_spawn_egg": 1038, "minecraft:lever": 672, "minecraft:orange_stained_glass": 472, "minecraft:waxed_cut_copper": 120, "minecraft:chainmail_leggings": 862, "minecraft:coast_armor_trim_smithing_template": 1272, "minecraft:dead_brain_coral_block": 590, "minecraft:green_banner": 1146, "minecraft:skeleton_skull": 1103, "minecraft:warped_wart_block": 518, "minecraft:waxed_exposed_copper": 113, "minecraft:andesite": 6, "minecraft:bone_block": 520, "minecraft:red_sand": 60, "minecraft:andesite_stairs": 631, "minecraft:music_disc_cat": 1169, "minecraft:chiseled_tuff": 16, "minecraft:dark_oak_trapdoor": 737, "minecraft:glow_berries": 1217, "minecraft:iron_door": 710, "minecraft:polished_tuff_stairs": 19, "minecraft:air": 0, "minecraft:blue_candle": 1253, "minecraft:jungle_hanging_sign": 900, "minecraft:sculk_shrieker": 374, "minecraft:damaged_anvil": 421, "minecraft:red_dye": 958, "minecraft:waxed_weathered_cut_copper_slab": 130, "minecraft:bat_spawn_egg": 1011, "minecraft:crimson_hyphae": 174, "minecraft:torchflower_seeds": 1152, "minecraft:acacia_fence": 315, "minecraft:gray_stained_glass_pane": 494, "minecraft:golden_shovel": 829, "minecraft:honey_block": 665, "minecraft:raw_gold_block": 84, "minecraft:red_bed": 978, "minecraft:spider_eye": 1000, "minecraft:yellow_banner": 1137, "minecraft:black_stained_glass": 486, "minecraft:gold_ingot": 815, "minecraft:lime_concrete_powder": 576, "minecraft:purple_glazed_terracotta": 549, "minecraft:purple_stained_glass": 481, "minecraft:red_nether_brick_slab": 649, "minecraft:waxed_copper_grate": 1315, "minecraft:zombie_villager_spawn_egg": 1086, "minecraft:cake": 963, "minecraft:enchanted_book": 1114, "minecraft:yellow_concrete_powder": 575, "minecraft:brewer_pottery_sherd": 1292, "minecraft:powder_snow_bucket": 911, "minecraft:tube_coral_block": 594, "minecraft:deepslate_diamond_ore": 77, "minecraft:snout_armor_trim_smithing_template": 1278, "minecraft:red_sandstone_stairs": 513, "minecraft:stripped_mangrove_log": 152, "minecraft:yellow_dye": 948, "minecraft:beetroot_soup": 1156, "minecraft:golden_leggings": 874, "minecraft:bamboo_stairs": 391, "minecraft:exposed_cut_copper_stairs": 105, "minecraft:diamond_shovel": 839, "minecraft:magenta_concrete_powder": 573, "minecraft:packed_mud": 344, "minecraft:peony": 468, "minecraft:cooked_beef": 989, "minecraft:diamond_block": 91, "minecraft:sunflower": 465, "minecraft:note_block": 681, "minecraft:polished_blackstone_brick_stairs": 1238, "minecraft:soul_torch": 331, "minecraft:weathered_copper_trapdoor": 744, "minecraft:yellow_concrete": 559, "minecraft:green_wool": 215, "minecraft:skeleton_horse_spawn_egg": 1062, "minecraft:magenta_shulker_box": 525, "minecraft:polished_tuff_slab": 18, "minecraft:sea_lantern": 509, "minecraft:zombified_piglin_spawn_egg": 1087, "minecraft:dark_oak_boat": 786, "minecraft:flower_banner_pattern": 1195, "minecraft:light_blue_carpet": 449, "minecraft:mangrove_trapdoor": 738, "minecraft:blaze_rod": 994, "minecraft:deepslate_redstone_ore": 71, "minecraft:diamond_ore": 76, "minecraft:fox_spawn_egg": 1031, "minecraft:gunpowder": 852, "minecraft:prismarine_brick_stairs": 507, "minecraft:cherry_leaves": 181, "minecraft:cut_copper": 100, "minecraft:pumpkin_pie": 1111, "minecraft:allay_spawn_egg": 1009, "minecraft:pearlescent_froglight": 1265, "minecraft:cherry_wood": 171, "minecraft:muddy_mangrove_roots": 141, "minecraft:music_disc_wait": 1181, "minecraft:acacia_log": 136, "minecraft:axolotl_bucket": 919, "minecraft:light_gray_stained_glass": 479, "minecraft:waxed_oxidized_copper": 115, "minecraft:emerald_ore": 72, "minecraft:light_blue_glazed_terracotta": 542, "minecraft:heartbreak_pottery_sherd": 1300, "minecraft:jungle_button": 687, "minecraft:mojang_banner_pattern": 1198, "minecraft:waxed_oxidized_copper_trapdoor": 749, "minecraft:white_concrete_powder": 571, "minecraft:crimson_pressure_plate": 708, "minecraft:cut_red_sandstone": 512, "minecraft:dragon_egg": 379, "minecraft:glowstone_dust": 934, "minecraft:music_disc_strad": 1178, "minecraft:warped_hanging_sign": 907, "minecraft:waxed_chiseled_copper": 116, "minecraft:weathered_chiseled_copper": 98, "minecraft:armadillo_scute": 796, "minecraft:baked_potato": 1099, "minecraft:yellow_terracotta": 431, "minecraft:slime_block": 664, "minecraft:jungle_chest_boat": 781, "minecraft:piston": 662, "minecraft:light_blue_dye": 947, "minecraft:nether_brick": 1115, "minecraft:netherite_shovel": 844, "minecraft:purple_concrete_powder": 581, "minecraft:smooth_quartz": 281, "minecraft:frogspawn": 1266, "minecraft:ice": 306, "minecraft:brown_concrete": 567, "minecraft:chipped_anvil": 420, "minecraft:green_shulker_box": 536, "minecraft:prismarine": 503, "minecraft:stripped_spruce_log": 146, "minecraft:weathered_cut_copper_slab": 110, "minecraft:birch_planks": 38, "minecraft:blast_furnace": 1207, "minecraft:friend_pottery_sherd": 1297, "minecraft:map": 1101, "minecraft:polished_blackstone": 1232, "minecraft:sandstone": 191, "minecraft:waxed_copper_block": 112, "minecraft:wolf_spawn_egg": 1082, "minecraft:brown_candle": 1254, "minecraft:cat_spawn_egg": 1016, "minecraft:lime_dye": 949, "minecraft:polished_andesite_stairs": 633, "minecraft:polished_granite": 3, "minecraft:stripped_cherry_log": 150, "minecraft:tall_grass": 469, "minecraft:chest": 299, "minecraft:dead_brain_coral_fan": 615, "minecraft:oak_leaves": 176, "minecraft:ravager_spawn_egg": 1056, "minecraft:spruce_door": 712, "minecraft:string": 850, "minecraft:stripped_warped_stem": 154, "minecraft:waxed_exposed_copper_trapdoor": 747, "minecraft:deepslate_brick_stairs": 637, "minecraft:lapis_ore": 74, "minecraft:sandstone_slab": 266, "minecraft:tuff_bricks": 21, "minecraft:warped_trapdoor": 741, "minecraft:dragon_head": 1108, "minecraft:orange_carpet": 447, "minecraft:gray_carpet": 453, "minecraft:red_sandstone": 510, "minecraft:verdant_froglight": 1264, "minecraft:brown_mushroom": 234, "minecraft:chiseled_polished_blackstone": 1235, "minecraft:spruce_hanging_sign": 898, "minecraft:spruce_planks": 37, "minecraft:azalea": 197, "minecraft:ghast_tear": 995, "minecraft:bucket": 908, "minecraft:diorite": 4, "minecraft:oxidized_cut_copper": 103, "minecraft:waxed_weathered_copper": 114, "minecraft:armor_stand": 1123, "minecraft:black_wool": 217, "minecraft:deepslate_tile_wall": 418, "minecraft:dispenser": 668, "minecraft:smithing_table": 1211, "minecraft:stone_shovel": 824, "minecraft:white_concrete": 555, "minecraft:cobbled_deepslate_slab": 652, "minecraft:cornflower": 228, "minecraft:purpur_slab": 277, "minecraft:prismarine_stairs": 506, "minecraft:purple_dye": 954, "minecraft:purple_bed": 974, "minecraft:purple_terracotta": 437, "minecraft:creeper_spawn_egg": 1022, "minecraft:grindstone": 1210, "minecraft:end_stone_brick_wall": 410, "minecraft:light_blue_wool": 205, "minecraft:stripped_warped_hyphae": 164, "minecraft:dark_oak_slab": 258, "minecraft:fire_coral": 602, "minecraft:lantern": 1214, "minecraft:magenta_candle": 1244, "minecraft:orange_banner": 1134, "minecraft:rabbit_stew": 1120, "minecraft:smooth_red_sandstone": 282, "minecraft:sniffer_egg": 588, "minecraft:birch_stairs": 385, "minecraft:jukebox": 310, "minecraft:wild_armor_trim_smithing_template": 1273, "minecraft:glow_lichen": 360, "minecraft:white_glazed_terracotta": 539, "minecraft:blackstone_slab": 1229, "minecraft:crimson_hanging_sign": 906, "minecraft:zoglin_spawn_egg": 1083, "minecraft:rabbit_spawn_egg": 1055, "minecraft:vindicator_spawn_egg": 1076, "minecraft:quartz_stairs": 426, "minecraft:warden_spawn_egg": 1078, "minecraft:weathered_cut_copper": 102, "minecraft:deepslate_emerald_ore": 73, "minecraft:dropper": 669, "minecraft:light_gray_bed": 972, "minecraft:scrape_pottery_sherd": 1306, "minecraft:music_disc_ward": 1179, "minecraft:red_nether_brick_stairs": 632, "minecraft:soul_campfire": 1219, "minecraft:jungle_door": 714, "minecraft:oak_chest_boat": 775, "minecraft:mud": 32, "minecraft:polished_blackstone_pressure_plate": 696, "minecraft:acacia_chest_boat": 783, "minecraft:cut_copper_slab": 108, "minecraft:oak_hanging_sign": 897, "minecraft:soul_sand": 326, "minecraft:wet_sponge": 187, "minecraft:wooden_axe": 821, "minecraft:amethyst_cluster": 1261, "minecraft:light_gray_glazed_terracotta": 547, "minecraft:green_dye": 957, "minecraft:spruce_button": 685, "minecraft:weathered_copper_bulb": 1321, "minecraft:lead": 1128, "minecraft:mangrove_door": 718, "minecraft:dead_bubble_coral_block": 591, "minecraft:dune_armor_trim_smithing_template": 1271, "minecraft:explorer_pottery_sherd": 1295, "minecraft:honeycomb_block": 1225, "minecraft:music_disc_far": 1174, "minecraft:netherite_hoe": 847, "minecraft:cod_spawn_egg": 1020, "minecraft:crimson_roots": 238, "minecraft:stone_brick_slab": 271, "minecraft:rail": 763, "minecraft:small_dripleaf": 250, "minecraft:silverfish_spawn_egg": 1060, "minecraft:llama_spawn_egg": 1041, "minecraft:oxidized_chiseled_copper": 99, "minecraft:cobbled_deepslate_stairs": 635, "minecraft:cod": 935, "minecraft:sculk_catalyst": 373, "minecraft:sculk_sensor": 675, "minecraft:warped_slab": 263, "minecraft:light_blue_concrete": 558, "minecraft:moss_carpet": 245, "minecraft:oxidized_copper": 95, "minecraft:prismarine_slab": 278, "minecraft:apple": 800, "minecraft:green_stained_glass": 484, "minecraft:lapis_block": 190, "minecraft:purple_shulker_box": 533, "minecraft:snow_golem_spawn_egg": 1065, "minecraft:villager_spawn_egg": 1075, "minecraft:blue_bed": 975, "minecraft:infested_cobblestone": 334, "minecraft:arms_up_pottery_sherd": 1290, "minecraft:music_disc_stal": 1177, "minecraft:oak_boat": 774, "minecraft:spruce_trapdoor": 732, "minecraft:cooked_rabbit": 1119, "minecraft:light_gray_concrete": 563, "minecraft:daylight_detector": 674, "minecraft:beetroot_seeds": 1155, "minecraft:black_concrete_powder": 586, "minecraft:water_bucket": 909, "minecraft:milk_bucket": 914, "minecraft:smooth_stone": 284, "minecraft:brewing_stand": 1004, "minecraft:light_gray_candle": 1250, "minecraft:mace": 1093, "minecraft:magenta_concrete": 557, "minecraft:nether_brick_slab": 273, "minecraft:bamboo": 251, "minecraft:brain_coral": 600, "minecraft:cherry_pressure_plate": 704, "minecraft:cherry_slab": 257, "minecraft:chiseled_bookshelf": 287, "minecraft:cut_sandstone_slab": 267, "minecraft:deepslate_tiles": 348, "minecraft:end_stone_bricks": 378, "minecraft:ancient_debris": 80, "minecraft:brown_glazed_terracotta": 551, "minecraft:spruce_fence_gate": 751, "minecraft:firework_rocket": 1112, "minecraft:nautilus_shell": 1190, "minecraft:stripped_oak_wood": 155, "minecraft:waxed_weathered_copper_door": 728, "minecraft:carved_pumpkin": 323, "minecraft:light_blue_stained_glass_pane": 490, "minecraft:dirt_path": 464, "minecraft:purpur_block": 295, "minecraft:shears": 983, "minecraft:waxed_exposed_cut_copper_slab": 129, "minecraft:coal_block": 81, "minecraft:dark_oak_planks": 42, "minecraft:golden_hoe": 832, "minecraft:granite_slab": 647, "minecraft:orange_stained_glass_pane": 488, "minecraft:skull_pottery_sherd": 1309, "minecraft:infested_stone": 333, "minecraft:mushroom_stew": 849, "minecraft:charcoal": 804, "minecraft:cobbled_deepslate": 9, "minecraft:dead_fire_coral_block": 592, "minecraft:magenta_stained_glass_pane": 489, "minecraft:pig_spawn_egg": 1049, "minecraft:polished_blackstone_brick_wall": 414, "minecraft:brick": 921, "minecraft:calibrated_sculk_sensor": 676, "minecraft:snowball": 912, "minecraft:sculk": 371, "minecraft:spruce_leaves": 177, "minecraft:waxed_oxidized_cut_copper": 123, "minecraft:wheat": 854, "minecraft:cow_spawn_egg": 1021, "minecraft:powered_rail": 761, "minecraft:dark_oak_door": 717, "minecraft:axolotl_spawn_egg": 1010, "minecraft:chainmail_chestplate": 861, "minecraft:enderman_spawn_egg": 1028, "minecraft:light_blue_terracotta": 430, "minecraft:mangrove_chest_boat": 789, "minecraft:orange_dye": 945, "minecraft:poisonous_potato": 1100, "minecraft:recovery_compass": 929, "minecraft:bogged_spawn_egg": 1014, "minecraft:brain_coral_block": 595, "minecraft:sweet_berries": 1216, "minecraft:white_wool": 202, "minecraft:jungle_pressure_plate": 702, "minecraft:music_disc_pigstep": 1185, "minecraft:pumpkin": 322, "minecraft:smooth_stone_slab": 265, "minecraft:brick_stairs": 361, "minecraft:burn_pottery_sherd": 1293, "minecraft:zombie_spawn_egg": 1084, "minecraft:cod_bucket": 917, "minecraft:sponge": 186, "minecraft:sandstone_wall": 409, "minecraft:magenta_glazed_terracotta": 541, "minecraft:purple_concrete": 565, "minecraft:furnace": 302, "minecraft:glowstone": 332, "minecraft:netherite_scrap": 817, "minecraft:waxed_exposed_copper_door": 727, "minecraft:acacia_leaves": 180, "minecraft:barrier": 443, "minecraft:cherry_sapling": 53, "minecraft:cyan_concrete": 564, "minecraft:netherite_chestplate": 877, "minecraft:sandstone_stairs": 380, "minecraft:smooth_red_sandstone_stairs": 622, "minecraft:vex_armor_trim_smithing_template": 1276, "minecraft:birch_boat": 778, "minecraft:birch_hanging_sign": 899, "minecraft:warped_button": 694, "minecraft:strider_spawn_egg": 1069, "minecraft:tadpole_bucket": 920, "minecraft:gilded_blackstone": 1231, "minecraft:polished_blackstone_slab": 1233, "minecraft:jigsaw": 793, "minecraft:mangrove_button": 691, "minecraft:nether_brick_fence": 369, "minecraft:oak_slab": 252, "minecraft:polished_diorite": 5, "minecraft:smooth_basalt": 330, "minecraft:dried_kelp_block": 923, "minecraft:guster_banner_pattern": 1202, "minecraft:wooden_pickaxe": 820, "minecraft:pink_banner": 1139, "minecraft:magma_cream": 1003, "minecraft:medium_amethyst_bud": 1259, "minecraft:dark_oak_sign": 892, "minecraft:gold_block": 90, "minecraft:light_gray_stained_glass_pane": 495, "minecraft:lodestone": 1226, "minecraft:piglin_spawn_egg": 1050, "minecraft:bamboo_pressure_plate": 707, "minecraft:cherry_planks": 41, "minecraft:fire_charge": 1089, "minecraft:green_concrete_powder": 584, "minecraft:nether_bricks": 366, "minecraft:white_stained_glass_pane": 487, "minecraft:chiseled_deepslate": 350, "minecraft:crimson_stairs": 393, "minecraft:polished_diorite_stairs": 624, "minecraft:smooth_sandstone_slab": 645, "minecraft:tide_armor_trim_smithing_template": 1277, "minecraft:dead_brain_coral": 604, "minecraft:polar_bear_spawn_egg": 1053, "minecraft:end_portal_frame": 376, "minecraft:flower_pot": 1096, "minecraft:iron_trapdoor": 730, "minecraft:acacia_planks": 40, "minecraft:bamboo_hanging_sign": 905, "minecraft:chain_command_block": 515, "minecraft:weathered_copper_door": 724, "minecraft:large_fern": 470, "minecraft:loom": 1194, "minecraft:melon_seeds": 987, "minecraft:tube_coral_fan": 609, "minecraft:dark_prismarine_slab": 280, "minecraft:egg": 927, "minecraft:cyan_candle": 1251, "minecraft:jungle_sign": 889, "minecraft:leather_helmet": 856, "minecraft:music_disc_11": 1180, "minecraft:vine": 359, "minecraft:compass": 928, "minecraft:cooked_chicken": 991, "minecraft:lectern": 670, "minecraft:mud_brick_slab": 272, "minecraft:parrot_spawn_egg": 1047, "minecraft:trident": 1188, "minecraft:waxed_cut_copper_slab": 128, "minecraft:waxed_oxidized_copper_door": 729, "minecraft:angler_pottery_sherd": 1288, "minecraft:dark_prismarine_stairs": 508, "minecraft:jungle_wood": 169, "minecraft:oak_planks": 36, "minecraft:polished_andesite": 7, "minecraft:arrow": 802, "minecraft:cherry_fence_gate": 755, "minecraft:blue_banner": 1144, "minecraft:breeze_rod": 1332, "minecraft:host_armor_trim_smithing_template": 1285, "minecraft:mangrove_boat": 788, "minecraft:minecart": 766, "minecraft:suspicious_sand": 58, "minecraft:wandering_trader_spawn_egg": 1077, "minecraft:cyan_glazed_terracotta": 548, "minecraft:dark_oak_pressure_plate": 705, "minecraft:copper_grate": 1311, "minecraft:netherite_boots": 879, "minecraft:pink_stained_glass": 477, "minecraft:waxed_exposed_copper_grate": 1316, "minecraft:chiseled_tuff_bricks": 25, "minecraft:chorus_fruit": 1150, }, } ================================================ FILE: server/registry/item_sub_predicate_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var ItemSubPredicateType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:potion_contents": 3, "minecraft:stored_enchantments": 2, "minecraft:trim": 12, "minecraft:written_book_content": 10, "minecraft:container": 5, "minecraft:firework_explosion": 7, "minecraft:fireworks": 8, "minecraft:bundle_contents": 6, "minecraft:enchantments": 1, "minecraft:writable_book_content": 9, "minecraft:attribute_modifiers": 11, "minecraft:custom_data": 4, "minecraft:jukebox_playable": 13, "minecraft:damage": 0, }, } ================================================ FILE: server/registry/loot_condition_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var LootConditionType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:all_of": 2, "minecraft:block_state_property": 8, "minecraft:entity_properties": 5, "minecraft:table_bonus": 10, "minecraft:time_check": 16, "minecraft:value_check": 17, "minecraft:weather_check": 14, "minecraft:enchantment_active_check": 18, "minecraft:killed_by_player": 6, "minecraft:match_tool": 9, "minecraft:random_chance": 3, "minecraft:survives_explosion": 11, "minecraft:any_of": 1, "minecraft:location_check": 13, "minecraft:reference": 15, "minecraft:damage_source_properties": 12, "minecraft:entity_scores": 7, "minecraft:inverted": 0, "minecraft:random_chance_with_enchanted_bonus": 4, }, } ================================================ FILE: server/registry/loot_function_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var LootFunctionType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:set_banner_pattern": 26, "minecraft:set_components": 6, "minecraft:set_instrument": 28, "minecraft:set_item": 1, "minecraft:copy_state": 25, "minecraft:exploration_map": 12, "minecraft:limit_count": 18, "minecraft:set_enchantments": 4, "minecraft:set_potion": 27, "minecraft:apply_bonus": 19, "minecraft:copy_name": 14, "minecraft:modify_contents": 16, "minecraft:set_attributes": 10, "minecraft:set_writable_book_pages": 36, "minecraft:explosion_decay": 21, "minecraft:filtered": 17, "minecraft:enchanted_count_increase": 8, "minecraft:sequence": 30, "minecraft:set_count": 0, "minecraft:set_custom_model_data": 39, "minecraft:set_loot_table": 20, "minecraft:set_stew_effect": 13, "minecraft:enchant_with_levels": 2, "minecraft:set_name": 11, "minecraft:toggle_tooltips": 37, "minecraft:copy_components": 31, "minecraft:enchant_randomly": 3, "minecraft:reference": 29, "minecraft:set_book_cover": 34, "minecraft:set_contents": 15, "minecraft:set_damage": 9, "minecraft:set_firework_explosion": 33, "minecraft:set_written_book_pages": 35, "minecraft:copy_custom_data": 24, "minecraft:fill_player_head": 23, "minecraft:furnace_smelt": 7, "minecraft:set_custom_data": 5, "minecraft:set_fireworks": 32, "minecraft:set_lore": 22, "minecraft:set_ominous_bottle_amplifier": 38, }, } ================================================ FILE: server/registry/loot_nbt_provider_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var LootNbtProviderType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:storage": 0, "minecraft:context": 1, }, } ================================================ FILE: server/registry/loot_number_provider_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var LootNumberProviderType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:binomial": 2, "minecraft:constant": 0, "minecraft:enchantment_level": 5, "minecraft:score": 3, "minecraft:storage": 4, "minecraft:uniform": 1, }, } ================================================ FILE: server/registry/loot_pool_entry_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var LootPoolEntryType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:group": 7, "minecraft:item": 1, "minecraft:loot_table": 2, "minecraft:sequence": 6, "minecraft:tag": 4, "minecraft:alternatives": 5, "minecraft:dynamic": 3, "minecraft:empty": 0, }, } ================================================ FILE: server/registry/loot_score_provider_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var LootScoreProviderType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:context": 1, "minecraft:fixed": 0, }, } ================================================ FILE: server/registry/map_decoration_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var MapDecorationType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:banner_gray": 17, "minecraft:banner_red": 24, "minecraft:banner_yellow": 14, "minecraft:blue_marker": 3, "minecraft:village_plains": 28, "minecraft:village_taiga": 31, "minecraft:banner_brown": 22, "minecraft:village_snowy": 30, "minecraft:banner_green": 23, "minecraft:banner_magenta": 12, "minecraft:target_x": 4, "minecraft:village_desert": 27, "minecraft:banner_blue": 21, "minecraft:banner_cyan": 19, "minecraft:banner_light_gray": 18, "minecraft:banner_pink": 16, "minecraft:frame": 1, "minecraft:jungle_temple": 32, "minecraft:player": 0, "minecraft:banner_light_blue": 13, "minecraft:banner_purple": 20, "minecraft:banner_white": 10, "minecraft:red_marker": 2, "minecraft:village_savanna": 29, "minecraft:trial_chambers": 34, "minecraft:banner_black": 25, "minecraft:banner_orange": 11, "minecraft:player_off_limits": 7, "minecraft:player_off_map": 6, "minecraft:red_x": 26, "minecraft:target_point": 5, "minecraft:banner_lime": 15, "minecraft:mansion": 8, "minecraft:monument": 9, "minecraft:swamp_hut": 33, }, } ================================================ FILE: server/registry/memory_module_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var MemoryModuleType = Registry{ Default: "minecraft:dummy", Entries: map[string]int32{ "minecraft:nearby_adult_piglins": 65, "minecraft:breeze_shoot_recover": 101, "minecraft:dummy": 0, "minecraft:nearest_targetable_player_not_wearing_gold": 64, "minecraft:sonic_boom_sound_delay": 89, "minecraft:touch_cooldown": 85, "minecraft:walk_target": 12, "minecraft:attack_target": 14, "minecraft:is_sniffing": 79, "minecraft:is_tempted": 43, "minecraft:nearest_hostile": 26, "minecraft:time_trying_to_reach_admire_item": 56, "minecraft:attack_cooling_down": 15, "minecraft:golem_detected_recently": 31, "minecraft:universal_anger": 54, "minecraft:has_hunting_cooldown": 46, "minecraft:item_pickup_cooldown_ticks": 93, "minecraft:pacified": 75, "minecraft:sonic_boom_cooldown": 87, "minecraft:breeze_jump_inhaling": 103, "minecraft:interactable_doors": 20, "minecraft:breeze_shoot_charging": 100, "minecraft:danger_detected_recently": 32, "minecraft:is_panicking": 51, "minecraft:roar_target": 76, "minecraft:breeze_shoot_cooldown": 102, "minecraft:liked_noteblock": 91, "minecraft:ram_target": 48, "minecraft:sniffer_sniffing_target": 95, "minecraft:nearest_visible_baby_hoglin": 63, "minecraft:celebrate_location": 60, "minecraft:sniffer_explored_positions": 94, "minecraft:sniffer_happy": 97, "minecraft:visible_adult_hoglin_count": 71, "minecraft:potential_job_site": 3, "minecraft:last_woken": 34, "minecraft:liked_noteblock_cooldown_ticks": 92, "minecraft:mobs": 6, "minecraft:disturbance_location": 77, "minecraft:disable_walk_to_admire_item": 57, "minecraft:doors_to_close": 21, "minecraft:is_pregnant": 50, "minecraft:nearest_visible_adult": 36, "minecraft:breeze_jump_target": 104, "minecraft:last_worked_at_poi": 35, "minecraft:unreachable_tongue_targets": 52, "minecraft:breeze_leaving_water": 105, "minecraft:ate_recently": 73, "minecraft:heard_bell_time": 29, "minecraft:secondary_job_site": 5, "minecraft:breeze_jump_cooldown": 98, "minecraft:hiding_place": 28, "minecraft:vibration_cooldown": 86, "minecraft:nearest_visible_huntable_hoglin": 62, "minecraft:ride_target": 18, "minecraft:hunted_recently": 59, "minecraft:sonic_boom_sound_cooldown": 88, "minecraft:nearest_visible_adult_piglin": 68, "minecraft:cant_reach_walk_target_since": 30, "minecraft:is_emerging": 80, "minecraft:long_jump_cooling_down": 44, "minecraft:nearest_visible_nemesis": 38, "minecraft:visible_villager_babies": 8, "minecraft:admiring_disabled": 58, "minecraft:nearest_visible_adult_piglins": 66, "minecraft:recent_projectile": 78, "minecraft:temptation_cooldown_ticks": 41, "minecraft:visible_adult_piglin_count": 70, "minecraft:breeze_shoot": 99, "minecraft:is_in_water": 49, "minecraft:nearest_visible_zombified": 69, "minecraft:roar_sound_delay": 81, "minecraft:home": 1, "minecraft:nearest_bed": 22, "minecraft:hurt_by": 23, "minecraft:nearest_player_holding_wanted_item": 72, "minecraft:sniff_cooldown": 84, "minecraft:meeting_point": 4, "minecraft:last_slept": 33, "minecraft:hurt_by_entity": 24, "minecraft:interaction_target": 16, "minecraft:job_site": 2, "minecraft:look_target": 13, "minecraft:nearest_repellent": 74, "minecraft:play_dead_ticks": 39, "minecraft:visible_mobs": 7, "minecraft:path": 19, "minecraft:breed_target": 17, "minecraft:sniffer_digging": 96, "minecraft:tempting_player": 40, "minecraft:gaze_cooldown_ticks": 42, "minecraft:nearest_visible_wanted_item": 37, "minecraft:dig_cooldown": 82, "minecraft:liked_player": 90, "minecraft:nearest_attackable": 27, "minecraft:nearest_visible_player": 10, "minecraft:roar_sound_cooldown": 83, "minecraft:angry_at": 53, "minecraft:dancing": 61, "minecraft:long_jump_mid_jump": 45, "minecraft:nearest_visible_targetable_player": 11, "minecraft:ram_cooldown_ticks": 47, "minecraft:avoid_target": 25, "minecraft:nearest_players": 9, "minecraft:nearest_visible_adult_hoglins": 67, "minecraft:admiring_item": 55, }, } ================================================ FILE: server/registry/menu.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var Menu = Registry{ Default: "", Entries: map[string]int32{ "minecraft:smoker": 22, "minecraft:crafter_3x3": 7, "minecraft:generic_9x1": 0, "minecraft:generic_9x3": 2, "minecraft:generic_9x5": 4, "minecraft:generic_9x6": 5, "minecraft:shulker_box": 20, "minecraft:stonecutter": 24, "minecraft:beacon": 9, "minecraft:crafting": 12, "minecraft:furnace": 14, "minecraft:generic_9x2": 1, "minecraft:generic_9x4": 3, "minecraft:grindstone": 15, "minecraft:cartography_table": 23, "minecraft:enchantment": 13, "minecraft:hopper": 16, "minecraft:lectern": 17, "minecraft:smithing": 21, "minecraft:anvil": 8, "minecraft:blast_furnace": 10, "minecraft:brewing_stand": 11, "minecraft:generic_3x3": 6, "minecraft:loom": 18, "minecraft:merchant": 19, }, } ================================================ FILE: server/registry/mob_effect.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var MobEffect = Registry{ Default: "", Entries: map[string]int32{ "minecraft:jump_boost": 7, "minecraft:wither": 19, "minecraft:hero_of_the_village": 31, "minecraft:invisibility": 13, "minecraft:slow_falling": 27, "minecraft:strength": 4, "minecraft:weaving": 36, "minecraft:darkness": 32, "minecraft:unluck": 26, "minecraft:wind_charged": 35, "minecraft:dolphins_grace": 29, "minecraft:health_boost": 20, "minecraft:instant_health": 5, "minecraft:oozing": 37, "minecraft:raid_omen": 34, "minecraft:hunger": 16, "minecraft:instant_damage": 6, "minecraft:nausea": 8, "minecraft:speed": 0, "minecraft:weakness": 17, "minecraft:water_breathing": 12, "minecraft:bad_omen": 30, "minecraft:levitation": 24, "minecraft:mining_fatigue": 3, "minecraft:night_vision": 15, "minecraft:regeneration": 9, "minecraft:slowness": 1, "minecraft:absorption": 21, "minecraft:glowing": 23, "minecraft:luck": 25, "minecraft:poison": 18, "minecraft:saturation": 22, "minecraft:resistance": 10, "minecraft:trial_omen": 33, "minecraft:blindness": 14, "minecraft:conduit_power": 28, "minecraft:fire_resistance": 11, "minecraft:haste": 2, "minecraft:infested": 38, }, } ================================================ FILE: server/registry/number_format_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var NumberFormatType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:blank": 0, "minecraft:fixed": 2, "minecraft:styled": 1, }, } ================================================ FILE: server/registry/particle_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var ParticleType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:item_snowball": 48, "minecraft:white_smoke": 57, "minecraft:dripping_honey": 73, "minecraft:dripping_lava": 8, "minecraft:item": 44, "minecraft:sonic_boom": 27, "minecraft:cherry_leaves": 33, "minecraft:dust": 13, "minecraft:falling_obsidian_tear": 83, "minecraft:witch": 65, "minecraft:dripping_obsidian_tear": 82, "minecraft:explosion": 22, "minecraft:item_slime": 46, "minecraft:mycelium": 51, "minecraft:end_rod": 19, "minecraft:gust_emitter_large": 25, "minecraft:shriek": 99, "minecraft:electric_spark": 97, "minecraft:falling_dripstone_water": 92, "minecraft:landing_obsidian_tear": 84, "minecraft:vault_connection": 104, "minecraft:dripping_dripstone_lava": 89, "minecraft:falling_lava": 9, "minecraft:current_down": 67, "minecraft:snowflake": 88, "minecraft:ash": 78, "minecraft:campfire_signal_smoke": 72, "minecraft:spore_blossom_air": 81, "minecraft:trial_omen": 108, "minecraft:heart": 42, "minecraft:large_smoke": 49, "minecraft:trial_spawner_detection_ominous": 103, "minecraft:wax_off": 96, "minecraft:white_ash": 86, "minecraft:egg_crack": 100, "minecraft:flash": 39, "minecraft:totem_of_undying": 62, "minecraft:falling_dust": 28, "minecraft:dolphin": 70, "minecraft:dragon_breath": 7, "minecraft:gust": 23, "minecraft:landing_lava": 10, "minecraft:bubble_column_up": 68, "minecraft:crit": 5, "minecraft:small_gust": 24, "minecraft:effect": 15, "minecraft:sculk_charge_pop": 36, "minecraft:splash": 64, "minecraft:smoke": 56, "minecraft:block": 1, "minecraft:fishing": 30, "minecraft:infested": 32, "minecraft:rain": 55, "minecraft:wax_on": 95, "minecraft:angry_villager": 0, "minecraft:elder_guardian": 16, "minecraft:dust_color_transition": 14, "minecraft:reverse_portal": 85, "minecraft:dripping_water": 11, "minecraft:entity_effect": 20, "minecraft:happy_villager": 40, "minecraft:portal": 54, "minecraft:sweep_attack": 61, "minecraft:bubble": 3, "minecraft:enchanted_hit": 17, "minecraft:falling_honey": 74, "minecraft:nautilus": 69, "minecraft:sneeze": 58, "minecraft:dust_plume": 101, "minecraft:falling_water": 12, "minecraft:falling_dripstone_lava": 90, "minecraft:sculk_charge": 35, "minecraft:campfire_cosy_smoke": 71, "minecraft:glow_squid_ink": 93, "minecraft:vibration": 45, "minecraft:block_marker": 2, "minecraft:damage_indicator": 6, "minecraft:ominous_spawning": 106, "minecraft:poof": 53, "minecraft:falling_spore_blossom": 77, "minecraft:flame": 31, "minecraft:soul_fire_flame": 37, "minecraft:spit": 59, "minecraft:bubble_pop": 66, "minecraft:explosion_emitter": 21, "minecraft:warped_spore": 80, "minecraft:falling_nectar": 76, "minecraft:trial_spawner_detection": 102, "minecraft:gust_emitter_small": 26, "minecraft:sculk_soul": 34, "minecraft:cloud": 4, "minecraft:enchant": 18, "minecraft:firework": 29, "minecraft:raid_omen": 107, "minecraft:note": 52, "minecraft:small_flame": 87, "minecraft:underwater": 63, "minecraft:crimson_spore": 79, "minecraft:dust_pillar": 105, "minecraft:glow": 94, "minecraft:landing_honey": 75, "minecraft:lava": 50, "minecraft:soul": 38, "minecraft:squid_ink": 60, "minecraft:dripping_dripstone_water": 91, "minecraft:scrape": 98, "minecraft:instant_effect": 43, "minecraft:item_cobweb": 47, "minecraft:composter": 41, }, } ================================================ FILE: server/registry/point_of_interest_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var PointOfInterestType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:weaponsmith": 12, "minecraft:armorer": 0, "minecraft:bee_nest": 16, "minecraft:cartographer": 2, "minecraft:fisherman": 5, "minecraft:leatherworker": 7, "minecraft:shepherd": 10, "minecraft:beehive": 15, "minecraft:fletcher": 6, "minecraft:librarian": 8, "minecraft:lightning_rod": 19, "minecraft:nether_portal": 17, "minecraft:butcher": 1, "minecraft:cleric": 3, "minecraft:lodestone": 18, "minecraft:meeting": 14, "minecraft:toolsmith": 11, "minecraft:farmer": 4, "minecraft:home": 13, "minecraft:mason": 9, }, } ================================================ FILE: server/registry/pos_rule_test.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var PosRuleTest = Registry{ Default: "", Entries: map[string]int32{ "minecraft:always_true": 0, "minecraft:axis_aligned_linear_pos": 2, "minecraft:linear_pos": 1, }, } ================================================ FILE: server/registry/position_source_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var PositionSourceType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:block": 0, "minecraft:state": 1, }, } ================================================ FILE: server/registry/potion.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var Potion = Registry{ Default: "", Entries: map[string]int32{ "minecraft:long_swiftness": 14, "minecraft:luck": 39, "minecraft:poison": 28, "minecraft:long_night_vision": 5, "minecraft:long_regeneration": 32, "minecraft:night_vision": 4, "minecraft:oozing": 44, "minecraft:regeneration": 31, "minecraft:infested": 45, "minecraft:invisibility": 6, "minecraft:long_fire_resistance": 12, "minecraft:strong_harming": 27, "minecraft:strong_turtle_master": 21, "minecraft:thick": 2, "minecraft:strong_healing": 25, "minecraft:strong_slowness": 18, "minecraft:water": 0, "minecraft:weakness": 37, "minecraft:healing": 24, "minecraft:long_invisibility": 7, "minecraft:long_slow_falling": 41, "minecraft:long_strength": 35, "minecraft:slow_falling": 40, "minecraft:wind_charged": 42, "minecraft:long_leaping": 9, "minecraft:strength": 34, "minecraft:swiftness": 13, "minecraft:awkward": 3, "minecraft:fire_resistance": 11, "minecraft:harming": 26, "minecraft:strong_poison": 30, "minecraft:long_slowness": 17, "minecraft:mundane": 1, "minecraft:slowness": 16, "minecraft:long_weakness": 38, "minecraft:strong_leaping": 10, "minecraft:strong_strength": 36, "minecraft:strong_swiftness": 15, "minecraft:turtle_master": 19, "minecraft:long_poison": 29, "minecraft:long_turtle_master": 20, "minecraft:long_water_breathing": 23, "minecraft:water_breathing": 22, "minecraft:weaving": 43, "minecraft:leaping": 8, "minecraft:strong_regeneration": 33, }, } ================================================ FILE: server/registry/recipe_serializer.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var RecipeSerializer = Registry{ Default: "", Entries: map[string]int32{ "minecraft:campfire_cooking": 18, "minecraft:crafting_special_bannerduplicate": 10, "minecraft:crafting_special_firework_star": 7, "minecraft:crafting_special_mapextending": 5, "minecraft:crafting_special_tippedarrow": 9, "minecraft:smithing_transform": 20, "minecraft:stonecutting": 19, "minecraft:crafting_shapeless": 1, "minecraft:crafting_special_firework_rocket": 6, "minecraft:crafting_special_shielddecoration": 11, "minecraft:crafting_special_shulkerboxcoloring": 12, "minecraft:crafting_special_suspiciousstew": 13, "minecraft:smithing_trim": 21, "minecraft:crafting_special_mapcloning": 4, "minecraft:crafting_special_repairitem": 14, "minecraft:blasting": 16, "minecraft:crafting_decorated_pot": 22, "minecraft:crafting_shaped": 0, "minecraft:crafting_special_armordye": 2, "minecraft:crafting_special_bookcloning": 3, "minecraft:crafting_special_firework_star_fade": 8, "minecraft:smelting": 15, "minecraft:smoking": 17, }, } ================================================ FILE: server/registry/recipe_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var RecipeType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:campfire_cooking": 4, "minecraft:crafting": 0, "minecraft:smelting": 1, "minecraft:smithing": 6, "minecraft:smoking": 3, "minecraft:stonecutting": 5, "minecraft:blasting": 2, }, } ================================================ FILE: server/registry/registry.go ================================================ package registry // This package contains registries that are not sent to the client, meaning the ids are constants // Generated by https://github.com/ZeppelinMC/RegistryExtractor type Registry struct { Default string Entries map[string]int32 } // Looks up the name in the registry and returns the protocol id if found, otherwise default or 0 func (r Registry) Get(n string) int32 { i, _ := r.Lookup(n) return i } // Looks up the name in the registry and returns the protocol id. If the protocol id is not found, returns the default entry and(ok=false), and if that is not found either then returns 0 func (r Registry) Lookup(n string) (int32, bool) { i, ok := r.Entries[n] if !ok { if r.Default != "" { i = r.Entries[r.Default] } } return i, ok } // Returns the name of the protocol id func (r Registry) NameOf(id int32) (string, bool) { for n, e := range r.Entries { if e == id { return n, true } } return "", false } ================================================ FILE: server/registry/rule_block_entity_modifier.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var RuleBlockEntityModifier = Registry{ Default: "", Entries: map[string]int32{ "minecraft:append_loot": 3, "minecraft:append_static": 2, "minecraft:clear": 0, "minecraft:passthrough": 1, }, } ================================================ FILE: server/registry/rule_test.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var RuleTest = Registry{ Default: "", Entries: map[string]int32{ "minecraft:block_match": 1, "minecraft:blockstate_match": 2, "minecraft:random_block_match": 4, "minecraft:random_blockstate_match": 5, "minecraft:tag_match": 3, "minecraft:always_true": 0, }, } ================================================ FILE: server/registry/schedule.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var Schedule = Registry{ Default: "", Entries: map[string]int32{ "minecraft:empty": 0, "minecraft:simple": 1, "minecraft:villager_baby": 2, "minecraft:villager_default": 3, }, } ================================================ FILE: server/registry/sensor_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var SensorType = Registry{ Default: "minecraft:dummy", Entries: map[string]int32{ "minecraft:armadillo_scare_detected": 10, "minecraft:breeze_attack_entity_sensor": 25, "minecraft:frog_temptations": 18, "minecraft:hurt_by": 5, "minecraft:nearest_adult": 14, "minecraft:sniffer_temptations": 24, "minecraft:villager_hostiles": 6, "minecraft:piglin_brute_specific_sensor": 12, "minecraft:axolotl_attackables": 15, "minecraft:axolotl_temptations": 16, "minecraft:camel_temptations": 19, "minecraft:dummy": 0, "minecraft:golem_detected": 9, "minecraft:nearest_bed": 4, "minecraft:nearest_items": 1, "minecraft:secondary_pois": 8, "minecraft:villager_babies": 7, "minecraft:warden_entity_sensor": 23, "minecraft:goat_temptations": 17, "minecraft:hoglin_specific_sensor": 13, "minecraft:nearest_players": 3, "minecraft:piglin_specific_sensor": 11, "minecraft:armadillo_temptations": 20, "minecraft:frog_attackables": 21, "minecraft:is_in_water": 22, "minecraft:nearest_living_entities": 2, }, } ================================================ FILE: server/registry/sound_event.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var SoundEvent = Registry{ Default: "", Entries: map[string]int32{ "minecraft:block.scaffolding.step": 1194, "minecraft:state.fishing_bobber.throw": 518, "minecraft:state.llama.chest": 786, "minecraft:state.player.hurt_sweet_berry_bush": 1113, "minecraft:state.strider.ambient": 1302, "minecraft:block.cherry_sapling.step": 279, "minecraft:block.coral_block.place": 363, "minecraft:state.armadillo.roll": 60, "minecraft:state.breeze.deflect": 187, "minecraft:state.dolphin.attack": 413, "minecraft:state.parrot.imitate.endermite": 1037, "minecraft:block.deepslate_tiles.step": 407, "minecraft:block.packed_mud.place": 944, "minecraft:state.armadillo.unroll_finish": 63, "minecraft:state.firework_rocket.twinkle": 511, "minecraft:state.parrot.imitate.pillager": 1048, "minecraft:state.ravager.step": 1158, "minecraft:item.armor.equip_gold": 71, "minecraft:block.fungus.fall": 965, "minecraft:block.hanging_roots.fall": 649, "minecraft:block.nylium.place": 953, "minecraft:state.ender_eye.launch": 476, "minecraft:state.evoker.death": 494, "minecraft:state.sniffer.digging": 1326, "minecraft:state.warden.death": 1498, "minecraft:block.amethyst_cluster.step": 40, "minecraft:block.beehive.shear": 153, "minecraft:block.sculk_sensor.step": 1214, "minecraft:state.fox.bite": 527, "minecraft:state.frog.death": 558, "minecraft:state.vindicator.ambient": 1474, "minecraft:state.witch.celebrate": 1533, "minecraft:item.trident.return": 1386, "minecraft:music.overworld.grove": 897, "minecraft:block.azalea_leaves.step": 104, "minecraft:block.note_block.harp": 992, "minecraft:state.goat.step": 627, "minecraft:state.sniffer.digging_stop": 1327, "minecraft:state.splash_potion.break": 1347, "minecraft:state.strider.hurt": 1306, "minecraft:state.wandering_trader.reappeared": 1491, "minecraft:item.goat_horn.sound.3": 709, "minecraft:block.cherry_wood.hit": 272, "minecraft:block.cherry_wood_pressure_plate.click_on": 297, "minecraft:block.composter.empty": 330, "minecraft:block.copper.hit": 349, "minecraft:block.polished_tuff.hit": 1412, "minecraft:block.suspicious_sand.fall": 540, "minecraft:state.iron_golem.hurt": 751, "minecraft:state.piglin.retreat": 1084, "minecraft:state.wolf.death": 1553, "minecraft:block.amethyst_cluster.fall": 37, "minecraft:block.deepslate_tiles.break": 403, "minecraft:block.enchantment_table.use": 465, "minecraft:block.sculk_sensor.clicking": 1208, "minecraft:block.sweet_berry_bush.pick_berries": 1376, "minecraft:ui.toast.challenge_complete": 1433, "minecraft:block.bamboo_wood_hanging_sign.place": 672, "minecraft:block.glass.hit": 595, "minecraft:block.scaffolding.place": 1193, "minecraft:state.firework_rocket.launch": 509, "minecraft:state.shulker.hurt": 1246, "minecraft:state.sniffer.idle": 1319, "minecraft:state.turtle.ambient_land": 1415, "minecraft:ambient.underwater.loop.additions.rare": 27, "minecraft:block.end_portal.spawn": 490, "minecraft:state.elder_guardian.hurt": 462, "minecraft:state.generic.drink": 574, "minecraft:state.goat.long_jump": 612, "minecraft:state.puffer_fish.blow_up": 1141, "minecraft:state.turtle.lay_egg": 1423, "minecraft:state.villager.death": 1456, "minecraft:item.armor.equip_wolf": 76, "minecraft:item.goat_horn.sound.1": 707, "minecraft:music.overworld.sparse_jungle": 915, "minecraft:block.bamboo.hit": 107, "minecraft:block.frogspawn.break": 552, "minecraft:block.sculk_sensor.clicking_stop": 1209, "minecraft:block.wet_sponge.dries": 1525, "minecraft:state.drowned.swim": 453, "minecraft:state.hoglin.converted_to_zombified": 693, "minecraft:state.phantom.ambient": 1066, "minecraft:state.wandering_trader.trade": 1492, "minecraft:state.wolf.howl": 1555, "minecraft:block.cave_vines.fall": 260, "minecraft:block.cherry_wood_hanging_sign.place": 289, "minecraft:state.glow_squid.hurt": 606, "minecraft:state.item.pickup": 762, "minecraft:music.nether.basalt_deltas": 893, "minecraft:block.cherry_wood_door.open": 291, "minecraft:block.suspicious_gravel.step": 542, "minecraft:block.bamboo_wood_pressure_plate.click_on": 125, "minecraft:block.ender_chest.close": 466, "minecraft:block.lantern.place": 771, "minecraft:block.stem.fall": 950, "minecraft:block.tuff_bricks.step": 1409, "minecraft:state.zoglin.death": 1582, "minecraft:block.netherite_block.step": 977, "minecraft:block.sculk.step": 1201, "minecraft:block.wart_block.fall": 975, "minecraft:state.skeleton_horse.death": 1259, "minecraft:music.overworld.cherry_grove": 904, "minecraft:block.chiseled_bookshelf.insert": 311, "minecraft:block.hanging_roots.hit": 650, "minecraft:state.panda.sneeze": 1015, "minecraft:state.slime.death_small": 1311, "minecraft:item.axe.scrape": 86, "minecraft:music.nether.nether_wastes": 905, "minecraft:block.metal.hit": 818, "minecraft:block.pink_petals.break": 836, "minecraft:state.cow.death": 366, "minecraft:state.parrot.imitate.slime": 1053, "minecraft:state.zombie.step": 1601, "minecraft:item.armor.equip_elytra": 69, "minecraft:block.roots.break": 565, "minecraft:block.vault.close_shutter": 1439, "minecraft:state.glow_item_frame.break": 600, "minecraft:state.horse.breathe": 717, "minecraft:state.leash_knot.break": 778, "minecraft:state.wither.hurt": 1541, "minecraft:block.suspicious_gravel.hit": 544, "minecraft:state.arrow.hit_player": 83, "minecraft:ambient.soul_sand_valley.mood": 19, "minecraft:block.ancient_debris.break": 41, "minecraft:block.candle.fall": 246, "minecraft:block.decorated_pot.place": 391, "minecraft:block.mangrove_roots.step": 813, "minecraft:state.firework_rocket.large_blast": 507, "minecraft:state.firework_rocket.shoot": 510, "minecraft:state.goat.screaming.death": 619, "minecraft:state.husk.death": 735, "minecraft:state.stray.ambient": 1370, "minecraft:block.amethyst_block.step": 35, "minecraft:block.anvil.break": 46, "minecraft:block.snow.step": 1342, "minecraft:state.puffer_fish.death": 1142, "minecraft:state.ravager.attack": 1154, "minecraft:state.witch.drink": 1535, "minecraft:block.copper_bulb.hit": 342, "minecraft:block.mangrove_roots.fall": 810, "minecraft:block.wet_grass.place": 1522, "minecraft:state.armor_stand.place": 81, "minecraft:state.lightning_bolt.thunder": 782, "minecraft:item.bottle.empty": 183, "minecraft:block.nether_gold_ore.break": 1161, "minecraft:block.slime_block.place": 1277, "minecraft:block.stone_pressure_plate.click_off": 1367, "minecraft:state.axolotl.idle_air": 91, "minecraft:state.hostile.swim": 732, "minecraft:item.brush.brushing.gravel.complete": 204, "minecraft:item.ominous_bottle.dispose": 1011, "minecraft:block.chiseled_bookshelf.fall": 309, "minecraft:block.pointed_dripstone.drip_water": 440, "minecraft:state.villager.hurt": 1457, "minecraft:block.mud_bricks.place": 854, "minecraft:block.trial_spawner.step": 674, "minecraft:state.parrot.imitate.phantom": 1045, "minecraft:state.squid.death": 1358, "minecraft:block.bamboo_wood_door.open": 119, "minecraft:block.bone_block.break": 174, "minecraft:block.suspicious_sand.place": 538, "minecraft:state.mooshroom.eat": 827, "minecraft:state.sheep.hurt": 1228, "minecraft:state.zombie_horse.ambient": 1592, "minecraft:block.note_block.flute": 990, "minecraft:block.piston.extend": 1098, "minecraft:block.polished_deepslate.place": 1129, "minecraft:block.sniffer_egg.plop": 1329, "minecraft:block.tuff.place": 1402, "minecraft:block.tuff_bricks.fall": 1406, "minecraft:state.piglin.step": 1085, "minecraft:state.turtle.shamble_baby": 1425, "minecraft:state.villager.work_toolsmith": 1472, "minecraft:item.armor.unequip_wolf": 77, "minecraft:item.firecharge.use": 504, "minecraft:music_disc.chirp": 875, "minecraft:ambient.basalt_deltas.mood": 10, "minecraft:block.calcite.step": 227, "minecraft:block.chorus_flower.death": 317, "minecraft:block.grindstone.use": 638, "minecraft:state.fox.spit": 534, "minecraft:music_disc.mall": 877, "minecraft:block.decorated_pot.shatter": 392, "minecraft:state.allay.death": 2, "minecraft:state.breeze.jump": 192, "minecraft:state.hoglin.ambient": 690, "minecraft:state.husk.hurt": 736, "minecraft:state.iron_golem.death": 750, "minecraft:state.skeleton_horse.ambient_water": 1262, "minecraft:state.warden.tendril_clicks": 1513, "minecraft:block.candle.break": 244, "minecraft:block.nether_ore.break": 1166, "minecraft:block.packed_mud.step": 945, "minecraft:block.polished_deepslate.fall": 1127, "minecraft:state.cod.ambient": 325, "minecraft:state.dolphin.jump": 417, "minecraft:state.evoker.ambient": 491, "minecraft:state.parrot.imitate.zombie": 1063, "minecraft:state.player.hurt": 1109, "minecraft:state.spider.hurt": 1345, "minecraft:state.wither.shoot": 1542, "minecraft:block.coral_block.fall": 361, "minecraft:block.deepslate_bricks.place": 396, "minecraft:block.dripstone_block.fall": 432, "minecraft:block.wet_grass.fall": 1520, "minecraft:item.flintandsteel.use": 519, "minecraft:block.wart_block.step": 972, "minecraft:state.breeze.hurt": 196, "minecraft:state.piglin_brute.angry": 1088, "minecraft:state.player.hurt_on_fire": 1112, "minecraft:state.zombie.break_wooden_door": 1588, "minecraft:block.moss_carpet.place": 834, "minecraft:block.note_block.cow_bell": 998, "minecraft:state.allay.ambient_without_item": 1, "minecraft:state.bat.takeoff": 139, "minecraft:state.phantom.flap": 1069, "minecraft:state.player.small_fall": 1115, "minecraft:state.turtle.hurt": 1421, "minecraft:state.warden.agitated": 1494, "minecraft:block.amethyst_cluster.place": 39, "minecraft:block.copper_bulb.fall": 343, "minecraft:block.decorated_pot.hit": 387, "minecraft:block.nether_wood_hanging_sign.break": 664, "minecraft:block.note_block.imitate.ender_dragon": 1005, "minecraft:block.smoker.smoke": 1316, "minecraft:state.cow.hurt": 367, "minecraft:state.rabbit.ambient": 1147, "minecraft:item.crossbow.loading_end": 378, "minecraft:block.anvil.fall": 48, "minecraft:block.polished_tuff.break": 1410, "minecraft:block.anvil.destroy": 47, "minecraft:block.azalea.fall": 96, "minecraft:block.fence_gate.close": 502, "minecraft:block.stone_button.click_off": 1362, "minecraft:block.trial_spawner.eject_item": 688, "minecraft:block.vault.reject_rewarded_player": 1442, "minecraft:state.goat.horn_break": 616, "minecraft:state.ravager.celebrate": 1155, "minecraft:block.hanging_roots.break": 648, "minecraft:block.soul_sand.place": 1288, "minecraft:block.trial_spawner.about_to_spawn_item": 679, "minecraft:state.glow_squid.squirt": 607, "minecraft:block.bamboo_sapling.hit": 111, "minecraft:block.metal.fall": 817, "minecraft:block.nether_wood.break": 925, "minecraft:state.donkey.eat": 425, "minecraft:state.goat.screaming.long_jump": 622, "minecraft:state.polar_bear.warning": 1125, "minecraft:block.cherry_sapling.fall": 276, "minecraft:block.fire.ambient": 513, "minecraft:block.froglight.step": 550, "minecraft:block.muddy_mangrove_roots.break": 856, "minecraft:block.pointed_dripstone.fall": 437, "minecraft:state.allay.ambient_with_item": 0, "minecraft:state.magma_cube.hurt": 804, "minecraft:state.parrot.imitate.guardian": 1040, "minecraft:ambient.basalt_deltas.additions": 8, "minecraft:ambient.basalt_deltas.loop": 9, "minecraft:block.bone_block.fall": 175, "minecraft:block.candle.place": 248, "minecraft:block.note_block.snare": 995, "minecraft:block.rooted_dirt.fall": 1177, "minecraft:block.small_amethyst_bud.place": 1280, "minecraft:block.wet_grass.step": 1523, "minecraft:state.villager.work_cleric": 1464, "minecraft:state.zoglin.attack": 1581, "minecraft:music_disc.mellohi": 878, "minecraft:block.ladder.break": 763, "minecraft:block.small_dripleaf.break": 1281, "minecraft:state.creeper.hurt": 373, "minecraft:state.drowned.ambient_water": 446, "minecraft:state.llama.hurt": 789, "minecraft:music.menu": 892, "minecraft:block.cherry_wood.place": 273, "minecraft:block.flowering_azalea.step": 524, "minecraft:block.pink_petals.fall": 837, "minecraft:block.polished_deepslate.hit": 1128, "minecraft:state.skeleton.death": 1257, "minecraft:item.glow_ink_sac.use": 598, "minecraft:block.bamboo_wood_hanging_sign.hit": 671, "minecraft:block.big_dripleaf.break": 157, "minecraft:block.lantern.fall": 769, "minecraft:block.powder_snow.hit": 1136, "minecraft:block.wooden_pressure_plate.click_off": 1567, "minecraft:state.bee.loop_aggressive": 146, "minecraft:state.llama.step": 791, "minecraft:block.sculk_shrieker.break": 1215, "minecraft:block.slime_block.hit": 1276, "minecraft:block.wood.fall": 1570, "minecraft:state.parrot.imitate.vindicator": 1057, "minecraft:state.sniffer.step": 1317, "minecraft:item.spyglass.stop_using": 1356, "minecraft:block.copper_grate.place": 355, "minecraft:block.gravel.break": 633, "minecraft:block.nether_bricks.break": 918, "minecraft:state.fishing_bobber.splash": 517, "minecraft:state.parrot.imitate.ender_dragon": 1036, "minecraft:state.strider.step_lava": 1308, "minecraft:block.amethyst_block.resonate": 34, "minecraft:block.lodestone.step": 795, "minecraft:block.note_block.bass": 987, "minecraft:block.note_block.imitate.skeleton": 1003, "minecraft:block.packed_mud.break": 941, "minecraft:block.wooden_trapdoor.close": 1563, "minecraft:state.mooshroom.suspicious_milk": 829, "minecraft:state.player.hurt_freeze": 1111, "minecraft:state.shulker.teleport": 1250, "minecraft:state.turtle.shamble": 1424, "minecraft:block.deepslate_tiles.place": 406, "minecraft:block.gravel.place": 636, "minecraft:block.mud_bricks.fall": 852, "minecraft:block.sculk.fall": 1198, "minecraft:state.fox.sniff": 533, "minecraft:item.elytra.flying": 464, "minecraft:music.overworld.swamp": 900, "minecraft:block.calcite.fall": 230, "minecraft:block.coral_block.hit": 362, "minecraft:block.note_block.basedrum": 986, "minecraft:state.bee.loop": 147, "minecraft:state.witch.death": 1534, "minecraft:block.candle.step": 249, "minecraft:block.shroomlight.step": 1234, "minecraft:state.dolphin.hurt": 416, "minecraft:music_disc.wait": 882, "minecraft:ui.cartography_table.take_result": 1430, "minecraft:block.cave_vines.pick_berries": 264, "minecraft:block.fungus.break": 961, "minecraft:block.hanging_sign.waxed_interact_fail": 1514, "minecraft:block.honey_block.slide": 702, "minecraft:block.netherite_block.break": 976, "minecraft:block.stem.hit": 949, "minecraft:state.item_frame.rotate_item": 760, "minecraft:state.mule.angry": 862, "minecraft:state.shulker.death": 1245, "minecraft:state.skeleton_horse.swim": 1261, "minecraft:state.wither_skeleton.ambient": 1543, "minecraft:block.bamboo.fall": 106, "minecraft:block.bamboo_wood_button.click_on": 123, "minecraft:block.metal.step": 822, "minecraft:block.shroomlight.place": 1235, "minecraft:block.snow.fall": 1334, "minecraft:block.spore_blossom.place": 1300, "minecraft:state.allay.item_taken": 5, "minecraft:state.slime.attack": 1269, "minecraft:state.strider.death": 1305, "minecraft:state.warden.angry": 1496, "minecraft:state.wolf.whine": 1560, "minecraft:block.cherry_wood_button.click_off": 294, "minecraft:block.heavy_core.break": 658, "minecraft:block.wet_grass.hit": 1521, "minecraft:state.salmon.hurt": 1184, "minecraft:state.sniffer.searching": 1325, "minecraft:state.zombie_villager.hurt": 1606, "minecraft:block.copper.place": 348, "minecraft:block.trial_spawner.ambient_ominous": 685, "minecraft:state.fox.hurt": 530, "minecraft:state.generic.small_fall": 579, "minecraft:state.parrot.imitate.ravager": 1049, "minecraft:state.strider.eat": 1309, "minecraft:state.strider.step": 1307, "minecraft:state.zombie_horse.hurt": 1594, "minecraft:music.overworld.lush_caves": 899, "minecraft:block.copper.step": 347, "minecraft:block.tuff_bricks.break": 1405, "minecraft:state.allay.item_given": 4, "minecraft:state.magma_cube.hurt_small": 805, "minecraft:state.shulker.ambient": 1239, "minecraft:music_disc.pigstep": 879, "minecraft:weather.rain.above": 1518, "minecraft:block.barrel.close": 128, "minecraft:block.basalt.break": 130, "minecraft:block.nether_wood_trapdoor.close": 932, "minecraft:block.sand.step": 1189, "minecraft:block.slime_block.break": 1274, "minecraft:state.stray.hurt": 1372, "minecraft:state.zombie.attack_wooden_door": 1586, "minecraft:block.cherry_wood_hanging_sign.fall": 287, "minecraft:block.heavy_core.fall": 659, "minecraft:block.snow.place": 1341, "minecraft:state.ender_dragon.shoot": 474, "minecraft:block.frogspawn.fall": 553, "minecraft:block.grass.hit": 630, "minecraft:block.nether_sprouts.place": 958, "minecraft:block.wooden_button.click_on": 1566, "minecraft:state.player.attack.nodamage": 1101, "minecraft:state.skeleton.shoot": 1267, "minecraft:state.warden.ambient": 1495, "minecraft:item.crossbow.quick_charge_2": 382, "minecraft:ui.stonecutter.take_result": 1431, "minecraft:block.coral_block.break": 360, "minecraft:block.scaffolding.fall": 1191, "minecraft:block.wood.step": 1573, "minecraft:state.iron_golem.step": 753, "minecraft:state.minecart.inside.underwater": 823, "minecraft:item.armor.equip_iron": 72, "minecraft:block.conduit.ambient.short": 336, "minecraft:block.deepslate.break": 398, "minecraft:block.nether_ore.fall": 1167, "minecraft:block.nylium.hit": 954, "minecraft:block.trial_spawner.ominous_activate": 683, "minecraft:state.blaze.hurt": 165, "minecraft:state.breeze.idle_ground": 189, "minecraft:state.dolphin.ambient": 411, "minecraft:state.hostile.small_fall": 730, "minecraft:item.bucket.fill": 216, "minecraft:block.azalea.place": 98, "minecraft:state.camel.saddle": 237, "minecraft:state.frog.long_jump": 562, "minecraft:block.anvil.use": 53, "minecraft:block.mangrove_roots.place": 812, "minecraft:block.medium_amethyst_bud.place": 815, "minecraft:block.sculk_sensor.hit": 1212, "minecraft:block.soul_soil.place": 1293, "minecraft:block.suspicious_sand.hit": 539, "minecraft:state.dolphin.death": 414, "minecraft:state.player.attack.crit": 1099, "minecraft:item.trident.riptide_3": 1389, "minecraft:block.mud_bricks.hit": 853, "minecraft:block.nether_gold_ore.step": 1165, "minecraft:block.soul_sand.hit": 1289, "minecraft:state.hoglin.attack": 692, "minecraft:state.stray.step": 1373, "minecraft:state.wither.death": 1540, "minecraft:item.armor.equip_chain": 67, "minecraft:music.overworld.meadow": 903, "minecraft:block.beehive.drip": 150, "minecraft:block.cherry_sapling.place": 278, "minecraft:block.chiseled_bookshelf.pickup": 314, "minecraft:block.hanging_sign.fall": 655, "minecraft:state.ghast.shoot": 586, "minecraft:state.hoglin.retreat": 696, "minecraft:state.item_frame.break": 757, "minecraft:state.piglin.death": 1081, "minecraft:state.ravager.death": 1156, "minecraft:block.pointed_dripstone.drip_water_into_cauldron": 442, "minecraft:block.portal.travel": 1132, "minecraft:block.shulker_box.close": 1240, "minecraft:state.hostile.hurt": 729, "minecraft:state.mule.jump": 867, "minecraft:state.parrot.imitate.illusioner": 1043, "minecraft:state.salmon.ambient": 1181, "minecraft:state.vex.death": 1452, "minecraft:state.donkey.death": 424, "minecraft:state.player.hurt_drown": 1110, "minecraft:state.puffer_fish.hurt": 1144, "minecraft:state.spider.step": 1346, "minecraft:block.bubble_column.upwards_ambient": 206, "minecraft:state.ender_dragon.ambient": 468, "minecraft:state.enderman.teleport": 482, "minecraft:state.squid.squirt": 1360, "minecraft:block.dripstone_block.break": 428, "minecraft:block.tuff.step": 1401, "minecraft:state.iron_golem.attack": 748, "minecraft:state.villager.work_librarian": 1469, "minecraft:block.bubble_column.whirlpool_ambient": 208, "minecraft:block.sculk_shrieker.fall": 1216, "minecraft:state.drowned.death": 447, "minecraft:state.ravager.roar": 1160, "minecraft:block.decorated_pot.step": 390, "minecraft:state.illusioner.ambient": 738, "minecraft:state.sniffer.sniffing": 1324, "minecraft:item.bucket.empty": 210, "minecraft:block.azalea_leaves.place": 103, "minecraft:block.cherry_wood.step": 274, "minecraft:block.nether_wood_trapdoor.open": 933, "minecraft:block.nylium.fall": 955, "minecraft:block.wooden_button.click_off": 1565, "minecraft:state.ender_dragon.flap": 471, "minecraft:state.glow_item_frame.place": 601, "minecraft:state.goat.eat": 610, "minecraft:state.wandering_trader.drink_potion": 1488, "minecraft:item.goat_horn.sound.0": 706, "minecraft:block.amethyst_block.chime": 30, "minecraft:block.calcite.break": 226, "minecraft:block.calcite.place": 228, "minecraft:block.coral_block.step": 364, "minecraft:block.nether_ore.place": 1169, "minecraft:block.sponge.fall": 1350, "minecraft:block.weeping_vines.fall": 970, "minecraft:state.axolotl.splash": 93, "minecraft:state.evoker.prepare_attack": 497, "minecraft:state.parrot.imitate.blaze": 1030, "minecraft:block.bubble_column.upwards_inside": 207, "minecraft:block.nether_wood_hanging_sign.fall": 665, "minecraft:block.sponge.absorb": 1354, "minecraft:block.stone.hit": 1365, "minecraft:block.wood.hit": 1571, "minecraft:item.bucket.fill_tadpole": 221, "minecraft:item.crossbow.shoot": 384, "minecraft:block.moss_carpet.break": 831, "minecraft:block.note_block.imitate.piglin": 1007, "minecraft:block.redstone_torch.burnout": 1171, "minecraft:block.soul_sand.break": 1286, "minecraft:state.elder_guardian.death": 459, "minecraft:state.guardian.ambient": 640, "minecraft:state.hoglin.death": 694, "minecraft:block.amethyst_block.break": 29, "minecraft:block.lever.click": 780, "minecraft:state.armor_stand.hit": 80, "minecraft:state.axolotl.death": 89, "minecraft:state.hoglin.step": 697, "minecraft:state.player.attack.knockback": 1100, "minecraft:state.wolf.ambient": 1552, "minecraft:state.zombified_piglin.ambient": 1597, "minecraft:block.nether_bricks.place": 920, "minecraft:block.respawn_anchor.ambient": 1172, "minecraft:block.respawn_anchor.set_spawn": 1175, "minecraft:block.sculk_shrieker.place": 1218, "minecraft:state.horse.ambient": 714, "minecraft:state.snow_golem.shear": 1339, "minecraft:block.sculk_catalyst.step": 1207, "minecraft:block.trial_spawner.fall": 677, "minecraft:block.wet_sponge.place": 1528, "minecraft:state.llama.swag": 792, "minecraft:state.mooshroom.milk": 828, "minecraft:state.slime.death": 1270, "minecraft:state.wolf.pant": 1557, "minecraft:block.nether_sprouts.fall": 960, "minecraft:state.minecart.inside": 824, "minecraft:block.chain.break": 265, "minecraft:block.vault.fall": 1443, "minecraft:state.breeze.charge": 186, "minecraft:state.enderman.stare": 481, "minecraft:state.zoglin.angry": 1580, "minecraft:block.azalea.hit": 97, "minecraft:block.gilded_blackstone.fall": 589, "minecraft:block.note_block.bell": 988, "minecraft:block.vault.break": 1438, "minecraft:state.puffer_fish.blow_out": 1140, "minecraft:state.skeleton.converted_to_stray": 1256, "minecraft:item.goat_horn.sound.4": 710, "minecraft:block.cherry_wood_door.close": 290, "minecraft:block.cherry_wood_fence_gate.open": 299, "minecraft:block.cobweb.fall": 324, "minecraft:block.copper_grate.break": 353, "minecraft:block.lantern.hit": 770, "minecraft:block.muddy_mangrove_roots.place": 859, "minecraft:block.snow.break": 1333, "minecraft:state.evoker.prepare_summon": 498, "minecraft:state.parrot.ambient": 1025, "minecraft:state.wolf.shake": 1558, "minecraft:block.crop.break": 375, "minecraft:block.sculk_catalyst.fall": 1204, "minecraft:block.trial_spawner.detect_player": 682, "minecraft:state.endermite.death": 484, "minecraft:state.generic.burn": 572, "minecraft:state.lightning_bolt.impact": 781, "minecraft:music.nether.soul_sand_valley": 908, "minecraft:state.fox.screech": 531, "minecraft:state.parrot.imitate.zombie_villager": 1064, "minecraft:state.player.levelup": 1114, "minecraft:state.villager.work_armorer": 1461, "minecraft:music.overworld.badlands": 913, "minecraft:block.candle.hit": 247, "minecraft:block.dispenser.dispense": 408, "minecraft:block.nether_wood_fence_gate.open": 939, "minecraft:state.glow_item_frame.add_item": 599, "minecraft:state.warden.nearby_closest": 1507, "minecraft:block.moss.break": 841, "minecraft:state.llama.angry": 785, "minecraft:state.zombie.attack_iron_door": 1587, "minecraft:block.copper_trapdoor.open": 359, "minecraft:block.soul_soil.hit": 1294, "minecraft:block.sponge.step": 1353, "minecraft:state.ghast.death": 583, "minecraft:state.sheep.ambient": 1226, "minecraft:state.slime.jump": 1272, "minecraft:state.villager.ambient": 1454, "minecraft:state.wither.break_block": 1539, "minecraft:block.rooted_dirt.break": 1176, "minecraft:state.illusioner.cast_spell": 739, "minecraft:state.skeleton.ambient": 1255, "minecraft:state.warden.dig": 1499, "minecraft:state.zoglin.ambient": 1579, "minecraft:block.small_dripleaf.fall": 1282, "minecraft:state.enderman.scream": 480, "minecraft:state.frog.ambient": 557, "minecraft:state.skeleton_horse.ambient": 1258, "minecraft:item.bucket.empty_axolotl": 211, "minecraft:item.bucket.empty_powder_snow": 214, "minecraft:block.lava.pop": 777, "minecraft:block.sculk_shrieker.hit": 1217, "minecraft:state.chicken.death": 304, "minecraft:state.dolphin.ambient_water": 412, "minecraft:state.villager.celebrate": 1455, "minecraft:ambient.crimson_forest.additions": 11, "minecraft:block.deepslate.hit": 400, "minecraft:block.gravel.fall": 634, "minecraft:state.evoker.celebrate": 493, "minecraft:state.horse.gallop": 720, "minecraft:state.parrot.imitate.stray": 1055, "minecraft:state.player.attack.sweep": 1103, "minecraft:ambient.underwater.enter": 23, "minecraft:block.cherry_sapling.break": 275, "minecraft:block.weeping_vines.hit": 969, "minecraft:state.guardian.flop": 645, "minecraft:block.gilded_blackstone.place": 591, "minecraft:block.growing_plant.crop": 639, "minecraft:block.lodestone.break": 794, "minecraft:block.nether_ore.step": 1170, "minecraft:state.horse.step": 725, "minecraft:state.wandering_trader.disappeared": 1486, "minecraft:block.bamboo_wood.step": 117, "minecraft:block.basalt.step": 131, "minecraft:block.nylium.step": 952, "minecraft:block.tripwire.detach": 1395, "minecraft:state.axolotl.idle_water": 92, "minecraft:block.anvil.place": 51, "minecraft:block.moss_carpet.fall": 832, "minecraft:state.ender_dragon.hurt": 473, "minecraft:state.piglin.celebrate": 1080, "minecraft:state.villager.work_weaponsmith": 1473, "minecraft:item.bucket.empty_fish": 212, "minecraft:block.chain.fall": 266, "minecraft:block.furnace.fire_crackle": 570, "minecraft:state.armor_stand.fall": 79, "minecraft:state.turtle.hurt_baby": 1422, "minecraft:block.heavy_core.place": 661, "minecraft:block.note_block.imitate.wither_skeleton": 1006, "minecraft:block.powder_snow.fall": 1135, "minecraft:block.soul_soil.break": 1291, "minecraft:state.generic.hurt": 578, "minecraft:state.ghast.hurt": 584, "minecraft:state.guardian.death": 643, "minecraft:state.illusioner.death": 740, "minecraft:state.piglin.hurt": 1083, "minecraft:state.squid.ambient": 1357, "minecraft:item.bucket.fill_powder_snow": 220, "minecraft:music.creative": 868, "minecraft:block.large_amethyst_bud.place": 774, "minecraft:block.moss.hit": 843, "minecraft:block.pointed_dripstone.place": 435, "minecraft:music.overworld.forest": 901, "minecraft:block.bamboo_wood.fall": 114, "minecraft:block.chiseled_bookshelf.step": 313, "minecraft:block.note_block.xylophone": 996, "minecraft:block.sculk_catalyst.break": 1203, "minecraft:block.snow.hit": 1340, "minecraft:block.vine.fall": 1479, "minecraft:state.blaze.burn": 163, "minecraft:state.iron_golem.repair": 752, "minecraft:state.item_frame.place": 758, "minecraft:state.vindicator.hurt": 1477, "minecraft:block.sculk_sensor.break": 1210, "minecraft:block.vault.eject_item": 1441, "minecraft:state.goat.hurt": 611, "minecraft:state.warden.nearby_closer": 1506, "minecraft:event.mob_effect.trial_omen": 1609, "minecraft:item.nether_wart.plant": 924, "minecraft:item.trident.hit": 1384, "minecraft:ambient.warped_forest.loop": 21, "minecraft:block.sculk_vein.place": 1224, "minecraft:block.sweet_berry_bush.place": 1375, "minecraft:block.vault.hit": 1444, "minecraft:state.breeze.inhale": 188, "minecraft:state.polar_bear.ambient": 1120, "minecraft:state.wandering_trader.drink_milk": 1487, "minecraft:block.amethyst_cluster.break": 36, "minecraft:block.vine.break": 1478, "minecraft:block.wood.place": 1572, "minecraft:state.tropical_fish.death": 1397, "minecraft:music.dragon": 889, "minecraft:block.cherry_wood_fence_gate.close": 298, "minecraft:state.bee.hurt": 145, "minecraft:block.bamboo_wood.hit": 115, "minecraft:block.decorated_pot.insert_fail": 389, "minecraft:block.roots.place": 567, "minecraft:state.breeze.wind_burst": 198, "minecraft:state.rabbit.jump": 1151, "minecraft:state.shulker.close": 1244, "minecraft:state.shulker.shoot": 1249, "minecraft:music.overworld.stony_peaks": 909, "minecraft:block.crafter.fail": 371, "minecraft:block.nether_sprouts.break": 956, "minecraft:state.armadillo.eat": 54, "minecraft:state.goat.ambient": 608, "minecraft:item.honey_bottle.drink": 705, "minecraft:block.ancient_debris.place": 43, "minecraft:block.copper.break": 346, "minecraft:state.fox.death": 528, "minecraft:state.parrot.imitate.husk": 1042, "minecraft:state.silverfish.death": 1252, "minecraft:state.warden.attack_impact": 1497, "minecraft:block.sculk_sensor.fall": 1211, "minecraft:block.sponge.place": 1352, "minecraft:state.bat.loop": 138, "minecraft:state.bee.sting": 148, "minecraft:state.enderman.hurt": 479, "minecraft:state.skeleton_horse.jump_water": 1264, "minecraft:state.villager.work_butcher": 1462, "minecraft:block.anvil.hit": 49, "minecraft:block.big_dripleaf.tilt_up": 444, "minecraft:block.bubble_column.whirlpool_inside": 209, "minecraft:block.sculk_catalyst.bloom": 1202, "minecraft:block.trial_spawner.hit": 676, "minecraft:state.pig.saddle": 1075, "minecraft:item.bucket.fill_fish": 218, "minecraft:music_disc.ward": 883, "minecraft:block.beacon.activate": 140, "minecraft:block.nether_bricks.fall": 922, "minecraft:state.hoglin.hurt": 695, "minecraft:item.armor.equip_turtle": 75, "minecraft:item.book.page_turn": 180, "minecraft:block.copper_bulb.place": 341, "minecraft:block.grass.break": 628, "minecraft:block.grass.place": 631, "minecraft:block.mangrove_roots.hit": 811, "minecraft:state.goat.screaming.hurt": 621, "minecraft:music_disc.13": 872, "minecraft:state.parrot.imitate.bogged": 1031, "minecraft:item.goat_horn.sound.7": 713, "minecraft:music.overworld.jagged_peaks": 898, "minecraft:block.iron_door.open": 747, "minecraft:block.iron_trapdoor.close": 754, "minecraft:block.nether_wood_button.click_off": 934, "minecraft:state.generic.splash": 580, "minecraft:state.tropical_fish.ambient": 1396, "minecraft:item.goat_horn.sound.2": 708, "minecraft:block.chest.open": 302, "minecraft:block.flowering_azalea.fall": 521, "minecraft:block.nether_wart.break": 923, "minecraft:state.bogged.hurt": 171, "minecraft:state.endermite.ambient": 483, "minecraft:state.player.attack.strong": 1102, "minecraft:state.wither.spawn": 1547, "minecraft:music_disc.far": 876, "minecraft:music_disc.otherside": 884, "minecraft:block.copper_grate.step": 354, "minecraft:block.glass.step": 597, "minecraft:block.grass.step": 632, "minecraft:block.metal.break": 816, "minecraft:block.mud.step": 850, "minecraft:block.soul_sand.fall": 1290, "minecraft:item.shield.block": 1231, "minecraft:ui.stonecutter.select_recipe": 1432, "minecraft:block.decorated_pot.fall": 386, "minecraft:block.rooted_dirt.hit": 1178, "minecraft:state.guardian.hurt": 646, "minecraft:state.splash_potion.throw": 1348, "minecraft:block.bamboo_wood_hanging_sign.fall": 670, "minecraft:block.bamboo_wood_trapdoor.open": 121, "minecraft:block.copper_grate.hit": 356, "minecraft:block.flowering_azalea.place": 523, "minecraft:block.fungus.hit": 964, "minecraft:block.nether_wood_door.close": 930, "minecraft:block.packed_mud.hit": 943, "minecraft:block.trial_spawner.spawn_mob": 678, "minecraft:state.camel.sit": 238, "minecraft:state.parrot.imitate.spider": 1054, "minecraft:state.piglin.converted_to_zombified": 1086, "minecraft:state.sniffer.scenting": 1323, "minecraft:state.snow_golem.hurt": 1337, "minecraft:state.stray.death": 1371, "minecraft:state.tnt.primed": 1382, "minecraft:ambient.soul_sand_valley.loop": 18, "minecraft:block.tripwire.click_on": 1394, "minecraft:state.breeze.idle_air": 190, "minecraft:state.skeleton_horse.step_water": 1265, "minecraft:item.bottle.fill_dragonbreath": 185, "minecraft:block.froglight.break": 546, "minecraft:state.panda.hurt": 1023, "minecraft:block.cherry_wood_button.click_on": 295, "minecraft:block.wooden_door.close": 1561, "minecraft:state.bogged.step": 173, "minecraft:state.frog.lay_spawn": 561, "minecraft:state.villager.work_mason": 1470, "minecraft:intentionally_empty": 940, "minecraft:item.book.put": 181, "minecraft:block.brewing_stand.brew": 199, "minecraft:block.deepslate_bricks.step": 397, "minecraft:state.axolotl.attack": 88, "minecraft:state.lingering_potion.throw": 783, "minecraft:state.strider.happy": 1303, "minecraft:item.armor.equip_netherite": 74, "minecraft:block.ancient_debris.fall": 45, "minecraft:block.hanging_roots.step": 652, "minecraft:block.iron_door.close": 746, "minecraft:block.moss_carpet.hit": 833, "minecraft:block.sand.hit": 1187, "minecraft:state.cat.stray_ambient": 251, "minecraft:state.egg.throw": 455, "minecraft:state.illusioner.prepare_blindness": 743, "minecraft:state.panda.death": 1017, "minecraft:state.panda.pre_sneeze": 1014, "minecraft:item.goat_horn.sound.5": 711, "minecraft:item.mace.smash_air": 800, "minecraft:block.lodestone.hit": 797, "minecraft:block.shroomlight.break": 1233, "minecraft:block.vine.hit": 1480, "minecraft:item.bundle.insert": 223, "minecraft:block.shulker_box.open": 1241, "minecraft:block.trial_spawner.ambient": 684, "minecraft:block.wet_sponge.break": 1524, "minecraft:state.bat.hurt": 137, "minecraft:state.elder_guardian.curse": 458, "minecraft:state.panda.eat": 1018, "minecraft:state.wandering_trader.hurt": 1489, "minecraft:block.bamboo_wood.break": 113, "minecraft:block.cave_vines.break": 259, "minecraft:state.villager.work_fisherman": 1466, "minecraft:state.witch.throw": 1537, "minecraft:music.nether.crimson_forest": 894, "minecraft:block.amethyst_block.place": 33, "minecraft:block.comparator.click": 329, "minecraft:block.portal.trigger": 1133, "minecraft:state.camel.step_sand": 241, "minecraft:state.creeper.death": 372, "minecraft:state.firework_rocket.twinkle_far": 512, "minecraft:state.puffer_fish.flop": 1143, "minecraft:state.vex.ambient": 1450, "minecraft:state.wandering_trader.yes": 1493, "minecraft:state.warden.sniff": 1509, "minecraft:item.bucket.empty_tadpole": 215, "minecraft:item.bucket.fill_lava": 219, "minecraft:block.netherrack.place": 983, "minecraft:block.wet_sponge.step": 1529, "minecraft:state.generic.big_fall": 571, "minecraft:item.honeycomb.wax_on": 704, "minecraft:block.ladder.step": 767, "minecraft:block.trial_spawner.spawn_item": 680, "minecraft:block.tuff.break": 1400, "minecraft:state.leash_knot.place": 779, "minecraft:state.player.teleport": 1119, "minecraft:state.ravager.hurt": 1157, "minecraft:item.goat_horn.sound.6": 712, "minecraft:item.trident.riptide_1": 1387, "minecraft:ambient.warped_forest.mood": 22, "minecraft:block.nether_sprouts.step": 957, "minecraft:block.nether_wood.fall": 926, "minecraft:block.note_block.pling": 994, "minecraft:block.vine.place": 1481, "minecraft:state.elder_guardian.hurt_land": 463, "minecraft:state.hostile.big_fall": 727, "minecraft:state.parrot.hurt": 1029, "minecraft:item.wolf_armor.damage": 1550, "minecraft:music.nether.warped_forest": 910, "minecraft:block.amethyst_block.hit": 32, "minecraft:block.bamboo.break": 105, "minecraft:block.bamboo.place": 108, "minecraft:block.dispenser.launch": 410, "minecraft:block.small_dripleaf.step": 1285, "minecraft:block.vault.ambient": 1437, "minecraft:state.horse.death": 718, "minecraft:item.ink_sac.use": 745, "minecraft:block.hanging_sign.place": 657, "minecraft:block.note_block.imitate.zombie": 1002, "minecraft:block.sculk.place": 1200, "minecraft:state.parrot.imitate.skeleton": 1052, "minecraft:state.pig.step": 1076, "minecraft:state.piglin_brute.step": 1091, "minecraft:state.slime.jump_small": 1313, "minecraft:state.zombie.infect": 1596, "minecraft:block.beacon.deactivate": 142, "minecraft:block.respawn_anchor.deplete": 1174, "minecraft:block.stem.break": 946, "minecraft:block.tripwire.click_off": 1393, "minecraft:state.bogged.ambient": 169, "minecraft:state.chicken.egg": 305, "minecraft:state.villager.work_shepherd": 1471, "minecraft:block.note_block.bit": 1000, "minecraft:block.note_block.imitate.creeper": 1004, "minecraft:state.firework_rocket.blast_far": 506, "minecraft:state.ghast.scream": 585, "minecraft:state.glow_squid.ambient": 604, "minecraft:state.husk.step": 737, "minecraft:state.salmon.death": 1182, "minecraft:state.silverfish.ambient": 1251, "minecraft:state.spider.ambient": 1343, "minecraft:block.copper_trapdoor.close": 358, "minecraft:state.elder_guardian.ambient_land": 457, "minecraft:state.firework_rocket.large_blast_far": 508, "minecraft:state.parrot.imitate.breeze": 1032, "minecraft:music_disc.11": 871, "minecraft:music_disc.relic": 885, "minecraft:ui.toast.in": 1434, "minecraft:ambient.crimson_forest.mood": 13, "minecraft:block.beehive.enter": 151, "minecraft:state.bogged.death": 170, "minecraft:state.minecart.riding": 825, "minecraft:state.piglin_brute.death": 1089, "minecraft:block.stem.place": 948, "minecraft:block.stone.place": 1366, "minecraft:state.cat.ambient": 250, "minecraft:state.parrot.fly": 1028, "minecraft:item.shield.break": 1232, "minecraft:music_disc.precipice": 888, "minecraft:block.frogspawn.hatch": 554, "minecraft:state.camel.hurt": 236, "minecraft:state.skeleton_horse.gallop_water": 1263, "minecraft:state.sniffer.eat": 1318, "minecraft:state.warden.hurt": 1502, "minecraft:block.moss.fall": 842, "minecraft:block.netherite_block.fall": 980, "minecraft:state.chicken.step": 307, "minecraft:state.fox.sleep": 532, "minecraft:item.crossbow.quick_charge_3": 383, "minecraft:block.frogspawn.step": 551, "minecraft:block.lantern.step": 772, "minecraft:block.mangrove_roots.break": 809, "minecraft:block.mud.hit": 848, "minecraft:state.cat.hiss": 254, "minecraft:state.ender_eye.death": 475, "minecraft:state.endermite.hurt": 485, "minecraft:state.goat.milk": 613, "minecraft:block.bamboo_sapling.break": 110, "minecraft:block.nether_ore.hit": 1168, "minecraft:state.elder_guardian.ambient": 456, "minecraft:item.bottle.fill": 184, "minecraft:state.donkey.angry": 422, "minecraft:state.zombie.destroy_egg": 1591, "minecraft:block.bone_block.place": 177, "minecraft:block.nether_wood_pressure_plate.click_on": 937, "minecraft:state.warden.sonic_charge": 1511, "minecraft:block.chorus_flower.grow": 318, "minecraft:block.lodestone.place": 796, "minecraft:block.nether_sprouts.hit": 959, "minecraft:block.slime_block.step": 1278, "minecraft:block.sponge.break": 1349, "minecraft:state.allay.item_thrown": 6, "minecraft:state.armadillo.step": 58, "minecraft:state.zombie_villager.ambient": 1602, "minecraft:item.hoe.till": 689, "minecraft:block.copper_bulb.break": 339, "minecraft:state.cat.purr": 257, "minecraft:state.cat.purreow": 258, "minecraft:state.slime.squish_small": 1314, "minecraft:state.strider.saddle": 1310, "minecraft:state.turtle.egg_hatch": 1420, "minecraft:block.copper_door.open": 352, "minecraft:block.wool.break": 1574, "minecraft:state.polar_bear.death": 1122, "minecraft:block.bamboo_sapling.place": 112, "minecraft:block.wooden_door.open": 1562, "minecraft:state.magma_cube.jump": 806, "minecraft:state.parrot.imitate.warden": 1058, "minecraft:item.armor.equip_generic": 70, "minecraft:item.mace.smash_ground_heavy": 802, "minecraft:block.ancient_debris.step": 42, "minecraft:block.big_dripleaf.step": 161, "minecraft:block.cherry_wood_trapdoor.close": 292, "minecraft:block.honey_block.place": 701, "minecraft:block.metal.place": 819, "minecraft:block.pink_petals.hit": 838, "minecraft:state.cow.step": 369, "minecraft:state.donkey.jump": 427, "minecraft:state.ender_dragon.growl": 472, "minecraft:state.fox.teleport": 535, "minecraft:state.parrot.imitate.silverfish": 1051, "minecraft:ambient.crimson_forest.loop": 12, "minecraft:block.muddy_mangrove_roots.fall": 857, "minecraft:block.note_block.iron_xylophone": 997, "minecraft:state.breeze.shoot": 191, "minecraft:state.dragon_fireball.explode": 470, "minecraft:state.pig.ambient": 1072, "minecraft:block.nether_gold_ore.place": 1164, "minecraft:block.rooted_dirt.step": 1180, "minecraft:block.sculk_vein.step": 1225, "minecraft:state.illusioner.prepare_mirror": 744, "minecraft:item.bucket.empty_lava": 213, "minecraft:item.crossbow.loading_start": 380, "minecraft:item.totem.use": 1383, "minecraft:block.dripstone_block.step": 429, "minecraft:block.ender_chest.open": 467, "minecraft:block.nether_bricks.hit": 921, "minecraft:state.parrot.imitate.wither": 1060, "minecraft:block.iron_trapdoor.open": 755, "minecraft:block.stone_pressure_plate.click_on": 1368, "minecraft:state.zombie_villager.death": 1605, "minecraft:block.ancient_debris.hit": 44, "minecraft:block.azalea.step": 99, "minecraft:block.big_dripleaf.hit": 159, "minecraft:block.bubble_column.bubble_pop": 205, "minecraft:block.chain.place": 268, "minecraft:block.chiseled_bookshelf.place": 316, "minecraft:state.cat.death": 252, "minecraft:state.glow_item_frame.remove_item": 602, "minecraft:state.painting.place": 1013, "minecraft:item.trident.thunder": 1391, "minecraft:block.glass.fall": 594, "minecraft:block.nether_bricks.step": 919, "minecraft:state.polar_bear.hurt": 1123, "minecraft:block.amethyst_cluster.hit": 38, "minecraft:block.crafter.craft": 370, "minecraft:block.shroomlight.fall": 1237, "minecraft:state.breeze.whirl": 197, "minecraft:state.iron_golem.damage": 749, "minecraft:state.piglin_brute.hurt": 1090, "minecraft:state.skeleton.step": 1268, "minecraft:block.gravel.step": 637, "minecraft:block.ladder.place": 766, "minecraft:state.armadillo.death": 59, "minecraft:state.wind_charge.throw": 1531, "minecraft:music.overworld.dripstone_caves": 896, "minecraft:block.sand.break": 1185, "minecraft:state.goat.ram_impact": 615, "minecraft:state.zombified_piglin.death": 1599, "minecraft:block.amethyst_block.fall": 31, "minecraft:block.bamboo_wood_hanging_sign.step": 668, "minecraft:block.froglight.place": 549, "minecraft:block.wooden_trapdoor.open": 1564, "minecraft:state.dolphin.play": 418, "minecraft:state.generic.explode": 576, "minecraft:state.turtle.egg_crack": 1419, "minecraft:state.wolf.step": 1559, "minecraft:block.deepslate.step": 402, "minecraft:block.metal_pressure_plate.click_off": 820, "minecraft:state.horse.armor": 716, "minecraft:state.magma_cube.squish": 807, "minecraft:block.chest.close": 300, "minecraft:block.small_dripleaf.place": 1284, "minecraft:state.llama.ambient": 784, "minecraft:music_disc.5": 870, "minecraft:block.large_amethyst_bud.break": 773, "minecraft:state.ender_pearl.throw": 487, "minecraft:state.horse.jump": 722, "minecraft:state.mule.death": 864, "minecraft:music_disc.stal": 880, "minecraft:block.big_dripleaf.fall": 158, "minecraft:block.deepslate_tiles.fall": 404, "minecraft:block.hanging_sign.step": 653, "minecraft:block.nether_gold_ore.fall": 1162, "minecraft:block.roots.hit": 568, "minecraft:state.horse.saddle": 724, "minecraft:state.hostile.splash": 731, "minecraft:state.ravager.ambient": 1153, "minecraft:state.warden.listening": 1503, "minecraft:ambient.underwater.loop.additions": 26, "minecraft:block.note_block.banjo": 1001, "minecraft:block.wart_block.place": 973, "minecraft:state.armadillo.unroll_start": 65, "minecraft:state.axolotl.swim": 94, "minecraft:state.fox.aggro": 525, "minecraft:state.parrot.imitate.wither_skeleton": 1061, "minecraft:state.player.big_fall": 1105, "minecraft:state.zombie_villager.cure": 1604, "minecraft:item.trident.throw": 1390, "minecraft:block.bamboo_wood_button.click_off": 122, "minecraft:block.frogspawn.hit": 555, "minecraft:state.breeze.land": 193, "minecraft:state.evoker.hurt": 496, "minecraft:state.mooshroom.convert": 826, "minecraft:state.wither_skeleton.death": 1544, "minecraft:item.trident.hit_ground": 1385, "minecraft:block.chest.locked": 301, "minecraft:block.conduit.ambient": 335, "minecraft:state.goat.screaming.milk": 623, "minecraft:state.snow_golem.ambient": 1335, "minecraft:state.warden.heartbeat": 1501, "minecraft:item.bundle.drop_contents": 222, "minecraft:music.overworld.desert": 912, "minecraft:block.bone_block.step": 178, "minecraft:state.bee.death": 144, "minecraft:state.camel.dash": 232, "minecraft:state.husk.ambient": 733, "minecraft:state.wither.ambient": 1538, "minecraft:state.drowned.hurt_water": 450, "minecraft:state.enderman.death": 478, "minecraft:state.piglin_brute.ambient": 1087, "minecraft:block.campfire.crackle": 242, "minecraft:block.chain.hit": 267, "minecraft:block.stone.break": 1361, "minecraft:state.wandering_trader.no": 1490, "minecraft:block.grass.fall": 629, "minecraft:block.stone.fall": 1364, "minecraft:block.trial_spawner.place": 675, "minecraft:state.elder_guardian.flop": 461, "minecraft:music.under_water": 917, "minecraft:block.froglight.fall": 547, "minecraft:state.camel.death": 234, "minecraft:state.dolphin.splash": 419, "minecraft:state.panda.bite": 1024, "minecraft:state.parrot.step": 1065, "minecraft:state.pillager.hurt": 1096, "minecraft:state.tadpole.flop": 1378, "minecraft:state.villager.yes": 1460, "minecraft:ambient.underwater.exit": 24, "minecraft:block.cherry_sapling.hit": 277, "minecraft:block.tripwire.attach": 1392, "minecraft:block.azalea_leaves.hit": 102, "minecraft:block.fire.extinguish": 514, "minecraft:block.honey_block.step": 703, "minecraft:block.sand.fall": 1186, "minecraft:state.llama.eat": 788, "minecraft:state.parrot.imitate.drowned": 1034, "minecraft:state.zombie.ambient": 1585, "minecraft:item.brush.brushing.gravel": 202, "minecraft:block.cake.add_candle": 225, "minecraft:block.composter.fill_success": 332, "minecraft:block.conduit.deactivate": 338, "minecraft:block.nether_gold_ore.hit": 1163, "minecraft:block.nether_wood_fence_gate.close": 938, "minecraft:block.netherite_block.place": 978, "minecraft:block.packed_mud.fall": 942, "minecraft:block.wood.break": 1569, "minecraft:state.cat.eat": 253, "minecraft:state.elder_guardian.death_land": 460, "minecraft:state.glow_item_frame.rotate_item": 603, "minecraft:state.slime.hurt": 1271, "minecraft:block.candle.ambient": 243, "minecraft:block.cherry_wood_trapdoor.open": 293, "minecraft:block.spore_blossom.step": 1301, "minecraft:block.suspicious_sand.break": 536, "minecraft:state.evoker.prepare_wololo": 499, "minecraft:state.shulker.open": 1248, "minecraft:state.villager.no": 1458, "minecraft:block.bamboo_wood_trapdoor.close": 120, "minecraft:block.big_dripleaf.place": 160, "minecraft:block.cherry_leaves.place": 283, "minecraft:block.hanging_sign.break": 654, "minecraft:block.heavy_core.step": 662, "minecraft:block.ladder.fall": 764, "minecraft:block.nether_wood_pressure_plate.click_off": 936, "minecraft:block.sculk_catalyst.place": 1206, "minecraft:block.sniffer_egg.hatch": 1331, "minecraft:state.piglin.angry": 1079, "minecraft:block.cherry_wood.break": 270, "minecraft:block.note_block.hat": 993, "minecraft:block.sculk_vein.break": 1221, "minecraft:block.stone.step": 1369, "minecraft:state.camel.dash_ready": 233, "minecraft:state.magma_cube.death_small": 793, "minecraft:state.parrot.imitate.ghast": 1039, "minecraft:state.vex.hurt": 1453, "minecraft:block.chiseled_bookshelf.pickup.enchanted": 315, "minecraft:block.weeping_vines.step": 967, "minecraft:state.cod.flop": 327, "minecraft:state.phantom.death": 1068, "minecraft:state.wandering_trader.death": 1485, "minecraft:block.bell.use": 155, "minecraft:block.copper_bulb.turn_on": 344, "minecraft:state.cat.beg_for_food": 255, "minecraft:block.big_dripleaf.tilt_down": 443, "minecraft:block.cave_vines.hit": 261, "minecraft:block.mud_bricks.step": 855, "minecraft:block.sculk.hit": 1199, "minecraft:block.wart_block.break": 971, "minecraft:block.sculk_catalyst.hit": 1205, "minecraft:block.suspicious_gravel.place": 543, "minecraft:state.donkey.ambient": 421, "minecraft:state.guardian.hurt_land": 647, "minecraft:state.panda.worried_ambient": 1022, "minecraft:block.bamboo_wood_door.close": 118, "minecraft:block.chiseled_bookshelf.break": 308, "minecraft:state.horse.step_wood": 726, "minecraft:music_disc.creator_music_box": 887, "minecraft:block.cobweb.break": 320, "minecraft:block.lava.extinguish": 776, "minecraft:state.guardian.attack": 642, "minecraft:block.gravel.hit": 635, "minecraft:block.sculk_shrieker.shriek": 1219, "minecraft:state.camel.ambient": 231, "minecraft:state.evoker_fangs.attack": 495, "minecraft:state.player.swim": 1118, "minecraft:state.turtle.swim": 1426, "minecraft:item.bone_meal.use": 179, "minecraft:state.armadillo.scute_drop": 62, "minecraft:state.cow.milk": 368, "minecraft:state.silverfish.step": 1254, "minecraft:state.snow_golem.death": 1336, "minecraft:state.breeze.slide": 194, "minecraft:state.camel.stand": 239, "minecraft:state.drowned.step": 452, "minecraft:state.frog.eat": 559, "minecraft:state.salmon.flop": 1183, "minecraft:state.villager.work_leatherworker": 1468, "minecraft:state.zoglin.hurt": 1583, "minecraft:block.bamboo_wood_fence_gate.open": 127, "minecraft:block.deepslate_bricks.fall": 394, "minecraft:block.mud_bricks.break": 851, "minecraft:block.muddy_mangrove_roots.step": 860, "minecraft:block.soul_soil.fall": 1295, "minecraft:state.guardian.ambient_land": 641, "minecraft:state.piglin_brute.converted_to_zombified": 1092, "minecraft:block.bamboo_wood_pressure_plate.click_off": 124, "minecraft:block.calcite.hit": 229, "minecraft:block.decorated_pot.insert": 388, "minecraft:block.polished_tuff.step": 1414, "minecraft:state.drowned.hurt": 449, "minecraft:state.ghast.ambient": 582, "minecraft:state.parrot.imitate.piglin_brute": 1047, "minecraft:item.brush.brushing.sand": 201, "minecraft:block.beacon.ambient": 141, "minecraft:block.sand.place": 1188, "minecraft:state.ravager.stunned": 1159, "minecraft:block.nether_wood.place": 928, "minecraft:state.generic.extinguish_fire": 577, "minecraft:state.sheep.shear": 1229, "minecraft:block.basalt.fall": 134, "minecraft:block.cave_vines.place": 262, "minecraft:block.nether_wood_door.open": 931, "minecraft:state.item_frame.add_item": 756, "minecraft:state.item_frame.remove_item": 759, "minecraft:state.sniffer.death": 1321, "minecraft:state.zombie_villager.converted": 1603, "minecraft:item.mace.smash_ground": 801, "minecraft:block.bamboo_wood_fence_gate.close": 126, "minecraft:block.netherrack.fall": 985, "minecraft:block.pointed_dripstone.land": 438, "minecraft:block.sculk_sensor.place": 1213, "minecraft:state.zoglin.step": 1584, "minecraft:item.dye.use": 454, "minecraft:block.deepslate_bricks.break": 393, "minecraft:block.fungus.step": 962, "minecraft:block.lantern.break": 768, "minecraft:block.note_block.guitar": 991, "minecraft:block.tuff_bricks.hit": 1407, "minecraft:state.camel.step": 240, "minecraft:state.cow.ambient": 365, "minecraft:state.drowned.ambient": 445, "minecraft:music.overworld.jungle": 914, "minecraft:block.bamboo.step": 109, "minecraft:block.polished_tuff.fall": 1411, "minecraft:state.generic.eat": 575, "minecraft:state.llama.spit": 790, "minecraft:state.mule.hurt": 866, "minecraft:state.parrot.imitate.evoker": 1038, "minecraft:state.zombie_horse.death": 1593, "minecraft:block.bamboo_wood.place": 116, "minecraft:block.nether_wood.hit": 927, "minecraft:block.nether_wood_hanging_sign.step": 663, "minecraft:block.netherrack.break": 981, "minecraft:state.allay.hurt": 3, "minecraft:state.parrot.imitate.hoglin": 1041, "minecraft:block.soul_soil.step": 1292, "minecraft:state.enderman.ambient": 477, "minecraft:state.goat.screaming.ram_impact": 625, "minecraft:state.parrot.imitate.zoglin": 1062, "minecraft:state.spider.death": 1344, "minecraft:state.vindicator.death": 1476, "minecraft:ambient.underwater.loop": 25, "minecraft:block.slime_block.fall": 1275, "minecraft:block.wool.place": 1577, "minecraft:state.blaze.death": 164, "minecraft:state.ghast.warn": 587, "minecraft:state.hoglin.angry": 691, "minecraft:state.wolf.growl": 1554, "minecraft:particle.soul_escape": 1296, "minecraft:block.vault.step": 1449, "minecraft:state.generic.death": 573, "minecraft:state.mule.chest": 863, "minecraft:state.frog.tongue": 564, "minecraft:ui.loom.take_result": 1429, "minecraft:block.lava.ambient": 775, "minecraft:block.lily_pad.place": 1483, "minecraft:block.mud.break": 846, "minecraft:state.armadillo.hurt": 55, "minecraft:state.bee.pollinate": 149, "minecraft:state.player.breath": 1106, "minecraft:ambient.nether_wastes.loop": 15, "minecraft:block.vault.place": 1448, "minecraft:state.sniffer.hurt": 1320, "minecraft:state.tadpole.death": 1377, "minecraft:state.witch.hurt": 1536, "minecraft:event.mob_effect.raid_omen": 1610, "minecraft:item.brush.brushing.sand.complete": 203, "minecraft:block.cherry_wood.fall": 271, "minecraft:block.cobweb.step": 321, "minecraft:block.copper_door.close": 351, "minecraft:block.tuff.fall": 1404, "minecraft:state.axolotl.hurt": 90, "minecraft:state.mooshroom.shear": 830, "minecraft:item.bundle.remove_one": 224, "minecraft:block.cherry_wood_hanging_sign.break": 286, "minecraft:block.conduit.activate": 334, "minecraft:state.arrow.hit": 82, "minecraft:state.donkey.hurt": 426, "minecraft:ambient.warped_forest.additions": 20, "minecraft:state.goat.screaming.ambient": 618, "minecraft:state.parrot.imitate.piglin": 1046, "minecraft:block.weeping_vines.break": 966, "minecraft:state.fish.swim": 515, "minecraft:state.fishing_bobber.retrieve": 516, "minecraft:state.phantom.swoop": 1071, "minecraft:block.stone_button.click_on": 1363, "minecraft:block.trial_spawner.break": 673, "minecraft:state.boat.paddle_land": 167, "minecraft:state.goat.screaming.eat": 620, "minecraft:state.wandering_trader.ambient": 1484, "minecraft:state.zombified_piglin.hurt": 1600, "minecraft:block.cherry_leaves.step": 284, "minecraft:block.vault.activate": 1436, "minecraft:state.drowned.shoot": 451, "minecraft:state.tadpole.hurt": 1380, "minecraft:block.bamboo_wood_hanging_sign.break": 669, "minecraft:block.copper.fall": 350, "minecraft:block.pointed_dripstone.drip_lava": 439, "minecraft:block.tuff.hit": 1403, "minecraft:state.frog.step": 563, "minecraft:state.magma_cube.squish_small": 808, "minecraft:block.cherry_leaves.break": 280, "minecraft:block.moss.place": 844, "minecraft:block.scaffolding.hit": 1192, "minecraft:state.boat.paddle_water": 168, "minecraft:state.mule.ambient": 861, "minecraft:state.parrot.imitate.shulker": 1050, "minecraft:state.piglin.jealous": 1082, "minecraft:state.villager.work_farmer": 1465, "minecraft:item.axe.strip": 85, "minecraft:block.end_portal_frame.fill": 489, "minecraft:block.trial_spawner.spawn_item_begin": 681, "minecraft:state.armadillo.peek": 64, "minecraft:block.cherry_wood_hanging_sign.step": 285, "minecraft:block.frogspawn.place": 556, "minecraft:block.glass.break": 593, "minecraft:block.powder_snow.step": 1138, "minecraft:block.wooden_pressure_plate.click_on": 1568, "minecraft:state.armor_stand.break": 78, "minecraft:state.donkey.chest": 423, "minecraft:state.illusioner.hurt": 741, "minecraft:state.llama.death": 787, "minecraft:state.shulker.hurt_closed": 1247, "minecraft:block.trial_spawner.open_shutter": 686, "minecraft:block.weeping_vines.place": 968, "minecraft:state.experience_bottle.throw": 500, "minecraft:state.rabbit.hurt": 1150, "minecraft:state.silverfish.hurt": 1253, "minecraft:state.warden.nearby_close": 1505, "minecraft:block.portal.ambient": 1131, "minecraft:block.suspicious_gravel.fall": 545, "minecraft:block.sweet_berry_bush.break": 1374, "minecraft:block.vault.open_shutter": 1447, "minecraft:state.chicken.hurt": 306, "minecraft:state.slime.hurt_small": 1312, "minecraft:state.zombified_piglin.angry": 1598, "minecraft:weather.rain": 1517, "minecraft:block.copper_bulb.turn_off": 345, "minecraft:block.hanging_roots.place": 651, "minecraft:block.moss.step": 845, "minecraft:block.mud.fall": 847, "minecraft:block.powder_snow.break": 1134, "minecraft:block.sculk.break": 1197, "minecraft:block.tuff_bricks.place": 1408, "minecraft:state.goat.death": 609, "minecraft:state.polar_bear.step": 1124, "minecraft:item.armor.equip_leather": 73, "minecraft:ui.button.click": 1427, "minecraft:block.copper_bulb.step": 340, "minecraft:block.gilded_blackstone.break": 588, "minecraft:block.vault.insert_item_fail": 1446, "minecraft:state.sheep.step": 1230, "minecraft:state.tadpole.grow_up": 1379, "minecraft:state.wither_skeleton.step": 1546, "minecraft:block.polished_tuff.place": 1413, "minecraft:block.suspicious_sand.step": 537, "minecraft:state.player.burp": 1107, "minecraft:state.player.death": 1108, "minecraft:state.horse.eat": 719, "minecraft:state.horse.hurt": 721, "minecraft:state.polar_bear.ambient_baby": 1121, "minecraft:state.warden.listening_angry": 1504, "minecraft:block.azalea_leaves.break": 100, "minecraft:block.cherry_wood_pressure_plate.click_off": 296, "minecraft:block.composter.fill": 331, "minecraft:block.honey_block.hit": 700, "minecraft:block.piston.contract": 1097, "minecraft:state.frog.hurt": 560, "minecraft:block.flowering_azalea.hit": 522, "minecraft:block.sign.waxed_interact_fail": 1515, "minecraft:state.wolf.hurt": 1556, "minecraft:block.cherry_leaves.hit": 282, "minecraft:block.deepslate_bricks.hit": 395, "minecraft:block.sculk.charge": 1196, "minecraft:ui.loom.select_pattern": 1428, "minecraft:ambient.cave": 7, "minecraft:block.rooted_dirt.place": 1179, "minecraft:block.spore_blossom.break": 1297, "minecraft:block.spore_blossom.fall": 1298, "minecraft:block.deepslate_tiles.hit": 405, "minecraft:block.sniffer_egg.crack": 1330, "minecraft:state.generic.swim": 581, "minecraft:state.squid.hurt": 1359, "minecraft:state.villager.trade": 1459, "minecraft:state.villager.work_cartographer": 1463, "minecraft:block.cobweb.hit": 323, "minecraft:block.conduit.attack.target": 337, "minecraft:block.nether_wood_button.click_on": 935, "minecraft:block.pointed_dripstone.drip_lava_into_cauldron": 441, "minecraft:state.slime.squish": 1273, "minecraft:event.raid.horn": 1152, "minecraft:item.trident.riptide_2": 1388, "minecraft:block.netherite_block.hit": 979, "minecraft:block.sculk_vein.hit": 1223, "minecraft:block.wool.hit": 1576, "minecraft:state.snowball.throw": 1332, "minecraft:block.medium_amethyst_bud.break": 814, "minecraft:block.scaffolding.break": 1190, "minecraft:state.chicken.ambient": 303, "minecraft:state.cod.death": 326, "minecraft:state.parrot.imitate.vex": 1056, "minecraft:state.warden.emerge": 1500, "minecraft:item.brush.brushing.generic": 200, "minecraft:block.beacon.power_select": 143, "minecraft:block.decorated_pot.break": 385, "minecraft:block.netherrack.hit": 984, "minecraft:block.note_block.didgeridoo": 999, "minecraft:block.suspicious_gravel.break": 541, "minecraft:state.player.splash": 1116, "minecraft:state.turtle.egg_break": 1418, "minecraft:state.zombie_villager.step": 1607, "minecraft:block.basalt.hit": 133, "minecraft:block.muddy_mangrove_roots.hit": 858, "minecraft:block.vault.deactivate": 1440, "minecraft:enchant.thorns.hit": 1381, "minecraft:state.puffer_fish.ambient": 1139, "minecraft:state.rabbit.attack": 1148, "minecraft:state.tropical_fish.hurt": 1399, "minecraft:block.fungus.place": 963, "minecraft:block.metal_pressure_plate.click_on": 821, "minecraft:state.dolphin.swim": 420, "minecraft:block.bell.resonate": 156, "minecraft:block.cave_vines.step": 263, "minecraft:block.lodestone.fall": 798, "minecraft:block.wool.fall": 1575, "minecraft:state.ocelot.death": 1010, "minecraft:state.panda.cant_breed": 1020, "minecraft:state.skeleton.hurt": 1266, "minecraft:item.armor.equip_diamond": 68, "minecraft:block.chiseled_bookshelf.insert.enchanted": 312, "minecraft:block.wet_sponge.fall": 1526, "minecraft:state.goat.screaming.prepare_ram": 624, "minecraft:state.skeleton_horse.hurt": 1260, "minecraft:state.snow_golem.shoot": 1338, "minecraft:item.wolf_armor.repair": 1551, "minecraft:music_disc.blocks": 873, "minecraft:block.gilded_blackstone.step": 592, "minecraft:block.glass.place": 596, "minecraft:block.note_block.chime": 989, "minecraft:state.fox.eat": 529, "minecraft:state.mule.eat": 865, "minecraft:item.wolf_armor.break": 1548, "minecraft:ui.toast.out": 1435, "minecraft:ambient.underwater.loop.additions.ultra_rare": 28, "minecraft:block.anvil.land": 50, "minecraft:block.nether_wood_hanging_sign.place": 667, "minecraft:state.parrot.eat": 1027, "minecraft:state.parrot.imitate.creeper": 1033, "minecraft:state.wither_skeleton.hurt": 1545, "minecraft:item.crossbow.loading_middle": 379, "minecraft:music_disc.cat": 874, "minecraft:block.pointed_dripstone.hit": 436, "minecraft:state.blaze.shoot": 166, "minecraft:state.ocelot.hurt": 1008, "minecraft:state.rabbit.death": 1149, "minecraft:state.sniffer.drop_seed": 1322, "minecraft:state.witch.ambient": 1532, "minecraft:event.mob_effect.bad_omen": 1608, "minecraft:music_disc.strad": 881, "minecraft:block.pointed_dripstone.step": 434, "minecraft:state.ender_dragon.death": 469, "minecraft:state.parrot.imitate.witch": 1059, "minecraft:music.overworld.flower_forest": 911, "minecraft:block.vine.step": 1482, "minecraft:state.player.attack.weak": 1104, "minecraft:item.shovel.flatten": 1238, "minecraft:ambient.nether_wastes.mood": 16, "minecraft:block.basalt.place": 132, "minecraft:block.beehive.work": 154, "minecraft:block.dispenser.fail": 409, "minecraft:block.mud.place": 849, "minecraft:block.polished_deepslate.step": 1130, "minecraft:block.sculk_shrieker.step": 1220, "minecraft:state.breeze.death": 195, "minecraft:state.creeper.primed": 374, "minecraft:state.drowned.death_water": 448, "minecraft:state.glow_squid.death": 605, "minecraft:state.painting.break": 1012, "minecraft:state.piglin.admiring_item": 1077, "minecraft:state.player.splash.high_speed": 1117, "minecraft:state.vex.charge": 1451, "minecraft:music_disc.creator": 886, "minecraft:block.shroomlight.hit": 1236, "minecraft:block.trial_spawner.close_shutter": 687, "minecraft:state.sniffer.happy": 1328, "minecraft:state.strider.retreat": 1304, "minecraft:block.cherry_leaves.fall": 281, "minecraft:block.end_gateway.spawn": 488, "minecraft:state.armadillo.hurt_reduced": 56, "minecraft:state.bat.ambient": 135, "minecraft:state.endermite.step": 486, "minecraft:state.illusioner.mirror_move": 742, "minecraft:block.copper_grate.fall": 357, "minecraft:block.nether_wood.step": 929, "minecraft:block.polished_deepslate.break": 1126, "minecraft:state.evoker.cast_spell": 492, "minecraft:state.sheep.death": 1227, "minecraft:state.zombie.hurt": 1595, "minecraft:ambient.nether_wastes.additions": 14, "minecraft:block.cherry_wood_hanging_sign.hit": 288, "minecraft:block.soul_sand.step": 1287, "minecraft:block.spore_blossom.hit": 1299, "minecraft:block.wet_sponge.hit": 1527, "minecraft:state.fox.ambient": 526, "minecraft:state.phantom.hurt": 1070, "minecraft:state.pillager.ambient": 1093, "minecraft:state.zombie.converted_to_drowned": 1589, "minecraft:item.crossbow.quick_charge_1": 381, "minecraft:item.goat_horn.play": 617, "minecraft:music.overworld.deep_dark": 895, "minecraft:block.bone_block.hit": 176, "minecraft:block.stem.step": 947, "minecraft:state.armadillo.brush": 66, "minecraft:state.cod.hurt": 328, "minecraft:state.pillager.death": 1095, "minecraft:block.blastfurnace.fire_crackle": 182, "minecraft:block.chain.step": 269, "minecraft:block.pumpkin.carve": 1146, "minecraft:block.roots.fall": 569, "minecraft:state.bogged.shear": 172, "minecraft:state.ocelot.ambient": 1009, "minecraft:state.panda.aggressive_ambient": 1021, "minecraft:music.game": 891, "minecraft:music.overworld.snowy_slopes": 907, "minecraft:block.heavy_core.hit": 660, "minecraft:block.ladder.hit": 765, "minecraft:block.nether_wood_hanging_sign.hit": 666, "minecraft:block.pink_petals.place": 839, "minecraft:state.goat.prepare_ram": 614, "minecraft:state.husk.converted_to_zombie": 734, "minecraft:state.parrot.imitate.elder_guardian": 1035, "minecraft:state.puffer_fish.sting": 1145, "minecraft:state.turtle.death": 1416, "minecraft:state.villager.work_fletcher": 1467, "minecraft:state.warden.roar": 1508, "minecraft:state.warden.sonic_boom": 1510, "minecraft:state.warden.step": 1512, "minecraft:block.smithing_table.use": 1315, "minecraft:state.cat.hurt": 256, "minecraft:state.horse.angry": 715, "minecraft:state.pig.hurt": 1074, "minecraft:block.beehive.exit": 152, "minecraft:block.gilded_blackstone.hit": 590, "minecraft:block.netherrack.step": 982, "minecraft:block.pink_petals.step": 840, "minecraft:state.bat.death": 136, "minecraft:state.blaze.ambient": 162, "minecraft:state.camel.eat": 235, "minecraft:state.dolphin.eat": 415, "minecraft:state.turtle.death_baby": 1417, "minecraft:music.overworld.old_growth_taiga": 902, "minecraft:block.anvil.step": 52, "minecraft:block.cobweb.place": 322, "minecraft:block.composter.ready": 333, "minecraft:block.roots.step": 566, "minecraft:block.small_dripleaf.hit": 1283, "minecraft:block.wet_grass.break": 1519, "minecraft:state.pillager.celebrate": 1094, "minecraft:state.zombie.death": 1590, "minecraft:item.chorus_fruit.teleport": 319, "minecraft:item.wolf_armor.crack": 1549, "minecraft:ambient.soul_sand_valley.additions": 17, "minecraft:block.hanging_sign.hit": 656, "minecraft:block.small_amethyst_bud.break": 1279, "minecraft:state.armadillo.land": 61, "minecraft:state.hostile.death": 728, "minecraft:state.pig.death": 1073, "minecraft:state.vindicator.celebrate": 1475, "minecraft:block.azalea_leaves.fall": 101, "minecraft:block.powder_snow.place": 1137, "minecraft:block.sculk_vein.fall": 1222, "minecraft:state.tropical_fish.flop": 1398, "minecraft:item.axe.wax_off": 87, "minecraft:item.crossbow.hit": 377, "minecraft:block.honey_block.break": 698, "minecraft:block.water.ambient": 1516, "minecraft:state.armadillo.ambient": 57, "minecraft:state.horse.land": 723, "minecraft:state.parrot.imitate.magma_cube": 1044, "minecraft:state.magma_cube.death": 803, "minecraft:state.shulker_bullet.hurt": 1243, "minecraft:block.deepslate.place": 401, "minecraft:block.fence_gate.open": 503, "minecraft:block.flowering_azalea.break": 520, "minecraft:block.froglight.hit": 548, "minecraft:block.vault.insert_item": 1445, "minecraft:music.end": 890, "minecraft:block.dripstone_block.place": 430, "minecraft:block.nylium.break": 951, "minecraft:block.sculk.spread": 1195, "minecraft:state.firework_rocket.blast": 505, "minecraft:state.item.break": 761, "minecraft:state.phantom.bite": 1067, "minecraft:block.deepslate.fall": 399, "minecraft:block.respawn_anchor.charge": 1173, "minecraft:state.panda.ambient": 1016, "minecraft:item.spyglass.use": 1355, "minecraft:music.overworld.frozen_peaks": 906, "minecraft:block.moss_carpet.step": 835, "minecraft:block.pointed_dripstone.break": 433, "minecraft:item.crop.plant": 376, "minecraft:block.dripstone_block.hit": 431, "minecraft:block.honey_block.fall": 699, "minecraft:state.arrow.shoot": 84, "minecraft:state.experience_orb.pickup": 501, "minecraft:state.goat.screaming.horn_break": 626, "minecraft:block.candle.extinguish": 245, "minecraft:block.wart_block.hit": 974, "minecraft:state.guardian.death_land": 644, "minecraft:state.panda.step": 1019, "minecraft:state.parrot.death": 1026, "minecraft:state.piglin.ambient": 1078, "minecraft:state.wind_charge.wind_burst": 1530, "minecraft:item.bucket.fill_axolotl": 217, "minecraft:item.lodestone_compass.lock": 799, "minecraft:music.credits": 869, "minecraft:music.overworld.bamboo_jungle": 916, "minecraft:block.azalea.break": 95, "minecraft:block.barrel.open": 129, "minecraft:block.chiseled_bookshelf.hit": 310, "minecraft:block.sponge.hit": 1351, "minecraft:block.wool.step": 1578, "minecraft:state.shulker_bullet.hit": 1242, }, } ================================================ FILE: server/registry/stat_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var StatType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:used": 2, "minecraft:broken": 3, "minecraft:killed_by": 7, "minecraft:picked_up": 4, "minecraft:killed": 6, "minecraft:mined": 0, "minecraft:crafted": 1, "minecraft:custom": 8, "minecraft:dropped": 5, }, } ================================================ FILE: server/registry/trigger_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var TriggerType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:villager_trade": 18, "minecraft:fall_after_explosion": 55, "minecraft:kill_mob_near_sculk_catalyst": 50, "minecraft:avoid_vibration": 52, "minecraft:effects_changed": 26, "minecraft:fall_from_height": 48, "minecraft:thrown_item_picked_up_by_player": 43, "minecraft:allay_drop_item_on_block": 51, "minecraft:bee_nest_destroyed": 36, "minecraft:entity_hurt_player": 7, "minecraft:inventory_changed": 4, "minecraft:placed_block": 24, "minecraft:player_hurt_entity": 6, "minecraft:tame_animal": 23, "minecraft:thrown_item_picked_up_by_entity": 42, "minecraft:filled_bucket": 9, "minecraft:nether_travel": 28, "minecraft:started_riding": 45, "minecraft:tick": 22, "minecraft:any_block_use": 40, "minecraft:enter_block": 3, "minecraft:lightning_strike": 46, "minecraft:player_killed_entity": 1, "minecraft:using_item": 47, "minecraft:brewed_potion": 10, "minecraft:recipe_crafted": 53, "minecraft:recipe_unlocked": 5, "minecraft:slide_down_block": 35, "minecraft:default_block_use": 39, "minecraft:player_generates_container_loot": 41, "minecraft:ride_entity_in_lava": 49, "minecraft:used_totem": 27, "minecraft:fishing_rod_hooked": 29, "minecraft:hero_of_the_village": 33, "minecraft:target_hit": 37, "minecraft:player_interacted_with_entity": 44, "minecraft:slept_in_bed": 16, "minecraft:voluntary_exile": 34, "minecraft:channeled_lightning": 30, "minecraft:location": 15, "minecraft:enchanted_item": 8, "minecraft:summoned_entity": 13, "minecraft:construct_beacon": 11, "minecraft:crafter_recipe_crafted": 54, "minecraft:cured_zombie_villager": 17, "minecraft:item_durability_changed": 19, "minecraft:item_used_on_block": 38, "minecraft:consume_item": 25, "minecraft:levitation": 20, "minecraft:bred_animals": 14, "minecraft:changed_dimension": 21, "minecraft:entity_killed_player": 2, "minecraft:shot_crossbow": 31, "minecraft:impossible": 0, "minecraft:killed_by_crossbow": 32, "minecraft:used_ender_eye": 12, }, } ================================================ FILE: server/registry/villager_profession.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var VillagerProfession = Registry{ Default: "minecraft:none", Entries: map[string]int32{ "minecraft:butcher": 2, "minecraft:cleric": 4, "minecraft:shepherd": 12, "minecraft:armorer": 1, "minecraft:nitwit": 11, "minecraft:toolsmith": 13, "minecraft:leatherworker": 8, "minecraft:fisherman": 6, "minecraft:mason": 10, "minecraft:weaponsmith": 14, "minecraft:cartographer": 3, "minecraft:fletcher": 7, "minecraft:librarian": 9, "minecraft:none": 0, "minecraft:farmer": 5, }, } ================================================ FILE: server/registry/villager_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var VillagerType = Registry{ Default: "minecraft:plains", Entries: map[string]int32{ "minecraft:savanna": 3, "minecraft:snow": 4, "minecraft:swamp": 5, "minecraft:taiga": 6, "minecraft:desert": 0, "minecraft:jungle": 1, "minecraft:plains": 2, }, } ================================================ FILE: server/registry/worldgen_biome_source.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenBiomeSource = Registry{ Default: "", Entries: map[string]int32{ "minecraft:checkerboard": 2, "minecraft:fixed": 0, "minecraft:multi_noise": 1, "minecraft:the_end": 3, }, } ================================================ FILE: server/registry/worldgen_block_state_provider_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenBlockStateProviderType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:noise_threshold_provider": 2, "minecraft:randomized_int_state_provider": 6, "minecraft:rotated_block_provider": 5, "minecraft:simple_state_provider": 0, "minecraft:weighted_state_provider": 1, "minecraft:dual_noise_provider": 4, "minecraft:noise_provider": 3, }, } ================================================ FILE: server/registry/worldgen_carver.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenCarver = Registry{ Default: "", Entries: map[string]int32{ "minecraft:cave": 0, "minecraft:nether_cave": 1, "minecraft:canyon": 2, }, } ================================================ FILE: server/registry/worldgen_chunk_generator.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenChunkGenerator = Registry{ Default: "", Entries: map[string]int32{ "minecraft:debug": 2, "minecraft:flat": 1, "minecraft:noise": 0, }, } ================================================ FILE: server/registry/worldgen_density_function_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenDensityFunctionType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:spline": 29, "minecraft:y_clamped_gradient": 31, "minecraft:beardifier": 2, "minecraft:blend_alpha": 0, "minecraft:blend_density": 17, "minecraft:cache_all_in_cell": 8, "minecraft:clamp": 18, "minecraft:squeeze": 24, "minecraft:flat_cache": 5, "minecraft:half_negative": 22, "minecraft:max": 28, "minecraft:noise": 9, "minecraft:range_choice": 13, "minecraft:blend_offset": 1, "minecraft:shift_b": 15, "minecraft:shifted_noise": 12, "minecraft:end_islands": 10, "minecraft:shift": 16, "minecraft:shift_a": 14, "minecraft:add": 25, "minecraft:interpolated": 4, "minecraft:mul": 26, "minecraft:abs": 19, "minecraft:old_blended_noise": 3, "minecraft:square": 20, "minecraft:weird_scaled_sampler": 11, "minecraft:quarter_negative": 23, "minecraft:cache_2d": 6, "minecraft:cache_once": 7, "minecraft:constant": 30, "minecraft:cube": 21, "minecraft:min": 27, }, } ================================================ FILE: server/registry/worldgen_feature.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenFeature = Registry{ Default: "", Entries: map[string]int32{ "minecraft:nether_forest_vegetation": 44, "minecraft:ore": 30, "minecraft:spring_feature": 6, "minecraft:tree": 1, "minecraft:block_pile": 5, "minecraft:disk": 28, "minecraft:flower": 2, "minecraft:geode": 57, "minecraft:void_start_platform": 9, "minecraft:multiface_growth": 22, "minecraft:basalt_columns": 47, "minecraft:basalt_pillar": 52, "minecraft:fossil": 11, "minecraft:glowstone_blob": 15, "minecraft:random_patch": 4, "minecraft:scattered_ore": 53, "minecraft:sculk_patch": 61, "minecraft:twisting_vines": 46, "minecraft:block_column": 18, "minecraft:dripstone_cluster": 58, "minecraft:end_spike": 32, "minecraft:ice_spike": 14, "minecraft:blue_ice": 25, "minecraft:vines": 17, "minecraft:coral_claw": 39, "minecraft:forest_rock": 27, "minecraft:random_boolean_selector": 56, "minecraft:simple_random_selector": 55, "minecraft:huge_brown_mushroom": 13, "minecraft:kelp": 36, "minecraft:waterlogged_vegetation_patch": 20, "minecraft:coral_tree": 37, "minecraft:end_gateway": 34, "minecraft:underwater_magma": 23, "minecraft:fill_layer": 50, "minecraft:no_op": 0, "minecraft:seagrass": 35, "minecraft:simple_block": 41, "minecraft:bamboo": 42, "minecraft:chorus_plant": 7, "minecraft:desert_well": 10, "minecraft:end_platform": 31, "minecraft:pointed_dripstone": 60, "minecraft:root_system": 21, "minecraft:monster_room": 24, "minecraft:no_bonemeal_flower": 3, "minecraft:delta_feature": 48, "minecraft:end_island": 33, "minecraft:large_dripstone": 59, "minecraft:replace_single_block": 8, "minecraft:huge_red_mushroom": 12, "minecraft:netherrack_replace_blobs": 49, "minecraft:sea_pickle": 40, "minecraft:vegetation_patch": 19, "minecraft:bonus_chest": 51, "minecraft:iceberg": 26, "minecraft:coral_mushroom": 38, "minecraft:freeze_top_layer": 16, "minecraft:random_selector": 54, "minecraft:huge_fungus": 43, "minecraft:lake": 29, "minecraft:weeping_vines": 45, }, } ================================================ FILE: server/registry/worldgen_feature_size_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenFeatureSizeType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:three_layers_feature_size": 1, "minecraft:two_layers_feature_size": 0, }, } ================================================ FILE: server/registry/worldgen_foliage_placer_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenFoliagePlacerType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:blob_foliage_placer": 0, "minecraft:dark_oak_foliage_placer": 8, "minecraft:fancy_foliage_placer": 5, "minecraft:jungle_foliage_placer": 6, "minecraft:mega_pine_foliage_placer": 7, "minecraft:pine_foliage_placer": 2, "minecraft:random_spread_foliage_placer": 9, "minecraft:spruce_foliage_placer": 1, "minecraft:acacia_foliage_placer": 3, "minecraft:bush_foliage_placer": 4, "minecraft:cherry_foliage_placer": 10, }, } ================================================ FILE: server/registry/worldgen_material_condition.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenMaterialCondition = Registry{ Default: "", Entries: map[string]int32{ "minecraft:steep": 6, "minecraft:stone_depth": 10, "minecraft:temperature": 5, "minecraft:vertical_gradient": 2, "minecraft:y_above": 3, "minecraft:above_preliminary_surface": 9, "minecraft:biome": 0, "minecraft:hole": 8, "minecraft:noise_threshold": 1, "minecraft:not": 7, "minecraft:water": 4, }, } ================================================ FILE: server/registry/worldgen_material_rule.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenMaterialRule = Registry{ Default: "", Entries: map[string]int32{ "minecraft:block": 1, "minecraft:condition": 3, "minecraft:sequence": 2, "minecraft:bandlands": 0, }, } ================================================ FILE: server/registry/worldgen_placement_modifier_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenPlacementModifierType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:rarity_filter": 1, "minecraft:surface_water_depth_filter": 3, "minecraft:block_predicate_filter": 0, "minecraft:carving_mask": 14, "minecraft:heightmap": 10, "minecraft:noise_based_count": 6, "minecraft:noise_threshold_count": 7, "minecraft:biome": 4, "minecraft:in_square": 12, "minecraft:random_offset": 13, "minecraft:surface_relative_threshold_filter": 2, "minecraft:count": 5, "minecraft:count_on_every_layer": 8, "minecraft:environment_scan": 9, "minecraft:fixed_placement": 15, "minecraft:height_range": 11, }, } ================================================ FILE: server/registry/worldgen_pool_alias_binding.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenPoolAliasBinding = Registry{ Default: "", Entries: map[string]int32{ "minecraft:direct": 2, "minecraft:random": 0, "minecraft:random_group": 1, }, } ================================================ FILE: server/registry/worldgen_root_placer_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenRootPlacerType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:mangrove_root_placer": 0, }, } ================================================ FILE: server/registry/worldgen_structure_piece.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenStructurePiece = Registry{ Default: "", Entries: map[string]int32{ "minecraft:nece": 9, "minecraft:omsimple": 47, "minecraft:orp": 33, "minecraft:nectb": 8, "minecraft:nefos": 54, "minecraft:shrc": 27, "minecraft:shs": 30, "minecraft:mscorridor": 0, "minecraft:mscrossing": 1, "minecraft:nebs": 6, "minecraft:ompenthouse": 46, "minecraft:shcc": 19, "minecraft:shfc": 20, "minecraft:omb": 38, "minecraft:iglu": 34, "minecraft:necsr": 14, "minecraft:nesr": 17, "minecraft:shsd": 28, "minecraft:shstart": 29, "minecraft:omcr": 39, "minecraft:shpr": 24, "minecraft:tejp": 32, "minecraft:omdxr": 40, "minecraft:omdyzr": 43, "minecraft:wmp": 51, "minecraft:msroom": 2, "minecraft:nebef": 5, "minecraft:omdxyr": 41, "minecraft:omsimplet": 48, "minecraft:tesh": 36, "minecraft:nesc": 12, "minecraft:shssd": 31, "minecraft:btp": 52, "minecraft:msstairs": 3, "minecraft:rupo": 35, "minecraft:shph": 25, "minecraft:nemt": 15, "minecraft:nerc": 16, "minecraft:nestart": 18, "minecraft:omdzr": 44, "minecraft:omentry": 45, "minecraft:shipwreck": 53, "minecraft:shlt": 22, "minecraft:neccs": 7, "minecraft:omdyr": 42, "minecraft:nebcr": 4, "minecraft:nesclt": 11, "minecraft:nescrt": 13, "minecraft:sh5c": 21, "minecraft:shrt": 26, "minecraft:jigsaw": 55, "minecraft:nescsc": 10, "minecraft:omwr": 49, "minecraft:tedp": 37, "minecraft:ecp": 50, "minecraft:shli": 23, }, } ================================================ FILE: server/registry/worldgen_structure_placement.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenStructurePlacement = Registry{ Default: "", Entries: map[string]int32{ "minecraft:concentric_rings": 1, "minecraft:random_spread": 0, }, } ================================================ FILE: server/registry/worldgen_structure_pool_element.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenStructurePoolElement = Registry{ Default: "", Entries: map[string]int32{ "minecraft:empty_pool_element": 3, "minecraft:feature_pool_element": 2, "minecraft:legacy_single_pool_element": 4, "minecraft:list_pool_element": 1, "minecraft:single_pool_element": 0, }, } ================================================ FILE: server/registry/worldgen_structure_processor.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenStructureProcessor = Registry{ Default: "", Entries: map[string]int32{ "minecraft:lava_submerged_block": 8, "minecraft:block_age": 6, "minecraft:block_rot": 1, "minecraft:gravity": 2, "minecraft:jigsaw_replacement": 3, "minecraft:nop": 5, "minecraft:protected_blocks": 9, "minecraft:rule": 4, "minecraft:blackstone_replace": 7, "minecraft:block_ignore": 0, "minecraft:capped": 10, }, } ================================================ FILE: server/registry/worldgen_structure_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenStructureType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:swamp_hut": 14, "minecraft:desert_pyramid": 1, "minecraft:jigsaw": 5, "minecraft:nether_fossil": 8, "minecraft:ocean_monument": 9, "minecraft:ruined_portal": 11, "minecraft:shipwreck": 12, "minecraft:end_city": 2, "minecraft:fortress": 3, "minecraft:stronghold": 13, "minecraft:ocean_ruin": 10, "minecraft:buried_treasure": 0, "minecraft:igloo": 4, "minecraft:jungle_temple": 6, "minecraft:mineshaft": 7, "minecraft:woodland_mansion": 15, }, } ================================================ FILE: server/registry/worldgen_tree_decorator_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenTreeDecoratorType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:leave_vine": 1, "minecraft:trunk_vine": 0, "minecraft:alter_ground": 4, "minecraft:attached_to_leaves": 5, "minecraft:beehive": 3, "minecraft:cocoa": 2, }, } ================================================ FILE: server/registry/worldgen_trunk_placer_type.go ================================================ package registry // Generated by https://github.com/ZeppelinMC/RegistryExtractor var WorldgenTrunkPlacerType = Registry{ Default: "", Entries: map[string]int32{ "minecraft:dark_oak_trunk_placer": 4, "minecraft:forking_trunk_placer": 1, "minecraft:mega_jungle_trunk_placer": 3, "minecraft:upwards_branching_trunk_placer": 7, "minecraft:bending_trunk_placer": 6, "minecraft:cherry_trunk_placer": 8, "minecraft:fancy_trunk_placer": 5, "minecraft:giant_trunk_placer": 2, "minecraft:straight_trunk_placer": 0, }, } ================================================ FILE: server/server.go ================================================ package server import ( "bytes" "fmt" "github.com/zeppelinmc/zeppelin/properties" "github.com/zeppelinmc/zeppelin/protocol/net/packet/configuration" "github.com/zeppelinmc/zeppelin/server/player" "image/png" "os" "runtime" "slices" "time" nnet "net" "github.com/zeppelinmc/zeppelin/protocol/net/packet/status" "github.com/zeppelinmc/zeppelin/protocol/text" "github.com/zeppelinmc/zeppelin/server/command" "github.com/zeppelinmc/zeppelin/server/player/state" "github.com/zeppelinmc/zeppelin/server/tick" "github.com/zeppelinmc/zeppelin/server/world" _ "github.com/zeppelinmc/zeppelin/server/world/terrain" "github.com/zeppelinmc/zeppelin/protocol/net" "github.com/zeppelinmc/zeppelin/util/log" ) // Creates a new server instance using the specified config, returns an error if unable to bind listener func New(cfg properties.ServerProperties, world *world.World) (*Server, error) { var ip = nnet.ParseIP(cfg.ServerIp) if ip == nil { ip = nnet.IPv4(0, 0, 0, 0) } lcfg := net.Config{ IP: ip, Port: int(cfg.ServerPort), CompressionThreshold: int32(cfg.NetworkCompressionThreshold), Encrypt: cfg.EnableEncryption || cfg.OnlineMode, Authenticate: cfg.OnlineMode, AcceptTransfers: cfg.AcceptTransfers, } if !cfg.OnlineMode { log.Warnln("Server is not enforcing authentication. The server will let anyone log as any username and potentially harm the server. Proceed with caution") } listener, err := lcfg.New() server := &Server{ listener: listener, cfg: cfg, World: world, Players: state.NewPlayerEntityManager(), stopLoop: make(chan struct{}), playerList: player.NewPlayerList(0), } server.icon, err = os.ReadFile("server-icon.png") if err == nil { img, err := png.Decode(bytes.NewReader(server.icon)) if err != nil { log.Warn("Server icon must be a 64x64 image in the PNG format") } b := img.Bounds() if b.Dx() != 64 || b.Dy() != 64 { log.Warn("Server icon must be a 64x64 image in the PNG format") } } //server.Console = &Console{Server: server} //server.World.Broadcast.AddDummy(server.Console) server.listener.SetStatusProvider(server.provideStatus) if server.cfg.EnforceSecureProfile && !cfg.OnlineMode { server.cfg.EnforceSecureProfile = false } compstr := "compress everything" if cfg.NetworkCompressionThreshold > 0 { compstr = fmt.Sprintf("compress everything starting from %d bytes", cfg.NetworkCompressionThreshold) } else if cfg.NetworkCompressionThreshold < 0 { compstr = "no compression" } log.Infolnf("Network compression threshold is %d (%s)", cfg.NetworkCompressionThreshold, compstr) //server.createTicker() return server, err } type Server struct { cfg properties.ServerProperties listener *net.Listener TickManager *tick.TickManager playerList player.PlayerList timeStart time.Time World *world.World icon []byte CommandManager *command.Manager onConnectionIntercept func(conn *net.Conn, stop *bool) closed bool stopLoop chan struct{} Players *state.PlayerEntityManager } func (srv *Server) setOnConnectionIntercept(i func(conn *net.Conn, stop *bool)) { srv.onConnectionIntercept = i } func (srv *Server) Listener() *net.Listener { return srv.listener } func (srv *Server) provideStatus(*net.Conn) status.StatusResponseData { //count := srv.World.Broadcast.NumSession() count := 0 max := srv.cfg.MaxPlayers if max == -1 { max = count + 1 } return status.StatusResponseData{ Version: status.StatusVersion{ Name: "Zeppelin 1.21.3", Protocol: net.ProtocolVersion, }, Description: text.Unmarshal(srv.cfg.MOTD, srv.cfg.ChatFormatter.Rune()), Players: status.StatusPlayers{ Max: max, Online: count, //Sample: srv.World.Broadcast.Sample(), }, Favicon: srv.icon, EnforcesSecureChat: srv.cfg.EnforceSecureProfile, } } func (srv *Server) SetStatusProvider(sp net.StatusProvider) { srv.listener.SetStatusProvider(sp) } func (srv *Server) Properties() properties.ServerProperties { return srv.cfg } func (srv *Server) Start(ts time.Time) { if slices.Index(os.Args, "--no-plugins") == -1 { if runtime.GOOS == "darwin" || runtime.GOOS == "linux" || runtime.GOOS == "freebsd" { log.Infoln("Loading plugins") srv.loadPlugins() } } log.Info("Preparing world spawn... ") ow := srv.World.Dimension("minecraft:overworld") var chunks int32 spawnCX, spawnCZ := srv.World.Data.SpawnX>>4, srv.World.Data.SpawnZ>>4 for x := spawnCX - srv.cfg.ViewDistance; x < spawnCX+srv.cfg.ViewDistance; x++ { for z := spawnCZ - srv.cfg.ViewDistance; z < spawnCZ+srv.cfg.ViewDistance; z++ { _, err := ow.GetChunk(x, z) if err == nil { chunks++ } } } fmt.Printf("cached %d chunks\n\r", chunks) srv.timeStart = ts log.Infolnf("Done! (%s)", time.Since(ts)) for { conn, err := srv.listener.Accept() if err != nil { if !srv.closed { log.Errorln("Server error: ", err) } <-srv.stopLoop return } if srv.onConnectionIntercept != nil { var stop bool srv.onConnectionIntercept(conn, &stop) if stop { continue } } srv.handleNewConnection(conn) } } func (srv *Server) handleNewConnection(conn *net.Conn) { log.Infolnf("%sPlayer attempting to connect: %s (%s)", log.FormatAddr(srv.cfg.LogIPs, conn.RemoteAddr()), conn.Username(), conn.UUID()) if p := srv.playerList.PlayerByUsername(conn.Username()); p != nil { _ = conn.WritePacket(&configuration.Disconnect{ Reason: text.TextComponent{Text: "You are already connected to the server from another session. Please disconnect then try again"}, }) return } playerData, err := srv.World.PlayerData(conn.UUID().String()) if err != nil { playerData = srv.World.NewPlayerData(conn.UUID()) } playerState := srv.Players.New(playerData) go srv.playerList.New(conn, playerState, &srv.World.DimensionManager, &srv.World.Level, &srv.cfg, srv.CommandManager).Login() } func (srv *Server) Stop() { log.InfolnClean("Stopping server") srv.closed = true srv.listener.Close() //srv.World.Broadcast.DisconnectAll(text.TextComponent{Text: "Server closed"}) log.InfolnClean("Saving player data") srv.Players.SaveAll() srv.World.Save() log.InfolnfClean("Server lasted for %s", srv.formatTimestart()) srv.stopLoop <- struct{}{} } func (srv *Server) formatTimestart() string { sub := time.Since(srv.timeStart) return fmt.Sprintf("%02dhrs %02dmins, %02dsecs", int(sub.Hours())%60, int(sub.Minutes())%60, int(sub.Seconds())%60) } func (srv *Server) createTicker() { //srv.TickManager = tick.New(20, srv.World.Broadcast) srv.TickManager.AddNew(func() { srv.World.IncrementTime() }) } ================================================ FILE: server/tick/tick.go ================================================ package tick import ( "fmt" "sync" "sync/atomic" "time" //"github.com/zeppelinmc/zeppelin/server/session" ) // New creates a new tick manager with tps ticks per second func New(tps int /*b *session.Broadcast*/) *TickManager { mgr := &TickManager{ //b: b, } mgr.d.Store(int64(time.Second / time.Duration(tps))) return mgr } type TickManager struct { tickers []*time.Ticker mu sync.RWMutex d atomic.Int64 //b *session.Broadcast } func (mgr *TickManager) AddNew(f func()) { tick := mgr.New() go func() { for range tick.C { f() } }() } func (mgr *TickManager) SetFrequency(tps int) error { mgr.mu.RLock() defer mgr.mu.RUnlock() if tps == 0 { return fmt.Errorf("0 tps is not allowed. Use mgr.Freeze instead") } d := time.Second / time.Duration(tps) mgr.d.Store(int64(d)) for _, ticker := range mgr.tickers { ticker.Reset(d) } /*mgr.b.Range(func(u uuid.UUID, s session.Session) bool { s.SetTickState(float32(tps), false) return true })*/ return nil } func (mgr *TickManager) Freeze() { for _, ticker := range mgr.tickers { ticker.Stop() } /*mgr.b.Range(func(u uuid.UUID, s session.Session) bool { s.SetTickState(0, true) return true })*/ } func (mgr *TickManager) Unfreeze() { freq := time.Duration(mgr.d.Load()) for _, ticker := range mgr.tickers { ticker.Reset(freq) } //tps := 1 / (float32(freq) / float32(time.Second)) /*mgr.b.Range(func(u uuid.UUID, s session.Session) bool { s.SetTickState(tps, false) return true })*/ } func (mgr *TickManager) Add(ticker *time.Ticker) { mgr.mu.Lock() defer mgr.mu.Unlock() mgr.tickers = append(mgr.tickers, ticker) } func (mgr *TickManager) New() *time.Ticker { ticker := time.NewTicker(mgr.Frequency()) mgr.mu.Lock() defer mgr.mu.Unlock() mgr.tickers = append(mgr.tickers, ticker) return ticker } func (mgr *TickManager) Count() int { mgr.mu.RLock() defer mgr.mu.RUnlock() return len(mgr.tickers) } func (mgr *TickManager) Remove(ticker *time.Ticker) (ok bool) { for _, t := range mgr.tickers { if t == ticker { return true } } return } func (mgr *TickManager) Frequency() time.Duration { return time.Duration(mgr.d.Load()) } ================================================ FILE: server/world/block/0block.go ================================================ package block import ( "slices" "strconv" "github.com/zeppelinmc/zeppelin/protocol/net/packet/play" "github.com/zeppelinmc/zeppelin/protocol/net/tags" "github.com/zeppelinmc/zeppelin/server/registry" //"github.com/zeppelinmc/zeppelin/server/session" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" "github.com/zeppelinmc/zeppelin/server/world/chunk/section" "github.com/zeppelinmc/zeppelin/server/world/dimension" ) type BlockProperties = map[string]string type Block = section.Block type Axis = string const ( AxisX Axis = "x" AxisY Axis = "y" AxisZ Axis = "z" ) type Direction = string const ( DirectionNorth Direction = "north" DirectionSouth Direction = "south" DirectionWest Direction = "west" DirectionEast Direction = "east" ) func atoi(str string) int { v, _ := strconv.Atoi(str) return v } // A usable block is a block which performs a certain action when left clicked type Usable interface { Block Use(clicker any, pk play.UseItemOn, dimension *dimension.Dimension) } // A block state haver is one that also has a block state type BlockEntityHaver interface { Block BlockEntity(pos.BlockPosition) chunk.BlockEntity } // A block custom place sound haver is one that has a custom place sound type BlockCustomPlaceSoundHaver interface { Block PlaceSound(pos.BlockPosition) *play.SoundEffect } type BreakInfo struct { // The hardness of this block Hardness float32 // Whether this block drops xp when broken DropsXp bool // The xp points this block can drop MinXp, MaxXp float32 // The blast resistance of this block BlastResistance float32 } // Is checks if the tag applies to the block func Is(block Block, tagName string) bool { name, _ := block.Encode() return slices.Index(tags.Tags.Tags["minecraft:block"][tagName], registry.Block.Get(name)) != -1 } // A block that can be broken type Breakable interface { BreakInfo() BreakInfo } func init() { section.RegisterBlock(Cake{}) section.RegisterBlock(JunglePressurePlate{}) section.RegisterBlock(StrippedMangroveWood{}) section.RegisterBlock(StrippedWarpedHyphae{}) section.RegisterBlock(WaxedOxidizedCopperDoor{}) section.RegisterBlock(DioriteSlab{}) section.RegisterBlock(Mud{}) section.RegisterBlock(SporeBlossom{}) section.RegisterBlock(StrippedCrimsonHyphae{}) section.RegisterBlock(DeadBrainCoral{}) section.RegisterBlock(JungleFence{}) section.RegisterBlock(Podzol{}) section.RegisterBlock(PolishedDeepslateWall{}) section.RegisterBlock(RedCandleCake{}) section.RegisterBlock(WeatheredChiseledCopper{}) section.RegisterBlock(WeatheredCopperBulb{}) section.RegisterBlock(AncientDebris{}) section.RegisterBlock(Anvil{}) section.RegisterBlock(OakTrapdoor{}) section.RegisterBlock(PrismarineWall{}) section.RegisterBlock(PurpleTerracotta{}) section.RegisterBlock(RespawnAnchor{}) section.RegisterBlock(CrimsonFungus{}) section.RegisterBlock(LightBlueStainedGlass{}) section.RegisterBlock(MudBricks{}) section.RegisterBlock(CyanConcretePowder{}) section.RegisterBlock(NetherBrickStairs{}) section.RegisterBlock(PowderSnowCauldron{}) section.RegisterBlock(TwistingVinesPlant{}) section.RegisterBlock(WaxedWeatheredCutCopperSlab{}) section.RegisterBlock(Bedrock{}) section.RegisterBlock(CrimsonTrapdoor{}) section.RegisterBlock(StoneBrickSlab{}) section.RegisterBlock(RedSandstoneSlab{}) section.RegisterBlock(Shroomlight{}) section.RegisterBlock(YellowCandleCake{}) section.RegisterBlock(CutCopperStairs{}) section.RegisterBlock(Lilac{}) section.RegisterBlock(RedCarpet{}) section.RegisterBlock(JungleLog{}) section.RegisterBlock(MuddyMangroveRoots{}) section.RegisterBlock(PolishedDeepslate{}) section.RegisterBlock(WeatheredCopperGrate{}) section.RegisterBlock(ChiseledPolishedBlackstone{}) section.RegisterBlock(DeepslateIronOre{}) section.RegisterBlock(MossBlock{}) section.RegisterBlock(DarkPrismarine{}) section.RegisterBlock(DeadBubbleCoral{}) section.RegisterBlock(MangroveFenceGate{}) section.RegisterBlock(MangroveTrapdoor{}) section.RegisterBlock(OakDoor{}) section.RegisterBlock(BirchSlab{}) section.RegisterBlock(BubbleCoralBlock{}) section.RegisterBlock(ChiseledBookshelf{}) section.RegisterBlock(PinkConcretePowder{}) section.RegisterBlock(LightGrayStainedGlassPane{}) section.RegisterBlock(SeaPickle{}) section.RegisterBlock(StructureBlock{}) section.RegisterBlock(TubeCoralWallFan{}) section.RegisterBlock(CopperGrate{}) section.RegisterBlock(PottedCrimsonRoots{}) section.RegisterBlock(TripwireHook{}) section.RegisterBlock(PottedBrownMushroom{}) section.RegisterBlock(AcaciaWallSign{}) section.RegisterBlock(CrackedDeepslateBricks{}) section.RegisterBlock(PinkWool{}) section.RegisterBlock(DeepslateBrickWall{}) section.RegisterBlock(JungleStairs{}) section.RegisterBlock(LimeWallBanner{}) section.RegisterBlock(OrangeStainedGlass{}) section.RegisterBlock(PottedAzaleaBush{}) section.RegisterBlock(BlackWallBanner{}) section.RegisterBlock(CherrySapling{}) section.RegisterBlock(CrackedPolishedBlackstoneBricks{}) section.RegisterBlock(Mycelium{}) section.RegisterBlock(Piston{}) section.RegisterBlock(AcaciaPressurePlate{}) section.RegisterBlock(BambooSign{}) section.RegisterBlock(BirchFence{}) section.RegisterBlock(BambooPlanks{}) section.RegisterBlock(CyanConcrete{}) section.RegisterBlock(LightBlueBanner{}) section.RegisterBlock(SpruceLeaves{}) section.RegisterBlock(Andesite{}) section.RegisterBlock(CherrySign{}) section.RegisterBlock(BirchSign{}) section.RegisterBlock(MudBrickStairs{}) section.RegisterBlock(Torch{}) section.RegisterBlock(BambooSapling{}) section.RegisterBlock(MangrovePlanks{}) section.RegisterBlock(WaxedOxidizedCutCopperSlab{}) section.RegisterBlock(SugarCane{}) section.RegisterBlock(AcaciaButton{}) section.RegisterBlock(DeepslateLapisOre{}) section.RegisterBlock(Potatoes{}) section.RegisterBlock(WaxedExposedCutCopperStairs{}) section.RegisterBlock(YellowGlazedTerracotta{}) section.RegisterBlock(IronDoor{}) section.RegisterBlock(JungleSlab{}) section.RegisterBlock(PinkStainedGlassPane{}) section.RegisterBlock(SculkCatalyst{}) section.RegisterBlock(SpruceSlab{}) section.RegisterBlock(CandleCake{}) section.RegisterBlock(LapisBlock{}) section.RegisterBlock(MossyStoneBrickWall{}) section.RegisterBlock(WeatheredCutCopperStairs{}) section.RegisterBlock(FloweringAzalea{}) section.RegisterBlock(OakFence{}) section.RegisterBlock(PurpleCandle{}) section.RegisterBlock(IronOre{}) section.RegisterBlock(LightBlueWallBanner{}) section.RegisterBlock(Cornflower{}) section.RegisterBlock(DirtPath{}) section.RegisterBlock(ExposedCopperDoor{}) section.RegisterBlock(BrainCoralFan{}) section.RegisterBlock(ChippedAnvil{}) section.RegisterBlock(QuartzBlock{}) section.RegisterBlock(SpruceFenceGate{}) section.RegisterBlock(StrippedCrimsonStem{}) section.RegisterBlock(Cobblestone{}) section.RegisterBlock(DragonHead{}) section.RegisterBlock(SmoothSandstoneStairs{}) section.RegisterBlock(BlastFurnace{}) section.RegisterBlock(OxidizedCopperTrapdoor{}) section.RegisterBlock(LimeBanner{}) section.RegisterBlock(PolishedDeepslateSlab{}) section.RegisterBlock(VerdantFroglight{}) section.RegisterBlock(BlueConcrete{}) section.RegisterBlock(CobbledDeepslate{}) section.RegisterBlock(JungleDoor{}) section.RegisterBlock(SkeletonWallSkull{}) section.RegisterBlock(ExposedCopperTrapdoor{}) section.RegisterBlock(MagentaBanner{}) section.RegisterBlock(SandstoneStairs{}) section.RegisterBlock(WaxedOxidizedCopperTrapdoor{}) section.RegisterBlock(BlackBanner{}) section.RegisterBlock(CaveAir{}) section.RegisterBlock(DiamondOre{}) section.RegisterBlock(BubbleCoralWallFan{}) section.RegisterBlock(StrippedJungleWood{}) section.RegisterBlock(WaxedOxidizedCutCopper{}) section.RegisterBlock(DarkPrismarineStairs{}) section.RegisterBlock(GrayCarpet{}) section.RegisterBlock(MossyStoneBrickSlab{}) section.RegisterBlock(OrangeConcrete{}) section.RegisterBlock(AttachedMelonStem{}) section.RegisterBlock(BlueStainedGlass{}) section.RegisterBlock(Crafter{}) section.RegisterBlock(SoulSoil{}) section.RegisterBlock(BrownCandle{}) section.RegisterBlock(PinkStainedGlass{}) section.RegisterBlock(SandstoneWall{}) section.RegisterBlock(SpruceHangingSign{}) section.RegisterBlock(StrippedBirchWood{}) section.RegisterBlock(WhiteCarpet{}) section.RegisterBlock(AcaciaDoor{}) section.RegisterBlock(DeadBrainCoralFan{}) section.RegisterBlock(OakLog{}) section.RegisterBlock(SoulFire{}) section.RegisterBlock(Target{}) section.RegisterBlock(CalibratedSculkSensor{}) section.RegisterBlock(EndStone{}) section.RegisterBlock(MagentaShulkerBox{}) section.RegisterBlock(GreenBanner{}) section.RegisterBlock(OrangeBanner{}) section.RegisterBlock(LightGrayWool{}) section.RegisterBlock(OakSapling{}) section.RegisterBlock(OxeyeDaisy{}) section.RegisterBlock(WarpedHyphae{}) section.RegisterBlock(BirchPressurePlate{}) section.RegisterBlock(BrownConcretePowder{}) section.RegisterBlock(DarkOakSlab{}) section.RegisterBlock(DarkOakStairs{}) section.RegisterBlock(PinkConcrete{}) section.RegisterBlock(PolishedAndesiteSlab{}) section.RegisterBlock(SpruceStairs{}) section.RegisterBlock(GrayShulkerBox{}) section.RegisterBlock(IronBlock{}) section.RegisterBlock(NetherWartBlock{}) section.RegisterBlock(YellowStainedGlass{}) section.RegisterBlock(CobbledDeepslateWall{}) section.RegisterBlock(CyanWallBanner{}) section.RegisterBlock(PurpleStainedGlass{}) section.RegisterBlock(MagentaWallBanner{}) section.RegisterBlock(WaxedCopperGrate{}) section.RegisterBlock(Pumpkin{}) section.RegisterBlock(ChiseledSandstone{}) section.RegisterBlock(CyanStainedGlass{}) section.RegisterBlock(NetherPortal{}) section.RegisterBlock(WarpedButton{}) section.RegisterBlock(WaterCauldron{}) section.RegisterBlock(EndGateway{}) section.RegisterBlock(RedStainedGlass{}) section.RegisterBlock(SoulTorch{}) section.RegisterBlock(OrangeShulkerBox{}) section.RegisterBlock(PlayerWallHead{}) section.RegisterBlock(Rail{}) section.RegisterBlock(SnifferEgg{}) section.RegisterBlock(WarpedSlab{}) section.RegisterBlock(ExposedCutCopperSlab{}) section.RegisterBlock(ExposedCutCopperStairs{}) section.RegisterBlock(LimeStainedGlassPane{}) section.RegisterBlock(SlimeBlock{}) section.RegisterBlock(ChorusPlant{}) section.RegisterBlock(MangroveRoots{}) section.RegisterBlock(ShortGrass{}) section.RegisterBlock(GoldOre{}) section.RegisterBlock(LightGrayShulkerBox{}) section.RegisterBlock(PottedRedMushroom{}) section.RegisterBlock(BlueCarpet{}) section.RegisterBlock(CraftingTable{}) section.RegisterBlock(DeadHornCoralBlock{}) section.RegisterBlock(PurpleShulkerBox{}) section.RegisterBlock(BambooButton{}) section.RegisterBlock(CobblestoneWall{}) section.RegisterBlock(DragonWallHead{}) section.RegisterBlock(LightGrayBed{}) section.RegisterBlock(MangrovePressurePlate{}) section.RegisterBlock(BlueOrchid{}) section.RegisterBlock(BrownStainedGlass{}) section.RegisterBlock(ChiseledQuartzBlock{}) section.RegisterBlock(DeadTubeCoralWallFan{}) section.RegisterBlock(Terracotta{}) section.RegisterBlock(BlueWool{}) section.RegisterBlock(CutRedSandstone{}) section.RegisterBlock(DarkOakSapling{}) section.RegisterBlock(WaxedCopperTrapdoor{}) section.RegisterBlock(BrickStairs{}) section.RegisterBlock(PolishedTuffSlab{}) section.RegisterBlock(WarpedHangingSign{}) section.RegisterBlock(CyanBed{}) section.RegisterBlock(DeadBush{}) section.RegisterBlock(RedTerracotta{}) section.RegisterBlock(PolishedBasalt{}) section.RegisterBlock(WaxedCutCopper{}) section.RegisterBlock(BambooSlab{}) section.RegisterBlock(CherryWallHangingSign{}) section.RegisterBlock(GrayConcrete{}) section.RegisterBlock(PistonHead{}) section.RegisterBlock(TubeCoralBlock{}) section.RegisterBlock(OrangeBed{}) section.RegisterBlock(PolishedGraniteStairs{}) section.RegisterBlock(PottedFloweringAzaleaBush{}) section.RegisterBlock(BambooFenceGate{}) section.RegisterBlock(BlackWool{}) section.RegisterBlock(CoarseDirt{}) section.RegisterBlock(AcaciaFenceGate{}) section.RegisterBlock(Sandstone{}) section.RegisterBlock(BambooMosaicSlab{}) section.RegisterBlock(MangroveLeaves{}) section.RegisterBlock(WhiteCandle{}) section.RegisterBlock(PottedSpruceSapling{}) section.RegisterBlock(StoneBrickStairs{}) section.RegisterBlock(WhiteTerracotta{}) section.RegisterBlock(EnderChest{}) section.RegisterBlock(FireCoral{}) section.RegisterBlock(PolishedTuffStairs{}) section.RegisterBlock(CutSandstone{}) section.RegisterBlock(GreenWool{}) section.RegisterBlock(SmoothQuartzSlab{}) section.RegisterBlock(JungleTrapdoor{}) section.RegisterBlock(MangroveButton{}) section.RegisterBlock(PinkBed{}) section.RegisterBlock(AcaciaSapling{}) section.RegisterBlock(ActivatorRail{}) section.RegisterBlock(Furnace{}) section.RegisterBlock(DeadTubeCoral{}) section.RegisterBlock(PurpleCarpet{}) section.RegisterBlock(WarpedStem{}) section.RegisterBlock(Deepslate{}) section.RegisterBlock(LimeWool{}) section.RegisterBlock(MagentaConcrete{}) section.RegisterBlock(SpruceSign{}) section.RegisterBlock(BirchLog{}) section.RegisterBlock(BrownBed{}) section.RegisterBlock(CopperOre{}) section.RegisterBlock(PottedWarpedFungus{}) section.RegisterBlock(LimeConcrete{}) section.RegisterBlock(LimeGlazedTerracotta{}) section.RegisterBlock(PointedDripstone{}) section.RegisterBlock(PurpurSlab{}) section.RegisterBlock(WeepingVinesPlant{}) section.RegisterBlock(Glass{}) section.RegisterBlock(Hopper{}) section.RegisterBlock(OxidizedChiseledCopper{}) section.RegisterBlock(WhiteWallBanner{}) section.RegisterBlock(WitherSkeletonSkull{}) section.RegisterBlock(LimeCarpet{}) section.RegisterBlock(Observer{}) section.RegisterBlock(PolishedBlackstoneBrickWall{}) section.RegisterBlock(Loom{}) section.RegisterBlock(PolishedBlackstoneBrickStairs{}) section.RegisterBlock(Cauldron{}) section.RegisterBlock(DeadTubeCoralBlock{}) section.RegisterBlock(LightBlueGlazedTerracotta{}) section.RegisterBlock(LargeAmethystBud{}) section.RegisterBlock(Candle{}) section.RegisterBlock(DeadFireCoralBlock{}) section.RegisterBlock(KelpPlant{}) section.RegisterBlock(PottedOxeyeDaisy{}) section.RegisterBlock(Sunflower{}) section.RegisterBlock(BirchPlanks{}) section.RegisterBlock(HoneycombBlock{}) section.RegisterBlock(PottedCrimsonFungus{}) section.RegisterBlock(BrewingStand{}) section.RegisterBlock(RedSand{}) section.RegisterBlock(PurpurStairs{}) section.RegisterBlock(WarpedPressurePlate{}) section.RegisterBlock(WhiteGlazedTerracotta{}) section.RegisterBlock(IronBars{}) section.RegisterBlock(JungleFenceGate{}) section.RegisterBlock(LightBlueConcretePowder{}) section.RegisterBlock(PottedDeadBush{}) section.RegisterBlock(SuspiciousSand{}) section.RegisterBlock(CobblestoneStairs{}) section.RegisterBlock(CrimsonNylium{}) section.RegisterBlock(GrayConcretePowder{}) section.RegisterBlock(Tuff{}) section.RegisterBlock(WarpedFenceGate{}) section.RegisterBlock(BlackCandleCake{}) section.RegisterBlock(CobbledDeepslateSlab{}) section.RegisterBlock(Prismarine{}) section.RegisterBlock(CherryWood{}) section.RegisterBlock(Comparator{}) section.RegisterBlock(SmoothQuartzStairs{}) section.RegisterBlock(SoulSand{}) section.RegisterBlock(EndStoneBrickWall{}) section.RegisterBlock(MangroveSign{}) section.RegisterBlock(PottedAzureBluet{}) section.RegisterBlock(SweetBerryBush{}) section.RegisterBlock(Azalea{}) section.RegisterBlock(CyanShulkerBox{}) section.RegisterBlock(EndStoneBricks{}) section.RegisterBlock(MovingPiston{}) section.RegisterBlock(PolishedAndesite{}) section.RegisterBlock(QuartzSlab{}) section.RegisterBlock(BigDripleafStem{}) section.RegisterBlock(ChiseledRedSandstone{}) section.RegisterBlock(GrayWallBanner{}) section.RegisterBlock(PolishedBlackstonePressurePlate{}) section.RegisterBlock(Seagrass{}) section.RegisterBlock(RedWool{}) section.RegisterBlock(WarpedStairs{}) section.RegisterBlock(CrimsonHyphae{}) section.RegisterBlock(CutCopper{}) section.RegisterBlock(DarkOakWallHangingSign{}) section.RegisterBlock(ReinforcedDeepslate{}) section.RegisterBlock(StrippedBambooBlock{}) section.RegisterBlock(WaxedExposedCopperTrapdoor{}) section.RegisterBlock(WeatheredCopperDoor{}) section.RegisterBlock(Air{}) section.RegisterBlock(DarkOakSign{}) section.RegisterBlock(MossyCobblestoneSlab{}) section.RegisterBlock(GraniteStairs{}) section.RegisterBlock(MagentaConcretePowder{}) section.RegisterBlock(MangroveWood{}) section.RegisterBlock(MossyStoneBrickStairs{}) section.RegisterBlock(PottedCornflower{}) section.RegisterBlock(AcaciaStairs{}) section.RegisterBlock(BirchHangingSign{}) section.RegisterBlock(CreeperWallHead{}) section.RegisterBlock(SmithingTable{}) section.RegisterBlock(PurpleConcretePowder{}) section.RegisterBlock(SpruceLog{}) section.RegisterBlock(WaxedExposedCopperGrate{}) section.RegisterBlock(DarkOakPressurePlate{}) section.RegisterBlock(ExposedCopperGrate{}) section.RegisterBlock(GreenCandle{}) section.RegisterBlock(ExposedCutCopper{}) section.RegisterBlock(PottedWhiteTulip{}) section.RegisterBlock(TuffBrickWall{}) section.RegisterBlock(WeatheredCutCopperSlab{}) section.RegisterBlock(YellowConcrete{}) section.RegisterBlock(DeepslateRedstoneOre{}) section.RegisterBlock(SmoothStoneSlab{}) section.RegisterBlock(SuspiciousGravel{}) section.RegisterBlock(ExposedCopper{}) section.RegisterBlock(GreenCarpet{}) section.RegisterBlock(GreenGlazedTerracotta{}) section.RegisterBlock(LilyPad{}) section.RegisterBlock(OakStairs{}) section.RegisterBlock(BlueShulkerBox{}) section.RegisterBlock(Carrots{}) section.RegisterBlock(DarkPrismarineSlab{}) section.RegisterBlock(PurpleWallBanner{}) section.RegisterBlock(WaxedWeatheredCopperTrapdoor{}) section.RegisterBlock(LimeBed{}) section.RegisterBlock(WaxedWeatheredCopperDoor{}) section.RegisterBlock(GreenConcrete{}) section.RegisterBlock(IronTrapdoor{}) section.RegisterBlock(JungleWallSign{}) section.RegisterBlock(WaxedCopperBulb{}) section.RegisterBlock(Blackstone{}) section.RegisterBlock(CyanWool{}) section.RegisterBlock(OakWallSign{}) section.RegisterBlock(StonePressurePlate{}) section.RegisterBlock(StrippedDarkOakLog{}) section.RegisterBlock(DeepslateBrickSlab{}) section.RegisterBlock(LimeStainedGlass{}) section.RegisterBlock(PolishedDiorite{}) section.RegisterBlock(PottedOakSapling{}) section.RegisterBlock(RedStainedGlassPane{}) section.RegisterBlock(Allium{}) section.RegisterBlock(CopperTrapdoor{}) section.RegisterBlock(DeadFireCoralFan{}) section.RegisterBlock(TintedGlass{}) section.RegisterBlock(WarpedWallSign{}) section.RegisterBlock(WaxedExposedChiseledCopper{}) section.RegisterBlock(DioriteStairs{}) section.RegisterBlock(PurpleCandleCake{}) section.RegisterBlock(SmoothRedSandstoneStairs{}) section.RegisterBlock(Beetroots{}) section.RegisterBlock(CommandBlock{}) section.RegisterBlock(GreenWallBanner{}) section.RegisterBlock(PottedCherrySapling{}) section.RegisterBlock(StoneBricks{}) section.RegisterBlock(WarpedPlanks{}) section.RegisterBlock(BambooPressurePlate{}) section.RegisterBlock(CherryPlanks{}) section.RegisterBlock(LilyOfTheValley{}) section.RegisterBlock(PottedFern{}) section.RegisterBlock(YellowConcretePowder{}) section.RegisterBlock(GrassBlock{}) section.RegisterBlock(LightGrayConcrete{}) section.RegisterBlock(Melon{}) section.RegisterBlock(Lectern{}) section.RegisterBlock(PinkTulip{}) section.RegisterBlock(RedMushroomBlock{}) section.RegisterBlock(Wheat{}) section.RegisterBlock(WhiteConcrete{}) section.RegisterBlock(BambooMosaicStairs{}) section.RegisterBlock(CyanTerracotta{}) section.RegisterBlock(InfestedChiseledStoneBricks{}) section.RegisterBlock(FletchingTable{}) section.RegisterBlock(PottedCactus{}) section.RegisterBlock(WarpedDoor{}) section.RegisterBlock(StrippedOakLog{}) section.RegisterBlock(Composter{}) section.RegisterBlock(MagentaCandle{}) section.RegisterBlock(OchreFroglight{}) section.RegisterBlock(GreenShulkerBox{}) section.RegisterBlock(Sand{}) section.RegisterBlock(StoneBrickWall{}) section.RegisterBlock(WaxedExposedCutCopper{}) section.RegisterBlock(ChiseledStoneBricks{}) section.RegisterBlock(EnchantingTable{}) section.RegisterBlock(GildedBlackstone{}) section.RegisterBlock(MagentaStainedGlass{}) section.RegisterBlock(PurpleBanner{}) section.RegisterBlock(PolishedBlackstoneSlab{}) section.RegisterBlock(PurpleGlazedTerracotta{}) section.RegisterBlock(PurpurBlock{}) section.RegisterBlock(BrownStainedGlassPane{}) section.RegisterBlock(LightBlueWool{}) section.RegisterBlock(PinkPetals{}) section.RegisterBlock(StrippedOakWood{}) section.RegisterBlock(WaxedCutCopperSlab{}) section.RegisterBlock(CyanGlazedTerracotta{}) section.RegisterBlock(DioriteWall{}) section.RegisterBlock(RawIronBlock{}) section.RegisterBlock(ChiseledDeepslate{}) section.RegisterBlock(LightGrayConcretePowder{}) section.RegisterBlock(Torchflower{}) section.RegisterBlock(WeatheredCopper{}) section.RegisterBlock(BlackShulkerBox{}) section.RegisterBlock(PackedMud{}) section.RegisterBlock(RedstoneLamp{}) section.RegisterBlock(WarpedWartBlock{}) section.RegisterBlock(BlueCandle{}) section.RegisterBlock(DeadBubbleCoralFan{}) section.RegisterBlock(VoidAir{}) section.RegisterBlock(YellowCandle{}) section.RegisterBlock(GlowLichen{}) section.RegisterBlock(LapisOre{}) section.RegisterBlock(PottedPinkTulip{}) section.RegisterBlock(PottedPoppy{}) section.RegisterBlock(Bookshelf{}) section.RegisterBlock(FloweringAzaleaLeaves{}) section.RegisterBlock(LightBlueCarpet{}) section.RegisterBlock(GrayWool{}) section.RegisterBlock(JungleButton{}) section.RegisterBlock(NetheriteBlock{}) section.RegisterBlock(GoldBlock{}) section.RegisterBlock(MagentaCarpet{}) section.RegisterBlock(BambooFence{}) section.RegisterBlock(CoalOre{}) section.RegisterBlock(CopperDoor{}) section.RegisterBlock(RedNetherBrickWall{}) section.RegisterBlock(GraniteSlab{}) section.RegisterBlock(SpruceSapling{}) section.RegisterBlock(CherryPressurePlate{}) section.RegisterBlock(YellowCarpet{}) section.RegisterBlock(GlassPane{}) section.RegisterBlock(PolishedDeepslateStairs{}) section.RegisterBlock(PottedMangrovePropagule{}) section.RegisterBlock(BambooHangingSign{}) section.RegisterBlock(Dropper{}) section.RegisterBlock(EmeraldBlock{}) section.RegisterBlock(PinkWallBanner{}) section.RegisterBlock(StrippedAcaciaWood{}) section.RegisterBlock(AcaciaLog{}) section.RegisterBlock(BambooMosaic{}) section.RegisterBlock(OakLeaves{}) section.RegisterBlock(PinkCarpet{}) section.RegisterBlock(SandstoneSlab{}) section.RegisterBlock(CyanBanner{}) section.RegisterBlock(DeepslateTiles{}) section.RegisterBlock(DetectorRail{}) section.RegisterBlock(NetherBrickFence{}) section.RegisterBlock(PurpleBed{}) section.RegisterBlock(SoulCampfire{}) section.RegisterBlock(BirchLeaves{}) section.RegisterBlock(BrownWallBanner{}) section.RegisterBlock(CyanStainedGlassPane{}) section.RegisterBlock(GrayGlazedTerracotta{}) section.RegisterBlock(StickyPiston{}) section.RegisterBlock(TallGrass{}) section.RegisterBlock(AcaciaSlab{}) section.RegisterBlock(AmethystBlock{}) section.RegisterBlock(CrimsonRoots{}) section.RegisterBlock(SmallAmethystBud{}) section.RegisterBlock(TubeCoralFan{}) section.RegisterBlock(WhiteConcretePowder{}) section.RegisterBlock(BlackTerracotta{}) section.RegisterBlock(WaxedOxidizedCopperBulb{}) section.RegisterBlock(PetrifiedOakSlab{}) section.RegisterBlock(PolishedBlackstoneBricks{}) section.RegisterBlock(PumpkinStem{}) section.RegisterBlock(YellowShulkerBox{}) section.RegisterBlock(DecoratedPot{}) section.RegisterBlock(Kelp{}) section.RegisterBlock(RedSandstone{}) section.RegisterBlock(MagentaStainedGlassPane{}) section.RegisterBlock(PinkShulkerBox{}) section.RegisterBlock(PottedBirchSapling{}) section.RegisterBlock(SmoothBasalt{}) section.RegisterBlock(WaxedCopperBlock{}) section.RegisterBlock(DiamondBlock{}) section.RegisterBlock(GrayTerracotta{}) section.RegisterBlock(LightGrayCarpet{}) section.RegisterBlock(AzaleaLeaves{}) section.RegisterBlock(QuartzStairs{}) section.RegisterBlock(SoulLantern{}) section.RegisterBlock(MelonStem{}) section.RegisterBlock(Peony{}) section.RegisterBlock(CherryLeaves{}) section.RegisterBlock(Lantern{}) section.RegisterBlock(Lever{}) section.RegisterBlock(JackOLantern{}) section.RegisterBlock(MossyCobblestoneWall{}) section.RegisterBlock(OrangeWool{}) section.RegisterBlock(YellowWool{}) section.RegisterBlock(BlueIce{}) section.RegisterBlock(GreenTerracotta{}) section.RegisterBlock(LightBlueStainedGlassPane{}) section.RegisterBlock(GreenBed{}) section.RegisterBlock(SculkShrieker{}) section.RegisterBlock(BrownCarpet{}) section.RegisterBlock(DarkOakFence{}) section.RegisterBlock(Gravel{}) section.RegisterBlock(PolishedTuff{}) section.RegisterBlock(Sponge{}) section.RegisterBlock(WaxedOxidizedCopperGrate{}) section.RegisterBlock(CyanCarpet{}) section.RegisterBlock(DeepslateTileSlab{}) section.RegisterBlock(Farmland{}) section.RegisterBlock(NetherQuartzOre{}) section.RegisterBlock(TwistingVines{}) section.RegisterBlock(PrismarineBrickStairs{}) section.RegisterBlock(Snow{}) section.RegisterBlock(CrimsonFence{}) section.RegisterBlock(LightGrayCandleCake{}) section.RegisterBlock(PottedLilyOfTheValley{}) section.RegisterBlock(RawCopperBlock{}) section.RegisterBlock(SpruceWallHangingSign{}) section.RegisterBlock(AcaciaWallHangingSign{}) section.RegisterBlock(GreenStainedGlass{}) section.RegisterBlock(JungleSapling{}) section.RegisterBlock(AndesiteStairs{}) section.RegisterBlock(CrackedDeepslateTiles{}) section.RegisterBlock(DamagedAnvil{}) section.RegisterBlock(PoweredRail{}) section.RegisterBlock(CreeperHead{}) section.RegisterBlock(InfestedStone{}) section.RegisterBlock(OxidizedCopperGrate{}) section.RegisterBlock(BubbleColumn{}) section.RegisterBlock(LightGrayWallBanner{}) section.RegisterBlock(SculkVein{}) section.RegisterBlock(PolishedBlackstoneStairs{}) section.RegisterBlock(CrimsonStem{}) section.RegisterBlock(EndStoneBrickStairs{}) section.RegisterBlock(OxidizedCopper{}) section.RegisterBlock(WaxedWeatheredCutCopper{}) section.RegisterBlock(BlueTerracotta{}) section.RegisterBlock(Cobweb{}) section.RegisterBlock(PolishedGranite{}) section.RegisterBlock(BirchButton{}) section.RegisterBlock(CyanCandleCake{}) section.RegisterBlock(RedstoneBlock{}) section.RegisterBlock(MudBrickWall{}) section.RegisterBlock(PinkCandleCake{}) section.RegisterBlock(TuffBricks{}) section.RegisterBlock(WallTorch{}) section.RegisterBlock(Beacon{}) section.RegisterBlock(MangroveLog{}) section.RegisterBlock(RedTulip{}) section.RegisterBlock(WhiteShulkerBox{}) section.RegisterBlock(BigDripleaf{}) section.RegisterBlock(BrainCoral{}) section.RegisterBlock(ChiseledTuff{}) section.RegisterBlock(RedMushroom{}) section.RegisterBlock(SmoothStone{}) section.RegisterBlock(BlackStainedGlass{}) section.RegisterBlock(Poppy{}) section.RegisterBlock(PottedOrangeTulip{}) section.RegisterBlock(Ice{}) section.RegisterBlock(SprucePlanks{}) section.RegisterBlock(TuffWall{}) section.RegisterBlock(CrimsonFenceGate{}) section.RegisterBlock(EndStoneBrickSlab{}) section.RegisterBlock(SnowBlock{}) section.RegisterBlock(PolishedBlackstoneBrickSlab{}) section.RegisterBlock(TorchflowerCrop{}) section.RegisterBlock(WhiteCandleCake{}) section.RegisterBlock(BrownConcrete{}) section.RegisterBlock(ExposedCopperBulb{}) section.RegisterBlock(LightBlueBed{}) section.RegisterBlock(PottedTorchflower{}) section.RegisterBlock(RedCandle{}) section.RegisterBlock(BlackConcrete{}) section.RegisterBlock(Dandelion{}) section.RegisterBlock(PackedIce{}) section.RegisterBlock(DeepslateTileStairs{}) section.RegisterBlock(BrownWool{}) section.RegisterBlock(Fire{}) section.RegisterBlock(BirchFenceGate{}) section.RegisterBlock(PurpurPillar{}) section.RegisterBlock(SpruceFence{}) section.RegisterBlock(AmethystCluster{}) section.RegisterBlock(RepeatingCommandBlock{}) section.RegisterBlock(Vine{}) section.RegisterBlock(TallSeagrass{}) section.RegisterBlock(AcaciaLeaves{}) section.RegisterBlock(DarkOakWallSign{}) section.RegisterBlock(MushroomStem{}) section.RegisterBlock(CarvedPumpkin{}) section.RegisterBlock(NoteBlock{}) section.RegisterBlock(Stone{}) section.RegisterBlock(Chain{}) section.RegisterBlock(CherryTrapdoor{}) section.RegisterBlock(ChorusFlower{}) section.RegisterBlock(Glowstone{}) section.RegisterBlock(InfestedDeepslate{}) section.RegisterBlock(RedGlazedTerracotta{}) section.RegisterBlock(CrackedNetherBricks{}) section.RegisterBlock(DeadBrainCoralBlock{}) section.RegisterBlock(Diorite{}) section.RegisterBlock(CherryStairs{}) section.RegisterBlock(PolishedDioriteSlab{}) section.RegisterBlock(TuffBrickStairs{}) section.RegisterBlock(WaxedExposedCutCopperSlab{}) section.RegisterBlock(BirchSapling{}) section.RegisterBlock(BlueCandleCake{}) section.RegisterBlock(CherrySlab{}) section.RegisterBlock(CrimsonSign{}) section.RegisterBlock(PitcherPlant{}) section.RegisterBlock(RedNetherBrickStairs{}) section.RegisterBlock(CrackedStoneBricks{}) section.RegisterBlock(CutSandstoneSlab{}) section.RegisterBlock(LightBlueConcrete{}) section.RegisterBlock(PitcherCrop{}) section.RegisterBlock(LimeCandleCake{}) section.RegisterBlock(MangroveHangingSign{}) section.RegisterBlock(WaxedCopperDoor{}) section.RegisterBlock(DeepslateCoalOre{}) section.RegisterBlock(Light{}) section.RegisterBlock(LightGrayCandle{}) section.RegisterBlock(StoneStairs{}) section.RegisterBlock(EndRod{}) section.RegisterBlock(SmallDripleaf{}) section.RegisterBlock(SpruceButton{}) section.RegisterBlock(BeeNest{}) section.RegisterBlock(MagentaBed{}) section.RegisterBlock(OakPressurePlate{}) section.RegisterBlock(PiglinHead{}) section.RegisterBlock(SculkSensor{}) section.RegisterBlock(AttachedPumpkinStem{}) section.RegisterBlock(CrimsonPlanks{}) section.RegisterBlock(Frogspawn{}) section.RegisterBlock(GrayCandleCake{}) section.RegisterBlock(MangroveWallHangingSign{}) section.RegisterBlock(DeepslateBrickStairs{}) section.RegisterBlock(DeepslateEmeraldOre{}) section.RegisterBlock(Fern{}) section.RegisterBlock(WhiteStainedGlassPane{}) section.RegisterBlock(GrayStainedGlassPane{}) section.RegisterBlock(RedstoneTorch{}) section.RegisterBlock(StrippedCherryWood{}) section.RegisterBlock(CrimsonWallSign{}) section.RegisterBlock(InfestedMossyStoneBricks{}) section.RegisterBlock(PolishedBlackstone{}) section.RegisterBlock(Basalt{}) section.RegisterBlock(BrainCoralBlock{}) section.RegisterBlock(CherryButton{}) section.RegisterBlock(SpruceWood{}) section.RegisterBlock(StoneSlab{}) section.RegisterBlock(WarpedWallHangingSign{}) section.RegisterBlock(DarkOakButton{}) section.RegisterBlock(PottedWarpedRoots{}) section.RegisterBlock(QuartzBricks{}) section.RegisterBlock(PowderSnow{}) section.RegisterBlock(Cactus{}) section.RegisterBlock(CobbledDeepslateStairs{}) section.RegisterBlock(PinkTerracotta{}) section.RegisterBlock(SprucePressurePlate{}) section.RegisterBlock(AcaciaTrapdoor{}) section.RegisterBlock(EndPortalFrame{}) section.RegisterBlock(OrangeStainedGlassPane{}) section.RegisterBlock(Smoker{}) section.RegisterBlock(StrippedBirchLog{}) section.RegisterBlock(BoneBlock{}) section.RegisterBlock(BrainCoralWallFan{}) section.RegisterBlock(Bricks{}) section.RegisterBlock(OakSlab{}) section.RegisterBlock(BlueWallBanner{}) section.RegisterBlock(Chest{}) section.RegisterBlock(DeadBrainCoralWallFan{}) section.RegisterBlock(BirchWallHangingSign{}) section.RegisterBlock(HeavyCore{}) section.RegisterBlock(StrippedCherryLog{}) section.RegisterBlock(BrownMushroomBlock{}) section.RegisterBlock(DeadBubbleCoralBlock{}) section.RegisterBlock(LargeFern{}) section.RegisterBlock(RedSandstoneWall{}) section.RegisterBlock(Spawner{}) section.RegisterBlock(GrayCandle{}) section.RegisterBlock(JungleWood{}) section.RegisterBlock(OrangeConcretePowder{}) section.RegisterBlock(OrangeTulip{}) section.RegisterBlock(SpruceTrapdoor{}) section.RegisterBlock(Barrel{}) section.RegisterBlock(LightBlueShulkerBox{}) section.RegisterBlock(Lodestone{}) section.RegisterBlock(MagentaWool{}) section.RegisterBlock(OrangeCandleCake{}) section.RegisterBlock(ShulkerBox{}) section.RegisterBlock(SmoothSandstone{}) section.RegisterBlock(SoulWallTorch{}) section.RegisterBlock(BubbleCoralFan{}) section.RegisterBlock(ChainCommandBlock{}) section.RegisterBlock(HornCoralWallFan{}) section.RegisterBlock(Calcite{}) section.RegisterBlock(AcaciaWood{}) section.RegisterBlock(DeadBubbleCoralWallFan{}) section.RegisterBlock(Scaffolding{}) section.RegisterBlock(WarpedFence{}) section.RegisterBlock(JungleLeaves{}) section.RegisterBlock(LightWeightedPressurePlate{}) section.RegisterBlock(StrippedDarkOakWood{}) section.RegisterBlock(InfestedCrackedStoneBricks{}) section.RegisterBlock(PottedAcaciaSapling{}) section.RegisterBlock(RedstoneWire{}) section.RegisterBlock(WaxedExposedCopper{}) section.RegisterBlock(BambooTrapdoor{}) section.RegisterBlock(FireCoralFan{}) section.RegisterBlock(GrayStainedGlass{}) section.RegisterBlock(BirchWood{}) section.RegisterBlock(GreenStainedGlassPane{}) section.RegisterBlock(TrialSpawner{}) section.RegisterBlock(GreenCandleCake{}) section.RegisterBlock(OxidizedCutCopperStairs{}) section.RegisterBlock(PolishedDioriteStairs{}) section.RegisterBlock(OrangeCarpet{}) section.RegisterBlock(TrappedChest{}) section.RegisterBlock(WhiteWool{}) section.RegisterBlock(BlackGlazedTerracotta{}) section.RegisterBlock(ChiseledTuffBricks{}) section.RegisterBlock(NetherBrickWall{}) section.RegisterBlock(Obsidian{}) section.RegisterBlock(ZombieHead{}) section.RegisterBlock(BambooWallHangingSign{}) section.RegisterBlock(GrayBed{}) section.RegisterBlock(MossCarpet{}) section.RegisterBlock(WeepingVines{}) section.RegisterBlock(CobblestoneSlab{}) section.RegisterBlock(RedConcretePowder{}) section.RegisterBlock(WaxedWeatheredChiseledCopper{}) section.RegisterBlock(CutCopperSlab{}) section.RegisterBlock(DripstoneBlock{}) section.RegisterBlock(LightGrayGlazedTerracotta{}) section.RegisterBlock(OakHangingSign{}) section.RegisterBlock(CrimsonWallHangingSign{}) section.RegisterBlock(DarkOakLog{}) section.RegisterBlock(DarkOakWood{}) section.RegisterBlock(RootedDirt{}) section.RegisterBlock(WitherSkeletonWallSkull{}) section.RegisterBlock(BambooDoor{}) section.RegisterBlock(HornCoralFan{}) section.RegisterBlock(MagmaBlock{}) section.RegisterBlock(LightBlueTerracotta{}) section.RegisterBlock(LightGrayBanner{}) section.RegisterBlock(Netherrack{}) section.RegisterBlock(AndesiteSlab{}) section.RegisterBlock(BrownShulkerBox{}) section.RegisterBlock(DeepslateTileWall{}) section.RegisterBlock(BrickSlab{}) section.RegisterBlock(Conduit{}) section.RegisterBlock(FireCoralBlock{}) section.RegisterBlock(InfestedStoneBricks{}) section.RegisterBlock(BrickWall{}) section.RegisterBlock(GraniteWall{}) section.RegisterBlock(PottedBamboo{}) section.RegisterBlock(DeadHornCoral{}) section.RegisterBlock(QuartzPillar{}) section.RegisterBlock(WetSponge{}) section.RegisterBlock(BlackBed{}) section.RegisterBlock(BlackConcretePowder{}) section.RegisterBlock(CherryFenceGate{}) section.RegisterBlock(DarkOakFenceGate{}) section.RegisterBlock(SmoothRedSandstone{}) section.RegisterBlock(Stonecutter{}) section.RegisterBlock(TurtleEgg{}) section.RegisterBlock(DeadHornCoralFan{}) section.RegisterBlock(DeepslateGoldOre{}) section.RegisterBlock(MossyCobblestone{}) section.RegisterBlock(PolishedGraniteSlab{}) section.RegisterBlock(AcaciaSign{}) section.RegisterBlock(BrownMushroom{}) section.RegisterBlock(Grindstone{}) section.RegisterBlock(WhiteBanner{}) section.RegisterBlock(PinkGlazedTerracotta{}) section.RegisterBlock(Tnt{}) section.RegisterBlock(WarpedNylium{}) section.RegisterBlock(RedstoneOre{}) section.RegisterBlock(BlackCarpet{}) section.RegisterBlock(OakPlanks{}) section.RegisterBlock(RedConcrete{}) section.RegisterBlock(PrismarineSlab{}) section.RegisterBlock(BambooWallSign{}) section.RegisterBlock(DarkOakDoor{}) section.RegisterBlock(DeepslateDiamondOre{}) section.RegisterBlock(HornCoralBlock{}) section.RegisterBlock(RedNetherBricks{}) section.RegisterBlock(YellowWallBanner{}) section.RegisterBlock(LightBlueCandle{}) section.RegisterBlock(OxidizedCopperBulb{}) section.RegisterBlock(RawGoldBlock{}) section.RegisterBlock(WhiteStainedGlass{}) section.RegisterBlock(BrownBanner{}) section.RegisterBlock(CrimsonHangingSign{}) section.RegisterBlock(HoneyBlock{}) section.RegisterBlock(PrismarineBrickSlab{}) section.RegisterBlock(TubeCoral{}) section.RegisterBlock(WaxedWeatheredCutCopperStairs{}) section.RegisterBlock(Bamboo{}) section.RegisterBlock(MangrovePropagule{}) section.RegisterBlock(PottedJungleSapling{}) section.RegisterBlock(OxidizedCutCopper{}) section.RegisterBlock(RoseBush{}) section.RegisterBlock(WaxedWeatheredCopperGrate{}) section.RegisterBlock(RedSandstoneStairs{}) section.RegisterBlock(WarpedFungus{}) section.RegisterBlock(WaxedWeatheredCopper{}) section.RegisterBlock(AcaciaFence{}) section.RegisterBlock(MagentaTerracotta{}) section.RegisterBlock(PlayerHead{}) section.RegisterBlock(Dispenser{}) section.RegisterBlock(PottedDandelion{}) section.RegisterBlock(WeatheredCutCopper{}) section.RegisterBlock(AcaciaHangingSign{}) section.RegisterBlock(CherryFence{}) section.RegisterBlock(CrimsonPressurePlate{}) section.RegisterBlock(NetherBrickSlab{}) section.RegisterBlock(SpruceWallSign{}) section.RegisterBlock(WitherRose{}) section.RegisterBlock(BirchDoor{}) section.RegisterBlock(BlackCandle{}) section.RegisterBlock(CartographyTable{}) section.RegisterBlock(OakWood{}) section.RegisterBlock(TuffStairs{}) section.RegisterBlock(WeatheredCopperTrapdoor{}) section.RegisterBlock(PiglinWallHead{}) section.RegisterBlock(PurpleWool{}) section.RegisterBlock(StoneButton{}) section.RegisterBlock(WaxedOxidizedCutCopperStairs{}) section.RegisterBlock(AzureBluet{}) section.RegisterBlock(BlueConcretePowder{}) section.RegisterBlock(DeadFireCoralWallFan{}) section.RegisterBlock(SkeletonSkull{}) section.RegisterBlock(DarkOakLeaves{}) section.RegisterBlock(JungleHangingSign{}) section.RegisterBlock(MangroveSlab{}) section.RegisterBlock(CaveVines{}) section.RegisterBlock(Cocoa{}) section.RegisterBlock(JungleSign{}) section.RegisterBlock(Vault{}) section.RegisterBlock(WaxedChiseledCopper{}) section.RegisterBlock(BlackStainedGlassPane{}) section.RegisterBlock(FlowerPot{}) section.RegisterBlock(MangroveFence{}) section.RegisterBlock(WaxedCutCopperStairs{}) section.RegisterBlock(YellowBed{}) section.RegisterBlock(CyanCandle{}) section.RegisterBlock(GreenConcretePowder{}) section.RegisterBlock(PrismarineBricks{}) section.RegisterBlock(DarkOakPlanks{}) section.RegisterBlock(DeadFireCoral{}) section.RegisterBlock(Dirt{}) section.RegisterBlock(DragonEgg{}) section.RegisterBlock(FireCoralWallFan{}) section.RegisterBlock(Beehive{}) section.RegisterBlock(BrownCandleCake{}) section.RegisterBlock(Clay{}) section.RegisterBlock(MagentaCandleCake{}) section.RegisterBlock(OrangeWallBanner{}) section.RegisterBlock(LightningRod{}) section.RegisterBlock(MossyStoneBricks{}) section.RegisterBlock(OrangeTerracotta{}) section.RegisterBlock(PurpleConcrete{}) section.RegisterBlock(StrippedAcaciaLog{}) section.RegisterBlock(AndesiteWall{}) section.RegisterBlock(BlueGlazedTerracotta{}) section.RegisterBlock(CherryWallSign{}) section.RegisterBlock(ZombieWallHead{}) section.RegisterBlock(HornCoral{}) section.RegisterBlock(AcaciaPlanks{}) section.RegisterBlock(DaylightDetector{}) section.RegisterBlock(WaxedOxidizedCopper{}) section.RegisterBlock(RedstoneWallTorch{}) section.RegisterBlock(SmoothQuartz{}) section.RegisterBlock(EmeraldOre{}) section.RegisterBlock(HayBlock{}) section.RegisterBlock(OxidizedCopperDoor{}) section.RegisterBlock(MangroveWallSign{}) section.RegisterBlock(PearlescentFroglight{}) section.RegisterBlock(HangingRoots{}) section.RegisterBlock(InfestedCobblestone{}) section.RegisterBlock(Jigsaw{}) section.RegisterBlock(WarpedTrapdoor{}) section.RegisterBlock(ChiseledNetherBricks{}) section.RegisterBlock(HeavyWeightedPressurePlate{}) section.RegisterBlock(StrippedSpruceLog{}) section.RegisterBlock(RedBanner{}) section.RegisterBlock(StructureVoid{}) section.RegisterBlock(NetherBricks{}) section.RegisterBlock(PottedDarkOakSapling{}) section.RegisterBlock(PurpleStainedGlassPane{}) section.RegisterBlock(SmoothSandstoneSlab{}) section.RegisterBlock(FrostedIce{}) section.RegisterBlock(PolishedAndesiteStairs{}) section.RegisterBlock(PottedWitherRose{}) section.RegisterBlock(YellowBanner{}) section.RegisterBlock(YellowTerracotta{}) section.RegisterBlock(CopperBulb{}) section.RegisterBlock(DeadTubeCoralFan{}) section.RegisterBlock(OrangeCandle{}) section.RegisterBlock(CherryLog{}) section.RegisterBlock(MangroveDoor{}) section.RegisterBlock(DriedKelpBlock{}) section.RegisterBlock(StrippedJungleLog{}) section.RegisterBlock(MangroveStairs{}) section.RegisterBlock(OakButton{}) section.RegisterBlock(OakWallHangingSign{}) section.RegisterBlock(Repeater{}) section.RegisterBlock(BlackstoneStairs{}) section.RegisterBlock(CaveVinesPlant{}) section.RegisterBlock(NetherGoldOre{}) section.RegisterBlock(DarkOakHangingSign{}) section.RegisterBlock(Lava{}) section.RegisterBlock(LightGrayStainedGlass{}) section.RegisterBlock(Water{}) section.RegisterBlock(BambooBlock{}) section.RegisterBlock(BirchStairs{}) section.RegisterBlock(BlueStainedGlassPane{}) section.RegisterBlock(RedWallBanner{}) section.RegisterBlock(BlueBed{}) section.RegisterBlock(EndPortal{}) section.RegisterBlock(NetherSprouts{}) section.RegisterBlock(RedNetherBrickSlab{}) section.RegisterBlock(WaxedOxidizedChiseledCopper{}) section.RegisterBlock(DeadHornCoralWallFan{}) section.RegisterBlock(DeepslateCopperOre{}) section.RegisterBlock(JungleWallHangingSign{}) section.RegisterBlock(TuffBrickSlab{}) section.RegisterBlock(Bell{}) section.RegisterBlock(MediumAmethystBud{}) section.RegisterBlock(OakFenceGate{}) section.RegisterBlock(SpruceDoor{}) section.RegisterBlock(StrippedWarpedStem{}) section.RegisterBlock(WaxedExposedCopperDoor{}) section.RegisterBlock(Barrier{}) section.RegisterBlock(DeepslateBricks{}) section.RegisterBlock(ExposedChiseledCopper{}) section.RegisterBlock(WhiteBed{}) section.RegisterBlock(CherryHangingSign{}) section.RegisterBlock(StrippedSpruceWood{}) section.RegisterBlock(WaxedWeatheredCopperBulb{}) section.RegisterBlock(LimeCandle{}) section.RegisterBlock(MossyCobblestoneStairs{}) section.RegisterBlock(OxidizedCutCopperSlab{}) section.RegisterBlock(Sculk{}) section.RegisterBlock(BrownGlazedTerracotta{}) section.RegisterBlock(BuddingAmethyst{}) section.RegisterBlock(LavaCauldron{}) section.RegisterBlock(SeaLantern{}) section.RegisterBlock(BlackstoneWall{}) section.RegisterBlock(Campfire{}) section.RegisterBlock(LimeTerracotta{}) section.RegisterBlock(Jukebox{}) section.RegisterBlock(TuffSlab{}) section.RegisterBlock(MagentaGlazedTerracotta{}) section.RegisterBlock(RedBed{}) section.RegisterBlock(BlackstoneSlab{}) section.RegisterBlock(ChiseledCopper{}) section.RegisterBlock(Ladder{}) section.RegisterBlock(WarpedSign{}) section.RegisterBlock(BlueBanner{}) section.RegisterBlock(LightGrayTerracotta{}) section.RegisterBlock(NetherWart{}) section.RegisterBlock(PinkBanner{}) section.RegisterBlock(PinkCandle{}) section.RegisterBlock(PolishedBlackstoneButton{}) section.RegisterBlock(PrismarineStairs{}) section.RegisterBlock(BubbleCoral{}) section.RegisterBlock(CrimsonSlab{}) section.RegisterBlock(OakSign{}) section.RegisterBlock(LimeShulkerBox{}) section.RegisterBlock(BrownTerracotta{}) section.RegisterBlock(CrimsonStairs{}) section.RegisterBlock(GrayBanner{}) section.RegisterBlock(CoalBlock{}) section.RegisterBlock(CrimsonButton{}) section.RegisterBlock(StrippedMangroveLog{}) section.RegisterBlock(CherryDoor{}) section.RegisterBlock(PottedRedTulip{}) section.RegisterBlock(WarpedRoots{}) section.RegisterBlock(CrimsonDoor{}) section.RegisterBlock(JunglePlanks{}) section.RegisterBlock(CryingObsidian{}) section.RegisterBlock(SmoothRedSandstoneSlab{}) section.RegisterBlock(YellowStainedGlassPane{}) section.RegisterBlock(BambooStairs{}) section.RegisterBlock(BirchTrapdoor{}) section.RegisterBlock(Tripwire{}) section.RegisterBlock(Granite{}) section.RegisterBlock(LimeConcretePowder{}) section.RegisterBlock(PolishedBlackstoneWall{}) section.RegisterBlock(RedShulkerBox{}) section.RegisterBlock(WaxedExposedCopperBulb{}) section.RegisterBlock(WhiteTulip{}) section.RegisterBlock(BirchWallSign{}) section.RegisterBlock(CutRedSandstoneSlab{}) section.RegisterBlock(LightBlueCandleCake{}) section.RegisterBlock(PottedAllium{}) section.RegisterBlock(PottedBlueOrchid{}) section.RegisterBlock(OrangeGlazedTerracotta{}) section.RegisterBlock(PolishedTuffWall{}) section.RegisterBlock(CopperBlock{}) section.RegisterBlock(DarkOakTrapdoor{}) section.RegisterBlock(MudBrickSlab{}) } ================================================ FILE: server/world/block/acaciaButton.go ================================================ package block import ( "strconv" ) type AcaciaButton struct { Facing string Powered bool Face string } func (b AcaciaButton) Encode() (string, BlockProperties) { return "minecraft:acacia_button", BlockProperties{ "face": b.Face, "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), } } func (b AcaciaButton) New(props BlockProperties) Block { return AcaciaButton{ Face: props["face"], Facing: props["facing"], Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/acaciaDoor.go ================================================ package block import ( "strconv" ) type AcaciaDoor struct { Open bool Powered bool Facing string Half string Hinge string } func (b AcaciaDoor) Encode() (string, BlockProperties) { return "minecraft:acacia_door", BlockProperties{ "facing": b.Facing, "half": b.Half, "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), } } func (b AcaciaDoor) New(props BlockProperties) Block { return AcaciaDoor{ Hinge: props["hinge"], Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/acaciaFence.go ================================================ package block import ( "strconv" ) type AcaciaFence struct { South bool Waterlogged bool West bool East bool North bool } func (b AcaciaFence) Encode() (string, BlockProperties) { return "minecraft:acacia_fence", BlockProperties{ "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), } } func (b AcaciaFence) New(props BlockProperties) Block { return AcaciaFence{ South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", } } ================================================ FILE: server/world/block/acaciaFenceGate.go ================================================ package block import ( "strconv" ) type AcaciaFenceGate struct { InWall bool Open bool Powered bool Facing string } func (b AcaciaFenceGate) Encode() (string, BlockProperties) { return "minecraft:acacia_fence_gate", BlockProperties{ "in_wall": strconv.FormatBool(b.InWall), "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, } } func (b AcaciaFenceGate) New(props BlockProperties) Block { return AcaciaFenceGate{ InWall: props["in_wall"] != "false", Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/acaciaHangingSign.go ================================================ package block import ( "strconv" ) type AcaciaHangingSign struct { Attached bool Rotation int Waterlogged bool } func (b AcaciaHangingSign) Encode() (string, BlockProperties) { return "minecraft:acacia_hanging_sign", BlockProperties{ "attached": strconv.FormatBool(b.Attached), "rotation": strconv.Itoa(b.Rotation), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b AcaciaHangingSign) New(props BlockProperties) Block { return AcaciaHangingSign{ Attached: props["attached"] != "false", Rotation: atoi(props["rotation"]), Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/acaciaLeaves.go ================================================ package block import ( "strconv" ) type AcaciaLeaves struct { Waterlogged bool Distance int Persistent bool } func (b AcaciaLeaves) Encode() (string, BlockProperties) { return "minecraft:acacia_leaves", BlockProperties{ "distance": strconv.Itoa(b.Distance), "persistent": strconv.FormatBool(b.Persistent), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b AcaciaLeaves) New(props BlockProperties) Block { return AcaciaLeaves{ Persistent: props["persistent"] != "false", Waterlogged: props["waterlogged"] != "false", Distance: atoi(props["distance"]), } } ================================================ FILE: server/world/block/acaciaLog.go ================================================ package block type AcaciaLog struct { Axis string } func (b AcaciaLog) Encode() (string, BlockProperties) { return "minecraft:acacia_log", BlockProperties{ "axis": b.Axis, } } func (b AcaciaLog) New(props BlockProperties) Block { return AcaciaLog{ Axis: props["axis"], } } ================================================ FILE: server/world/block/acaciaPlanks.go ================================================ package block type AcaciaPlanks struct { } func (b AcaciaPlanks) Encode() (string, BlockProperties) { return "minecraft:acacia_planks", BlockProperties{} } func (b AcaciaPlanks) New(props BlockProperties) Block { return AcaciaPlanks{} } ================================================ FILE: server/world/block/acaciaPressurePlate.go ================================================ package block import ( "strconv" ) type AcaciaPressurePlate struct { Powered bool } func (b AcaciaPressurePlate) Encode() (string, BlockProperties) { return "minecraft:acacia_pressure_plate", BlockProperties{ "powered": strconv.FormatBool(b.Powered), } } func (b AcaciaPressurePlate) New(props BlockProperties) Block { return AcaciaPressurePlate{ Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/acaciaSapling.go ================================================ package block import ( "strconv" ) type AcaciaSapling struct { Stage int } func (b AcaciaSapling) Encode() (string, BlockProperties) { return "minecraft:acacia_sapling", BlockProperties{ "stage": strconv.Itoa(b.Stage), } } func (b AcaciaSapling) New(props BlockProperties) Block { return AcaciaSapling{ Stage: atoi(props["stage"]), } } ================================================ FILE: server/world/block/acaciaSign.go ================================================ package block import ( "strconv" ) type AcaciaSign struct { Rotation int Waterlogged bool } func (b AcaciaSign) Encode() (string, BlockProperties) { return "minecraft:acacia_sign", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b AcaciaSign) New(props BlockProperties) Block { return AcaciaSign{ Rotation: atoi(props["rotation"]), Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/acaciaSlab.go ================================================ package block import ( "strconv" ) type AcaciaSlab struct { Type string Waterlogged bool } func (b AcaciaSlab) Encode() (string, BlockProperties) { return "minecraft:acacia_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b AcaciaSlab) New(props BlockProperties) Block { return AcaciaSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/acaciaStairs.go ================================================ package block import ( "strconv" ) type AcaciaStairs struct { Facing string Half string Shape string Waterlogged bool } func (b AcaciaStairs) Encode() (string, BlockProperties) { return "minecraft:acacia_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b AcaciaStairs) New(props BlockProperties) Block { return AcaciaStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/acaciaTrapdoor.go ================================================ package block import ( "strconv" ) type AcaciaTrapdoor struct { Waterlogged bool Facing string Half string Open bool Powered bool } func (b AcaciaTrapdoor) Encode() (string, BlockProperties) { return "minecraft:acacia_trapdoor", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), } } func (b AcaciaTrapdoor) New(props BlockProperties) Block { return AcaciaTrapdoor{ Half: props["half"], Open: props["open"] != "false", Powered: props["powered"] != "false", Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/acaciaWallHangingSign.go ================================================ package block import ( "strconv" ) type AcaciaWallHangingSign struct { Facing string Waterlogged bool } func (b AcaciaWallHangingSign) Encode() (string, BlockProperties) { return "minecraft:acacia_wall_hanging_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b AcaciaWallHangingSign) New(props BlockProperties) Block { return AcaciaWallHangingSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/acaciaWallSign.go ================================================ package block import ( "strconv" ) type AcaciaWallSign struct { Facing string Waterlogged bool } func (b AcaciaWallSign) Encode() (string, BlockProperties) { return "minecraft:acacia_wall_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b AcaciaWallSign) New(props BlockProperties) Block { return AcaciaWallSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/acaciaWood.go ================================================ package block type AcaciaWood struct { Axis string } func (b AcaciaWood) Encode() (string, BlockProperties) { return "minecraft:acacia_wood", BlockProperties{ "axis": b.Axis, } } func (b AcaciaWood) New(props BlockProperties) Block { return AcaciaWood{ Axis: props["axis"], } } ================================================ FILE: server/world/block/activatorRail.go ================================================ package block import ( "strconv" ) type ActivatorRail struct { Powered bool Shape string Waterlogged bool } func (b ActivatorRail) Encode() (string, BlockProperties) { return "minecraft:activator_rail", BlockProperties{ "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "powered": strconv.FormatBool(b.Powered), } } func (b ActivatorRail) New(props BlockProperties) Block { return ActivatorRail{ Powered: props["powered"] != "false", Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/air.go ================================================ package block type Air struct { } func (b Air) Encode() (string, BlockProperties) { return "minecraft:air", BlockProperties{} } func (b Air) New(props BlockProperties) Block { return Air{} } ================================================ FILE: server/world/block/allium.go ================================================ package block type Allium struct { } func (b Allium) Encode() (string, BlockProperties) { return "minecraft:allium", BlockProperties{} } func (b Allium) New(props BlockProperties) Block { return Allium{} } ================================================ FILE: server/world/block/amethystBlock.go ================================================ package block type AmethystBlock struct { } func (b AmethystBlock) Encode() (string, BlockProperties) { return "minecraft:amethyst_block", BlockProperties{} } func (b AmethystBlock) New(props BlockProperties) Block { return AmethystBlock{} } ================================================ FILE: server/world/block/amethystCluster.go ================================================ package block import ( "strconv" ) type AmethystCluster struct { Waterlogged bool Facing string } func (b AmethystCluster) Encode() (string, BlockProperties) { return "minecraft:amethyst_cluster", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b AmethystCluster) New(props BlockProperties) Block { return AmethystCluster{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/ancientDebris.go ================================================ package block type AncientDebris struct { } func (b AncientDebris) Encode() (string, BlockProperties) { return "minecraft:ancient_debris", BlockProperties{} } func (b AncientDebris) New(props BlockProperties) Block { return AncientDebris{} } ================================================ FILE: server/world/block/andesite.go ================================================ package block type Andesite struct { } func (b Andesite) Encode() (string, BlockProperties) { return "minecraft:andesite", BlockProperties{} } func (b Andesite) New(props BlockProperties) Block { return Andesite{} } ================================================ FILE: server/world/block/andesiteSlab.go ================================================ package block import ( "strconv" ) type AndesiteSlab struct { Waterlogged bool Type string } func (b AndesiteSlab) Encode() (string, BlockProperties) { return "minecraft:andesite_slab", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "type": b.Type, } } func (b AndesiteSlab) New(props BlockProperties) Block { return AndesiteSlab{ Waterlogged: props["waterlogged"] != "false", Type: props["type"], } } ================================================ FILE: server/world/block/andesiteStairs.go ================================================ package block import ( "strconv" ) type AndesiteStairs struct { Shape string Waterlogged bool Facing string Half string } func (b AndesiteStairs) Encode() (string, BlockProperties) { return "minecraft:andesite_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b AndesiteStairs) New(props BlockProperties) Block { return AndesiteStairs{ Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/andesiteWall.go ================================================ package block import ( "strconv" ) type AndesiteWall struct { North string South string Up bool Waterlogged bool West string East string } func (b AndesiteWall) Encode() (string, BlockProperties) { return "minecraft:andesite_wall", BlockProperties{ "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, "north": b.North, "south": b.South, } } func (b AndesiteWall) New(props BlockProperties) Block { return AndesiteWall{ East: props["east"], North: props["north"], South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], } } ================================================ FILE: server/world/block/anvil.go ================================================ package block type Anvil struct { Facing string } func (b Anvil) Encode() (string, BlockProperties) { return "minecraft:anvil", BlockProperties{ "facing": b.Facing, } } func (b Anvil) New(props BlockProperties) Block { return Anvil{ Facing: props["facing"], } } ================================================ FILE: server/world/block/attachedMelonStem.go ================================================ package block type AttachedMelonStem struct { Facing string } func (b AttachedMelonStem) Encode() (string, BlockProperties) { return "minecraft:attached_melon_stem", BlockProperties{ "facing": b.Facing, } } func (b AttachedMelonStem) New(props BlockProperties) Block { return AttachedMelonStem{ Facing: props["facing"], } } ================================================ FILE: server/world/block/attachedPumpkinStem.go ================================================ package block type AttachedPumpkinStem struct { Facing string } func (b AttachedPumpkinStem) Encode() (string, BlockProperties) { return "minecraft:attached_pumpkin_stem", BlockProperties{ "facing": b.Facing, } } func (b AttachedPumpkinStem) New(props BlockProperties) Block { return AttachedPumpkinStem{ Facing: props["facing"], } } ================================================ FILE: server/world/block/azalea.go ================================================ package block type Azalea struct { } func (b Azalea) Encode() (string, BlockProperties) { return "minecraft:azalea", BlockProperties{} } func (b Azalea) New(props BlockProperties) Block { return Azalea{} } ================================================ FILE: server/world/block/azaleaLeaves.go ================================================ package block import ( "strconv" ) type AzaleaLeaves struct { Persistent bool Waterlogged bool Distance int } func (b AzaleaLeaves) Encode() (string, BlockProperties) { return "minecraft:azalea_leaves", BlockProperties{ "persistent": strconv.FormatBool(b.Persistent), "waterlogged": strconv.FormatBool(b.Waterlogged), "distance": strconv.Itoa(b.Distance), } } func (b AzaleaLeaves) New(props BlockProperties) Block { return AzaleaLeaves{ Persistent: props["persistent"] != "false", Waterlogged: props["waterlogged"] != "false", Distance: atoi(props["distance"]), } } ================================================ FILE: server/world/block/azureBluet.go ================================================ package block type AzureBluet struct { } func (b AzureBluet) Encode() (string, BlockProperties) { return "minecraft:azure_bluet", BlockProperties{} } func (b AzureBluet) New(props BlockProperties) Block { return AzureBluet{} } ================================================ FILE: server/world/block/bamboo.go ================================================ package block import ( "strconv" ) type Bamboo struct { Age int Leaves string Stage int } func (b Bamboo) Encode() (string, BlockProperties) { return "minecraft:bamboo", BlockProperties{ "stage": strconv.Itoa(b.Stage), "age": strconv.Itoa(b.Age), "leaves": b.Leaves, } } func (b Bamboo) New(props BlockProperties) Block { return Bamboo{ Age: atoi(props["age"]), Leaves: props["leaves"], Stage: atoi(props["stage"]), } } ================================================ FILE: server/world/block/bambooBlock.go ================================================ package block type BambooBlock struct { Axis string } func (b BambooBlock) Encode() (string, BlockProperties) { return "minecraft:bamboo_block", BlockProperties{ "axis": b.Axis, } } func (b BambooBlock) New(props BlockProperties) Block { return BambooBlock{ Axis: props["axis"], } } ================================================ FILE: server/world/block/bambooButton.go ================================================ package block import ( "strconv" ) type BambooButton struct { Face string Facing string Powered bool } func (b BambooButton) Encode() (string, BlockProperties) { return "minecraft:bamboo_button", BlockProperties{ "face": b.Face, "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), } } func (b BambooButton) New(props BlockProperties) Block { return BambooButton{ Facing: props["facing"], Powered: props["powered"] != "false", Face: props["face"], } } ================================================ FILE: server/world/block/bambooDoor.go ================================================ package block import ( "strconv" ) type BambooDoor struct { Powered bool Facing string Half string Hinge string Open bool } func (b BambooDoor) Encode() (string, BlockProperties) { return "minecraft:bamboo_door", BlockProperties{ "half": b.Half, "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, } } func (b BambooDoor) New(props BlockProperties) Block { return BambooDoor{ Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], Half: props["half"], Hinge: props["hinge"], } } ================================================ FILE: server/world/block/bambooFence.go ================================================ package block import ( "strconv" ) type BambooFence struct { South bool Waterlogged bool West bool East bool North bool } func (b BambooFence) Encode() (string, BlockProperties) { return "minecraft:bamboo_fence", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), } } func (b BambooFence) New(props BlockProperties) Block { return BambooFence{ Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", } } ================================================ FILE: server/world/block/bambooFenceGate.go ================================================ package block import ( "strconv" ) type BambooFenceGate struct { Open bool Powered bool Facing string InWall bool } func (b BambooFenceGate) Encode() (string, BlockProperties) { return "minecraft:bamboo_fence_gate", BlockProperties{ "facing": b.Facing, "in_wall": strconv.FormatBool(b.InWall), "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), } } func (b BambooFenceGate) New(props BlockProperties) Block { return BambooFenceGate{ Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], InWall: props["in_wall"] != "false", } } ================================================ FILE: server/world/block/bambooHangingSign.go ================================================ package block import ( "strconv" ) type BambooHangingSign struct { Attached bool Rotation int Waterlogged bool } func (b BambooHangingSign) Encode() (string, BlockProperties) { return "minecraft:bamboo_hanging_sign", BlockProperties{ "attached": strconv.FormatBool(b.Attached), "rotation": strconv.Itoa(b.Rotation), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BambooHangingSign) New(props BlockProperties) Block { return BambooHangingSign{ Attached: props["attached"] != "false", Rotation: atoi(props["rotation"]), Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/bambooMosaic.go ================================================ package block type BambooMosaic struct { } func (b BambooMosaic) Encode() (string, BlockProperties) { return "minecraft:bamboo_mosaic", BlockProperties{} } func (b BambooMosaic) New(props BlockProperties) Block { return BambooMosaic{} } ================================================ FILE: server/world/block/bambooMosaicSlab.go ================================================ package block import ( "strconv" ) type BambooMosaicSlab struct { Type string Waterlogged bool } func (b BambooMosaicSlab) Encode() (string, BlockProperties) { return "minecraft:bamboo_mosaic_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BambooMosaicSlab) New(props BlockProperties) Block { return BambooMosaicSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/bambooMosaicStairs.go ================================================ package block import ( "strconv" ) type BambooMosaicStairs struct { Half string Shape string Waterlogged bool Facing string } func (b BambooMosaicStairs) Encode() (string, BlockProperties) { return "minecraft:bamboo_mosaic_stairs", BlockProperties{ "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b BambooMosaicStairs) New(props BlockProperties) Block { return BambooMosaicStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/bambooPlanks.go ================================================ package block type BambooPlanks struct { } func (b BambooPlanks) Encode() (string, BlockProperties) { return "minecraft:bamboo_planks", BlockProperties{} } func (b BambooPlanks) New(props BlockProperties) Block { return BambooPlanks{} } ================================================ FILE: server/world/block/bambooPressurePlate.go ================================================ package block import ( "strconv" ) type BambooPressurePlate struct { Powered bool } func (b BambooPressurePlate) Encode() (string, BlockProperties) { return "minecraft:bamboo_pressure_plate", BlockProperties{ "powered": strconv.FormatBool(b.Powered), } } func (b BambooPressurePlate) New(props BlockProperties) Block { return BambooPressurePlate{ Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/bambooSapling.go ================================================ package block type BambooSapling struct { } func (b BambooSapling) Encode() (string, BlockProperties) { return "minecraft:bamboo_sapling", BlockProperties{} } func (b BambooSapling) New(props BlockProperties) Block { return BambooSapling{} } ================================================ FILE: server/world/block/bambooSign.go ================================================ package block import ( "strconv" ) type BambooSign struct { Waterlogged bool Rotation int } func (b BambooSign) Encode() (string, BlockProperties) { return "minecraft:bamboo_sign", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BambooSign) New(props BlockProperties) Block { return BambooSign{ Rotation: atoi(props["rotation"]), Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/bambooSlab.go ================================================ package block import ( "strconv" ) type BambooSlab struct { Type string Waterlogged bool } func (b BambooSlab) Encode() (string, BlockProperties) { return "minecraft:bamboo_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BambooSlab) New(props BlockProperties) Block { return BambooSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/bambooStairs.go ================================================ package block import ( "strconv" ) type BambooStairs struct { Waterlogged bool Facing string Half string Shape string } func (b BambooStairs) Encode() (string, BlockProperties) { return "minecraft:bamboo_stairs", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, "shape": b.Shape, } } func (b BambooStairs) New(props BlockProperties) Block { return BambooStairs{ Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/bambooTrapdoor.go ================================================ package block import ( "strconv" ) type BambooTrapdoor struct { Facing string Half string Open bool Powered bool Waterlogged bool } func (b BambooTrapdoor) Encode() (string, BlockProperties) { return "minecraft:bamboo_trapdoor", BlockProperties{ "facing": b.Facing, "half": b.Half, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BambooTrapdoor) New(props BlockProperties) Block { return BambooTrapdoor{ Open: props["open"] != "false", Powered: props["powered"] != "false", Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/bambooWallHangingSign.go ================================================ package block import ( "strconv" ) type BambooWallHangingSign struct { Facing string Waterlogged bool } func (b BambooWallHangingSign) Encode() (string, BlockProperties) { return "minecraft:bamboo_wall_hanging_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BambooWallHangingSign) New(props BlockProperties) Block { return BambooWallHangingSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/bambooWallSign.go ================================================ package block import ( "strconv" ) type BambooWallSign struct { Facing string Waterlogged bool } func (b BambooWallSign) Encode() (string, BlockProperties) { return "minecraft:bamboo_wall_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BambooWallSign) New(props BlockProperties) Block { return BambooWallSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/barrel.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Barrel struct { Facing string Open bool } func (b Barrel) Encode() (string, BlockProperties) { return "minecraft:barrel", BlockProperties{ "facing": b.Facing, "open": strconv.FormatBool(b.Open), } } func (b Barrel) New(props BlockProperties) Block { return Barrel{ Facing: props["facing"], Open: props["open"] != "false", } } func (b Barrel) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:barrel", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/barrier.go ================================================ package block import ( "strconv" ) type Barrier struct { Waterlogged bool } func (b Barrier) Encode() (string, BlockProperties) { return "minecraft:barrier", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b Barrier) New(props BlockProperties) Block { return Barrier{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/basalt.go ================================================ package block type Basalt struct { Axis string } func (b Basalt) Encode() (string, BlockProperties) { return "minecraft:basalt", BlockProperties{ "axis": b.Axis, } } func (b Basalt) New(props BlockProperties) Block { return Basalt{ Axis: props["axis"], } } ================================================ FILE: server/world/block/beacon.go ================================================ package block import ( "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Beacon struct { } func (b Beacon) Encode() (string, BlockProperties) { return "minecraft:beacon", BlockProperties{} } func (b Beacon) New(props BlockProperties) Block { return Beacon{} } func (b Beacon) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:beacon", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/bedrock.go ================================================ package block type Bedrock struct { } func (b Bedrock) Encode() (string, BlockProperties) { return "minecraft:bedrock", BlockProperties{} } func (b Bedrock) New(props BlockProperties) Block { return Bedrock{} } ================================================ FILE: server/world/block/beeNest.go ================================================ package block import ( "strconv" ) type BeeNest struct { Facing string HoneyLevel int } func (b BeeNest) Encode() (string, BlockProperties) { return "minecraft:bee_nest", BlockProperties{ "facing": b.Facing, "honey_level": strconv.Itoa(b.HoneyLevel), } } func (b BeeNest) New(props BlockProperties) Block { return BeeNest{ Facing: props["facing"], HoneyLevel: atoi(props["honey_level"]), } } ================================================ FILE: server/world/block/beehive.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Beehive struct { Facing string HoneyLevel int } func (b Beehive) Encode() (string, BlockProperties) { return "minecraft:beehive", BlockProperties{ "facing": b.Facing, "honey_level": strconv.Itoa(b.HoneyLevel), } } func (b Beehive) New(props BlockProperties) Block { return Beehive{ Facing: props["facing"], HoneyLevel: atoi(props["honey_level"]), } } func (b Beehive) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:beehive", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/beetroots.go ================================================ package block import ( "strconv" ) type Beetroots struct { Age int } func (b Beetroots) Encode() (string, BlockProperties) { return "minecraft:beetroots", BlockProperties{ "age": strconv.Itoa(b.Age), } } func (b Beetroots) New(props BlockProperties) Block { return Beetroots{ Age: atoi(props["age"]), } } ================================================ FILE: server/world/block/bell.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Bell struct { Facing string Powered bool Attachment string } func (b Bell) Encode() (string, BlockProperties) { return "minecraft:bell", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "attachment": b.Attachment, "facing": b.Facing, } } func (b Bell) New(props BlockProperties) Block { return Bell{ Facing: props["facing"], Powered: props["powered"] != "false", Attachment: props["attachment"], } } func (b Bell) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:bell", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/bigDripleaf.go ================================================ package block import ( "strconv" ) type BigDripleaf struct { Tilt string Waterlogged bool Facing string } func (b BigDripleaf) Encode() (string, BlockProperties) { return "minecraft:big_dripleaf", BlockProperties{ "facing": b.Facing, "tilt": b.Tilt, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BigDripleaf) New(props BlockProperties) Block { return BigDripleaf{ Facing: props["facing"], Tilt: props["tilt"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/bigDripleafStem.go ================================================ package block import ( "strconv" ) type BigDripleafStem struct { Facing string Waterlogged bool } func (b BigDripleafStem) Encode() (string, BlockProperties) { return "minecraft:big_dripleaf_stem", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BigDripleafStem) New(props BlockProperties) Block { return BigDripleafStem{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/birchButton.go ================================================ package block import ( "strconv" ) type BirchButton struct { Face string Facing string Powered bool } func (b BirchButton) Encode() (string, BlockProperties) { return "minecraft:birch_button", BlockProperties{ "face": b.Face, "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), } } func (b BirchButton) New(props BlockProperties) Block { return BirchButton{ Face: props["face"], Facing: props["facing"], Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/birchDoor.go ================================================ package block import ( "strconv" ) type BirchDoor struct { Facing string Half string Hinge string Open bool Powered bool } func (b BirchDoor) Encode() (string, BlockProperties) { return "minecraft:birch_door", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, "half": b.Half, "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), } } func (b BirchDoor) New(props BlockProperties) Block { return BirchDoor{ Hinge: props["hinge"], Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/birchFence.go ================================================ package block import ( "strconv" ) type BirchFence struct { West bool East bool North bool South bool Waterlogged bool } func (b BirchFence) Encode() (string, BlockProperties) { return "minecraft:birch_fence", BlockProperties{ "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), } } func (b BirchFence) New(props BlockProperties) Block { return BirchFence{ North: props["north"] != "false", South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", } } ================================================ FILE: server/world/block/birchFenceGate.go ================================================ package block import ( "strconv" ) type BirchFenceGate struct { Facing string InWall bool Open bool Powered bool } func (b BirchFenceGate) Encode() (string, BlockProperties) { return "minecraft:birch_fence_gate", BlockProperties{ "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, "in_wall": strconv.FormatBool(b.InWall), } } func (b BirchFenceGate) New(props BlockProperties) Block { return BirchFenceGate{ Facing: props["facing"], InWall: props["in_wall"] != "false", Open: props["open"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/birchHangingSign.go ================================================ package block import ( "strconv" ) type BirchHangingSign struct { Waterlogged bool Attached bool Rotation int } func (b BirchHangingSign) Encode() (string, BlockProperties) { return "minecraft:birch_hanging_sign", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "attached": strconv.FormatBool(b.Attached), "rotation": strconv.Itoa(b.Rotation), } } func (b BirchHangingSign) New(props BlockProperties) Block { return BirchHangingSign{ Attached: props["attached"] != "false", Rotation: atoi(props["rotation"]), Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/birchLeaves.go ================================================ package block import ( "strconv" ) type BirchLeaves struct { Persistent bool Waterlogged bool Distance int } func (b BirchLeaves) Encode() (string, BlockProperties) { return "minecraft:birch_leaves", BlockProperties{ "persistent": strconv.FormatBool(b.Persistent), "waterlogged": strconv.FormatBool(b.Waterlogged), "distance": strconv.Itoa(b.Distance), } } func (b BirchLeaves) New(props BlockProperties) Block { return BirchLeaves{ Persistent: props["persistent"] != "false", Waterlogged: props["waterlogged"] != "false", Distance: atoi(props["distance"]), } } ================================================ FILE: server/world/block/birchLog.go ================================================ package block type BirchLog struct { Axis string } func (b BirchLog) Encode() (string, BlockProperties) { return "minecraft:birch_log", BlockProperties{ "axis": b.Axis, } } func (b BirchLog) New(props BlockProperties) Block { return BirchLog{ Axis: props["axis"], } } ================================================ FILE: server/world/block/birchPlanks.go ================================================ package block type BirchPlanks struct { } func (b BirchPlanks) Encode() (string, BlockProperties) { return "minecraft:birch_planks", BlockProperties{} } func (b BirchPlanks) New(props BlockProperties) Block { return BirchPlanks{} } ================================================ FILE: server/world/block/birchPressurePlate.go ================================================ package block import ( "strconv" ) type BirchPressurePlate struct { Powered bool } func (b BirchPressurePlate) Encode() (string, BlockProperties) { return "minecraft:birch_pressure_plate", BlockProperties{ "powered": strconv.FormatBool(b.Powered), } } func (b BirchPressurePlate) New(props BlockProperties) Block { return BirchPressurePlate{ Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/birchSapling.go ================================================ package block import ( "strconv" ) type BirchSapling struct { Stage int } func (b BirchSapling) Encode() (string, BlockProperties) { return "minecraft:birch_sapling", BlockProperties{ "stage": strconv.Itoa(b.Stage), } } func (b BirchSapling) New(props BlockProperties) Block { return BirchSapling{ Stage: atoi(props["stage"]), } } ================================================ FILE: server/world/block/birchSign.go ================================================ package block import ( "strconv" ) type BirchSign struct { Rotation int Waterlogged bool } func (b BirchSign) Encode() (string, BlockProperties) { return "minecraft:birch_sign", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "rotation": strconv.Itoa(b.Rotation), } } func (b BirchSign) New(props BlockProperties) Block { return BirchSign{ Waterlogged: props["waterlogged"] != "false", Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/birchSlab.go ================================================ package block import ( "strconv" ) type BirchSlab struct { Type string Waterlogged bool } func (b BirchSlab) Encode() (string, BlockProperties) { return "minecraft:birch_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BirchSlab) New(props BlockProperties) Block { return BirchSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/birchStairs.go ================================================ package block import ( "strconv" ) type BirchStairs struct { Waterlogged bool Facing string Half string Shape string } func (b BirchStairs) Encode() (string, BlockProperties) { return "minecraft:birch_stairs", BlockProperties{ "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, } } func (b BirchStairs) New(props BlockProperties) Block { return BirchStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/birchTrapdoor.go ================================================ package block import ( "strconv" ) type BirchTrapdoor struct { Powered bool Waterlogged bool Facing string Half string Open bool } func (b BirchTrapdoor) Encode() (string, BlockProperties) { return "minecraft:birch_trapdoor", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), } } func (b BirchTrapdoor) New(props BlockProperties) Block { return BirchTrapdoor{ Half: props["half"], Open: props["open"] != "false", Powered: props["powered"] != "false", Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/birchWallHangingSign.go ================================================ package block import ( "strconv" ) type BirchWallHangingSign struct { Facing string Waterlogged bool } func (b BirchWallHangingSign) Encode() (string, BlockProperties) { return "minecraft:birch_wall_hanging_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BirchWallHangingSign) New(props BlockProperties) Block { return BirchWallHangingSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/birchWallSign.go ================================================ package block import ( "strconv" ) type BirchWallSign struct { Facing string Waterlogged bool } func (b BirchWallSign) Encode() (string, BlockProperties) { return "minecraft:birch_wall_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BirchWallSign) New(props BlockProperties) Block { return BirchWallSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/birchWood.go ================================================ package block type BirchWood struct { Axis string } func (b BirchWood) Encode() (string, BlockProperties) { return "minecraft:birch_wood", BlockProperties{ "axis": b.Axis, } } func (b BirchWood) New(props BlockProperties) Block { return BirchWood{ Axis: props["axis"], } } ================================================ FILE: server/world/block/blackBanner.go ================================================ package block import ( "strconv" ) type BlackBanner struct { Rotation int } func (b BlackBanner) Encode() (string, BlockProperties) { return "minecraft:black_banner", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), } } func (b BlackBanner) New(props BlockProperties) Block { return BlackBanner{ Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/blackBed.go ================================================ package block import ( "strconv" ) type BlackBed struct { Occupied bool Part string Facing string } func (b BlackBed) Encode() (string, BlockProperties) { return "minecraft:black_bed", BlockProperties{ "facing": b.Facing, "occupied": strconv.FormatBool(b.Occupied), "part": b.Part, } } func (b BlackBed) New(props BlockProperties) Block { return BlackBed{ Facing: props["facing"], Occupied: props["occupied"] != "false", Part: props["part"], } } ================================================ FILE: server/world/block/blackCandle.go ================================================ package block import ( "strconv" ) type BlackCandle struct { Candles int Lit bool Waterlogged bool } func (b BlackCandle) Encode() (string, BlockProperties) { return "minecraft:black_candle", BlockProperties{ "candles": strconv.Itoa(b.Candles), "lit": strconv.FormatBool(b.Lit), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BlackCandle) New(props BlockProperties) Block { return BlackCandle{ Candles: atoi(props["candles"]), Lit: props["lit"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/blackCandleCake.go ================================================ package block import ( "strconv" ) type BlackCandleCake struct { Lit bool } func (b BlackCandleCake) Encode() (string, BlockProperties) { return "minecraft:black_candle_cake", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b BlackCandleCake) New(props BlockProperties) Block { return BlackCandleCake{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/blackCarpet.go ================================================ package block type BlackCarpet struct { } func (b BlackCarpet) Encode() (string, BlockProperties) { return "minecraft:black_carpet", BlockProperties{} } func (b BlackCarpet) New(props BlockProperties) Block { return BlackCarpet{} } ================================================ FILE: server/world/block/blackConcrete.go ================================================ package block type BlackConcrete struct { } func (b BlackConcrete) Encode() (string, BlockProperties) { return "minecraft:black_concrete", BlockProperties{} } func (b BlackConcrete) New(props BlockProperties) Block { return BlackConcrete{} } ================================================ FILE: server/world/block/blackConcretePowder.go ================================================ package block type BlackConcretePowder struct { } func (b BlackConcretePowder) Encode() (string, BlockProperties) { return "minecraft:black_concrete_powder", BlockProperties{} } func (b BlackConcretePowder) New(props BlockProperties) Block { return BlackConcretePowder{} } ================================================ FILE: server/world/block/blackGlazedTerracotta.go ================================================ package block type BlackGlazedTerracotta struct { Facing string } func (b BlackGlazedTerracotta) Encode() (string, BlockProperties) { return "minecraft:black_glazed_terracotta", BlockProperties{ "facing": b.Facing, } } func (b BlackGlazedTerracotta) New(props BlockProperties) Block { return BlackGlazedTerracotta{ Facing: props["facing"], } } ================================================ FILE: server/world/block/blackShulkerBox.go ================================================ package block type BlackShulkerBox struct { Facing string } func (b BlackShulkerBox) Encode() (string, BlockProperties) { return "minecraft:black_shulker_box", BlockProperties{ "facing": b.Facing, } } func (b BlackShulkerBox) New(props BlockProperties) Block { return BlackShulkerBox{ Facing: props["facing"], } } ================================================ FILE: server/world/block/blackStainedGlass.go ================================================ package block type BlackStainedGlass struct { } func (b BlackStainedGlass) Encode() (string, BlockProperties) { return "minecraft:black_stained_glass", BlockProperties{} } func (b BlackStainedGlass) New(props BlockProperties) Block { return BlackStainedGlass{} } ================================================ FILE: server/world/block/blackStainedGlassPane.go ================================================ package block import ( "strconv" ) type BlackStainedGlassPane struct { Waterlogged bool West bool East bool North bool South bool } func (b BlackStainedGlassPane) Encode() (string, BlockProperties) { return "minecraft:black_stained_glass_pane", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), } } func (b BlackStainedGlassPane) New(props BlockProperties) Block { return BlackStainedGlassPane{ East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", } } ================================================ FILE: server/world/block/blackTerracotta.go ================================================ package block type BlackTerracotta struct { } func (b BlackTerracotta) Encode() (string, BlockProperties) { return "minecraft:black_terracotta", BlockProperties{} } func (b BlackTerracotta) New(props BlockProperties) Block { return BlackTerracotta{} } ================================================ FILE: server/world/block/blackWallBanner.go ================================================ package block type BlackWallBanner struct { Facing string } func (b BlackWallBanner) Encode() (string, BlockProperties) { return "minecraft:black_wall_banner", BlockProperties{ "facing": b.Facing, } } func (b BlackWallBanner) New(props BlockProperties) Block { return BlackWallBanner{ Facing: props["facing"], } } ================================================ FILE: server/world/block/blackWool.go ================================================ package block type BlackWool struct { } func (b BlackWool) Encode() (string, BlockProperties) { return "minecraft:black_wool", BlockProperties{} } func (b BlackWool) New(props BlockProperties) Block { return BlackWool{} } ================================================ FILE: server/world/block/blackstone.go ================================================ package block type Blackstone struct { } func (b Blackstone) Encode() (string, BlockProperties) { return "minecraft:blackstone", BlockProperties{} } func (b Blackstone) New(props BlockProperties) Block { return Blackstone{} } ================================================ FILE: server/world/block/blackstoneSlab.go ================================================ package block import ( "strconv" ) type BlackstoneSlab struct { Type string Waterlogged bool } func (b BlackstoneSlab) Encode() (string, BlockProperties) { return "minecraft:blackstone_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BlackstoneSlab) New(props BlockProperties) Block { return BlackstoneSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/blackstoneStairs.go ================================================ package block import ( "strconv" ) type BlackstoneStairs struct { Half string Shape string Waterlogged bool Facing string } func (b BlackstoneStairs) Encode() (string, BlockProperties) { return "minecraft:blackstone_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BlackstoneStairs) New(props BlockProperties) Block { return BlackstoneStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/blackstoneWall.go ================================================ package block import ( "strconv" ) type BlackstoneWall struct { Waterlogged bool West string East string North string South string Up bool } func (b BlackstoneWall) Encode() (string, BlockProperties) { return "minecraft:blackstone_wall", BlockProperties{ "north": b.North, "south": b.South, "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, } } func (b BlackstoneWall) New(props BlockProperties) Block { return BlackstoneWall{ East: props["east"], North: props["north"], South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], } } ================================================ FILE: server/world/block/blastFurnace.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type BlastFurnace struct { Facing string Lit bool } func (b BlastFurnace) Encode() (string, BlockProperties) { return "minecraft:blast_furnace", BlockProperties{ "facing": b.Facing, "lit": strconv.FormatBool(b.Lit), } } func (b BlastFurnace) New(props BlockProperties) Block { return BlastFurnace{ Lit: props["lit"] != "false", Facing: props["facing"], } } func (b BlastFurnace) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:blast_furnace", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/blueBanner.go ================================================ package block import ( "strconv" ) type BlueBanner struct { Rotation int } func (b BlueBanner) Encode() (string, BlockProperties) { return "minecraft:blue_banner", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), } } func (b BlueBanner) New(props BlockProperties) Block { return BlueBanner{ Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/blueBed.go ================================================ package block import ( "strconv" ) type BlueBed struct { Part string Facing string Occupied bool } func (b BlueBed) Encode() (string, BlockProperties) { return "minecraft:blue_bed", BlockProperties{ "part": b.Part, "facing": b.Facing, "occupied": strconv.FormatBool(b.Occupied), } } func (b BlueBed) New(props BlockProperties) Block { return BlueBed{ Occupied: props["occupied"] != "false", Part: props["part"], Facing: props["facing"], } } ================================================ FILE: server/world/block/blueCandle.go ================================================ package block import ( "strconv" ) type BlueCandle struct { Waterlogged bool Candles int Lit bool } func (b BlueCandle) Encode() (string, BlockProperties) { return "minecraft:blue_candle", BlockProperties{ "lit": strconv.FormatBool(b.Lit), "waterlogged": strconv.FormatBool(b.Waterlogged), "candles": strconv.Itoa(b.Candles), } } func (b BlueCandle) New(props BlockProperties) Block { return BlueCandle{ Waterlogged: props["waterlogged"] != "false", Candles: atoi(props["candles"]), Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/blueCandleCake.go ================================================ package block import ( "strconv" ) type BlueCandleCake struct { Lit bool } func (b BlueCandleCake) Encode() (string, BlockProperties) { return "minecraft:blue_candle_cake", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b BlueCandleCake) New(props BlockProperties) Block { return BlueCandleCake{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/blueCarpet.go ================================================ package block type BlueCarpet struct { } func (b BlueCarpet) Encode() (string, BlockProperties) { return "minecraft:blue_carpet", BlockProperties{} } func (b BlueCarpet) New(props BlockProperties) Block { return BlueCarpet{} } ================================================ FILE: server/world/block/blueConcrete.go ================================================ package block type BlueConcrete struct { } func (b BlueConcrete) Encode() (string, BlockProperties) { return "minecraft:blue_concrete", BlockProperties{} } func (b BlueConcrete) New(props BlockProperties) Block { return BlueConcrete{} } ================================================ FILE: server/world/block/blueConcretePowder.go ================================================ package block type BlueConcretePowder struct { } func (b BlueConcretePowder) Encode() (string, BlockProperties) { return "minecraft:blue_concrete_powder", BlockProperties{} } func (b BlueConcretePowder) New(props BlockProperties) Block { return BlueConcretePowder{} } ================================================ FILE: server/world/block/blueGlazedTerracotta.go ================================================ package block type BlueGlazedTerracotta struct { Facing string } func (b BlueGlazedTerracotta) Encode() (string, BlockProperties) { return "minecraft:blue_glazed_terracotta", BlockProperties{ "facing": b.Facing, } } func (b BlueGlazedTerracotta) New(props BlockProperties) Block { return BlueGlazedTerracotta{ Facing: props["facing"], } } ================================================ FILE: server/world/block/blueIce.go ================================================ package block type BlueIce struct { } func (b BlueIce) Encode() (string, BlockProperties) { return "minecraft:blue_ice", BlockProperties{} } func (b BlueIce) New(props BlockProperties) Block { return BlueIce{} } ================================================ FILE: server/world/block/blueOrchid.go ================================================ package block type BlueOrchid struct { } func (b BlueOrchid) Encode() (string, BlockProperties) { return "minecraft:blue_orchid", BlockProperties{} } func (b BlueOrchid) New(props BlockProperties) Block { return BlueOrchid{} } ================================================ FILE: server/world/block/blueShulkerBox.go ================================================ package block type BlueShulkerBox struct { Facing string } func (b BlueShulkerBox) Encode() (string, BlockProperties) { return "minecraft:blue_shulker_box", BlockProperties{ "facing": b.Facing, } } func (b BlueShulkerBox) New(props BlockProperties) Block { return BlueShulkerBox{ Facing: props["facing"], } } ================================================ FILE: server/world/block/blueStainedGlass.go ================================================ package block type BlueStainedGlass struct { } func (b BlueStainedGlass) Encode() (string, BlockProperties) { return "minecraft:blue_stained_glass", BlockProperties{} } func (b BlueStainedGlass) New(props BlockProperties) Block { return BlueStainedGlass{} } ================================================ FILE: server/world/block/blueStainedGlassPane.go ================================================ package block import ( "strconv" ) type BlueStainedGlassPane struct { East bool North bool South bool Waterlogged bool West bool } func (b BlueStainedGlassPane) Encode() (string, BlockProperties) { return "minecraft:blue_stained_glass_pane", BlockProperties{ "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), } } func (b BlueStainedGlassPane) New(props BlockProperties) Block { return BlueStainedGlassPane{ Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", } } ================================================ FILE: server/world/block/blueTerracotta.go ================================================ package block type BlueTerracotta struct { } func (b BlueTerracotta) Encode() (string, BlockProperties) { return "minecraft:blue_terracotta", BlockProperties{} } func (b BlueTerracotta) New(props BlockProperties) Block { return BlueTerracotta{} } ================================================ FILE: server/world/block/blueWallBanner.go ================================================ package block type BlueWallBanner struct { Facing string } func (b BlueWallBanner) Encode() (string, BlockProperties) { return "minecraft:blue_wall_banner", BlockProperties{ "facing": b.Facing, } } func (b BlueWallBanner) New(props BlockProperties) Block { return BlueWallBanner{ Facing: props["facing"], } } ================================================ FILE: server/world/block/blueWool.go ================================================ package block type BlueWool struct { } func (b BlueWool) Encode() (string, BlockProperties) { return "minecraft:blue_wool", BlockProperties{} } func (b BlueWool) New(props BlockProperties) Block { return BlueWool{} } ================================================ FILE: server/world/block/boneBlock.go ================================================ package block type BoneBlock struct { Axis string } func (b BoneBlock) Encode() (string, BlockProperties) { return "minecraft:bone_block", BlockProperties{ "axis": b.Axis, } } func (b BoneBlock) New(props BlockProperties) Block { return BoneBlock{ Axis: props["axis"], } } ================================================ FILE: server/world/block/bookshelf.go ================================================ package block type Bookshelf struct { } func (b Bookshelf) Encode() (string, BlockProperties) { return "minecraft:bookshelf", BlockProperties{} } func (b Bookshelf) New(props BlockProperties) Block { return Bookshelf{} } ================================================ FILE: server/world/block/brainCoral.go ================================================ package block import ( "strconv" ) type BrainCoral struct { Waterlogged bool } func (b BrainCoral) Encode() (string, BlockProperties) { return "minecraft:brain_coral", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BrainCoral) New(props BlockProperties) Block { return BrainCoral{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/brainCoralBlock.go ================================================ package block type BrainCoralBlock struct { } func (b BrainCoralBlock) Encode() (string, BlockProperties) { return "minecraft:brain_coral_block", BlockProperties{} } func (b BrainCoralBlock) New(props BlockProperties) Block { return BrainCoralBlock{} } ================================================ FILE: server/world/block/brainCoralFan.go ================================================ package block import ( "strconv" ) type BrainCoralFan struct { Waterlogged bool } func (b BrainCoralFan) Encode() (string, BlockProperties) { return "minecraft:brain_coral_fan", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BrainCoralFan) New(props BlockProperties) Block { return BrainCoralFan{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/brainCoralWallFan.go ================================================ package block import ( "strconv" ) type BrainCoralWallFan struct { Waterlogged bool Facing string } func (b BrainCoralWallFan) Encode() (string, BlockProperties) { return "minecraft:brain_coral_wall_fan", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b BrainCoralWallFan) New(props BlockProperties) Block { return BrainCoralWallFan{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/brewingStand.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type BrewingStand struct { HasBottle0 bool HasBottle1 bool HasBottle2 bool } func (b BrewingStand) Encode() (string, BlockProperties) { return "minecraft:brewing_stand", BlockProperties{ "has_bottle_0": strconv.FormatBool(b.HasBottle0), "has_bottle_1": strconv.FormatBool(b.HasBottle1), "has_bottle_2": strconv.FormatBool(b.HasBottle2), } } func (b BrewingStand) New(props BlockProperties) Block { return BrewingStand{ HasBottle0: props["has_bottle_0"] != "false", HasBottle1: props["has_bottle_1"] != "false", HasBottle2: props["has_bottle_2"] != "false", } } func (b BrewingStand) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:brewing_stand", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/brickSlab.go ================================================ package block import ( "strconv" ) type BrickSlab struct { Type string Waterlogged bool } func (b BrickSlab) Encode() (string, BlockProperties) { return "minecraft:brick_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BrickSlab) New(props BlockProperties) Block { return BrickSlab{ Waterlogged: props["waterlogged"] != "false", Type: props["type"], } } ================================================ FILE: server/world/block/brickStairs.go ================================================ package block import ( "strconv" ) type BrickStairs struct { Shape string Waterlogged bool Facing string Half string } func (b BrickStairs) Encode() (string, BlockProperties) { return "minecraft:brick_stairs", BlockProperties{ "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, } } func (b BrickStairs) New(props BlockProperties) Block { return BrickStairs{ Facing: props["facing"], Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/brickWall.go ================================================ package block import ( "strconv" ) type BrickWall struct { Waterlogged bool West string East string North string South string Up bool } func (b BrickWall) Encode() (string, BlockProperties) { return "minecraft:brick_wall", BlockProperties{ "south": b.South, "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, "north": b.North, } } func (b BrickWall) New(props BlockProperties) Block { return BrickWall{ Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], East: props["east"], North: props["north"], South: props["south"], } } ================================================ FILE: server/world/block/bricks.go ================================================ package block type Bricks struct { } func (b Bricks) Encode() (string, BlockProperties) { return "minecraft:bricks", BlockProperties{} } func (b Bricks) New(props BlockProperties) Block { return Bricks{} } ================================================ FILE: server/world/block/brownBanner.go ================================================ package block import ( "strconv" ) type BrownBanner struct { Rotation int } func (b BrownBanner) Encode() (string, BlockProperties) { return "minecraft:brown_banner", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), } } func (b BrownBanner) New(props BlockProperties) Block { return BrownBanner{ Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/brownBed.go ================================================ package block import ( "strconv" ) type BrownBed struct { Facing string Occupied bool Part string } func (b BrownBed) Encode() (string, BlockProperties) { return "minecraft:brown_bed", BlockProperties{ "facing": b.Facing, "occupied": strconv.FormatBool(b.Occupied), "part": b.Part, } } func (b BrownBed) New(props BlockProperties) Block { return BrownBed{ Facing: props["facing"], Occupied: props["occupied"] != "false", Part: props["part"], } } ================================================ FILE: server/world/block/brownCandle.go ================================================ package block import ( "strconv" ) type BrownCandle struct { Candles int Lit bool Waterlogged bool } func (b BrownCandle) Encode() (string, BlockProperties) { return "minecraft:brown_candle", BlockProperties{ "candles": strconv.Itoa(b.Candles), "lit": strconv.FormatBool(b.Lit), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BrownCandle) New(props BlockProperties) Block { return BrownCandle{ Candles: atoi(props["candles"]), Lit: props["lit"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/brownCandleCake.go ================================================ package block import ( "strconv" ) type BrownCandleCake struct { Lit bool } func (b BrownCandleCake) Encode() (string, BlockProperties) { return "minecraft:brown_candle_cake", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b BrownCandleCake) New(props BlockProperties) Block { return BrownCandleCake{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/brownCarpet.go ================================================ package block type BrownCarpet struct { } func (b BrownCarpet) Encode() (string, BlockProperties) { return "minecraft:brown_carpet", BlockProperties{} } func (b BrownCarpet) New(props BlockProperties) Block { return BrownCarpet{} } ================================================ FILE: server/world/block/brownConcrete.go ================================================ package block type BrownConcrete struct { } func (b BrownConcrete) Encode() (string, BlockProperties) { return "minecraft:brown_concrete", BlockProperties{} } func (b BrownConcrete) New(props BlockProperties) Block { return BrownConcrete{} } ================================================ FILE: server/world/block/brownConcretePowder.go ================================================ package block type BrownConcretePowder struct { } func (b BrownConcretePowder) Encode() (string, BlockProperties) { return "minecraft:brown_concrete_powder", BlockProperties{} } func (b BrownConcretePowder) New(props BlockProperties) Block { return BrownConcretePowder{} } ================================================ FILE: server/world/block/brownGlazedTerracotta.go ================================================ package block type BrownGlazedTerracotta struct { Facing string } func (b BrownGlazedTerracotta) Encode() (string, BlockProperties) { return "minecraft:brown_glazed_terracotta", BlockProperties{ "facing": b.Facing, } } func (b BrownGlazedTerracotta) New(props BlockProperties) Block { return BrownGlazedTerracotta{ Facing: props["facing"], } } ================================================ FILE: server/world/block/brownMushroom.go ================================================ package block type BrownMushroom struct { } func (b BrownMushroom) Encode() (string, BlockProperties) { return "minecraft:brown_mushroom", BlockProperties{} } func (b BrownMushroom) New(props BlockProperties) Block { return BrownMushroom{} } ================================================ FILE: server/world/block/brownMushroomBlock.go ================================================ package block import ( "strconv" ) type BrownMushroomBlock struct { West bool Down bool East bool North bool South bool Up bool } func (b BrownMushroomBlock) Encode() (string, BlockProperties) { return "minecraft:brown_mushroom_block", BlockProperties{ "down": strconv.FormatBool(b.Down), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "up": strconv.FormatBool(b.Up), "west": strconv.FormatBool(b.West), } } func (b BrownMushroomBlock) New(props BlockProperties) Block { return BrownMushroomBlock{ Up: props["up"] != "false", West: props["west"] != "false", Down: props["down"] != "false", East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", } } ================================================ FILE: server/world/block/brownShulkerBox.go ================================================ package block type BrownShulkerBox struct { Facing string } func (b BrownShulkerBox) Encode() (string, BlockProperties) { return "minecraft:brown_shulker_box", BlockProperties{ "facing": b.Facing, } } func (b BrownShulkerBox) New(props BlockProperties) Block { return BrownShulkerBox{ Facing: props["facing"], } } ================================================ FILE: server/world/block/brownStainedGlass.go ================================================ package block type BrownStainedGlass struct { } func (b BrownStainedGlass) Encode() (string, BlockProperties) { return "minecraft:brown_stained_glass", BlockProperties{} } func (b BrownStainedGlass) New(props BlockProperties) Block { return BrownStainedGlass{} } ================================================ FILE: server/world/block/brownStainedGlassPane.go ================================================ package block import ( "strconv" ) type BrownStainedGlassPane struct { Waterlogged bool West bool East bool North bool South bool } func (b BrownStainedGlassPane) Encode() (string, BlockProperties) { return "minecraft:brown_stained_glass_pane", BlockProperties{ "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BrownStainedGlassPane) New(props BlockProperties) Block { return BrownStainedGlassPane{ Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", } } ================================================ FILE: server/world/block/brownTerracotta.go ================================================ package block type BrownTerracotta struct { } func (b BrownTerracotta) Encode() (string, BlockProperties) { return "minecraft:brown_terracotta", BlockProperties{} } func (b BrownTerracotta) New(props BlockProperties) Block { return BrownTerracotta{} } ================================================ FILE: server/world/block/brownWallBanner.go ================================================ package block type BrownWallBanner struct { Facing string } func (b BrownWallBanner) Encode() (string, BlockProperties) { return "minecraft:brown_wall_banner", BlockProperties{ "facing": b.Facing, } } func (b BrownWallBanner) New(props BlockProperties) Block { return BrownWallBanner{ Facing: props["facing"], } } ================================================ FILE: server/world/block/brownWool.go ================================================ package block type BrownWool struct { } func (b BrownWool) Encode() (string, BlockProperties) { return "minecraft:brown_wool", BlockProperties{} } func (b BrownWool) New(props BlockProperties) Block { return BrownWool{} } ================================================ FILE: server/world/block/bubbleColumn.go ================================================ package block import ( "strconv" ) type BubbleColumn struct { Drag bool } func (b BubbleColumn) Encode() (string, BlockProperties) { return "minecraft:bubble_column", BlockProperties{ "drag": strconv.FormatBool(b.Drag), } } func (b BubbleColumn) New(props BlockProperties) Block { return BubbleColumn{ Drag: props["drag"] != "false", } } ================================================ FILE: server/world/block/bubbleCoral.go ================================================ package block import ( "strconv" ) type BubbleCoral struct { Waterlogged bool } func (b BubbleCoral) Encode() (string, BlockProperties) { return "minecraft:bubble_coral", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BubbleCoral) New(props BlockProperties) Block { return BubbleCoral{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/bubbleCoralBlock.go ================================================ package block type BubbleCoralBlock struct { } func (b BubbleCoralBlock) Encode() (string, BlockProperties) { return "minecraft:bubble_coral_block", BlockProperties{} } func (b BubbleCoralBlock) New(props BlockProperties) Block { return BubbleCoralBlock{} } ================================================ FILE: server/world/block/bubbleCoralFan.go ================================================ package block import ( "strconv" ) type BubbleCoralFan struct { Waterlogged bool } func (b BubbleCoralFan) Encode() (string, BlockProperties) { return "minecraft:bubble_coral_fan", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BubbleCoralFan) New(props BlockProperties) Block { return BubbleCoralFan{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/bubbleCoralWallFan.go ================================================ package block import ( "strconv" ) type BubbleCoralWallFan struct { Facing string Waterlogged bool } func (b BubbleCoralWallFan) Encode() (string, BlockProperties) { return "minecraft:bubble_coral_wall_fan", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b BubbleCoralWallFan) New(props BlockProperties) Block { return BubbleCoralWallFan{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/buddingAmethyst.go ================================================ package block type BuddingAmethyst struct { } func (b BuddingAmethyst) Encode() (string, BlockProperties) { return "minecraft:budding_amethyst", BlockProperties{} } func (b BuddingAmethyst) New(props BlockProperties) Block { return BuddingAmethyst{} } ================================================ FILE: server/world/block/cactus.go ================================================ package block import ( "strconv" ) type Cactus struct { Age int } func (b Cactus) Encode() (string, BlockProperties) { return "minecraft:cactus", BlockProperties{ "age": strconv.Itoa(b.Age), } } func (b Cactus) New(props BlockProperties) Block { return Cactus{ Age: atoi(props["age"]), } } ================================================ FILE: server/world/block/cake.go ================================================ package block import ( "strconv" ) type Cake struct { Bites int } func (b Cake) Encode() (string, BlockProperties) { return "minecraft:cake", BlockProperties{ "bites": strconv.Itoa(b.Bites), } } func (b Cake) New(props BlockProperties) Block { return Cake{ Bites: atoi(props["bites"]), } } ================================================ FILE: server/world/block/calcite.go ================================================ package block type Calcite struct { } func (b Calcite) Encode() (string, BlockProperties) { return "minecraft:calcite", BlockProperties{} } func (b Calcite) New(props BlockProperties) Block { return Calcite{} } ================================================ FILE: server/world/block/calibratedSculkSensor.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type CalibratedSculkSensor struct { Facing string Power int SculkSensorPhase string Waterlogged bool } func (b CalibratedSculkSensor) Encode() (string, BlockProperties) { return "minecraft:calibrated_sculk_sensor", BlockProperties{ "facing": b.Facing, "power": strconv.Itoa(b.Power), "sculk_sensor_phase": b.SculkSensorPhase, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b CalibratedSculkSensor) New(props BlockProperties) Block { return CalibratedSculkSensor{ Facing: props["facing"], Power: atoi(props["power"]), SculkSensorPhase: props["sculk_sensor_phase"], Waterlogged: props["waterlogged"] != "false", } } func (b CalibratedSculkSensor) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:calibrated_sculk_sensor", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/campfire.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Campfire struct { SignalFire bool Waterlogged bool Facing string Lit bool } func (b Campfire) Encode() (string, BlockProperties) { return "minecraft:campfire", BlockProperties{ "signal_fire": strconv.FormatBool(b.SignalFire), "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "lit": strconv.FormatBool(b.Lit), } } func (b Campfire) New(props BlockProperties) Block { return Campfire{ SignalFire: props["signal_fire"] != "false", Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Lit: props["lit"] != "false", } } func (b Campfire) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:campfire", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/candle.go ================================================ package block import ( "strconv" ) type Candle struct { Lit bool Waterlogged bool Candles int } func (b Candle) Encode() (string, BlockProperties) { return "minecraft:candle", BlockProperties{ "candles": strconv.Itoa(b.Candles), "lit": strconv.FormatBool(b.Lit), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b Candle) New(props BlockProperties) Block { return Candle{ Candles: atoi(props["candles"]), Lit: props["lit"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/candleCake.go ================================================ package block import ( "strconv" ) type CandleCake struct { Lit bool } func (b CandleCake) Encode() (string, BlockProperties) { return "minecraft:candle_cake", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b CandleCake) New(props BlockProperties) Block { return CandleCake{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/carrots.go ================================================ package block import ( "strconv" ) type Carrots struct { Age int } func (b Carrots) Encode() (string, BlockProperties) { return "minecraft:carrots", BlockProperties{ "age": strconv.Itoa(b.Age), } } func (b Carrots) New(props BlockProperties) Block { return Carrots{ Age: atoi(props["age"]), } } ================================================ FILE: server/world/block/cartographyTable.go ================================================ package block type CartographyTable struct { } func (b CartographyTable) Encode() (string, BlockProperties) { return "minecraft:cartography_table", BlockProperties{} } func (b CartographyTable) New(props BlockProperties) Block { return CartographyTable{} } ================================================ FILE: server/world/block/carvedPumpkin.go ================================================ package block type CarvedPumpkin struct { Facing string } func (b CarvedPumpkin) Encode() (string, BlockProperties) { return "minecraft:carved_pumpkin", BlockProperties{ "facing": b.Facing, } } func (b CarvedPumpkin) New(props BlockProperties) Block { return CarvedPumpkin{ Facing: props["facing"], } } ================================================ FILE: server/world/block/cauldron.go ================================================ package block type Cauldron struct { } func (b Cauldron) Encode() (string, BlockProperties) { return "minecraft:cauldron", BlockProperties{} } func (b Cauldron) New(props BlockProperties) Block { return Cauldron{} } ================================================ FILE: server/world/block/caveAir.go ================================================ package block type CaveAir struct { } func (b CaveAir) Encode() (string, BlockProperties) { return "minecraft:cave_air", BlockProperties{} } func (b CaveAir) New(props BlockProperties) Block { return CaveAir{} } ================================================ FILE: server/world/block/caveVines.go ================================================ package block import ( "strconv" ) type CaveVines struct { Age int Berries bool } func (b CaveVines) Encode() (string, BlockProperties) { return "minecraft:cave_vines", BlockProperties{ "berries": strconv.FormatBool(b.Berries), "age": strconv.Itoa(b.Age), } } func (b CaveVines) New(props BlockProperties) Block { return CaveVines{ Age: atoi(props["age"]), Berries: props["berries"] != "false", } } ================================================ FILE: server/world/block/caveVinesPlant.go ================================================ package block import ( "strconv" ) type CaveVinesPlant struct { Berries bool } func (b CaveVinesPlant) Encode() (string, BlockProperties) { return "minecraft:cave_vines_plant", BlockProperties{ "berries": strconv.FormatBool(b.Berries), } } func (b CaveVinesPlant) New(props BlockProperties) Block { return CaveVinesPlant{ Berries: props["berries"] != "false", } } ================================================ FILE: server/world/block/chain.go ================================================ package block import ( "strconv" ) type Chain struct { Axis string Waterlogged bool } func (b Chain) Encode() (string, BlockProperties) { return "minecraft:chain", BlockProperties{ "axis": b.Axis, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b Chain) New(props BlockProperties) Block { return Chain{ Axis: props["axis"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/chainCommandBlock.go ================================================ package block import ( "strconv" ) type ChainCommandBlock struct { Facing string Conditional bool } func (b ChainCommandBlock) Encode() (string, BlockProperties) { return "minecraft:chain_command_block", BlockProperties{ "conditional": strconv.FormatBool(b.Conditional), "facing": b.Facing, } } func (b ChainCommandBlock) New(props BlockProperties) Block { return ChainCommandBlock{ Conditional: props["conditional"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/cherryButton.go ================================================ package block import ( "strconv" ) type CherryButton struct { Facing string Powered bool Face string } func (b CherryButton) Encode() (string, BlockProperties) { return "minecraft:cherry_button", BlockProperties{ "face": b.Face, "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), } } func (b CherryButton) New(props BlockProperties) Block { return CherryButton{ Facing: props["facing"], Powered: props["powered"] != "false", Face: props["face"], } } ================================================ FILE: server/world/block/cherryDoor.go ================================================ package block import ( "strconv" ) type CherryDoor struct { Half string Hinge string Open bool Powered bool Facing string } func (b CherryDoor) Encode() (string, BlockProperties) { return "minecraft:cherry_door", BlockProperties{ "facing": b.Facing, "half": b.Half, "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), } } func (b CherryDoor) New(props BlockProperties) Block { return CherryDoor{ Powered: props["powered"] != "false", Facing: props["facing"], Half: props["half"], Hinge: props["hinge"], Open: props["open"] != "false", } } ================================================ FILE: server/world/block/cherryFence.go ================================================ package block import ( "strconv" ) type CherryFence struct { Waterlogged bool West bool East bool North bool South bool } func (b CherryFence) Encode() (string, BlockProperties) { return "minecraft:cherry_fence", BlockProperties{ "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), } } func (b CherryFence) New(props BlockProperties) Block { return CherryFence{ North: props["north"] != "false", South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", } } ================================================ FILE: server/world/block/cherryFenceGate.go ================================================ package block import ( "strconv" ) type CherryFenceGate struct { Facing string InWall bool Open bool Powered bool } func (b CherryFenceGate) Encode() (string, BlockProperties) { return "minecraft:cherry_fence_gate", BlockProperties{ "facing": b.Facing, "in_wall": strconv.FormatBool(b.InWall), "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), } } func (b CherryFenceGate) New(props BlockProperties) Block { return CherryFenceGate{ InWall: props["in_wall"] != "false", Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/cherryHangingSign.go ================================================ package block import ( "strconv" ) type CherryHangingSign struct { Attached bool Rotation int Waterlogged bool } func (b CherryHangingSign) Encode() (string, BlockProperties) { return "minecraft:cherry_hanging_sign", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "attached": strconv.FormatBool(b.Attached), "rotation": strconv.Itoa(b.Rotation), } } func (b CherryHangingSign) New(props BlockProperties) Block { return CherryHangingSign{ Attached: props["attached"] != "false", Rotation: atoi(props["rotation"]), Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/cherryLeaves.go ================================================ package block import ( "strconv" ) type CherryLeaves struct { Distance int Persistent bool Waterlogged bool } func (b CherryLeaves) Encode() (string, BlockProperties) { return "minecraft:cherry_leaves", BlockProperties{ "persistent": strconv.FormatBool(b.Persistent), "waterlogged": strconv.FormatBool(b.Waterlogged), "distance": strconv.Itoa(b.Distance), } } func (b CherryLeaves) New(props BlockProperties) Block { return CherryLeaves{ Distance: atoi(props["distance"]), Persistent: props["persistent"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/cherryLog.go ================================================ package block type CherryLog struct { Axis string } func (b CherryLog) Encode() (string, BlockProperties) { return "minecraft:cherry_log", BlockProperties{ "axis": b.Axis, } } func (b CherryLog) New(props BlockProperties) Block { return CherryLog{ Axis: props["axis"], } } ================================================ FILE: server/world/block/cherryPlanks.go ================================================ package block type CherryPlanks struct { } func (b CherryPlanks) Encode() (string, BlockProperties) { return "minecraft:cherry_planks", BlockProperties{} } func (b CherryPlanks) New(props BlockProperties) Block { return CherryPlanks{} } ================================================ FILE: server/world/block/cherryPressurePlate.go ================================================ package block import ( "strconv" ) type CherryPressurePlate struct { Powered bool } func (b CherryPressurePlate) Encode() (string, BlockProperties) { return "minecraft:cherry_pressure_plate", BlockProperties{ "powered": strconv.FormatBool(b.Powered), } } func (b CherryPressurePlate) New(props BlockProperties) Block { return CherryPressurePlate{ Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/cherrySapling.go ================================================ package block import ( "strconv" ) type CherrySapling struct { Stage int } func (b CherrySapling) Encode() (string, BlockProperties) { return "minecraft:cherry_sapling", BlockProperties{ "stage": strconv.Itoa(b.Stage), } } func (b CherrySapling) New(props BlockProperties) Block { return CherrySapling{ Stage: atoi(props["stage"]), } } ================================================ FILE: server/world/block/cherrySign.go ================================================ package block import ( "strconv" ) type CherrySign struct { Rotation int Waterlogged bool } func (b CherrySign) Encode() (string, BlockProperties) { return "minecraft:cherry_sign", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b CherrySign) New(props BlockProperties) Block { return CherrySign{ Rotation: atoi(props["rotation"]), Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/cherrySlab.go ================================================ package block import ( "strconv" ) type CherrySlab struct { Type string Waterlogged bool } func (b CherrySlab) Encode() (string, BlockProperties) { return "minecraft:cherry_slab", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "type": b.Type, } } func (b CherrySlab) New(props BlockProperties) Block { return CherrySlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/cherryStairs.go ================================================ package block import ( "strconv" ) type CherryStairs struct { Waterlogged bool Facing string Half string Shape string } func (b CherryStairs) Encode() (string, BlockProperties) { return "minecraft:cherry_stairs", BlockProperties{ "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, } } func (b CherryStairs) New(props BlockProperties) Block { return CherryStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/cherryTrapdoor.go ================================================ package block import ( "strconv" ) type CherryTrapdoor struct { Facing string Half string Open bool Powered bool Waterlogged bool } func (b CherryTrapdoor) Encode() (string, BlockProperties) { return "minecraft:cherry_trapdoor", BlockProperties{ "facing": b.Facing, "half": b.Half, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b CherryTrapdoor) New(props BlockProperties) Block { return CherryTrapdoor{ Powered: props["powered"] != "false", Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Open: props["open"] != "false", } } ================================================ FILE: server/world/block/cherryWallHangingSign.go ================================================ package block import ( "strconv" ) type CherryWallHangingSign struct { Facing string Waterlogged bool } func (b CherryWallHangingSign) Encode() (string, BlockProperties) { return "minecraft:cherry_wall_hanging_sign", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b CherryWallHangingSign) New(props BlockProperties) Block { return CherryWallHangingSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/cherryWallSign.go ================================================ package block import ( "strconv" ) type CherryWallSign struct { Facing string Waterlogged bool } func (b CherryWallSign) Encode() (string, BlockProperties) { return "minecraft:cherry_wall_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b CherryWallSign) New(props BlockProperties) Block { return CherryWallSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/cherryWood.go ================================================ package block type CherryWood struct { Axis string } func (b CherryWood) Encode() (string, BlockProperties) { return "minecraft:cherry_wood", BlockProperties{ "axis": b.Axis, } } func (b CherryWood) New(props BlockProperties) Block { return CherryWood{ Axis: props["axis"], } } ================================================ FILE: server/world/block/chest.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/container" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Chest struct { Facing string Type string Waterlogged bool } func (g Chest) Encode() (string, BlockProperties) { return "minecraft:chest", BlockProperties{ "facing": g.Facing, "type": g.Type, "waterlogged": strconv.FormatBool(g.Waterlogged), } } func (g Chest) New(props BlockProperties) Block { if props["type"] == "" { props["type"] = "single" } return Chest{ Facing: props["facing"], Type: props["type"], Waterlogged: props["waterlogged"] == "true", } } func (g Chest) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:chest", Items: make(container.Container, 0), X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } /* func (g Chest) PlaceSound(pos pos.BlockPosition) *play.SoundEffect { return session.SoundEffect("minecraft:block.wood.place", false, nil, play.SoundCategoryBlock, pos.X(), pos.Y(), pos.Z(), 1, 1) } func (g Chest) Use(clicker session.Session, pk play.UseItemOn, dimension *dimension.Dimension) { w, ok := dimension.WindowManager.At(pk.BlockX, pk.BlockY, pk.BlockZ) if !ok { state, ok := dimension.BlockEntity(pk.BlockX, pk.BlockY, pk.BlockZ) if !ok { return } if state.Id != "minecraft:chest" { return } w = dimension.WindowManager.New("minecraft:generic_9x3", state.Id, state.Items, text.Sprint("Chest")) dimension.WindowManager.AddWindow([3]int32{pk.BlockX, pk.BlockY, pk.BlockZ}, w) } oldViewers := w.Viewers clicker.OpenWindow(w) clicker.Broadcast().BlockAction(pk.BlockX, pk.BlockY, pk.BlockZ, dimension.Name(), 1, w.Viewers) if oldViewers == 0 && w.Viewers > 0 { // chest was opened clicker.Broadcast().PlaySound(session.SoundEffect( "minecraft:block.chest.open", false, nil, play.SoundCategoryBlock, pk.BlockX, pk.BlockY, pk.BlockZ, 1, 1, ), dimension.Name()) } } */ var _ Block = (*Chest)(nil) ================================================ FILE: server/world/block/chippedAnvil.go ================================================ package block type ChippedAnvil struct { Facing string } func (b ChippedAnvil) Encode() (string, BlockProperties) { return "minecraft:chipped_anvil", BlockProperties{ "facing": b.Facing, } } func (b ChippedAnvil) New(props BlockProperties) Block { return ChippedAnvil{ Facing: props["facing"], } } ================================================ FILE: server/world/block/chiseledBookshelf.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type ChiseledBookshelf struct { Slot4Occupied bool Slot5Occupied bool Facing string Slot0Occupied bool Slot1Occupied bool Slot2Occupied bool Slot3Occupied bool } func (b ChiseledBookshelf) Encode() (string, BlockProperties) { return "minecraft:chiseled_bookshelf", BlockProperties{ "slot_1_occupied": strconv.FormatBool(b.Slot1Occupied), "slot_2_occupied": strconv.FormatBool(b.Slot2Occupied), "slot_3_occupied": strconv.FormatBool(b.Slot3Occupied), "slot_4_occupied": strconv.FormatBool(b.Slot4Occupied), "slot_5_occupied": strconv.FormatBool(b.Slot5Occupied), "facing": b.Facing, "slot_0_occupied": strconv.FormatBool(b.Slot0Occupied), } } func (b ChiseledBookshelf) New(props BlockProperties) Block { return ChiseledBookshelf{ Slot0Occupied: props["slot_0_occupied"] != "false", Slot1Occupied: props["slot_1_occupied"] != "false", Slot2Occupied: props["slot_2_occupied"] != "false", Slot3Occupied: props["slot_3_occupied"] != "false", Slot4Occupied: props["slot_4_occupied"] != "false", Slot5Occupied: props["slot_5_occupied"] != "false", Facing: props["facing"], } } func (b ChiseledBookshelf) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:chiseled_bookshelf", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/chiseledCopper.go ================================================ package block type ChiseledCopper struct { } func (b ChiseledCopper) Encode() (string, BlockProperties) { return "minecraft:chiseled_copper", BlockProperties{} } func (b ChiseledCopper) New(props BlockProperties) Block { return ChiseledCopper{} } ================================================ FILE: server/world/block/chiseledDeepslate.go ================================================ package block type ChiseledDeepslate struct { } func (b ChiseledDeepslate) Encode() (string, BlockProperties) { return "minecraft:chiseled_deepslate", BlockProperties{} } func (b ChiseledDeepslate) New(props BlockProperties) Block { return ChiseledDeepslate{} } ================================================ FILE: server/world/block/chiseledNetherBricks.go ================================================ package block type ChiseledNetherBricks struct { } func (b ChiseledNetherBricks) Encode() (string, BlockProperties) { return "minecraft:chiseled_nether_bricks", BlockProperties{} } func (b ChiseledNetherBricks) New(props BlockProperties) Block { return ChiseledNetherBricks{} } ================================================ FILE: server/world/block/chiseledPolishedBlackstone.go ================================================ package block type ChiseledPolishedBlackstone struct { } func (b ChiseledPolishedBlackstone) Encode() (string, BlockProperties) { return "minecraft:chiseled_polished_blackstone", BlockProperties{} } func (b ChiseledPolishedBlackstone) New(props BlockProperties) Block { return ChiseledPolishedBlackstone{} } ================================================ FILE: server/world/block/chiseledQuartzBlock.go ================================================ package block type ChiseledQuartzBlock struct { } func (b ChiseledQuartzBlock) Encode() (string, BlockProperties) { return "minecraft:chiseled_quartz_block", BlockProperties{} } func (b ChiseledQuartzBlock) New(props BlockProperties) Block { return ChiseledQuartzBlock{} } ================================================ FILE: server/world/block/chiseledRedSandstone.go ================================================ package block type ChiseledRedSandstone struct { } func (b ChiseledRedSandstone) Encode() (string, BlockProperties) { return "minecraft:chiseled_red_sandstone", BlockProperties{} } func (b ChiseledRedSandstone) New(props BlockProperties) Block { return ChiseledRedSandstone{} } ================================================ FILE: server/world/block/chiseledSandstone.go ================================================ package block type ChiseledSandstone struct { } func (b ChiseledSandstone) Encode() (string, BlockProperties) { return "minecraft:chiseled_sandstone", BlockProperties{} } func (b ChiseledSandstone) New(props BlockProperties) Block { return ChiseledSandstone{} } ================================================ FILE: server/world/block/chiseledStoneBricks.go ================================================ package block type ChiseledStoneBricks struct { } func (b ChiseledStoneBricks) Encode() (string, BlockProperties) { return "minecraft:chiseled_stone_bricks", BlockProperties{} } func (b ChiseledStoneBricks) New(props BlockProperties) Block { return ChiseledStoneBricks{} } ================================================ FILE: server/world/block/chiseledTuff.go ================================================ package block type ChiseledTuff struct { } func (b ChiseledTuff) Encode() (string, BlockProperties) { return "minecraft:chiseled_tuff", BlockProperties{} } func (b ChiseledTuff) New(props BlockProperties) Block { return ChiseledTuff{} } ================================================ FILE: server/world/block/chiseledTuffBricks.go ================================================ package block type ChiseledTuffBricks struct { } func (b ChiseledTuffBricks) Encode() (string, BlockProperties) { return "minecraft:chiseled_tuff_bricks", BlockProperties{} } func (b ChiseledTuffBricks) New(props BlockProperties) Block { return ChiseledTuffBricks{} } ================================================ FILE: server/world/block/chorusFlower.go ================================================ package block import ( "strconv" ) type ChorusFlower struct { Age int } func (b ChorusFlower) Encode() (string, BlockProperties) { return "minecraft:chorus_flower", BlockProperties{ "age": strconv.Itoa(b.Age), } } func (b ChorusFlower) New(props BlockProperties) Block { return ChorusFlower{ Age: atoi(props["age"]), } } ================================================ FILE: server/world/block/chorusPlant.go ================================================ package block import ( "strconv" ) type ChorusPlant struct { Up bool West bool Down bool East bool North bool South bool } func (b ChorusPlant) Encode() (string, BlockProperties) { return "minecraft:chorus_plant", BlockProperties{ "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "up": strconv.FormatBool(b.Up), "west": strconv.FormatBool(b.West), "down": strconv.FormatBool(b.Down), "east": strconv.FormatBool(b.East), } } func (b ChorusPlant) New(props BlockProperties) Block { return ChorusPlant{ Down: props["down"] != "false", East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", Up: props["up"] != "false", West: props["west"] != "false", } } ================================================ FILE: server/world/block/clay.go ================================================ package block type Clay struct { } func (b Clay) Encode() (string, BlockProperties) { return "minecraft:clay", BlockProperties{} } func (b Clay) New(props BlockProperties) Block { return Clay{} } ================================================ FILE: server/world/block/coalBlock.go ================================================ package block type CoalBlock struct { } func (b CoalBlock) Encode() (string, BlockProperties) { return "minecraft:coal_block", BlockProperties{} } func (b CoalBlock) New(props BlockProperties) Block { return CoalBlock{} } ================================================ FILE: server/world/block/coalOre.go ================================================ package block type CoalOre struct { } func (b CoalOre) Encode() (string, BlockProperties) { return "minecraft:coal_ore", BlockProperties{} } func (b CoalOre) New(props BlockProperties) Block { return CoalOre{} } ================================================ FILE: server/world/block/coarseDirt.go ================================================ package block type CoarseDirt struct { } func (b CoarseDirt) Encode() (string, BlockProperties) { return "minecraft:coarse_dirt", BlockProperties{} } func (b CoarseDirt) New(props BlockProperties) Block { return CoarseDirt{} } ================================================ FILE: server/world/block/cobbledDeepslate.go ================================================ package block type CobbledDeepslate struct { } func (b CobbledDeepslate) Encode() (string, BlockProperties) { return "minecraft:cobbled_deepslate", BlockProperties{} } func (b CobbledDeepslate) New(props BlockProperties) Block { return CobbledDeepslate{} } ================================================ FILE: server/world/block/cobbledDeepslateSlab.go ================================================ package block import ( "strconv" ) type CobbledDeepslateSlab struct { Type string Waterlogged bool } func (b CobbledDeepslateSlab) Encode() (string, BlockProperties) { return "minecraft:cobbled_deepslate_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b CobbledDeepslateSlab) New(props BlockProperties) Block { return CobbledDeepslateSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/cobbledDeepslateStairs.go ================================================ package block import ( "strconv" ) type CobbledDeepslateStairs struct { Facing string Half string Shape string Waterlogged bool } func (b CobbledDeepslateStairs) Encode() (string, BlockProperties) { return "minecraft:cobbled_deepslate_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b CobbledDeepslateStairs) New(props BlockProperties) Block { return CobbledDeepslateStairs{ Facing: props["facing"], Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/cobbledDeepslateWall.go ================================================ package block import ( "strconv" ) type CobbledDeepslateWall struct { South string Up bool Waterlogged bool West string East string North string } func (b CobbledDeepslateWall) Encode() (string, BlockProperties) { return "minecraft:cobbled_deepslate_wall", BlockProperties{ "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, "north": b.North, "south": b.South, } } func (b CobbledDeepslateWall) New(props BlockProperties) Block { return CobbledDeepslateWall{ South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], East: props["east"], North: props["north"], } } ================================================ FILE: server/world/block/cobblestone.go ================================================ package block type Cobblestone struct { } func (b Cobblestone) Encode() (string, BlockProperties) { return "minecraft:cobblestone", BlockProperties{} } func (b Cobblestone) New(props BlockProperties) Block { return Cobblestone{} } ================================================ FILE: server/world/block/cobblestoneSlab.go ================================================ package block import ( "strconv" ) type CobblestoneSlab struct { Waterlogged bool Type string } func (b CobblestoneSlab) Encode() (string, BlockProperties) { return "minecraft:cobblestone_slab", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "type": b.Type, } } func (b CobblestoneSlab) New(props BlockProperties) Block { return CobblestoneSlab{ Waterlogged: props["waterlogged"] != "false", Type: props["type"], } } ================================================ FILE: server/world/block/cobblestoneStairs.go ================================================ package block import ( "strconv" ) type CobblestoneStairs struct { Half string Shape string Waterlogged bool Facing string } func (b CobblestoneStairs) Encode() (string, BlockProperties) { return "minecraft:cobblestone_stairs", BlockProperties{ "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, } } func (b CobblestoneStairs) New(props BlockProperties) Block { return CobblestoneStairs{ Facing: props["facing"], Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/cobblestoneWall.go ================================================ package block import ( "strconv" ) type CobblestoneWall struct { West string East string North string South string Up bool Waterlogged bool } func (b CobblestoneWall) Encode() (string, BlockProperties) { return "minecraft:cobblestone_wall", BlockProperties{ "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, "north": b.North, "south": b.South, } } func (b CobblestoneWall) New(props BlockProperties) Block { return CobblestoneWall{ South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], East: props["east"], North: props["north"], } } ================================================ FILE: server/world/block/cobweb.go ================================================ package block type Cobweb struct { } func (b Cobweb) Encode() (string, BlockProperties) { return "minecraft:cobweb", BlockProperties{} } func (b Cobweb) New(props BlockProperties) Block { return Cobweb{} } ================================================ FILE: server/world/block/cocoa.go ================================================ package block import ( "strconv" ) type Cocoa struct { Age int Facing string } func (b Cocoa) Encode() (string, BlockProperties) { return "minecraft:cocoa", BlockProperties{ "age": strconv.Itoa(b.Age), "facing": b.Facing, } } func (b Cocoa) New(props BlockProperties) Block { return Cocoa{ Age: atoi(props["age"]), Facing: props["facing"], } } ================================================ FILE: server/world/block/commandBlock.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type CommandBlock struct { Conditional bool Facing string } func (b CommandBlock) Encode() (string, BlockProperties) { return "minecraft:command_block", BlockProperties{ "conditional": strconv.FormatBool(b.Conditional), "facing": b.Facing, } } func (b CommandBlock) New(props BlockProperties) Block { return CommandBlock{ Conditional: props["conditional"] != "false", Facing: props["facing"], } } func (b CommandBlock) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:command_block", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/comparator.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Comparator struct { Facing string Mode string Powered bool } func (b Comparator) Encode() (string, BlockProperties) { return "minecraft:comparator", BlockProperties{ "facing": b.Facing, "mode": b.Mode, "powered": strconv.FormatBool(b.Powered), } } func (b Comparator) New(props BlockProperties) Block { return Comparator{ Powered: props["powered"] != "false", Facing: props["facing"], Mode: props["mode"], } } func (b Comparator) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:comparator", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/composter.go ================================================ package block import ( "strconv" ) type Composter struct { Level int } func (b Composter) Encode() (string, BlockProperties) { return "minecraft:composter", BlockProperties{ "level": strconv.Itoa(b.Level), } } func (b Composter) New(props BlockProperties) Block { return Composter{ Level: atoi(props["level"]), } } ================================================ FILE: server/world/block/conduit.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Conduit struct { Waterlogged bool } func (b Conduit) Encode() (string, BlockProperties) { return "minecraft:conduit", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b Conduit) New(props BlockProperties) Block { return Conduit{ Waterlogged: props["waterlogged"] != "false", } } func (b Conduit) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:conduit", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/copperBlock.go ================================================ package block type CopperBlock struct { } func (b CopperBlock) Encode() (string, BlockProperties) { return "minecraft:copper_block", BlockProperties{} } func (b CopperBlock) New(props BlockProperties) Block { return CopperBlock{} } ================================================ FILE: server/world/block/copperBulb.go ================================================ package block import ( "strconv" ) type CopperBulb struct { Lit bool Powered bool } func (b CopperBulb) Encode() (string, BlockProperties) { return "minecraft:copper_bulb", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "lit": strconv.FormatBool(b.Lit), } } func (b CopperBulb) New(props BlockProperties) Block { return CopperBulb{ Lit: props["lit"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/copperDoor.go ================================================ package block import ( "strconv" ) type CopperDoor struct { Open bool Powered bool Facing string Half string Hinge string } func (b CopperDoor) Encode() (string, BlockProperties) { return "minecraft:copper_door", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, "half": b.Half, "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), } } func (b CopperDoor) New(props BlockProperties) Block { return CopperDoor{ Half: props["half"], Hinge: props["hinge"], Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/copperGrate.go ================================================ package block import ( "strconv" ) type CopperGrate struct { Waterlogged bool } func (b CopperGrate) Encode() (string, BlockProperties) { return "minecraft:copper_grate", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b CopperGrate) New(props BlockProperties) Block { return CopperGrate{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/copperOre.go ================================================ package block type CopperOre struct { } func (b CopperOre) Encode() (string, BlockProperties) { return "minecraft:copper_ore", BlockProperties{} } func (b CopperOre) New(props BlockProperties) Block { return CopperOre{} } ================================================ FILE: server/world/block/copperTrapdoor.go ================================================ package block import ( "strconv" ) type CopperTrapdoor struct { Open bool Powered bool Waterlogged bool Facing string Half string } func (b CopperTrapdoor) Encode() (string, BlockProperties) { return "minecraft:copper_trapdoor", BlockProperties{ "facing": b.Facing, "half": b.Half, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b CopperTrapdoor) New(props BlockProperties) Block { return CopperTrapdoor{ Powered: props["powered"] != "false", Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Open: props["open"] != "false", } } ================================================ FILE: server/world/block/cornflower.go ================================================ package block type Cornflower struct { } func (b Cornflower) Encode() (string, BlockProperties) { return "minecraft:cornflower", BlockProperties{} } func (b Cornflower) New(props BlockProperties) Block { return Cornflower{} } ================================================ FILE: server/world/block/crackedDeepslateBricks.go ================================================ package block type CrackedDeepslateBricks struct { } func (b CrackedDeepslateBricks) Encode() (string, BlockProperties) { return "minecraft:cracked_deepslate_bricks", BlockProperties{} } func (b CrackedDeepslateBricks) New(props BlockProperties) Block { return CrackedDeepslateBricks{} } ================================================ FILE: server/world/block/crackedDeepslateTiles.go ================================================ package block type CrackedDeepslateTiles struct { } func (b CrackedDeepslateTiles) Encode() (string, BlockProperties) { return "minecraft:cracked_deepslate_tiles", BlockProperties{} } func (b CrackedDeepslateTiles) New(props BlockProperties) Block { return CrackedDeepslateTiles{} } ================================================ FILE: server/world/block/crackedNetherBricks.go ================================================ package block type CrackedNetherBricks struct { } func (b CrackedNetherBricks) Encode() (string, BlockProperties) { return "minecraft:cracked_nether_bricks", BlockProperties{} } func (b CrackedNetherBricks) New(props BlockProperties) Block { return CrackedNetherBricks{} } ================================================ FILE: server/world/block/crackedPolishedBlackstoneBricks.go ================================================ package block type CrackedPolishedBlackstoneBricks struct { } func (b CrackedPolishedBlackstoneBricks) Encode() (string, BlockProperties) { return "minecraft:cracked_polished_blackstone_bricks", BlockProperties{} } func (b CrackedPolishedBlackstoneBricks) New(props BlockProperties) Block { return CrackedPolishedBlackstoneBricks{} } ================================================ FILE: server/world/block/crackedStoneBricks.go ================================================ package block type CrackedStoneBricks struct { } func (b CrackedStoneBricks) Encode() (string, BlockProperties) { return "minecraft:cracked_stone_bricks", BlockProperties{} } func (b CrackedStoneBricks) New(props BlockProperties) Block { return CrackedStoneBricks{} } ================================================ FILE: server/world/block/crafter.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Crafter struct { Crafting bool Orientation string Triggered bool } func (b Crafter) Encode() (string, BlockProperties) { return "minecraft:crafter", BlockProperties{ "crafting": strconv.FormatBool(b.Crafting), "orientation": b.Orientation, "triggered": strconv.FormatBool(b.Triggered), } } func (b Crafter) New(props BlockProperties) Block { return Crafter{ Crafting: props["crafting"] != "false", Orientation: props["orientation"], Triggered: props["triggered"] != "false", } } func (b Crafter) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:crafter", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/craftingTable.go ================================================ package block type CraftingTable struct { } func (b CraftingTable) Encode() (string, BlockProperties) { return "minecraft:crafting_table", BlockProperties{} } func (b CraftingTable) New(props BlockProperties) Block { return CraftingTable{} } ================================================ FILE: server/world/block/creeperHead.go ================================================ package block import ( "strconv" ) type CreeperHead struct { Powered bool Rotation int } func (b CreeperHead) Encode() (string, BlockProperties) { return "minecraft:creeper_head", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), "powered": strconv.FormatBool(b.Powered), } } func (b CreeperHead) New(props BlockProperties) Block { return CreeperHead{ Powered: props["powered"] != "false", Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/creeperWallHead.go ================================================ package block import ( "strconv" ) type CreeperWallHead struct { Facing string Powered bool } func (b CreeperWallHead) Encode() (string, BlockProperties) { return "minecraft:creeper_wall_head", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, } } func (b CreeperWallHead) New(props BlockProperties) Block { return CreeperWallHead{ Facing: props["facing"], Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/crimsonButton.go ================================================ package block import ( "strconv" ) type CrimsonButton struct { Face string Facing string Powered bool } func (b CrimsonButton) Encode() (string, BlockProperties) { return "minecraft:crimson_button", BlockProperties{ "face": b.Face, "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), } } func (b CrimsonButton) New(props BlockProperties) Block { return CrimsonButton{ Face: props["face"], Facing: props["facing"], Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/crimsonDoor.go ================================================ package block import ( "strconv" ) type CrimsonDoor struct { Half string Hinge string Open bool Powered bool Facing string } func (b CrimsonDoor) Encode() (string, BlockProperties) { return "minecraft:crimson_door", BlockProperties{ "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, "half": b.Half, } } func (b CrimsonDoor) New(props BlockProperties) Block { return CrimsonDoor{ Hinge: props["hinge"], Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/crimsonFence.go ================================================ package block import ( "strconv" ) type CrimsonFence struct { Waterlogged bool West bool East bool North bool South bool } func (b CrimsonFence) Encode() (string, BlockProperties) { return "minecraft:crimson_fence", BlockProperties{ "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), } } func (b CrimsonFence) New(props BlockProperties) Block { return CrimsonFence{ Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", } } ================================================ FILE: server/world/block/crimsonFenceGate.go ================================================ package block import ( "strconv" ) type CrimsonFenceGate struct { InWall bool Open bool Powered bool Facing string } func (b CrimsonFenceGate) Encode() (string, BlockProperties) { return "minecraft:crimson_fence_gate", BlockProperties{ "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, "in_wall": strconv.FormatBool(b.InWall), } } func (b CrimsonFenceGate) New(props BlockProperties) Block { return CrimsonFenceGate{ Powered: props["powered"] != "false", Facing: props["facing"], InWall: props["in_wall"] != "false", Open: props["open"] != "false", } } ================================================ FILE: server/world/block/crimsonFungus.go ================================================ package block type CrimsonFungus struct { } func (b CrimsonFungus) Encode() (string, BlockProperties) { return "minecraft:crimson_fungus", BlockProperties{} } func (b CrimsonFungus) New(props BlockProperties) Block { return CrimsonFungus{} } ================================================ FILE: server/world/block/crimsonHangingSign.go ================================================ package block import ( "strconv" ) type CrimsonHangingSign struct { Attached bool Rotation int Waterlogged bool } func (b CrimsonHangingSign) Encode() (string, BlockProperties) { return "minecraft:crimson_hanging_sign", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), "waterlogged": strconv.FormatBool(b.Waterlogged), "attached": strconv.FormatBool(b.Attached), } } func (b CrimsonHangingSign) New(props BlockProperties) Block { return CrimsonHangingSign{ Attached: props["attached"] != "false", Rotation: atoi(props["rotation"]), Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/crimsonHyphae.go ================================================ package block type CrimsonHyphae struct { Axis string } func (b CrimsonHyphae) Encode() (string, BlockProperties) { return "minecraft:crimson_hyphae", BlockProperties{ "axis": b.Axis, } } func (b CrimsonHyphae) New(props BlockProperties) Block { return CrimsonHyphae{ Axis: props["axis"], } } ================================================ FILE: server/world/block/crimsonNylium.go ================================================ package block type CrimsonNylium struct { } func (b CrimsonNylium) Encode() (string, BlockProperties) { return "minecraft:crimson_nylium", BlockProperties{} } func (b CrimsonNylium) New(props BlockProperties) Block { return CrimsonNylium{} } ================================================ FILE: server/world/block/crimsonPlanks.go ================================================ package block type CrimsonPlanks struct { } func (b CrimsonPlanks) Encode() (string, BlockProperties) { return "minecraft:crimson_planks", BlockProperties{} } func (b CrimsonPlanks) New(props BlockProperties) Block { return CrimsonPlanks{} } ================================================ FILE: server/world/block/crimsonPressurePlate.go ================================================ package block import ( "strconv" ) type CrimsonPressurePlate struct { Powered bool } func (b CrimsonPressurePlate) Encode() (string, BlockProperties) { return "minecraft:crimson_pressure_plate", BlockProperties{ "powered": strconv.FormatBool(b.Powered), } } func (b CrimsonPressurePlate) New(props BlockProperties) Block { return CrimsonPressurePlate{ Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/crimsonRoots.go ================================================ package block type CrimsonRoots struct { } func (b CrimsonRoots) Encode() (string, BlockProperties) { return "minecraft:crimson_roots", BlockProperties{} } func (b CrimsonRoots) New(props BlockProperties) Block { return CrimsonRoots{} } ================================================ FILE: server/world/block/crimsonSign.go ================================================ package block import ( "strconv" ) type CrimsonSign struct { Rotation int Waterlogged bool } func (b CrimsonSign) Encode() (string, BlockProperties) { return "minecraft:crimson_sign", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b CrimsonSign) New(props BlockProperties) Block { return CrimsonSign{ Rotation: atoi(props["rotation"]), Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/crimsonSlab.go ================================================ package block import ( "strconv" ) type CrimsonSlab struct { Type string Waterlogged bool } func (b CrimsonSlab) Encode() (string, BlockProperties) { return "minecraft:crimson_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b CrimsonSlab) New(props BlockProperties) Block { return CrimsonSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/crimsonStairs.go ================================================ package block import ( "strconv" ) type CrimsonStairs struct { Half string Shape string Waterlogged bool Facing string } func (b CrimsonStairs) Encode() (string, BlockProperties) { return "minecraft:crimson_stairs", BlockProperties{ "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, } } func (b CrimsonStairs) New(props BlockProperties) Block { return CrimsonStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/crimsonStem.go ================================================ package block type CrimsonStem struct { Axis string } func (b CrimsonStem) Encode() (string, BlockProperties) { return "minecraft:crimson_stem", BlockProperties{ "axis": b.Axis, } } func (b CrimsonStem) New(props BlockProperties) Block { return CrimsonStem{ Axis: props["axis"], } } ================================================ FILE: server/world/block/crimsonTrapdoor.go ================================================ package block import ( "strconv" ) type CrimsonTrapdoor struct { Half string Open bool Powered bool Waterlogged bool Facing string } func (b CrimsonTrapdoor) Encode() (string, BlockProperties) { return "minecraft:crimson_trapdoor", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), } } func (b CrimsonTrapdoor) New(props BlockProperties) Block { return CrimsonTrapdoor{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Open: props["open"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/crimsonWallHangingSign.go ================================================ package block import ( "strconv" ) type CrimsonWallHangingSign struct { Facing string Waterlogged bool } func (b CrimsonWallHangingSign) Encode() (string, BlockProperties) { return "minecraft:crimson_wall_hanging_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b CrimsonWallHangingSign) New(props BlockProperties) Block { return CrimsonWallHangingSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/crimsonWallSign.go ================================================ package block import ( "strconv" ) type CrimsonWallSign struct { Waterlogged bool Facing string } func (b CrimsonWallSign) Encode() (string, BlockProperties) { return "minecraft:crimson_wall_sign", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b CrimsonWallSign) New(props BlockProperties) Block { return CrimsonWallSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/cryingObsidian.go ================================================ package block type CryingObsidian struct { } func (b CryingObsidian) Encode() (string, BlockProperties) { return "minecraft:crying_obsidian", BlockProperties{} } func (b CryingObsidian) New(props BlockProperties) Block { return CryingObsidian{} } ================================================ FILE: server/world/block/cutCopper.go ================================================ package block type CutCopper struct { } func (b CutCopper) Encode() (string, BlockProperties) { return "minecraft:cut_copper", BlockProperties{} } func (b CutCopper) New(props BlockProperties) Block { return CutCopper{} } ================================================ FILE: server/world/block/cutCopperSlab.go ================================================ package block import ( "strconv" ) type CutCopperSlab struct { Type string Waterlogged bool } func (b CutCopperSlab) Encode() (string, BlockProperties) { return "minecraft:cut_copper_slab", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "type": b.Type, } } func (b CutCopperSlab) New(props BlockProperties) Block { return CutCopperSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/cutCopperStairs.go ================================================ package block import ( "strconv" ) type CutCopperStairs struct { Facing string Half string Shape string Waterlogged bool } func (b CutCopperStairs) Encode() (string, BlockProperties) { return "minecraft:cut_copper_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b CutCopperStairs) New(props BlockProperties) Block { return CutCopperStairs{ Facing: props["facing"], Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/cutRedSandstone.go ================================================ package block type CutRedSandstone struct { } func (b CutRedSandstone) Encode() (string, BlockProperties) { return "minecraft:cut_red_sandstone", BlockProperties{} } func (b CutRedSandstone) New(props BlockProperties) Block { return CutRedSandstone{} } ================================================ FILE: server/world/block/cutRedSandstoneSlab.go ================================================ package block import ( "strconv" ) type CutRedSandstoneSlab struct { Type string Waterlogged bool } func (b CutRedSandstoneSlab) Encode() (string, BlockProperties) { return "minecraft:cut_red_sandstone_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b CutRedSandstoneSlab) New(props BlockProperties) Block { return CutRedSandstoneSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/cutSandstone.go ================================================ package block type CutSandstone struct { } func (b CutSandstone) Encode() (string, BlockProperties) { return "minecraft:cut_sandstone", BlockProperties{} } func (b CutSandstone) New(props BlockProperties) Block { return CutSandstone{} } ================================================ FILE: server/world/block/cutSandstoneSlab.go ================================================ package block import ( "strconv" ) type CutSandstoneSlab struct { Type string Waterlogged bool } func (b CutSandstoneSlab) Encode() (string, BlockProperties) { return "minecraft:cut_sandstone_slab", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "type": b.Type, } } func (b CutSandstoneSlab) New(props BlockProperties) Block { return CutSandstoneSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/cyanBanner.go ================================================ package block import ( "strconv" ) type CyanBanner struct { Rotation int } func (b CyanBanner) Encode() (string, BlockProperties) { return "minecraft:cyan_banner", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), } } func (b CyanBanner) New(props BlockProperties) Block { return CyanBanner{ Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/cyanBed.go ================================================ package block import ( "strconv" ) type CyanBed struct { Occupied bool Part string Facing string } func (b CyanBed) Encode() (string, BlockProperties) { return "minecraft:cyan_bed", BlockProperties{ "facing": b.Facing, "occupied": strconv.FormatBool(b.Occupied), "part": b.Part, } } func (b CyanBed) New(props BlockProperties) Block { return CyanBed{ Facing: props["facing"], Occupied: props["occupied"] != "false", Part: props["part"], } } ================================================ FILE: server/world/block/cyanCandle.go ================================================ package block import ( "strconv" ) type CyanCandle struct { Candles int Lit bool Waterlogged bool } func (b CyanCandle) Encode() (string, BlockProperties) { return "minecraft:cyan_candle", BlockProperties{ "candles": strconv.Itoa(b.Candles), "lit": strconv.FormatBool(b.Lit), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b CyanCandle) New(props BlockProperties) Block { return CyanCandle{ Waterlogged: props["waterlogged"] != "false", Candles: atoi(props["candles"]), Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/cyanCandleCake.go ================================================ package block import ( "strconv" ) type CyanCandleCake struct { Lit bool } func (b CyanCandleCake) Encode() (string, BlockProperties) { return "minecraft:cyan_candle_cake", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b CyanCandleCake) New(props BlockProperties) Block { return CyanCandleCake{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/cyanCarpet.go ================================================ package block type CyanCarpet struct { } func (b CyanCarpet) Encode() (string, BlockProperties) { return "minecraft:cyan_carpet", BlockProperties{} } func (b CyanCarpet) New(props BlockProperties) Block { return CyanCarpet{} } ================================================ FILE: server/world/block/cyanConcrete.go ================================================ package block type CyanConcrete struct { } func (b CyanConcrete) Encode() (string, BlockProperties) { return "minecraft:cyan_concrete", BlockProperties{} } func (b CyanConcrete) New(props BlockProperties) Block { return CyanConcrete{} } ================================================ FILE: server/world/block/cyanConcretePowder.go ================================================ package block type CyanConcretePowder struct { } func (b CyanConcretePowder) Encode() (string, BlockProperties) { return "minecraft:cyan_concrete_powder", BlockProperties{} } func (b CyanConcretePowder) New(props BlockProperties) Block { return CyanConcretePowder{} } ================================================ FILE: server/world/block/cyanGlazedTerracotta.go ================================================ package block type CyanGlazedTerracotta struct { Facing string } func (b CyanGlazedTerracotta) Encode() (string, BlockProperties) { return "minecraft:cyan_glazed_terracotta", BlockProperties{ "facing": b.Facing, } } func (b CyanGlazedTerracotta) New(props BlockProperties) Block { return CyanGlazedTerracotta{ Facing: props["facing"], } } ================================================ FILE: server/world/block/cyanShulkerBox.go ================================================ package block type CyanShulkerBox struct { Facing string } func (b CyanShulkerBox) Encode() (string, BlockProperties) { return "minecraft:cyan_shulker_box", BlockProperties{ "facing": b.Facing, } } func (b CyanShulkerBox) New(props BlockProperties) Block { return CyanShulkerBox{ Facing: props["facing"], } } ================================================ FILE: server/world/block/cyanStainedGlass.go ================================================ package block type CyanStainedGlass struct { } func (b CyanStainedGlass) Encode() (string, BlockProperties) { return "minecraft:cyan_stained_glass", BlockProperties{} } func (b CyanStainedGlass) New(props BlockProperties) Block { return CyanStainedGlass{} } ================================================ FILE: server/world/block/cyanStainedGlassPane.go ================================================ package block import ( "strconv" ) type CyanStainedGlassPane struct { Waterlogged bool West bool East bool North bool South bool } func (b CyanStainedGlassPane) Encode() (string, BlockProperties) { return "minecraft:cyan_stained_glass_pane", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), } } func (b CyanStainedGlassPane) New(props BlockProperties) Block { return CyanStainedGlassPane{ East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", } } ================================================ FILE: server/world/block/cyanTerracotta.go ================================================ package block type CyanTerracotta struct { } func (b CyanTerracotta) Encode() (string, BlockProperties) { return "minecraft:cyan_terracotta", BlockProperties{} } func (b CyanTerracotta) New(props BlockProperties) Block { return CyanTerracotta{} } ================================================ FILE: server/world/block/cyanWallBanner.go ================================================ package block type CyanWallBanner struct { Facing string } func (b CyanWallBanner) Encode() (string, BlockProperties) { return "minecraft:cyan_wall_banner", BlockProperties{ "facing": b.Facing, } } func (b CyanWallBanner) New(props BlockProperties) Block { return CyanWallBanner{ Facing: props["facing"], } } ================================================ FILE: server/world/block/cyanWool.go ================================================ package block type CyanWool struct { } func (b CyanWool) Encode() (string, BlockProperties) { return "minecraft:cyan_wool", BlockProperties{} } func (b CyanWool) New(props BlockProperties) Block { return CyanWool{} } ================================================ FILE: server/world/block/damagedAnvil.go ================================================ package block type DamagedAnvil struct { Facing string } func (b DamagedAnvil) Encode() (string, BlockProperties) { return "minecraft:damaged_anvil", BlockProperties{ "facing": b.Facing, } } func (b DamagedAnvil) New(props BlockProperties) Block { return DamagedAnvil{ Facing: props["facing"], } } ================================================ FILE: server/world/block/dandelion.go ================================================ package block type Dandelion struct { } func (b Dandelion) Encode() (string, BlockProperties) { return "minecraft:dandelion", BlockProperties{} } func (b Dandelion) New(props BlockProperties) Block { return Dandelion{} } ================================================ FILE: server/world/block/darkOakButton.go ================================================ package block import ( "strconv" ) type DarkOakButton struct { Powered bool Face string Facing string } func (b DarkOakButton) Encode() (string, BlockProperties) { return "minecraft:dark_oak_button", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "face": b.Face, "facing": b.Facing, } } func (b DarkOakButton) New(props BlockProperties) Block { return DarkOakButton{ Powered: props["powered"] != "false", Face: props["face"], Facing: props["facing"], } } ================================================ FILE: server/world/block/darkOakDoor.go ================================================ package block import ( "strconv" ) type DarkOakDoor struct { Facing string Half string Hinge string Open bool Powered bool } func (b DarkOakDoor) Encode() (string, BlockProperties) { return "minecraft:dark_oak_door", BlockProperties{ "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, "half": b.Half, } } func (b DarkOakDoor) New(props BlockProperties) Block { return DarkOakDoor{ Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], Half: props["half"], Hinge: props["hinge"], } } ================================================ FILE: server/world/block/darkOakFence.go ================================================ package block import ( "strconv" ) type DarkOakFence struct { North bool South bool Waterlogged bool West bool East bool } func (b DarkOakFence) Encode() (string, BlockProperties) { return "minecraft:dark_oak_fence", BlockProperties{ "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DarkOakFence) New(props BlockProperties) Block { return DarkOakFence{ Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", } } ================================================ FILE: server/world/block/darkOakFenceGate.go ================================================ package block import ( "strconv" ) type DarkOakFenceGate struct { Powered bool Facing string InWall bool Open bool } func (b DarkOakFenceGate) Encode() (string, BlockProperties) { return "minecraft:dark_oak_fence_gate", BlockProperties{ "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, "in_wall": strconv.FormatBool(b.InWall), } } func (b DarkOakFenceGate) New(props BlockProperties) Block { return DarkOakFenceGate{ Powered: props["powered"] != "false", Facing: props["facing"], InWall: props["in_wall"] != "false", Open: props["open"] != "false", } } ================================================ FILE: server/world/block/darkOakHangingSign.go ================================================ package block import ( "strconv" ) type DarkOakHangingSign struct { Attached bool Rotation int Waterlogged bool } func (b DarkOakHangingSign) Encode() (string, BlockProperties) { return "minecraft:dark_oak_hanging_sign", BlockProperties{ "attached": strconv.FormatBool(b.Attached), "rotation": strconv.Itoa(b.Rotation), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DarkOakHangingSign) New(props BlockProperties) Block { return DarkOakHangingSign{ Rotation: atoi(props["rotation"]), Waterlogged: props["waterlogged"] != "false", Attached: props["attached"] != "false", } } ================================================ FILE: server/world/block/darkOakLeaves.go ================================================ package block import ( "strconv" ) type DarkOakLeaves struct { Distance int Persistent bool Waterlogged bool } func (b DarkOakLeaves) Encode() (string, BlockProperties) { return "minecraft:dark_oak_leaves", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "distance": strconv.Itoa(b.Distance), "persistent": strconv.FormatBool(b.Persistent), } } func (b DarkOakLeaves) New(props BlockProperties) Block { return DarkOakLeaves{ Distance: atoi(props["distance"]), Persistent: props["persistent"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/darkOakLog.go ================================================ package block type DarkOakLog struct { Axis string } func (b DarkOakLog) Encode() (string, BlockProperties) { return "minecraft:dark_oak_log", BlockProperties{ "axis": b.Axis, } } func (b DarkOakLog) New(props BlockProperties) Block { return DarkOakLog{ Axis: props["axis"], } } ================================================ FILE: server/world/block/darkOakPlanks.go ================================================ package block type DarkOakPlanks struct { } func (b DarkOakPlanks) Encode() (string, BlockProperties) { return "minecraft:dark_oak_planks", BlockProperties{} } func (b DarkOakPlanks) New(props BlockProperties) Block { return DarkOakPlanks{} } ================================================ FILE: server/world/block/darkOakPressurePlate.go ================================================ package block import ( "strconv" ) type DarkOakPressurePlate struct { Powered bool } func (b DarkOakPressurePlate) Encode() (string, BlockProperties) { return "minecraft:dark_oak_pressure_plate", BlockProperties{ "powered": strconv.FormatBool(b.Powered), } } func (b DarkOakPressurePlate) New(props BlockProperties) Block { return DarkOakPressurePlate{ Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/darkOakSapling.go ================================================ package block import ( "strconv" ) type DarkOakSapling struct { Stage int } func (b DarkOakSapling) Encode() (string, BlockProperties) { return "minecraft:dark_oak_sapling", BlockProperties{ "stage": strconv.Itoa(b.Stage), } } func (b DarkOakSapling) New(props BlockProperties) Block { return DarkOakSapling{ Stage: atoi(props["stage"]), } } ================================================ FILE: server/world/block/darkOakSign.go ================================================ package block import ( "strconv" ) type DarkOakSign struct { Waterlogged bool Rotation int } func (b DarkOakSign) Encode() (string, BlockProperties) { return "minecraft:dark_oak_sign", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "rotation": strconv.Itoa(b.Rotation), } } func (b DarkOakSign) New(props BlockProperties) Block { return DarkOakSign{ Waterlogged: props["waterlogged"] != "false", Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/darkOakSlab.go ================================================ package block import ( "strconv" ) type DarkOakSlab struct { Waterlogged bool Type string } func (b DarkOakSlab) Encode() (string, BlockProperties) { return "minecraft:dark_oak_slab", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "type": b.Type, } } func (b DarkOakSlab) New(props BlockProperties) Block { return DarkOakSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/darkOakStairs.go ================================================ package block import ( "strconv" ) type DarkOakStairs struct { Facing string Half string Shape string Waterlogged bool } func (b DarkOakStairs) Encode() (string, BlockProperties) { return "minecraft:dark_oak_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DarkOakStairs) New(props BlockProperties) Block { return DarkOakStairs{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Shape: props["shape"], } } ================================================ FILE: server/world/block/darkOakTrapdoor.go ================================================ package block import ( "strconv" ) type DarkOakTrapdoor struct { Half string Open bool Powered bool Waterlogged bool Facing string } func (b DarkOakTrapdoor) Encode() (string, BlockProperties) { return "minecraft:dark_oak_trapdoor", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, "open": strconv.FormatBool(b.Open), } } func (b DarkOakTrapdoor) New(props BlockProperties) Block { return DarkOakTrapdoor{ Half: props["half"], Open: props["open"] != "false", Powered: props["powered"] != "false", Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/darkOakWallHangingSign.go ================================================ package block import ( "strconv" ) type DarkOakWallHangingSign struct { Facing string Waterlogged bool } func (b DarkOakWallHangingSign) Encode() (string, BlockProperties) { return "minecraft:dark_oak_wall_hanging_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DarkOakWallHangingSign) New(props BlockProperties) Block { return DarkOakWallHangingSign{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/darkOakWallSign.go ================================================ package block import ( "strconv" ) type DarkOakWallSign struct { Facing string Waterlogged bool } func (b DarkOakWallSign) Encode() (string, BlockProperties) { return "minecraft:dark_oak_wall_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DarkOakWallSign) New(props BlockProperties) Block { return DarkOakWallSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/darkOakWood.go ================================================ package block type DarkOakWood struct { Axis string } func (b DarkOakWood) Encode() (string, BlockProperties) { return "minecraft:dark_oak_wood", BlockProperties{ "axis": b.Axis, } } func (b DarkOakWood) New(props BlockProperties) Block { return DarkOakWood{ Axis: props["axis"], } } ================================================ FILE: server/world/block/darkPrismarine.go ================================================ package block type DarkPrismarine struct { } func (b DarkPrismarine) Encode() (string, BlockProperties) { return "minecraft:dark_prismarine", BlockProperties{} } func (b DarkPrismarine) New(props BlockProperties) Block { return DarkPrismarine{} } ================================================ FILE: server/world/block/darkPrismarineSlab.go ================================================ package block import ( "strconv" ) type DarkPrismarineSlab struct { Type string Waterlogged bool } func (b DarkPrismarineSlab) Encode() (string, BlockProperties) { return "minecraft:dark_prismarine_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DarkPrismarineSlab) New(props BlockProperties) Block { return DarkPrismarineSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/darkPrismarineStairs.go ================================================ package block import ( "strconv" ) type DarkPrismarineStairs struct { Facing string Half string Shape string Waterlogged bool } func (b DarkPrismarineStairs) Encode() (string, BlockProperties) { return "minecraft:dark_prismarine_stairs", BlockProperties{ "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b DarkPrismarineStairs) New(props BlockProperties) Block { return DarkPrismarineStairs{ Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/daylightDetector.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type DaylightDetector struct { Power int Inverted bool } func (b DaylightDetector) Encode() (string, BlockProperties) { return "minecraft:daylight_detector", BlockProperties{ "inverted": strconv.FormatBool(b.Inverted), "power": strconv.Itoa(b.Power), } } func (b DaylightDetector) New(props BlockProperties) Block { return DaylightDetector{ Inverted: props["inverted"] != "false", Power: atoi(props["power"]), } } func (b DaylightDetector) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:daylight_detector", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/deadBrainCoral.go ================================================ package block import ( "strconv" ) type DeadBrainCoral struct { Waterlogged bool } func (b DeadBrainCoral) Encode() (string, BlockProperties) { return "minecraft:dead_brain_coral", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DeadBrainCoral) New(props BlockProperties) Block { return DeadBrainCoral{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/deadBrainCoralBlock.go ================================================ package block type DeadBrainCoralBlock struct { } func (b DeadBrainCoralBlock) Encode() (string, BlockProperties) { return "minecraft:dead_brain_coral_block", BlockProperties{} } func (b DeadBrainCoralBlock) New(props BlockProperties) Block { return DeadBrainCoralBlock{} } ================================================ FILE: server/world/block/deadBrainCoralFan.go ================================================ package block import ( "strconv" ) type DeadBrainCoralFan struct { Waterlogged bool } func (b DeadBrainCoralFan) Encode() (string, BlockProperties) { return "minecraft:dead_brain_coral_fan", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DeadBrainCoralFan) New(props BlockProperties) Block { return DeadBrainCoralFan{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/deadBrainCoralWallFan.go ================================================ package block import ( "strconv" ) type DeadBrainCoralWallFan struct { Facing string Waterlogged bool } func (b DeadBrainCoralWallFan) Encode() (string, BlockProperties) { return "minecraft:dead_brain_coral_wall_fan", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b DeadBrainCoralWallFan) New(props BlockProperties) Block { return DeadBrainCoralWallFan{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/deadBubbleCoral.go ================================================ package block import ( "strconv" ) type DeadBubbleCoral struct { Waterlogged bool } func (b DeadBubbleCoral) Encode() (string, BlockProperties) { return "minecraft:dead_bubble_coral", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DeadBubbleCoral) New(props BlockProperties) Block { return DeadBubbleCoral{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/deadBubbleCoralBlock.go ================================================ package block type DeadBubbleCoralBlock struct { } func (b DeadBubbleCoralBlock) Encode() (string, BlockProperties) { return "minecraft:dead_bubble_coral_block", BlockProperties{} } func (b DeadBubbleCoralBlock) New(props BlockProperties) Block { return DeadBubbleCoralBlock{} } ================================================ FILE: server/world/block/deadBubbleCoralFan.go ================================================ package block import ( "strconv" ) type DeadBubbleCoralFan struct { Waterlogged bool } func (b DeadBubbleCoralFan) Encode() (string, BlockProperties) { return "minecraft:dead_bubble_coral_fan", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DeadBubbleCoralFan) New(props BlockProperties) Block { return DeadBubbleCoralFan{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/deadBubbleCoralWallFan.go ================================================ package block import ( "strconv" ) type DeadBubbleCoralWallFan struct { Facing string Waterlogged bool } func (b DeadBubbleCoralWallFan) Encode() (string, BlockProperties) { return "minecraft:dead_bubble_coral_wall_fan", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DeadBubbleCoralWallFan) New(props BlockProperties) Block { return DeadBubbleCoralWallFan{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/deadBush.go ================================================ package block type DeadBush struct { } func (b DeadBush) Encode() (string, BlockProperties) { return "minecraft:dead_bush", BlockProperties{} } func (b DeadBush) New(props BlockProperties) Block { return DeadBush{} } ================================================ FILE: server/world/block/deadFireCoral.go ================================================ package block import ( "strconv" ) type DeadFireCoral struct { Waterlogged bool } func (b DeadFireCoral) Encode() (string, BlockProperties) { return "minecraft:dead_fire_coral", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DeadFireCoral) New(props BlockProperties) Block { return DeadFireCoral{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/deadFireCoralBlock.go ================================================ package block type DeadFireCoralBlock struct { } func (b DeadFireCoralBlock) Encode() (string, BlockProperties) { return "minecraft:dead_fire_coral_block", BlockProperties{} } func (b DeadFireCoralBlock) New(props BlockProperties) Block { return DeadFireCoralBlock{} } ================================================ FILE: server/world/block/deadFireCoralFan.go ================================================ package block import ( "strconv" ) type DeadFireCoralFan struct { Waterlogged bool } func (b DeadFireCoralFan) Encode() (string, BlockProperties) { return "minecraft:dead_fire_coral_fan", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DeadFireCoralFan) New(props BlockProperties) Block { return DeadFireCoralFan{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/deadFireCoralWallFan.go ================================================ package block import ( "strconv" ) type DeadFireCoralWallFan struct { Facing string Waterlogged bool } func (b DeadFireCoralWallFan) Encode() (string, BlockProperties) { return "minecraft:dead_fire_coral_wall_fan", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DeadFireCoralWallFan) New(props BlockProperties) Block { return DeadFireCoralWallFan{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/deadHornCoral.go ================================================ package block import ( "strconv" ) type DeadHornCoral struct { Waterlogged bool } func (b DeadHornCoral) Encode() (string, BlockProperties) { return "minecraft:dead_horn_coral", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DeadHornCoral) New(props BlockProperties) Block { return DeadHornCoral{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/deadHornCoralBlock.go ================================================ package block type DeadHornCoralBlock struct { } func (b DeadHornCoralBlock) Encode() (string, BlockProperties) { return "minecraft:dead_horn_coral_block", BlockProperties{} } func (b DeadHornCoralBlock) New(props BlockProperties) Block { return DeadHornCoralBlock{} } ================================================ FILE: server/world/block/deadHornCoralFan.go ================================================ package block import ( "strconv" ) type DeadHornCoralFan struct { Waterlogged bool } func (b DeadHornCoralFan) Encode() (string, BlockProperties) { return "minecraft:dead_horn_coral_fan", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DeadHornCoralFan) New(props BlockProperties) Block { return DeadHornCoralFan{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/deadHornCoralWallFan.go ================================================ package block import ( "strconv" ) type DeadHornCoralWallFan struct { Facing string Waterlogged bool } func (b DeadHornCoralWallFan) Encode() (string, BlockProperties) { return "minecraft:dead_horn_coral_wall_fan", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b DeadHornCoralWallFan) New(props BlockProperties) Block { return DeadHornCoralWallFan{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/deadTubeCoral.go ================================================ package block import ( "strconv" ) type DeadTubeCoral struct { Waterlogged bool } func (b DeadTubeCoral) Encode() (string, BlockProperties) { return "minecraft:dead_tube_coral", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DeadTubeCoral) New(props BlockProperties) Block { return DeadTubeCoral{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/deadTubeCoralBlock.go ================================================ package block type DeadTubeCoralBlock struct { } func (b DeadTubeCoralBlock) Encode() (string, BlockProperties) { return "minecraft:dead_tube_coral_block", BlockProperties{} } func (b DeadTubeCoralBlock) New(props BlockProperties) Block { return DeadTubeCoralBlock{} } ================================================ FILE: server/world/block/deadTubeCoralFan.go ================================================ package block import ( "strconv" ) type DeadTubeCoralFan struct { Waterlogged bool } func (b DeadTubeCoralFan) Encode() (string, BlockProperties) { return "minecraft:dead_tube_coral_fan", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DeadTubeCoralFan) New(props BlockProperties) Block { return DeadTubeCoralFan{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/deadTubeCoralWallFan.go ================================================ package block import ( "strconv" ) type DeadTubeCoralWallFan struct { Facing string Waterlogged bool } func (b DeadTubeCoralWallFan) Encode() (string, BlockProperties) { return "minecraft:dead_tube_coral_wall_fan", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DeadTubeCoralWallFan) New(props BlockProperties) Block { return DeadTubeCoralWallFan{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/decoratedPot.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type DecoratedPot struct { Cracked bool Facing string Waterlogged bool } func (b DecoratedPot) Encode() (string, BlockProperties) { return "minecraft:decorated_pot", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "cracked": strconv.FormatBool(b.Cracked), "facing": b.Facing, } } func (b DecoratedPot) New(props BlockProperties) Block { return DecoratedPot{ Cracked: props["cracked"] != "false", Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } func (b DecoratedPot) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:decorated_pot", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/deepslate.go ================================================ package block type Deepslate struct { Axis string } func (b Deepslate) Encode() (string, BlockProperties) { return "minecraft:deepslate", BlockProperties{ "axis": b.Axis, } } func (b Deepslate) New(props BlockProperties) Block { return Deepslate{ Axis: props["axis"], } } ================================================ FILE: server/world/block/deepslateBrickSlab.go ================================================ package block import ( "strconv" ) type DeepslateBrickSlab struct { Type string Waterlogged bool } func (b DeepslateBrickSlab) Encode() (string, BlockProperties) { return "minecraft:deepslate_brick_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DeepslateBrickSlab) New(props BlockProperties) Block { return DeepslateBrickSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/deepslateBrickStairs.go ================================================ package block import ( "strconv" ) type DeepslateBrickStairs struct { Facing string Half string Shape string Waterlogged bool } func (b DeepslateBrickStairs) Encode() (string, BlockProperties) { return "minecraft:deepslate_brick_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DeepslateBrickStairs) New(props BlockProperties) Block { return DeepslateBrickStairs{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Shape: props["shape"], } } ================================================ FILE: server/world/block/deepslateBrickWall.go ================================================ package block import ( "strconv" ) type DeepslateBrickWall struct { Up bool Waterlogged bool West string East string North string South string } func (b DeepslateBrickWall) Encode() (string, BlockProperties) { return "minecraft:deepslate_brick_wall", BlockProperties{ "west": b.West, "east": b.East, "north": b.North, "south": b.South, "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DeepslateBrickWall) New(props BlockProperties) Block { return DeepslateBrickWall{ East: props["east"], North: props["north"], South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], } } ================================================ FILE: server/world/block/deepslateBricks.go ================================================ package block type DeepslateBricks struct { } func (b DeepslateBricks) Encode() (string, BlockProperties) { return "minecraft:deepslate_bricks", BlockProperties{} } func (b DeepslateBricks) New(props BlockProperties) Block { return DeepslateBricks{} } ================================================ FILE: server/world/block/deepslateCoalOre.go ================================================ package block type DeepslateCoalOre struct { } func (b DeepslateCoalOre) Encode() (string, BlockProperties) { return "minecraft:deepslate_coal_ore", BlockProperties{} } func (b DeepslateCoalOre) New(props BlockProperties) Block { return DeepslateCoalOre{} } ================================================ FILE: server/world/block/deepslateCopperOre.go ================================================ package block type DeepslateCopperOre struct { } func (b DeepslateCopperOre) Encode() (string, BlockProperties) { return "minecraft:deepslate_copper_ore", BlockProperties{} } func (b DeepslateCopperOre) New(props BlockProperties) Block { return DeepslateCopperOre{} } ================================================ FILE: server/world/block/deepslateDiamondOre.go ================================================ package block type DeepslateDiamondOre struct { } func (b DeepslateDiamondOre) Encode() (string, BlockProperties) { return "minecraft:deepslate_diamond_ore", BlockProperties{} } func (b DeepslateDiamondOre) New(props BlockProperties) Block { return DeepslateDiamondOre{} } ================================================ FILE: server/world/block/deepslateEmeraldOre.go ================================================ package block type DeepslateEmeraldOre struct { } func (b DeepslateEmeraldOre) Encode() (string, BlockProperties) { return "minecraft:deepslate_emerald_ore", BlockProperties{} } func (b DeepslateEmeraldOre) New(props BlockProperties) Block { return DeepslateEmeraldOre{} } ================================================ FILE: server/world/block/deepslateGoldOre.go ================================================ package block type DeepslateGoldOre struct { } func (b DeepslateGoldOre) Encode() (string, BlockProperties) { return "minecraft:deepslate_gold_ore", BlockProperties{} } func (b DeepslateGoldOre) New(props BlockProperties) Block { return DeepslateGoldOre{} } ================================================ FILE: server/world/block/deepslateIronOre.go ================================================ package block type DeepslateIronOre struct { } func (b DeepslateIronOre) Encode() (string, BlockProperties) { return "minecraft:deepslate_iron_ore", BlockProperties{} } func (b DeepslateIronOre) New(props BlockProperties) Block { return DeepslateIronOre{} } ================================================ FILE: server/world/block/deepslateLapisOre.go ================================================ package block type DeepslateLapisOre struct { } func (b DeepslateLapisOre) Encode() (string, BlockProperties) { return "minecraft:deepslate_lapis_ore", BlockProperties{} } func (b DeepslateLapisOre) New(props BlockProperties) Block { return DeepslateLapisOre{} } ================================================ FILE: server/world/block/deepslateRedstoneOre.go ================================================ package block import ( "strconv" ) type DeepslateRedstoneOre struct { Lit bool } func (b DeepslateRedstoneOre) Encode() (string, BlockProperties) { return "minecraft:deepslate_redstone_ore", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b DeepslateRedstoneOre) New(props BlockProperties) Block { return DeepslateRedstoneOre{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/deepslateTileSlab.go ================================================ package block import ( "strconv" ) type DeepslateTileSlab struct { Type string Waterlogged bool } func (b DeepslateTileSlab) Encode() (string, BlockProperties) { return "minecraft:deepslate_tile_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DeepslateTileSlab) New(props BlockProperties) Block { return DeepslateTileSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/deepslateTileStairs.go ================================================ package block import ( "strconv" ) type DeepslateTileStairs struct { Facing string Half string Shape string Waterlogged bool } func (b DeepslateTileStairs) Encode() (string, BlockProperties) { return "minecraft:deepslate_tile_stairs", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, "shape": b.Shape, } } func (b DeepslateTileStairs) New(props BlockProperties) Block { return DeepslateTileStairs{ Facing: props["facing"], Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/deepslateTileWall.go ================================================ package block import ( "strconv" ) type DeepslateTileWall struct { West string East string North string South string Up bool Waterlogged bool } func (b DeepslateTileWall) Encode() (string, BlockProperties) { return "minecraft:deepslate_tile_wall", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, "north": b.North, "south": b.South, "up": strconv.FormatBool(b.Up), } } func (b DeepslateTileWall) New(props BlockProperties) Block { return DeepslateTileWall{ North: props["north"], South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], East: props["east"], } } ================================================ FILE: server/world/block/deepslateTiles.go ================================================ package block type DeepslateTiles struct { } func (b DeepslateTiles) Encode() (string, BlockProperties) { return "minecraft:deepslate_tiles", BlockProperties{} } func (b DeepslateTiles) New(props BlockProperties) Block { return DeepslateTiles{} } ================================================ FILE: server/world/block/detectorRail.go ================================================ package block import ( "strconv" ) type DetectorRail struct { Powered bool Shape string Waterlogged bool } func (b DetectorRail) Encode() (string, BlockProperties) { return "minecraft:detector_rail", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DetectorRail) New(props BlockProperties) Block { return DetectorRail{ Powered: props["powered"] != "false", Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/diamondBlock.go ================================================ package block type DiamondBlock struct { } func (b DiamondBlock) Encode() (string, BlockProperties) { return "minecraft:diamond_block", BlockProperties{} } func (b DiamondBlock) New(props BlockProperties) Block { return DiamondBlock{} } ================================================ FILE: server/world/block/diamondOre.go ================================================ package block type DiamondOre struct { } func (b DiamondOre) Encode() (string, BlockProperties) { return "minecraft:diamond_ore", BlockProperties{} } func (b DiamondOre) New(props BlockProperties) Block { return DiamondOre{} } ================================================ FILE: server/world/block/diorite.go ================================================ package block type Diorite struct { } func (b Diorite) Encode() (string, BlockProperties) { return "minecraft:diorite", BlockProperties{} } func (b Diorite) New(props BlockProperties) Block { return Diorite{} } ================================================ FILE: server/world/block/dioriteSlab.go ================================================ package block import ( "strconv" ) type DioriteSlab struct { Type string Waterlogged bool } func (b DioriteSlab) Encode() (string, BlockProperties) { return "minecraft:diorite_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DioriteSlab) New(props BlockProperties) Block { return DioriteSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/dioriteStairs.go ================================================ package block import ( "strconv" ) type DioriteStairs struct { Facing string Half string Shape string Waterlogged bool } func (b DioriteStairs) Encode() (string, BlockProperties) { return "minecraft:diorite_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b DioriteStairs) New(props BlockProperties) Block { return DioriteStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/dioriteWall.go ================================================ package block import ( "strconv" ) type DioriteWall struct { East string North string South string Up bool Waterlogged bool West string } func (b DioriteWall) Encode() (string, BlockProperties) { return "minecraft:diorite_wall", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, "north": b.North, "south": b.South, "up": strconv.FormatBool(b.Up), } } func (b DioriteWall) New(props BlockProperties) Block { return DioriteWall{ Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], East: props["east"], North: props["north"], South: props["south"], } } ================================================ FILE: server/world/block/dirt.go ================================================ package block type Dirt struct { } func (b Dirt) Encode() (string, BlockProperties) { return "minecraft:dirt", BlockProperties{} } func (b Dirt) New(props BlockProperties) Block { return Dirt{} } ================================================ FILE: server/world/block/dirtPath.go ================================================ package block type DirtPath struct { } func (b DirtPath) Encode() (string, BlockProperties) { return "minecraft:dirt_path", BlockProperties{} } func (b DirtPath) New(props BlockProperties) Block { return DirtPath{} } ================================================ FILE: server/world/block/dispenser.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Dispenser struct { Facing string Triggered bool } func (b Dispenser) Encode() (string, BlockProperties) { return "minecraft:dispenser", BlockProperties{ "triggered": strconv.FormatBool(b.Triggered), "facing": b.Facing, } } func (b Dispenser) New(props BlockProperties) Block { return Dispenser{ Facing: props["facing"], Triggered: props["triggered"] != "false", } } func (b Dispenser) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:dispenser", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/dragonEgg.go ================================================ package block type DragonEgg struct { } func (b DragonEgg) Encode() (string, BlockProperties) { return "minecraft:dragon_egg", BlockProperties{} } func (b DragonEgg) New(props BlockProperties) Block { return DragonEgg{} } ================================================ FILE: server/world/block/dragonHead.go ================================================ package block import ( "strconv" ) type DragonHead struct { Powered bool Rotation int } func (b DragonHead) Encode() (string, BlockProperties) { return "minecraft:dragon_head", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "rotation": strconv.Itoa(b.Rotation), } } func (b DragonHead) New(props BlockProperties) Block { return DragonHead{ Powered: props["powered"] != "false", Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/dragonWallHead.go ================================================ package block import ( "strconv" ) type DragonWallHead struct { Facing string Powered bool } func (b DragonWallHead) Encode() (string, BlockProperties) { return "minecraft:dragon_wall_head", BlockProperties{ "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), } } func (b DragonWallHead) New(props BlockProperties) Block { return DragonWallHead{ Facing: props["facing"], Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/driedKelpBlock.go ================================================ package block type DriedKelpBlock struct { } func (b DriedKelpBlock) Encode() (string, BlockProperties) { return "minecraft:dried_kelp_block", BlockProperties{} } func (b DriedKelpBlock) New(props BlockProperties) Block { return DriedKelpBlock{} } ================================================ FILE: server/world/block/dripstoneBlock.go ================================================ package block type DripstoneBlock struct { } func (b DripstoneBlock) Encode() (string, BlockProperties) { return "minecraft:dripstone_block", BlockProperties{} } func (b DripstoneBlock) New(props BlockProperties) Block { return DripstoneBlock{} } ================================================ FILE: server/world/block/dropper.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Dropper struct { Facing string Triggered bool } func (b Dropper) Encode() (string, BlockProperties) { return "minecraft:dropper", BlockProperties{ "facing": b.Facing, "triggered": strconv.FormatBool(b.Triggered), } } func (b Dropper) New(props BlockProperties) Block { return Dropper{ Triggered: props["triggered"] != "false", Facing: props["facing"], } } func (b Dropper) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:dropper", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/emeraldBlock.go ================================================ package block type EmeraldBlock struct { } func (b EmeraldBlock) Encode() (string, BlockProperties) { return "minecraft:emerald_block", BlockProperties{} } func (b EmeraldBlock) New(props BlockProperties) Block { return EmeraldBlock{} } ================================================ FILE: server/world/block/emeraldOre.go ================================================ package block type EmeraldOre struct { } func (b EmeraldOre) Encode() (string, BlockProperties) { return "minecraft:emerald_ore", BlockProperties{} } func (b EmeraldOre) New(props BlockProperties) Block { return EmeraldOre{} } ================================================ FILE: server/world/block/enchantingTable.go ================================================ package block import ( "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type EnchantingTable struct { } func (b EnchantingTable) Encode() (string, BlockProperties) { return "minecraft:enchanting_table", BlockProperties{} } func (b EnchantingTable) New(props BlockProperties) Block { return EnchantingTable{} } func (b EnchantingTable) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:enchanting_table", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/endGateway.go ================================================ package block import ( "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type EndGateway struct { } func (b EndGateway) Encode() (string, BlockProperties) { return "minecraft:end_gateway", BlockProperties{} } func (b EndGateway) New(props BlockProperties) Block { return EndGateway{} } func (b EndGateway) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:end_gateway", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/endPortal.go ================================================ package block import ( "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type EndPortal struct { } func (b EndPortal) Encode() (string, BlockProperties) { return "minecraft:end_portal", BlockProperties{} } func (b EndPortal) New(props BlockProperties) Block { return EndPortal{} } func (b EndPortal) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:end_portal", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/endPortalFrame.go ================================================ package block import ( "strconv" ) type EndPortalFrame struct { Eye bool Facing string } func (b EndPortalFrame) Encode() (string, BlockProperties) { return "minecraft:end_portal_frame", BlockProperties{ "eye": strconv.FormatBool(b.Eye), "facing": b.Facing, } } func (b EndPortalFrame) New(props BlockProperties) Block { return EndPortalFrame{ Eye: props["eye"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/endRod.go ================================================ package block type EndRod struct { Facing string } func (b EndRod) Encode() (string, BlockProperties) { return "minecraft:end_rod", BlockProperties{ "facing": b.Facing, } } func (b EndRod) New(props BlockProperties) Block { return EndRod{ Facing: props["facing"], } } ================================================ FILE: server/world/block/endStone.go ================================================ package block type EndStone struct { } func (b EndStone) Encode() (string, BlockProperties) { return "minecraft:end_stone", BlockProperties{} } func (b EndStone) New(props BlockProperties) Block { return EndStone{} } ================================================ FILE: server/world/block/endStoneBrickSlab.go ================================================ package block import ( "strconv" ) type EndStoneBrickSlab struct { Type string Waterlogged bool } func (b EndStoneBrickSlab) Encode() (string, BlockProperties) { return "minecraft:end_stone_brick_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b EndStoneBrickSlab) New(props BlockProperties) Block { return EndStoneBrickSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/endStoneBrickStairs.go ================================================ package block import ( "strconv" ) type EndStoneBrickStairs struct { Facing string Half string Shape string Waterlogged bool } func (b EndStoneBrickStairs) Encode() (string, BlockProperties) { return "minecraft:end_stone_brick_stairs", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, "shape": b.Shape, } } func (b EndStoneBrickStairs) New(props BlockProperties) Block { return EndStoneBrickStairs{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Shape: props["shape"], } } ================================================ FILE: server/world/block/endStoneBrickWall.go ================================================ package block import ( "strconv" ) type EndStoneBrickWall struct { West string East string North string South string Up bool Waterlogged bool } func (b EndStoneBrickWall) Encode() (string, BlockProperties) { return "minecraft:end_stone_brick_wall", BlockProperties{ "south": b.South, "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, "north": b.North, } } func (b EndStoneBrickWall) New(props BlockProperties) Block { return EndStoneBrickWall{ North: props["north"], South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], East: props["east"], } } ================================================ FILE: server/world/block/endStoneBricks.go ================================================ package block type EndStoneBricks struct { } func (b EndStoneBricks) Encode() (string, BlockProperties) { return "minecraft:end_stone_bricks", BlockProperties{} } func (b EndStoneBricks) New(props BlockProperties) Block { return EndStoneBricks{} } ================================================ FILE: server/world/block/enderChest.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type EnderChest struct { Facing string Waterlogged bool } func (b EnderChest) Encode() (string, BlockProperties) { return "minecraft:ender_chest", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b EnderChest) New(props BlockProperties) Block { return EnderChest{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } func (b EnderChest) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:ender_chest", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/exposedChiseledCopper.go ================================================ package block type ExposedChiseledCopper struct { } func (b ExposedChiseledCopper) Encode() (string, BlockProperties) { return "minecraft:exposed_chiseled_copper", BlockProperties{} } func (b ExposedChiseledCopper) New(props BlockProperties) Block { return ExposedChiseledCopper{} } ================================================ FILE: server/world/block/exposedCopper.go ================================================ package block type ExposedCopper struct { } func (b ExposedCopper) Encode() (string, BlockProperties) { return "minecraft:exposed_copper", BlockProperties{} } func (b ExposedCopper) New(props BlockProperties) Block { return ExposedCopper{} } ================================================ FILE: server/world/block/exposedCopperBulb.go ================================================ package block import ( "strconv" ) type ExposedCopperBulb struct { Powered bool Lit bool } func (b ExposedCopperBulb) Encode() (string, BlockProperties) { return "minecraft:exposed_copper_bulb", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "lit": strconv.FormatBool(b.Lit), } } func (b ExposedCopperBulb) New(props BlockProperties) Block { return ExposedCopperBulb{ Powered: props["powered"] != "false", Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/exposedCopperDoor.go ================================================ package block import ( "strconv" ) type ExposedCopperDoor struct { Facing string Half string Hinge string Open bool Powered bool } func (b ExposedCopperDoor) Encode() (string, BlockProperties) { return "minecraft:exposed_copper_door", BlockProperties{ "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, "half": b.Half, } } func (b ExposedCopperDoor) New(props BlockProperties) Block { return ExposedCopperDoor{ Facing: props["facing"], Half: props["half"], Hinge: props["hinge"], Open: props["open"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/exposedCopperGrate.go ================================================ package block import ( "strconv" ) type ExposedCopperGrate struct { Waterlogged bool } func (b ExposedCopperGrate) Encode() (string, BlockProperties) { return "minecraft:exposed_copper_grate", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b ExposedCopperGrate) New(props BlockProperties) Block { return ExposedCopperGrate{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/exposedCopperTrapdoor.go ================================================ package block import ( "strconv" ) type ExposedCopperTrapdoor struct { Powered bool Waterlogged bool Facing string Half string Open bool } func (b ExposedCopperTrapdoor) Encode() (string, BlockProperties) { return "minecraft:exposed_copper_trapdoor", BlockProperties{ "half": b.Half, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b ExposedCopperTrapdoor) New(props BlockProperties) Block { return ExposedCopperTrapdoor{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Open: props["open"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/exposedCutCopper.go ================================================ package block type ExposedCutCopper struct { } func (b ExposedCutCopper) Encode() (string, BlockProperties) { return "minecraft:exposed_cut_copper", BlockProperties{} } func (b ExposedCutCopper) New(props BlockProperties) Block { return ExposedCutCopper{} } ================================================ FILE: server/world/block/exposedCutCopperSlab.go ================================================ package block import ( "strconv" ) type ExposedCutCopperSlab struct { Type string Waterlogged bool } func (b ExposedCutCopperSlab) Encode() (string, BlockProperties) { return "minecraft:exposed_cut_copper_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b ExposedCutCopperSlab) New(props BlockProperties) Block { return ExposedCutCopperSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/exposedCutCopperStairs.go ================================================ package block import ( "strconv" ) type ExposedCutCopperStairs struct { Facing string Half string Shape string Waterlogged bool } func (b ExposedCutCopperStairs) Encode() (string, BlockProperties) { return "minecraft:exposed_cut_copper_stairs", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, "shape": b.Shape, } } func (b ExposedCutCopperStairs) New(props BlockProperties) Block { return ExposedCutCopperStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/farmland.go ================================================ package block import ( "strconv" ) type Farmland struct { Moisture int } func (b Farmland) Encode() (string, BlockProperties) { return "minecraft:farmland", BlockProperties{ "moisture": strconv.Itoa(b.Moisture), } } func (b Farmland) New(props BlockProperties) Block { return Farmland{ Moisture: atoi(props["moisture"]), } } ================================================ FILE: server/world/block/fern.go ================================================ package block type Fern struct { } func (b Fern) Encode() (string, BlockProperties) { return "minecraft:fern", BlockProperties{} } func (b Fern) New(props BlockProperties) Block { return Fern{} } ================================================ FILE: server/world/block/fire.go ================================================ package block import ( "strconv" ) type Fire struct { East bool North bool South bool Up bool West bool Age int } func (b Fire) Encode() (string, BlockProperties) { return "minecraft:fire", BlockProperties{ "up": strconv.FormatBool(b.Up), "west": strconv.FormatBool(b.West), "age": strconv.Itoa(b.Age), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), } } func (b Fire) New(props BlockProperties) Block { return Fire{ North: props["north"] != "false", South: props["south"] != "false", Up: props["up"] != "false", West: props["west"] != "false", Age: atoi(props["age"]), East: props["east"] != "false", } } ================================================ FILE: server/world/block/fireCoral.go ================================================ package block import ( "strconv" ) type FireCoral struct { Waterlogged bool } func (b FireCoral) Encode() (string, BlockProperties) { return "minecraft:fire_coral", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b FireCoral) New(props BlockProperties) Block { return FireCoral{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/fireCoralBlock.go ================================================ package block type FireCoralBlock struct { } func (b FireCoralBlock) Encode() (string, BlockProperties) { return "minecraft:fire_coral_block", BlockProperties{} } func (b FireCoralBlock) New(props BlockProperties) Block { return FireCoralBlock{} } ================================================ FILE: server/world/block/fireCoralFan.go ================================================ package block import ( "strconv" ) type FireCoralFan struct { Waterlogged bool } func (b FireCoralFan) Encode() (string, BlockProperties) { return "minecraft:fire_coral_fan", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b FireCoralFan) New(props BlockProperties) Block { return FireCoralFan{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/fireCoralWallFan.go ================================================ package block import ( "strconv" ) type FireCoralWallFan struct { Facing string Waterlogged bool } func (b FireCoralWallFan) Encode() (string, BlockProperties) { return "minecraft:fire_coral_wall_fan", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b FireCoralWallFan) New(props BlockProperties) Block { return FireCoralWallFan{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/fletchingTable.go ================================================ package block type FletchingTable struct { } func (b FletchingTable) Encode() (string, BlockProperties) { return "minecraft:fletching_table", BlockProperties{} } func (b FletchingTable) New(props BlockProperties) Block { return FletchingTable{} } ================================================ FILE: server/world/block/flowerPot.go ================================================ package block type FlowerPot struct { } func (b FlowerPot) Encode() (string, BlockProperties) { return "minecraft:flower_pot", BlockProperties{} } func (b FlowerPot) New(props BlockProperties) Block { return FlowerPot{} } ================================================ FILE: server/world/block/floweringAzalea.go ================================================ package block type FloweringAzalea struct { } func (b FloweringAzalea) Encode() (string, BlockProperties) { return "minecraft:flowering_azalea", BlockProperties{} } func (b FloweringAzalea) New(props BlockProperties) Block { return FloweringAzalea{} } ================================================ FILE: server/world/block/floweringAzaleaLeaves.go ================================================ package block import ( "strconv" ) type FloweringAzaleaLeaves struct { Distance int Persistent bool Waterlogged bool } func (b FloweringAzaleaLeaves) Encode() (string, BlockProperties) { return "minecraft:flowering_azalea_leaves", BlockProperties{ "distance": strconv.Itoa(b.Distance), "persistent": strconv.FormatBool(b.Persistent), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b FloweringAzaleaLeaves) New(props BlockProperties) Block { return FloweringAzaleaLeaves{ Distance: atoi(props["distance"]), Persistent: props["persistent"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/frogspawn.go ================================================ package block type Frogspawn struct { } func (b Frogspawn) Encode() (string, BlockProperties) { return "minecraft:frogspawn", BlockProperties{} } func (b Frogspawn) New(props BlockProperties) Block { return Frogspawn{} } ================================================ FILE: server/world/block/frostedIce.go ================================================ package block import ( "strconv" ) type FrostedIce struct { Age int } func (b FrostedIce) Encode() (string, BlockProperties) { return "minecraft:frosted_ice", BlockProperties{ "age": strconv.Itoa(b.Age), } } func (b FrostedIce) New(props BlockProperties) Block { return FrostedIce{ Age: atoi(props["age"]), } } ================================================ FILE: server/world/block/furnace.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Furnace struct { Facing string Lit bool } func (b Furnace) Encode() (string, BlockProperties) { return "minecraft:furnace", BlockProperties{ "facing": b.Facing, "lit": strconv.FormatBool(b.Lit), } } func (b Furnace) New(props BlockProperties) Block { return Furnace{ Facing: props["facing"], Lit: props["lit"] != "false", } } func (b Furnace) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:furnace", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/gildedBlackstone.go ================================================ package block type GildedBlackstone struct { } func (b GildedBlackstone) Encode() (string, BlockProperties) { return "minecraft:gilded_blackstone", BlockProperties{} } func (b GildedBlackstone) New(props BlockProperties) Block { return GildedBlackstone{} } ================================================ FILE: server/world/block/glass.go ================================================ package block type Glass struct { } func (b Glass) Encode() (string, BlockProperties) { return "minecraft:glass", BlockProperties{} } func (b Glass) New(props BlockProperties) Block { return Glass{} } ================================================ FILE: server/world/block/glassPane.go ================================================ package block import ( "strconv" ) type GlassPane struct { Waterlogged bool West bool East bool North bool South bool } func (b GlassPane) Encode() (string, BlockProperties) { return "minecraft:glass_pane", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), } } func (b GlassPane) New(props BlockProperties) Block { return GlassPane{ Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", } } ================================================ FILE: server/world/block/glowLichen.go ================================================ package block import ( "strconv" ) type GlowLichen struct { East bool North bool South bool Up bool Waterlogged bool West bool Down bool } func (b GlowLichen) Encode() (string, BlockProperties) { return "minecraft:glow_lichen", BlockProperties{ "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "down": strconv.FormatBool(b.Down), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), } } func (b GlowLichen) New(props BlockProperties) Block { return GlowLichen{ Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", Down: props["down"] != "false", East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", Up: props["up"] != "false", } } ================================================ FILE: server/world/block/glowstone.go ================================================ package block type Glowstone struct { } func (b Glowstone) Encode() (string, BlockProperties) { return "minecraft:glowstone", BlockProperties{} } func (b Glowstone) New(props BlockProperties) Block { return Glowstone{} } ================================================ FILE: server/world/block/goldBlock.go ================================================ package block type GoldBlock struct { } func (b GoldBlock) Encode() (string, BlockProperties) { return "minecraft:gold_block", BlockProperties{} } func (b GoldBlock) New(props BlockProperties) Block { return GoldBlock{} } ================================================ FILE: server/world/block/goldOre.go ================================================ package block type GoldOre struct { } func (b GoldOre) Encode() (string, BlockProperties) { return "minecraft:gold_ore", BlockProperties{} } func (b GoldOre) New(props BlockProperties) Block { return GoldOre{} } ================================================ FILE: server/world/block/granite.go ================================================ package block type Granite struct { } func (b Granite) Encode() (string, BlockProperties) { return "minecraft:granite", BlockProperties{} } func (b Granite) New(props BlockProperties) Block { return Granite{} } ================================================ FILE: server/world/block/graniteSlab.go ================================================ package block import ( "strconv" ) type GraniteSlab struct { Type string Waterlogged bool } func (b GraniteSlab) Encode() (string, BlockProperties) { return "minecraft:granite_slab", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "type": b.Type, } } func (b GraniteSlab) New(props BlockProperties) Block { return GraniteSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/graniteStairs.go ================================================ package block import ( "strconv" ) type GraniteStairs struct { Half string Shape string Waterlogged bool Facing string } func (b GraniteStairs) Encode() (string, BlockProperties) { return "minecraft:granite_stairs", BlockProperties{ "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, } } func (b GraniteStairs) New(props BlockProperties) Block { return GraniteStairs{ Facing: props["facing"], Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/graniteWall.go ================================================ package block import ( "strconv" ) type GraniteWall struct { West string East string North string South string Up bool Waterlogged bool } func (b GraniteWall) Encode() (string, BlockProperties) { return "minecraft:granite_wall", BlockProperties{ "west": b.West, "east": b.East, "north": b.North, "south": b.South, "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b GraniteWall) New(props BlockProperties) Block { return GraniteWall{ West: props["west"], East: props["east"], North: props["north"], South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/grassBlock.go ================================================ package block import ( "strconv" ) type GrassBlock struct { Snowy bool } func (g GrassBlock) Encode() (string, BlockProperties) { return "minecraft:grass_block", BlockProperties{ "snowy": strconv.FormatBool(g.Snowy), } } func (g GrassBlock) New(props BlockProperties) Block { return GrassBlock{Snowy: props["snowy"] == "true"} } /*func (g GrassBlock) PlaceSound(pos pos.BlockPosition) *play.SoundEffect { return session.SoundEffect("minecraft:block.grass.place", false, nil, play.SoundCategoryBlock, pos.X(), pos.Y(), pos.Z(), 1, 1) } */ ================================================ FILE: server/world/block/gravel.go ================================================ package block type Gravel struct { } func (b Gravel) Encode() (string, BlockProperties) { return "minecraft:gravel", BlockProperties{} } func (b Gravel) New(props BlockProperties) Block { return Gravel{} } ================================================ FILE: server/world/block/grayBanner.go ================================================ package block import ( "strconv" ) type GrayBanner struct { Rotation int } func (b GrayBanner) Encode() (string, BlockProperties) { return "minecraft:gray_banner", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), } } func (b GrayBanner) New(props BlockProperties) Block { return GrayBanner{ Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/grayBed.go ================================================ package block import ( "strconv" ) type GrayBed struct { Facing string Occupied bool Part string } func (b GrayBed) Encode() (string, BlockProperties) { return "minecraft:gray_bed", BlockProperties{ "facing": b.Facing, "occupied": strconv.FormatBool(b.Occupied), "part": b.Part, } } func (b GrayBed) New(props BlockProperties) Block { return GrayBed{ Facing: props["facing"], Occupied: props["occupied"] != "false", Part: props["part"], } } ================================================ FILE: server/world/block/grayCandle.go ================================================ package block import ( "strconv" ) type GrayCandle struct { Lit bool Waterlogged bool Candles int } func (b GrayCandle) Encode() (string, BlockProperties) { return "minecraft:gray_candle", BlockProperties{ "candles": strconv.Itoa(b.Candles), "lit": strconv.FormatBool(b.Lit), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b GrayCandle) New(props BlockProperties) Block { return GrayCandle{ Candles: atoi(props["candles"]), Lit: props["lit"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/grayCandleCake.go ================================================ package block import ( "strconv" ) type GrayCandleCake struct { Lit bool } func (b GrayCandleCake) Encode() (string, BlockProperties) { return "minecraft:gray_candle_cake", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b GrayCandleCake) New(props BlockProperties) Block { return GrayCandleCake{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/grayCarpet.go ================================================ package block type GrayCarpet struct { } func (b GrayCarpet) Encode() (string, BlockProperties) { return "minecraft:gray_carpet", BlockProperties{} } func (b GrayCarpet) New(props BlockProperties) Block { return GrayCarpet{} } ================================================ FILE: server/world/block/grayConcrete.go ================================================ package block type GrayConcrete struct { } func (b GrayConcrete) Encode() (string, BlockProperties) { return "minecraft:gray_concrete", BlockProperties{} } func (b GrayConcrete) New(props BlockProperties) Block { return GrayConcrete{} } ================================================ FILE: server/world/block/grayConcretePowder.go ================================================ package block type GrayConcretePowder struct { } func (b GrayConcretePowder) Encode() (string, BlockProperties) { return "minecraft:gray_concrete_powder", BlockProperties{} } func (b GrayConcretePowder) New(props BlockProperties) Block { return GrayConcretePowder{} } ================================================ FILE: server/world/block/grayGlazedTerracotta.go ================================================ package block type GrayGlazedTerracotta struct { Facing string } func (b GrayGlazedTerracotta) Encode() (string, BlockProperties) { return "minecraft:gray_glazed_terracotta", BlockProperties{ "facing": b.Facing, } } func (b GrayGlazedTerracotta) New(props BlockProperties) Block { return GrayGlazedTerracotta{ Facing: props["facing"], } } ================================================ FILE: server/world/block/grayShulkerBox.go ================================================ package block type GrayShulkerBox struct { Facing string } func (b GrayShulkerBox) Encode() (string, BlockProperties) { return "minecraft:gray_shulker_box", BlockProperties{ "facing": b.Facing, } } func (b GrayShulkerBox) New(props BlockProperties) Block { return GrayShulkerBox{ Facing: props["facing"], } } ================================================ FILE: server/world/block/grayStainedGlass.go ================================================ package block type GrayStainedGlass struct { } func (b GrayStainedGlass) Encode() (string, BlockProperties) { return "minecraft:gray_stained_glass", BlockProperties{} } func (b GrayStainedGlass) New(props BlockProperties) Block { return GrayStainedGlass{} } ================================================ FILE: server/world/block/grayStainedGlassPane.go ================================================ package block import ( "strconv" ) type GrayStainedGlassPane struct { West bool East bool North bool South bool Waterlogged bool } func (b GrayStainedGlassPane) Encode() (string, BlockProperties) { return "minecraft:gray_stained_glass_pane", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), } } func (b GrayStainedGlassPane) New(props BlockProperties) Block { return GrayStainedGlassPane{ East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", } } ================================================ FILE: server/world/block/grayTerracotta.go ================================================ package block type GrayTerracotta struct { } func (b GrayTerracotta) Encode() (string, BlockProperties) { return "minecraft:gray_terracotta", BlockProperties{} } func (b GrayTerracotta) New(props BlockProperties) Block { return GrayTerracotta{} } ================================================ FILE: server/world/block/grayWallBanner.go ================================================ package block type GrayWallBanner struct { Facing string } func (b GrayWallBanner) Encode() (string, BlockProperties) { return "minecraft:gray_wall_banner", BlockProperties{ "facing": b.Facing, } } func (b GrayWallBanner) New(props BlockProperties) Block { return GrayWallBanner{ Facing: props["facing"], } } ================================================ FILE: server/world/block/grayWool.go ================================================ package block type GrayWool struct { } func (b GrayWool) Encode() (string, BlockProperties) { return "minecraft:gray_wool", BlockProperties{} } func (b GrayWool) New(props BlockProperties) Block { return GrayWool{} } ================================================ FILE: server/world/block/greenBanner.go ================================================ package block import ( "strconv" ) type GreenBanner struct { Rotation int } func (b GreenBanner) Encode() (string, BlockProperties) { return "minecraft:green_banner", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), } } func (b GreenBanner) New(props BlockProperties) Block { return GreenBanner{ Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/greenBed.go ================================================ package block import ( "strconv" ) type GreenBed struct { Facing string Occupied bool Part string } func (b GreenBed) Encode() (string, BlockProperties) { return "minecraft:green_bed", BlockProperties{ "part": b.Part, "facing": b.Facing, "occupied": strconv.FormatBool(b.Occupied), } } func (b GreenBed) New(props BlockProperties) Block { return GreenBed{ Facing: props["facing"], Occupied: props["occupied"] != "false", Part: props["part"], } } ================================================ FILE: server/world/block/greenCandle.go ================================================ package block import ( "strconv" ) type GreenCandle struct { Candles int Lit bool Waterlogged bool } func (b GreenCandle) Encode() (string, BlockProperties) { return "minecraft:green_candle", BlockProperties{ "lit": strconv.FormatBool(b.Lit), "waterlogged": strconv.FormatBool(b.Waterlogged), "candles": strconv.Itoa(b.Candles), } } func (b GreenCandle) New(props BlockProperties) Block { return GreenCandle{ Candles: atoi(props["candles"]), Lit: props["lit"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/greenCandleCake.go ================================================ package block import ( "strconv" ) type GreenCandleCake struct { Lit bool } func (b GreenCandleCake) Encode() (string, BlockProperties) { return "minecraft:green_candle_cake", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b GreenCandleCake) New(props BlockProperties) Block { return GreenCandleCake{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/greenCarpet.go ================================================ package block type GreenCarpet struct { } func (b GreenCarpet) Encode() (string, BlockProperties) { return "minecraft:green_carpet", BlockProperties{} } func (b GreenCarpet) New(props BlockProperties) Block { return GreenCarpet{} } ================================================ FILE: server/world/block/greenConcrete.go ================================================ package block type GreenConcrete struct { } func (b GreenConcrete) Encode() (string, BlockProperties) { return "minecraft:green_concrete", BlockProperties{} } func (b GreenConcrete) New(props BlockProperties) Block { return GreenConcrete{} } ================================================ FILE: server/world/block/greenConcretePowder.go ================================================ package block type GreenConcretePowder struct { } func (b GreenConcretePowder) Encode() (string, BlockProperties) { return "minecraft:green_concrete_powder", BlockProperties{} } func (b GreenConcretePowder) New(props BlockProperties) Block { return GreenConcretePowder{} } ================================================ FILE: server/world/block/greenGlazedTerracotta.go ================================================ package block type GreenGlazedTerracotta struct { Facing string } func (b GreenGlazedTerracotta) Encode() (string, BlockProperties) { return "minecraft:green_glazed_terracotta", BlockProperties{ "facing": b.Facing, } } func (b GreenGlazedTerracotta) New(props BlockProperties) Block { return GreenGlazedTerracotta{ Facing: props["facing"], } } ================================================ FILE: server/world/block/greenShulkerBox.go ================================================ package block type GreenShulkerBox struct { Facing string } func (b GreenShulkerBox) Encode() (string, BlockProperties) { return "minecraft:green_shulker_box", BlockProperties{ "facing": b.Facing, } } func (b GreenShulkerBox) New(props BlockProperties) Block { return GreenShulkerBox{ Facing: props["facing"], } } ================================================ FILE: server/world/block/greenStainedGlass.go ================================================ package block type GreenStainedGlass struct { } func (b GreenStainedGlass) Encode() (string, BlockProperties) { return "minecraft:green_stained_glass", BlockProperties{} } func (b GreenStainedGlass) New(props BlockProperties) Block { return GreenStainedGlass{} } ================================================ FILE: server/world/block/greenStainedGlassPane.go ================================================ package block import ( "strconv" ) type GreenStainedGlassPane struct { South bool Waterlogged bool West bool East bool North bool } func (b GreenStainedGlassPane) Encode() (string, BlockProperties) { return "minecraft:green_stained_glass_pane", BlockProperties{ "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), } } func (b GreenStainedGlassPane) New(props BlockProperties) Block { return GreenStainedGlassPane{ South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", } } ================================================ FILE: server/world/block/greenTerracotta.go ================================================ package block type GreenTerracotta struct { } func (b GreenTerracotta) Encode() (string, BlockProperties) { return "minecraft:green_terracotta", BlockProperties{} } func (b GreenTerracotta) New(props BlockProperties) Block { return GreenTerracotta{} } ================================================ FILE: server/world/block/greenWallBanner.go ================================================ package block type GreenWallBanner struct { Facing string } func (b GreenWallBanner) Encode() (string, BlockProperties) { return "minecraft:green_wall_banner", BlockProperties{ "facing": b.Facing, } } func (b GreenWallBanner) New(props BlockProperties) Block { return GreenWallBanner{ Facing: props["facing"], } } ================================================ FILE: server/world/block/greenWool.go ================================================ package block type GreenWool struct { } func (b GreenWool) Encode() (string, BlockProperties) { return "minecraft:green_wool", BlockProperties{} } func (b GreenWool) New(props BlockProperties) Block { return GreenWool{} } ================================================ FILE: server/world/block/grindstone.go ================================================ package block type Grindstone struct { Face string Facing string } func (b Grindstone) Encode() (string, BlockProperties) { return "minecraft:grindstone", BlockProperties{ "face": b.Face, "facing": b.Facing, } } func (b Grindstone) New(props BlockProperties) Block { return Grindstone{ Face: props["face"], Facing: props["facing"], } } ================================================ FILE: server/world/block/hangingRoots.go ================================================ package block import ( "strconv" ) type HangingRoots struct { Waterlogged bool } func (b HangingRoots) Encode() (string, BlockProperties) { return "minecraft:hanging_roots", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b HangingRoots) New(props BlockProperties) Block { return HangingRoots{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/hayBlock.go ================================================ package block type HayBlock struct { Axis string } func (b HayBlock) Encode() (string, BlockProperties) { return "minecraft:hay_block", BlockProperties{ "axis": b.Axis, } } func (b HayBlock) New(props BlockProperties) Block { return HayBlock{ Axis: props["axis"], } } ================================================ FILE: server/world/block/heavyCore.go ================================================ package block import ( "strconv" ) type HeavyCore struct { Waterlogged bool } func (b HeavyCore) Encode() (string, BlockProperties) { return "minecraft:heavy_core", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b HeavyCore) New(props BlockProperties) Block { return HeavyCore{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/heavyWeightedPressurePlate.go ================================================ package block import ( "strconv" ) type HeavyWeightedPressurePlate struct { Power int } func (b HeavyWeightedPressurePlate) Encode() (string, BlockProperties) { return "minecraft:heavy_weighted_pressure_plate", BlockProperties{ "power": strconv.Itoa(b.Power), } } func (b HeavyWeightedPressurePlate) New(props BlockProperties) Block { return HeavyWeightedPressurePlate{ Power: atoi(props["power"]), } } ================================================ FILE: server/world/block/honeyBlock.go ================================================ package block type HoneyBlock struct { } func (b HoneyBlock) Encode() (string, BlockProperties) { return "minecraft:honey_block", BlockProperties{} } func (b HoneyBlock) New(props BlockProperties) Block { return HoneyBlock{} } ================================================ FILE: server/world/block/honeycombBlock.go ================================================ package block type HoneycombBlock struct { } func (b HoneycombBlock) Encode() (string, BlockProperties) { return "minecraft:honeycomb_block", BlockProperties{} } func (b HoneycombBlock) New(props BlockProperties) Block { return HoneycombBlock{} } ================================================ FILE: server/world/block/hopper.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Hopper struct { Enabled bool Facing string } func (b Hopper) Encode() (string, BlockProperties) { return "minecraft:hopper", BlockProperties{ "enabled": strconv.FormatBool(b.Enabled), "facing": b.Facing, } } func (b Hopper) New(props BlockProperties) Block { return Hopper{ Enabled: props["enabled"] != "false", Facing: props["facing"], } } func (b Hopper) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:hopper", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/hornCoral.go ================================================ package block import ( "strconv" ) type HornCoral struct { Waterlogged bool } func (b HornCoral) Encode() (string, BlockProperties) { return "minecraft:horn_coral", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b HornCoral) New(props BlockProperties) Block { return HornCoral{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/hornCoralBlock.go ================================================ package block type HornCoralBlock struct { } func (b HornCoralBlock) Encode() (string, BlockProperties) { return "minecraft:horn_coral_block", BlockProperties{} } func (b HornCoralBlock) New(props BlockProperties) Block { return HornCoralBlock{} } ================================================ FILE: server/world/block/hornCoralFan.go ================================================ package block import ( "strconv" ) type HornCoralFan struct { Waterlogged bool } func (b HornCoralFan) Encode() (string, BlockProperties) { return "minecraft:horn_coral_fan", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b HornCoralFan) New(props BlockProperties) Block { return HornCoralFan{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/hornCoralWallFan.go ================================================ package block import ( "strconv" ) type HornCoralWallFan struct { Facing string Waterlogged bool } func (b HornCoralWallFan) Encode() (string, BlockProperties) { return "minecraft:horn_coral_wall_fan", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b HornCoralWallFan) New(props BlockProperties) Block { return HornCoralWallFan{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/ice.go ================================================ package block type Ice struct { } func (b Ice) Encode() (string, BlockProperties) { return "minecraft:ice", BlockProperties{} } func (b Ice) New(props BlockProperties) Block { return Ice{} } ================================================ FILE: server/world/block/infestedChiseledStoneBricks.go ================================================ package block type InfestedChiseledStoneBricks struct { } func (b InfestedChiseledStoneBricks) Encode() (string, BlockProperties) { return "minecraft:infested_chiseled_stone_bricks", BlockProperties{} } func (b InfestedChiseledStoneBricks) New(props BlockProperties) Block { return InfestedChiseledStoneBricks{} } ================================================ FILE: server/world/block/infestedCobblestone.go ================================================ package block type InfestedCobblestone struct { } func (b InfestedCobblestone) Encode() (string, BlockProperties) { return "minecraft:infested_cobblestone", BlockProperties{} } func (b InfestedCobblestone) New(props BlockProperties) Block { return InfestedCobblestone{} } ================================================ FILE: server/world/block/infestedCrackedStoneBricks.go ================================================ package block type InfestedCrackedStoneBricks struct { } func (b InfestedCrackedStoneBricks) Encode() (string, BlockProperties) { return "minecraft:infested_cracked_stone_bricks", BlockProperties{} } func (b InfestedCrackedStoneBricks) New(props BlockProperties) Block { return InfestedCrackedStoneBricks{} } ================================================ FILE: server/world/block/infestedDeepslate.go ================================================ package block type InfestedDeepslate struct { Axis string } func (b InfestedDeepslate) Encode() (string, BlockProperties) { return "minecraft:infested_deepslate", BlockProperties{ "axis": b.Axis, } } func (b InfestedDeepslate) New(props BlockProperties) Block { return InfestedDeepslate{ Axis: props["axis"], } } ================================================ FILE: server/world/block/infestedMossyStoneBricks.go ================================================ package block type InfestedMossyStoneBricks struct { } func (b InfestedMossyStoneBricks) Encode() (string, BlockProperties) { return "minecraft:infested_mossy_stone_bricks", BlockProperties{} } func (b InfestedMossyStoneBricks) New(props BlockProperties) Block { return InfestedMossyStoneBricks{} } ================================================ FILE: server/world/block/infestedStone.go ================================================ package block type InfestedStone struct { } func (b InfestedStone) Encode() (string, BlockProperties) { return "minecraft:infested_stone", BlockProperties{} } func (b InfestedStone) New(props BlockProperties) Block { return InfestedStone{} } ================================================ FILE: server/world/block/infestedStoneBricks.go ================================================ package block type InfestedStoneBricks struct { } func (b InfestedStoneBricks) Encode() (string, BlockProperties) { return "minecraft:infested_stone_bricks", BlockProperties{} } func (b InfestedStoneBricks) New(props BlockProperties) Block { return InfestedStoneBricks{} } ================================================ FILE: server/world/block/ironBars.go ================================================ package block import ( "strconv" ) type IronBars struct { East bool North bool South bool Waterlogged bool West bool } func (b IronBars) Encode() (string, BlockProperties) { return "minecraft:iron_bars", BlockProperties{ "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), } } func (b IronBars) New(props BlockProperties) Block { return IronBars{ West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/ironBlock.go ================================================ package block type IronBlock struct { } func (b IronBlock) Encode() (string, BlockProperties) { return "minecraft:iron_block", BlockProperties{} } func (b IronBlock) New(props BlockProperties) Block { return IronBlock{} } ================================================ FILE: server/world/block/ironDoor.go ================================================ package block import ( "strconv" ) type IronDoor struct { Half string Hinge string Open bool Powered bool Facing string } func (b IronDoor) Encode() (string, BlockProperties) { return "minecraft:iron_door", BlockProperties{ "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, "half": b.Half, "hinge": b.Hinge, } } func (b IronDoor) New(props BlockProperties) Block { return IronDoor{ Hinge: props["hinge"], Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/ironOre.go ================================================ package block type IronOre struct { } func (b IronOre) Encode() (string, BlockProperties) { return "minecraft:iron_ore", BlockProperties{} } func (b IronOre) New(props BlockProperties) Block { return IronOre{} } ================================================ FILE: server/world/block/ironTrapdoor.go ================================================ package block import ( "strconv" ) type IronTrapdoor struct { Half string Open bool Powered bool Waterlogged bool Facing string } func (b IronTrapdoor) Encode() (string, BlockProperties) { return "minecraft:iron_trapdoor", BlockProperties{ "facing": b.Facing, "half": b.Half, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b IronTrapdoor) New(props BlockProperties) Block { return IronTrapdoor{ Half: props["half"], Open: props["open"] != "false", Powered: props["powered"] != "false", Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/jackOLantern.go ================================================ package block type JackOLantern struct { Facing string } func (b JackOLantern) Encode() (string, BlockProperties) { return "minecraft:jack_o_lantern", BlockProperties{ "facing": b.Facing, } } func (b JackOLantern) New(props BlockProperties) Block { return JackOLantern{ Facing: props["facing"], } } ================================================ FILE: server/world/block/jigsaw.go ================================================ package block import ( "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Jigsaw struct { Orientation string } func (b Jigsaw) Encode() (string, BlockProperties) { return "minecraft:jigsaw", BlockProperties{ "orientation": b.Orientation, } } func (b Jigsaw) New(props BlockProperties) Block { return Jigsaw{ Orientation: props["orientation"], } } func (b Jigsaw) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:jigsaw", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/jukebox.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Jukebox struct { HasRecord bool } func (b Jukebox) Encode() (string, BlockProperties) { return "minecraft:jukebox", BlockProperties{ "has_record": strconv.FormatBool(b.HasRecord), } } func (b Jukebox) New(props BlockProperties) Block { return Jukebox{ HasRecord: props["has_record"] != "false", } } func (b Jukebox) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:jukebox", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/jungleButton.go ================================================ package block import ( "strconv" ) type JungleButton struct { Face string Facing string Powered bool } func (b JungleButton) Encode() (string, BlockProperties) { return "minecraft:jungle_button", BlockProperties{ "face": b.Face, "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), } } func (b JungleButton) New(props BlockProperties) Block { return JungleButton{ Powered: props["powered"] != "false", Face: props["face"], Facing: props["facing"], } } ================================================ FILE: server/world/block/jungleDoor.go ================================================ package block import ( "strconv" ) type JungleDoor struct { Half string Hinge string Open bool Powered bool Facing string } func (b JungleDoor) Encode() (string, BlockProperties) { return "minecraft:jungle_door", BlockProperties{ "facing": b.Facing, "half": b.Half, "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), } } func (b JungleDoor) New(props BlockProperties) Block { return JungleDoor{ Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], Half: props["half"], Hinge: props["hinge"], } } ================================================ FILE: server/world/block/jungleFence.go ================================================ package block import ( "strconv" ) type JungleFence struct { East bool North bool South bool Waterlogged bool West bool } func (b JungleFence) Encode() (string, BlockProperties) { return "minecraft:jungle_fence", BlockProperties{ "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), } } func (b JungleFence) New(props BlockProperties) Block { return JungleFence{ North: props["north"] != "false", South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", } } ================================================ FILE: server/world/block/jungleFenceGate.go ================================================ package block import ( "strconv" ) type JungleFenceGate struct { Facing string InWall bool Open bool Powered bool } func (b JungleFenceGate) Encode() (string, BlockProperties) { return "minecraft:jungle_fence_gate", BlockProperties{ "facing": b.Facing, "in_wall": strconv.FormatBool(b.InWall), "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), } } func (b JungleFenceGate) New(props BlockProperties) Block { return JungleFenceGate{ InWall: props["in_wall"] != "false", Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/jungleHangingSign.go ================================================ package block import ( "strconv" ) type JungleHangingSign struct { Rotation int Waterlogged bool Attached bool } func (b JungleHangingSign) Encode() (string, BlockProperties) { return "minecraft:jungle_hanging_sign", BlockProperties{ "attached": strconv.FormatBool(b.Attached), "rotation": strconv.Itoa(b.Rotation), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b JungleHangingSign) New(props BlockProperties) Block { return JungleHangingSign{ Attached: props["attached"] != "false", Rotation: atoi(props["rotation"]), Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/jungleLeaves.go ================================================ package block import ( "strconv" ) type JungleLeaves struct { Distance int Persistent bool Waterlogged bool } func (b JungleLeaves) Encode() (string, BlockProperties) { return "minecraft:jungle_leaves", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "distance": strconv.Itoa(b.Distance), "persistent": strconv.FormatBool(b.Persistent), } } func (b JungleLeaves) New(props BlockProperties) Block { return JungleLeaves{ Distance: atoi(props["distance"]), Persistent: props["persistent"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/jungleLog.go ================================================ package block type JungleLog struct { Axis string } func (b JungleLog) Encode() (string, BlockProperties) { return "minecraft:jungle_log", BlockProperties{ "axis": b.Axis, } } func (b JungleLog) New(props BlockProperties) Block { return JungleLog{ Axis: props["axis"], } } ================================================ FILE: server/world/block/junglePlanks.go ================================================ package block type JunglePlanks struct { } func (b JunglePlanks) Encode() (string, BlockProperties) { return "minecraft:jungle_planks", BlockProperties{} } func (b JunglePlanks) New(props BlockProperties) Block { return JunglePlanks{} } ================================================ FILE: server/world/block/junglePressurePlate.go ================================================ package block import ( "strconv" ) type JunglePressurePlate struct { Powered bool } func (b JunglePressurePlate) Encode() (string, BlockProperties) { return "minecraft:jungle_pressure_plate", BlockProperties{ "powered": strconv.FormatBool(b.Powered), } } func (b JunglePressurePlate) New(props BlockProperties) Block { return JunglePressurePlate{ Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/jungleSapling.go ================================================ package block import ( "strconv" ) type JungleSapling struct { Stage int } func (b JungleSapling) Encode() (string, BlockProperties) { return "minecraft:jungle_sapling", BlockProperties{ "stage": strconv.Itoa(b.Stage), } } func (b JungleSapling) New(props BlockProperties) Block { return JungleSapling{ Stage: atoi(props["stage"]), } } ================================================ FILE: server/world/block/jungleSign.go ================================================ package block import ( "strconv" ) type JungleSign struct { Waterlogged bool Rotation int } func (b JungleSign) Encode() (string, BlockProperties) { return "minecraft:jungle_sign", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b JungleSign) New(props BlockProperties) Block { return JungleSign{ Waterlogged: props["waterlogged"] != "false", Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/jungleSlab.go ================================================ package block import ( "strconv" ) type JungleSlab struct { Type string Waterlogged bool } func (b JungleSlab) Encode() (string, BlockProperties) { return "minecraft:jungle_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b JungleSlab) New(props BlockProperties) Block { return JungleSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/jungleStairs.go ================================================ package block import ( "strconv" ) type JungleStairs struct { Facing string Half string Shape string Waterlogged bool } func (b JungleStairs) Encode() (string, BlockProperties) { return "minecraft:jungle_stairs", BlockProperties{ "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, } } func (b JungleStairs) New(props BlockProperties) Block { return JungleStairs{ Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/jungleTrapdoor.go ================================================ package block import ( "strconv" ) type JungleTrapdoor struct { Facing string Half string Open bool Powered bool Waterlogged bool } func (b JungleTrapdoor) Encode() (string, BlockProperties) { return "minecraft:jungle_trapdoor", BlockProperties{ "facing": b.Facing, "half": b.Half, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b JungleTrapdoor) New(props BlockProperties) Block { return JungleTrapdoor{ Powered: props["powered"] != "false", Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Open: props["open"] != "false", } } ================================================ FILE: server/world/block/jungleWallHangingSign.go ================================================ package block import ( "strconv" ) type JungleWallHangingSign struct { Facing string Waterlogged bool } func (b JungleWallHangingSign) Encode() (string, BlockProperties) { return "minecraft:jungle_wall_hanging_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b JungleWallHangingSign) New(props BlockProperties) Block { return JungleWallHangingSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/jungleWallSign.go ================================================ package block import ( "strconv" ) type JungleWallSign struct { Waterlogged bool Facing string } func (b JungleWallSign) Encode() (string, BlockProperties) { return "minecraft:jungle_wall_sign", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b JungleWallSign) New(props BlockProperties) Block { return JungleWallSign{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/jungleWood.go ================================================ package block type JungleWood struct { Axis string } func (b JungleWood) Encode() (string, BlockProperties) { return "minecraft:jungle_wood", BlockProperties{ "axis": b.Axis, } } func (b JungleWood) New(props BlockProperties) Block { return JungleWood{ Axis: props["axis"], } } ================================================ FILE: server/world/block/kelp.go ================================================ package block import ( "strconv" ) type Kelp struct { Age int } func (b Kelp) Encode() (string, BlockProperties) { return "minecraft:kelp", BlockProperties{ "age": strconv.Itoa(b.Age), } } func (b Kelp) New(props BlockProperties) Block { return Kelp{ Age: atoi(props["age"]), } } ================================================ FILE: server/world/block/kelpPlant.go ================================================ package block type KelpPlant struct { } func (b KelpPlant) Encode() (string, BlockProperties) { return "minecraft:kelp_plant", BlockProperties{} } func (b KelpPlant) New(props BlockProperties) Block { return KelpPlant{} } ================================================ FILE: server/world/block/ladder.go ================================================ package block import ( "strconv" ) type Ladder struct { Facing string Waterlogged bool } func (b Ladder) Encode() (string, BlockProperties) { return "minecraft:ladder", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b Ladder) New(props BlockProperties) Block { return Ladder{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/lantern.go ================================================ package block import ( "strconv" ) type Lantern struct { Hanging bool Waterlogged bool } func (b Lantern) Encode() (string, BlockProperties) { return "minecraft:lantern", BlockProperties{ "hanging": strconv.FormatBool(b.Hanging), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b Lantern) New(props BlockProperties) Block { return Lantern{ Hanging: props["hanging"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/lapisBlock.go ================================================ package block type LapisBlock struct { } func (b LapisBlock) Encode() (string, BlockProperties) { return "minecraft:lapis_block", BlockProperties{} } func (b LapisBlock) New(props BlockProperties) Block { return LapisBlock{} } ================================================ FILE: server/world/block/lapisOre.go ================================================ package block type LapisOre struct { } func (b LapisOre) Encode() (string, BlockProperties) { return "minecraft:lapis_ore", BlockProperties{} } func (b LapisOre) New(props BlockProperties) Block { return LapisOre{} } ================================================ FILE: server/world/block/largeAmethystBud.go ================================================ package block import ( "strconv" ) type LargeAmethystBud struct { Facing string Waterlogged bool } func (b LargeAmethystBud) Encode() (string, BlockProperties) { return "minecraft:large_amethyst_bud", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b LargeAmethystBud) New(props BlockProperties) Block { return LargeAmethystBud{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/largeFern.go ================================================ package block type LargeFern struct { Half string } func (b LargeFern) Encode() (string, BlockProperties) { return "minecraft:large_fern", BlockProperties{ "half": b.Half, } } func (b LargeFern) New(props BlockProperties) Block { return LargeFern{ Half: props["half"], } } ================================================ FILE: server/world/block/lava.go ================================================ package block import ( "strconv" ) type Lava struct { Level int } func (b Lava) Encode() (string, BlockProperties) { return "minecraft:lava", BlockProperties{ "level": strconv.Itoa(b.Level), } } func (b Lava) New(props BlockProperties) Block { return Lava{ Level: atoi(props["level"]), } } ================================================ FILE: server/world/block/lavaCauldron.go ================================================ package block type LavaCauldron struct { } func (b LavaCauldron) Encode() (string, BlockProperties) { return "minecraft:lava_cauldron", BlockProperties{} } func (b LavaCauldron) New(props BlockProperties) Block { return LavaCauldron{} } ================================================ FILE: server/world/block/lectern.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Lectern struct { HasBook bool Powered bool Facing string } func (b Lectern) Encode() (string, BlockProperties) { return "minecraft:lectern", BlockProperties{ "has_book": strconv.FormatBool(b.HasBook), "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, } } func (b Lectern) New(props BlockProperties) Block { return Lectern{ Powered: props["powered"] != "false", Facing: props["facing"], HasBook: props["has_book"] != "false", } } func (b Lectern) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:lectern", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/lever.go ================================================ package block import ( "strconv" ) type Lever struct { Face string Facing string Powered bool } func (b Lever) Encode() (string, BlockProperties) { return "minecraft:lever", BlockProperties{ "face": b.Face, "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), } } func (b Lever) New(props BlockProperties) Block { return Lever{ Face: props["face"], Facing: props["facing"], Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/light.go ================================================ package block import ( "strconv" ) type Light struct { Waterlogged bool Level int } func (b Light) Encode() (string, BlockProperties) { return "minecraft:light", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "level": strconv.Itoa(b.Level), } } func (b Light) New(props BlockProperties) Block { return Light{ Waterlogged: props["waterlogged"] != "false", Level: atoi(props["level"]), } } ================================================ FILE: server/world/block/lightBlueBanner.go ================================================ package block import ( "strconv" ) type LightBlueBanner struct { Rotation int } func (b LightBlueBanner) Encode() (string, BlockProperties) { return "minecraft:light_blue_banner", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), } } func (b LightBlueBanner) New(props BlockProperties) Block { return LightBlueBanner{ Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/lightBlueBed.go ================================================ package block import ( "strconv" ) type LightBlueBed struct { Facing string Occupied bool Part string } func (b LightBlueBed) Encode() (string, BlockProperties) { return "minecraft:light_blue_bed", BlockProperties{ "occupied": strconv.FormatBool(b.Occupied), "part": b.Part, "facing": b.Facing, } } func (b LightBlueBed) New(props BlockProperties) Block { return LightBlueBed{ Part: props["part"], Facing: props["facing"], Occupied: props["occupied"] != "false", } } ================================================ FILE: server/world/block/lightBlueCandle.go ================================================ package block import ( "strconv" ) type LightBlueCandle struct { Candles int Lit bool Waterlogged bool } func (b LightBlueCandle) Encode() (string, BlockProperties) { return "minecraft:light_blue_candle", BlockProperties{ "candles": strconv.Itoa(b.Candles), "lit": strconv.FormatBool(b.Lit), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b LightBlueCandle) New(props BlockProperties) Block { return LightBlueCandle{ Lit: props["lit"] != "false", Waterlogged: props["waterlogged"] != "false", Candles: atoi(props["candles"]), } } ================================================ FILE: server/world/block/lightBlueCandleCake.go ================================================ package block import ( "strconv" ) type LightBlueCandleCake struct { Lit bool } func (b LightBlueCandleCake) Encode() (string, BlockProperties) { return "minecraft:light_blue_candle_cake", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b LightBlueCandleCake) New(props BlockProperties) Block { return LightBlueCandleCake{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/lightBlueCarpet.go ================================================ package block type LightBlueCarpet struct { } func (b LightBlueCarpet) Encode() (string, BlockProperties) { return "minecraft:light_blue_carpet", BlockProperties{} } func (b LightBlueCarpet) New(props BlockProperties) Block { return LightBlueCarpet{} } ================================================ FILE: server/world/block/lightBlueConcrete.go ================================================ package block type LightBlueConcrete struct { } func (b LightBlueConcrete) Encode() (string, BlockProperties) { return "minecraft:light_blue_concrete", BlockProperties{} } func (b LightBlueConcrete) New(props BlockProperties) Block { return LightBlueConcrete{} } ================================================ FILE: server/world/block/lightBlueConcretePowder.go ================================================ package block type LightBlueConcretePowder struct { } func (b LightBlueConcretePowder) Encode() (string, BlockProperties) { return "minecraft:light_blue_concrete_powder", BlockProperties{} } func (b LightBlueConcretePowder) New(props BlockProperties) Block { return LightBlueConcretePowder{} } ================================================ FILE: server/world/block/lightBlueGlazedTerracotta.go ================================================ package block type LightBlueGlazedTerracotta struct { Facing string } func (b LightBlueGlazedTerracotta) Encode() (string, BlockProperties) { return "minecraft:light_blue_glazed_terracotta", BlockProperties{ "facing": b.Facing, } } func (b LightBlueGlazedTerracotta) New(props BlockProperties) Block { return LightBlueGlazedTerracotta{ Facing: props["facing"], } } ================================================ FILE: server/world/block/lightBlueShulkerBox.go ================================================ package block type LightBlueShulkerBox struct { Facing string } func (b LightBlueShulkerBox) Encode() (string, BlockProperties) { return "minecraft:light_blue_shulker_box", BlockProperties{ "facing": b.Facing, } } func (b LightBlueShulkerBox) New(props BlockProperties) Block { return LightBlueShulkerBox{ Facing: props["facing"], } } ================================================ FILE: server/world/block/lightBlueStainedGlass.go ================================================ package block type LightBlueStainedGlass struct { } func (b LightBlueStainedGlass) Encode() (string, BlockProperties) { return "minecraft:light_blue_stained_glass", BlockProperties{} } func (b LightBlueStainedGlass) New(props BlockProperties) Block { return LightBlueStainedGlass{} } ================================================ FILE: server/world/block/lightBlueStainedGlassPane.go ================================================ package block import ( "strconv" ) type LightBlueStainedGlassPane struct { North bool South bool Waterlogged bool West bool East bool } func (b LightBlueStainedGlassPane) Encode() (string, BlockProperties) { return "minecraft:light_blue_stained_glass_pane", BlockProperties{ "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), } } func (b LightBlueStainedGlassPane) New(props BlockProperties) Block { return LightBlueStainedGlassPane{ South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", } } ================================================ FILE: server/world/block/lightBlueTerracotta.go ================================================ package block type LightBlueTerracotta struct { } func (b LightBlueTerracotta) Encode() (string, BlockProperties) { return "minecraft:light_blue_terracotta", BlockProperties{} } func (b LightBlueTerracotta) New(props BlockProperties) Block { return LightBlueTerracotta{} } ================================================ FILE: server/world/block/lightBlueWallBanner.go ================================================ package block type LightBlueWallBanner struct { Facing string } func (b LightBlueWallBanner) Encode() (string, BlockProperties) { return "minecraft:light_blue_wall_banner", BlockProperties{ "facing": b.Facing, } } func (b LightBlueWallBanner) New(props BlockProperties) Block { return LightBlueWallBanner{ Facing: props["facing"], } } ================================================ FILE: server/world/block/lightBlueWool.go ================================================ package block type LightBlueWool struct { } func (b LightBlueWool) Encode() (string, BlockProperties) { return "minecraft:light_blue_wool", BlockProperties{} } func (b LightBlueWool) New(props BlockProperties) Block { return LightBlueWool{} } ================================================ FILE: server/world/block/lightGrayBanner.go ================================================ package block import ( "strconv" ) type LightGrayBanner struct { Rotation int } func (b LightGrayBanner) Encode() (string, BlockProperties) { return "minecraft:light_gray_banner", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), } } func (b LightGrayBanner) New(props BlockProperties) Block { return LightGrayBanner{ Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/lightGrayBed.go ================================================ package block import ( "strconv" ) type LightGrayBed struct { Facing string Occupied bool Part string } func (b LightGrayBed) Encode() (string, BlockProperties) { return "minecraft:light_gray_bed", BlockProperties{ "facing": b.Facing, "occupied": strconv.FormatBool(b.Occupied), "part": b.Part, } } func (b LightGrayBed) New(props BlockProperties) Block { return LightGrayBed{ Facing: props["facing"], Occupied: props["occupied"] != "false", Part: props["part"], } } ================================================ FILE: server/world/block/lightGrayCandle.go ================================================ package block import ( "strconv" ) type LightGrayCandle struct { Candles int Lit bool Waterlogged bool } func (b LightGrayCandle) Encode() (string, BlockProperties) { return "minecraft:light_gray_candle", BlockProperties{ "candles": strconv.Itoa(b.Candles), "lit": strconv.FormatBool(b.Lit), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b LightGrayCandle) New(props BlockProperties) Block { return LightGrayCandle{ Candles: atoi(props["candles"]), Lit: props["lit"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/lightGrayCandleCake.go ================================================ package block import ( "strconv" ) type LightGrayCandleCake struct { Lit bool } func (b LightGrayCandleCake) Encode() (string, BlockProperties) { return "minecraft:light_gray_candle_cake", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b LightGrayCandleCake) New(props BlockProperties) Block { return LightGrayCandleCake{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/lightGrayCarpet.go ================================================ package block type LightGrayCarpet struct { } func (b LightGrayCarpet) Encode() (string, BlockProperties) { return "minecraft:light_gray_carpet", BlockProperties{} } func (b LightGrayCarpet) New(props BlockProperties) Block { return LightGrayCarpet{} } ================================================ FILE: server/world/block/lightGrayConcrete.go ================================================ package block type LightGrayConcrete struct { } func (b LightGrayConcrete) Encode() (string, BlockProperties) { return "minecraft:light_gray_concrete", BlockProperties{} } func (b LightGrayConcrete) New(props BlockProperties) Block { return LightGrayConcrete{} } ================================================ FILE: server/world/block/lightGrayConcretePowder.go ================================================ package block type LightGrayConcretePowder struct { } func (b LightGrayConcretePowder) Encode() (string, BlockProperties) { return "minecraft:light_gray_concrete_powder", BlockProperties{} } func (b LightGrayConcretePowder) New(props BlockProperties) Block { return LightGrayConcretePowder{} } ================================================ FILE: server/world/block/lightGrayGlazedTerracotta.go ================================================ package block type LightGrayGlazedTerracotta struct { Facing string } func (b LightGrayGlazedTerracotta) Encode() (string, BlockProperties) { return "minecraft:light_gray_glazed_terracotta", BlockProperties{ "facing": b.Facing, } } func (b LightGrayGlazedTerracotta) New(props BlockProperties) Block { return LightGrayGlazedTerracotta{ Facing: props["facing"], } } ================================================ FILE: server/world/block/lightGrayShulkerBox.go ================================================ package block type LightGrayShulkerBox struct { Facing string } func (b LightGrayShulkerBox) Encode() (string, BlockProperties) { return "minecraft:light_gray_shulker_box", BlockProperties{ "facing": b.Facing, } } func (b LightGrayShulkerBox) New(props BlockProperties) Block { return LightGrayShulkerBox{ Facing: props["facing"], } } ================================================ FILE: server/world/block/lightGrayStainedGlass.go ================================================ package block type LightGrayStainedGlass struct { } func (b LightGrayStainedGlass) Encode() (string, BlockProperties) { return "minecraft:light_gray_stained_glass", BlockProperties{} } func (b LightGrayStainedGlass) New(props BlockProperties) Block { return LightGrayStainedGlass{} } ================================================ FILE: server/world/block/lightGrayStainedGlassPane.go ================================================ package block import ( "strconv" ) type LightGrayStainedGlassPane struct { South bool Waterlogged bool West bool East bool North bool } func (b LightGrayStainedGlassPane) Encode() (string, BlockProperties) { return "minecraft:light_gray_stained_glass_pane", BlockProperties{ "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), } } func (b LightGrayStainedGlassPane) New(props BlockProperties) Block { return LightGrayStainedGlassPane{ North: props["north"] != "false", South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", } } ================================================ FILE: server/world/block/lightGrayTerracotta.go ================================================ package block type LightGrayTerracotta struct { } func (b LightGrayTerracotta) Encode() (string, BlockProperties) { return "minecraft:light_gray_terracotta", BlockProperties{} } func (b LightGrayTerracotta) New(props BlockProperties) Block { return LightGrayTerracotta{} } ================================================ FILE: server/world/block/lightGrayWallBanner.go ================================================ package block type LightGrayWallBanner struct { Facing string } func (b LightGrayWallBanner) Encode() (string, BlockProperties) { return "minecraft:light_gray_wall_banner", BlockProperties{ "facing": b.Facing, } } func (b LightGrayWallBanner) New(props BlockProperties) Block { return LightGrayWallBanner{ Facing: props["facing"], } } ================================================ FILE: server/world/block/lightGrayWool.go ================================================ package block type LightGrayWool struct { } func (b LightGrayWool) Encode() (string, BlockProperties) { return "minecraft:light_gray_wool", BlockProperties{} } func (b LightGrayWool) New(props BlockProperties) Block { return LightGrayWool{} } ================================================ FILE: server/world/block/lightWeightedPressurePlate.go ================================================ package block import ( "strconv" ) type LightWeightedPressurePlate struct { Power int } func (b LightWeightedPressurePlate) Encode() (string, BlockProperties) { return "minecraft:light_weighted_pressure_plate", BlockProperties{ "power": strconv.Itoa(b.Power), } } func (b LightWeightedPressurePlate) New(props BlockProperties) Block { return LightWeightedPressurePlate{ Power: atoi(props["power"]), } } ================================================ FILE: server/world/block/lightningRod.go ================================================ package block import ( "strconv" ) type LightningRod struct { Facing string Powered bool Waterlogged bool } func (b LightningRod) Encode() (string, BlockProperties) { return "minecraft:lightning_rod", BlockProperties{ "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b LightningRod) New(props BlockProperties) Block { return LightningRod{ Facing: props["facing"], Powered: props["powered"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/lilac.go ================================================ package block type Lilac struct { Half string } func (b Lilac) Encode() (string, BlockProperties) { return "minecraft:lilac", BlockProperties{ "half": b.Half, } } func (b Lilac) New(props BlockProperties) Block { return Lilac{ Half: props["half"], } } ================================================ FILE: server/world/block/lilyOfTheValley.go ================================================ package block type LilyOfTheValley struct { } func (b LilyOfTheValley) Encode() (string, BlockProperties) { return "minecraft:lily_of_the_valley", BlockProperties{} } func (b LilyOfTheValley) New(props BlockProperties) Block { return LilyOfTheValley{} } ================================================ FILE: server/world/block/lilyPad.go ================================================ package block type LilyPad struct { } func (b LilyPad) Encode() (string, BlockProperties) { return "minecraft:lily_pad", BlockProperties{} } func (b LilyPad) New(props BlockProperties) Block { return LilyPad{} } ================================================ FILE: server/world/block/limeBanner.go ================================================ package block import ( "strconv" ) type LimeBanner struct { Rotation int } func (b LimeBanner) Encode() (string, BlockProperties) { return "minecraft:lime_banner", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), } } func (b LimeBanner) New(props BlockProperties) Block { return LimeBanner{ Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/limeBed.go ================================================ package block import ( "strconv" ) type LimeBed struct { Facing string Occupied bool Part string } func (b LimeBed) Encode() (string, BlockProperties) { return "minecraft:lime_bed", BlockProperties{ "facing": b.Facing, "occupied": strconv.FormatBool(b.Occupied), "part": b.Part, } } func (b LimeBed) New(props BlockProperties) Block { return LimeBed{ Facing: props["facing"], Occupied: props["occupied"] != "false", Part: props["part"], } } ================================================ FILE: server/world/block/limeCandle.go ================================================ package block import ( "strconv" ) type LimeCandle struct { Candles int Lit bool Waterlogged bool } func (b LimeCandle) Encode() (string, BlockProperties) { return "minecraft:lime_candle", BlockProperties{ "candles": strconv.Itoa(b.Candles), "lit": strconv.FormatBool(b.Lit), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b LimeCandle) New(props BlockProperties) Block { return LimeCandle{ Candles: atoi(props["candles"]), Lit: props["lit"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/limeCandleCake.go ================================================ package block import ( "strconv" ) type LimeCandleCake struct { Lit bool } func (b LimeCandleCake) Encode() (string, BlockProperties) { return "minecraft:lime_candle_cake", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b LimeCandleCake) New(props BlockProperties) Block { return LimeCandleCake{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/limeCarpet.go ================================================ package block type LimeCarpet struct { } func (b LimeCarpet) Encode() (string, BlockProperties) { return "minecraft:lime_carpet", BlockProperties{} } func (b LimeCarpet) New(props BlockProperties) Block { return LimeCarpet{} } ================================================ FILE: server/world/block/limeConcrete.go ================================================ package block type LimeConcrete struct { } func (b LimeConcrete) Encode() (string, BlockProperties) { return "minecraft:lime_concrete", BlockProperties{} } func (b LimeConcrete) New(props BlockProperties) Block { return LimeConcrete{} } ================================================ FILE: server/world/block/limeConcretePowder.go ================================================ package block type LimeConcretePowder struct { } func (b LimeConcretePowder) Encode() (string, BlockProperties) { return "minecraft:lime_concrete_powder", BlockProperties{} } func (b LimeConcretePowder) New(props BlockProperties) Block { return LimeConcretePowder{} } ================================================ FILE: server/world/block/limeGlazedTerracotta.go ================================================ package block type LimeGlazedTerracotta struct { Facing string } func (b LimeGlazedTerracotta) Encode() (string, BlockProperties) { return "minecraft:lime_glazed_terracotta", BlockProperties{ "facing": b.Facing, } } func (b LimeGlazedTerracotta) New(props BlockProperties) Block { return LimeGlazedTerracotta{ Facing: props["facing"], } } ================================================ FILE: server/world/block/limeShulkerBox.go ================================================ package block type LimeShulkerBox struct { Facing string } func (b LimeShulkerBox) Encode() (string, BlockProperties) { return "minecraft:lime_shulker_box", BlockProperties{ "facing": b.Facing, } } func (b LimeShulkerBox) New(props BlockProperties) Block { return LimeShulkerBox{ Facing: props["facing"], } } ================================================ FILE: server/world/block/limeStainedGlass.go ================================================ package block type LimeStainedGlass struct { } func (b LimeStainedGlass) Encode() (string, BlockProperties) { return "minecraft:lime_stained_glass", BlockProperties{} } func (b LimeStainedGlass) New(props BlockProperties) Block { return LimeStainedGlass{} } ================================================ FILE: server/world/block/limeStainedGlassPane.go ================================================ package block import ( "strconv" ) type LimeStainedGlassPane struct { West bool East bool North bool South bool Waterlogged bool } func (b LimeStainedGlassPane) Encode() (string, BlockProperties) { return "minecraft:lime_stained_glass_pane", BlockProperties{ "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), } } func (b LimeStainedGlassPane) New(props BlockProperties) Block { return LimeStainedGlassPane{ South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", } } ================================================ FILE: server/world/block/limeTerracotta.go ================================================ package block type LimeTerracotta struct { } func (b LimeTerracotta) Encode() (string, BlockProperties) { return "minecraft:lime_terracotta", BlockProperties{} } func (b LimeTerracotta) New(props BlockProperties) Block { return LimeTerracotta{} } ================================================ FILE: server/world/block/limeWallBanner.go ================================================ package block type LimeWallBanner struct { Facing string } func (b LimeWallBanner) Encode() (string, BlockProperties) { return "minecraft:lime_wall_banner", BlockProperties{ "facing": b.Facing, } } func (b LimeWallBanner) New(props BlockProperties) Block { return LimeWallBanner{ Facing: props["facing"], } } ================================================ FILE: server/world/block/limeWool.go ================================================ package block type LimeWool struct { } func (b LimeWool) Encode() (string, BlockProperties) { return "minecraft:lime_wool", BlockProperties{} } func (b LimeWool) New(props BlockProperties) Block { return LimeWool{} } ================================================ FILE: server/world/block/lodestone.go ================================================ package block type Lodestone struct { } func (b Lodestone) Encode() (string, BlockProperties) { return "minecraft:lodestone", BlockProperties{} } func (b Lodestone) New(props BlockProperties) Block { return Lodestone{} } ================================================ FILE: server/world/block/loom.go ================================================ package block type Loom struct { Facing string } func (b Loom) Encode() (string, BlockProperties) { return "minecraft:loom", BlockProperties{ "facing": b.Facing, } } func (b Loom) New(props BlockProperties) Block { return Loom{ Facing: props["facing"], } } ================================================ FILE: server/world/block/magentaBanner.go ================================================ package block import ( "strconv" ) type MagentaBanner struct { Rotation int } func (b MagentaBanner) Encode() (string, BlockProperties) { return "minecraft:magenta_banner", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), } } func (b MagentaBanner) New(props BlockProperties) Block { return MagentaBanner{ Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/magentaBed.go ================================================ package block import ( "strconv" ) type MagentaBed struct { Facing string Occupied bool Part string } func (b MagentaBed) Encode() (string, BlockProperties) { return "minecraft:magenta_bed", BlockProperties{ "occupied": strconv.FormatBool(b.Occupied), "part": b.Part, "facing": b.Facing, } } func (b MagentaBed) New(props BlockProperties) Block { return MagentaBed{ Facing: props["facing"], Occupied: props["occupied"] != "false", Part: props["part"], } } ================================================ FILE: server/world/block/magentaCandle.go ================================================ package block import ( "strconv" ) type MagentaCandle struct { Candles int Lit bool Waterlogged bool } func (b MagentaCandle) Encode() (string, BlockProperties) { return "minecraft:magenta_candle", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "candles": strconv.Itoa(b.Candles), "lit": strconv.FormatBool(b.Lit), } } func (b MagentaCandle) New(props BlockProperties) Block { return MagentaCandle{ Lit: props["lit"] != "false", Waterlogged: props["waterlogged"] != "false", Candles: atoi(props["candles"]), } } ================================================ FILE: server/world/block/magentaCandleCake.go ================================================ package block import ( "strconv" ) type MagentaCandleCake struct { Lit bool } func (b MagentaCandleCake) Encode() (string, BlockProperties) { return "minecraft:magenta_candle_cake", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b MagentaCandleCake) New(props BlockProperties) Block { return MagentaCandleCake{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/magentaCarpet.go ================================================ package block type MagentaCarpet struct { } func (b MagentaCarpet) Encode() (string, BlockProperties) { return "minecraft:magenta_carpet", BlockProperties{} } func (b MagentaCarpet) New(props BlockProperties) Block { return MagentaCarpet{} } ================================================ FILE: server/world/block/magentaConcrete.go ================================================ package block type MagentaConcrete struct { } func (b MagentaConcrete) Encode() (string, BlockProperties) { return "minecraft:magenta_concrete", BlockProperties{} } func (b MagentaConcrete) New(props BlockProperties) Block { return MagentaConcrete{} } ================================================ FILE: server/world/block/magentaConcretePowder.go ================================================ package block type MagentaConcretePowder struct { } func (b MagentaConcretePowder) Encode() (string, BlockProperties) { return "minecraft:magenta_concrete_powder", BlockProperties{} } func (b MagentaConcretePowder) New(props BlockProperties) Block { return MagentaConcretePowder{} } ================================================ FILE: server/world/block/magentaGlazedTerracotta.go ================================================ package block type MagentaGlazedTerracotta struct { Facing string } func (b MagentaGlazedTerracotta) Encode() (string, BlockProperties) { return "minecraft:magenta_glazed_terracotta", BlockProperties{ "facing": b.Facing, } } func (b MagentaGlazedTerracotta) New(props BlockProperties) Block { return MagentaGlazedTerracotta{ Facing: props["facing"], } } ================================================ FILE: server/world/block/magentaShulkerBox.go ================================================ package block type MagentaShulkerBox struct { Facing string } func (b MagentaShulkerBox) Encode() (string, BlockProperties) { return "minecraft:magenta_shulker_box", BlockProperties{ "facing": b.Facing, } } func (b MagentaShulkerBox) New(props BlockProperties) Block { return MagentaShulkerBox{ Facing: props["facing"], } } ================================================ FILE: server/world/block/magentaStainedGlass.go ================================================ package block type MagentaStainedGlass struct { } func (b MagentaStainedGlass) Encode() (string, BlockProperties) { return "minecraft:magenta_stained_glass", BlockProperties{} } func (b MagentaStainedGlass) New(props BlockProperties) Block { return MagentaStainedGlass{} } ================================================ FILE: server/world/block/magentaStainedGlassPane.go ================================================ package block import ( "strconv" ) type MagentaStainedGlassPane struct { East bool North bool South bool Waterlogged bool West bool } func (b MagentaStainedGlassPane) Encode() (string, BlockProperties) { return "minecraft:magenta_stained_glass_pane", BlockProperties{ "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b MagentaStainedGlassPane) New(props BlockProperties) Block { return MagentaStainedGlassPane{ Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", } } ================================================ FILE: server/world/block/magentaTerracotta.go ================================================ package block type MagentaTerracotta struct { } func (b MagentaTerracotta) Encode() (string, BlockProperties) { return "minecraft:magenta_terracotta", BlockProperties{} } func (b MagentaTerracotta) New(props BlockProperties) Block { return MagentaTerracotta{} } ================================================ FILE: server/world/block/magentaWallBanner.go ================================================ package block type MagentaWallBanner struct { Facing string } func (b MagentaWallBanner) Encode() (string, BlockProperties) { return "minecraft:magenta_wall_banner", BlockProperties{ "facing": b.Facing, } } func (b MagentaWallBanner) New(props BlockProperties) Block { return MagentaWallBanner{ Facing: props["facing"], } } ================================================ FILE: server/world/block/magentaWool.go ================================================ package block type MagentaWool struct { } func (b MagentaWool) Encode() (string, BlockProperties) { return "minecraft:magenta_wool", BlockProperties{} } func (b MagentaWool) New(props BlockProperties) Block { return MagentaWool{} } ================================================ FILE: server/world/block/magmaBlock.go ================================================ package block type MagmaBlock struct { } func (b MagmaBlock) Encode() (string, BlockProperties) { return "minecraft:magma_block", BlockProperties{} } func (b MagmaBlock) New(props BlockProperties) Block { return MagmaBlock{} } ================================================ FILE: server/world/block/mangroveButton.go ================================================ package block import ( "strconv" ) type MangroveButton struct { Facing string Powered bool Face string } func (b MangroveButton) Encode() (string, BlockProperties) { return "minecraft:mangrove_button", BlockProperties{ "face": b.Face, "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), } } func (b MangroveButton) New(props BlockProperties) Block { return MangroveButton{ Face: props["face"], Facing: props["facing"], Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/mangroveDoor.go ================================================ package block import ( "strconv" ) type MangroveDoor struct { Powered bool Facing string Half string Hinge string Open bool } func (b MangroveDoor) Encode() (string, BlockProperties) { return "minecraft:mangrove_door", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, "half": b.Half, "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), } } func (b MangroveDoor) New(props BlockProperties) Block { return MangroveDoor{ Half: props["half"], Hinge: props["hinge"], Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/mangroveFence.go ================================================ package block import ( "strconv" ) type MangroveFence struct { East bool North bool South bool Waterlogged bool West bool } func (b MangroveFence) Encode() (string, BlockProperties) { return "minecraft:mangrove_fence", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), } } func (b MangroveFence) New(props BlockProperties) Block { return MangroveFence{ East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", } } ================================================ FILE: server/world/block/mangroveFenceGate.go ================================================ package block import ( "strconv" ) type MangroveFenceGate struct { Facing string InWall bool Open bool Powered bool } func (b MangroveFenceGate) Encode() (string, BlockProperties) { return "minecraft:mangrove_fence_gate", BlockProperties{ "facing": b.Facing, "in_wall": strconv.FormatBool(b.InWall), "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), } } func (b MangroveFenceGate) New(props BlockProperties) Block { return MangroveFenceGate{ Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], InWall: props["in_wall"] != "false", } } ================================================ FILE: server/world/block/mangroveHangingSign.go ================================================ package block import ( "strconv" ) type MangroveHangingSign struct { Attached bool Rotation int Waterlogged bool } func (b MangroveHangingSign) Encode() (string, BlockProperties) { return "minecraft:mangrove_hanging_sign", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), "waterlogged": strconv.FormatBool(b.Waterlogged), "attached": strconv.FormatBool(b.Attached), } } func (b MangroveHangingSign) New(props BlockProperties) Block { return MangroveHangingSign{ Waterlogged: props["waterlogged"] != "false", Attached: props["attached"] != "false", Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/mangroveLeaves.go ================================================ package block import ( "strconv" ) type MangroveLeaves struct { Distance int Persistent bool Waterlogged bool } func (b MangroveLeaves) Encode() (string, BlockProperties) { return "minecraft:mangrove_leaves", BlockProperties{ "distance": strconv.Itoa(b.Distance), "persistent": strconv.FormatBool(b.Persistent), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b MangroveLeaves) New(props BlockProperties) Block { return MangroveLeaves{ Distance: atoi(props["distance"]), Persistent: props["persistent"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/mangroveLog.go ================================================ package block type MangroveLog struct { Axis string } func (b MangroveLog) Encode() (string, BlockProperties) { return "minecraft:mangrove_log", BlockProperties{ "axis": b.Axis, } } func (b MangroveLog) New(props BlockProperties) Block { return MangroveLog{ Axis: props["axis"], } } ================================================ FILE: server/world/block/mangrovePlanks.go ================================================ package block type MangrovePlanks struct { } func (b MangrovePlanks) Encode() (string, BlockProperties) { return "minecraft:mangrove_planks", BlockProperties{} } func (b MangrovePlanks) New(props BlockProperties) Block { return MangrovePlanks{} } ================================================ FILE: server/world/block/mangrovePressurePlate.go ================================================ package block import ( "strconv" ) type MangrovePressurePlate struct { Powered bool } func (b MangrovePressurePlate) Encode() (string, BlockProperties) { return "minecraft:mangrove_pressure_plate", BlockProperties{ "powered": strconv.FormatBool(b.Powered), } } func (b MangrovePressurePlate) New(props BlockProperties) Block { return MangrovePressurePlate{ Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/mangrovePropagule.go ================================================ package block import ( "strconv" ) type MangrovePropagule struct { Waterlogged bool Age int Hanging bool Stage int } func (b MangrovePropagule) Encode() (string, BlockProperties) { return "minecraft:mangrove_propagule", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "age": strconv.Itoa(b.Age), "hanging": strconv.FormatBool(b.Hanging), "stage": strconv.Itoa(b.Stage), } } func (b MangrovePropagule) New(props BlockProperties) Block { return MangrovePropagule{ Age: atoi(props["age"]), Hanging: props["hanging"] != "false", Stage: atoi(props["stage"]), Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/mangroveRoots.go ================================================ package block import ( "strconv" ) type MangroveRoots struct { Waterlogged bool } func (b MangroveRoots) Encode() (string, BlockProperties) { return "minecraft:mangrove_roots", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b MangroveRoots) New(props BlockProperties) Block { return MangroveRoots{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/mangroveSign.go ================================================ package block import ( "strconv" ) type MangroveSign struct { Rotation int Waterlogged bool } func (b MangroveSign) Encode() (string, BlockProperties) { return "minecraft:mangrove_sign", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b MangroveSign) New(props BlockProperties) Block { return MangroveSign{ Rotation: atoi(props["rotation"]), Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/mangroveSlab.go ================================================ package block import ( "strconv" ) type MangroveSlab struct { Type string Waterlogged bool } func (b MangroveSlab) Encode() (string, BlockProperties) { return "minecraft:mangrove_slab", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "type": b.Type, } } func (b MangroveSlab) New(props BlockProperties) Block { return MangroveSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/mangroveStairs.go ================================================ package block import ( "strconv" ) type MangroveStairs struct { Facing string Half string Shape string Waterlogged bool } func (b MangroveStairs) Encode() (string, BlockProperties) { return "minecraft:mangrove_stairs", BlockProperties{ "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, } } func (b MangroveStairs) New(props BlockProperties) Block { return MangroveStairs{ Facing: props["facing"], Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/mangroveTrapdoor.go ================================================ package block import ( "strconv" ) type MangroveTrapdoor struct { Powered bool Waterlogged bool Facing string Half string Open bool } func (b MangroveTrapdoor) Encode() (string, BlockProperties) { return "minecraft:mangrove_trapdoor", BlockProperties{ "facing": b.Facing, "half": b.Half, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b MangroveTrapdoor) New(props BlockProperties) Block { return MangroveTrapdoor{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Open: props["open"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/mangroveWallHangingSign.go ================================================ package block import ( "strconv" ) type MangroveWallHangingSign struct { Waterlogged bool Facing string } func (b MangroveWallHangingSign) Encode() (string, BlockProperties) { return "minecraft:mangrove_wall_hanging_sign", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b MangroveWallHangingSign) New(props BlockProperties) Block { return MangroveWallHangingSign{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/mangroveWallSign.go ================================================ package block import ( "strconv" ) type MangroveWallSign struct { Facing string Waterlogged bool } func (b MangroveWallSign) Encode() (string, BlockProperties) { return "minecraft:mangrove_wall_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b MangroveWallSign) New(props BlockProperties) Block { return MangroveWallSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/mangroveWood.go ================================================ package block type MangroveWood struct { Axis string } func (b MangroveWood) Encode() (string, BlockProperties) { return "minecraft:mangrove_wood", BlockProperties{ "axis": b.Axis, } } func (b MangroveWood) New(props BlockProperties) Block { return MangroveWood{ Axis: props["axis"], } } ================================================ FILE: server/world/block/mediumAmethystBud.go ================================================ package block import ( "strconv" ) type MediumAmethystBud struct { Facing string Waterlogged bool } func (b MediumAmethystBud) Encode() (string, BlockProperties) { return "minecraft:medium_amethyst_bud", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b MediumAmethystBud) New(props BlockProperties) Block { return MediumAmethystBud{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/melon.go ================================================ package block type Melon struct { } func (b Melon) Encode() (string, BlockProperties) { return "minecraft:melon", BlockProperties{} } func (b Melon) New(props BlockProperties) Block { return Melon{} } ================================================ FILE: server/world/block/melonStem.go ================================================ package block import ( "strconv" ) type MelonStem struct { Age int } func (b MelonStem) Encode() (string, BlockProperties) { return "minecraft:melon_stem", BlockProperties{ "age": strconv.Itoa(b.Age), } } func (b MelonStem) New(props BlockProperties) Block { return MelonStem{ Age: atoi(props["age"]), } } ================================================ FILE: server/world/block/mossBlock.go ================================================ package block type MossBlock struct { } func (b MossBlock) Encode() (string, BlockProperties) { return "minecraft:moss_block", BlockProperties{} } func (b MossBlock) New(props BlockProperties) Block { return MossBlock{} } ================================================ FILE: server/world/block/mossCarpet.go ================================================ package block type MossCarpet struct { } func (b MossCarpet) Encode() (string, BlockProperties) { return "minecraft:moss_carpet", BlockProperties{} } func (b MossCarpet) New(props BlockProperties) Block { return MossCarpet{} } ================================================ FILE: server/world/block/mossyCobblestone.go ================================================ package block type MossyCobblestone struct { } func (b MossyCobblestone) Encode() (string, BlockProperties) { return "minecraft:mossy_cobblestone", BlockProperties{} } func (b MossyCobblestone) New(props BlockProperties) Block { return MossyCobblestone{} } ================================================ FILE: server/world/block/mossyCobblestoneSlab.go ================================================ package block import ( "strconv" ) type MossyCobblestoneSlab struct { Waterlogged bool Type string } func (b MossyCobblestoneSlab) Encode() (string, BlockProperties) { return "minecraft:mossy_cobblestone_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b MossyCobblestoneSlab) New(props BlockProperties) Block { return MossyCobblestoneSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/mossyCobblestoneStairs.go ================================================ package block import ( "strconv" ) type MossyCobblestoneStairs struct { Facing string Half string Shape string Waterlogged bool } func (b MossyCobblestoneStairs) Encode() (string, BlockProperties) { return "minecraft:mossy_cobblestone_stairs", BlockProperties{ "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b MossyCobblestoneStairs) New(props BlockProperties) Block { return MossyCobblestoneStairs{ Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/mossyCobblestoneWall.go ================================================ package block import ( "strconv" ) type MossyCobblestoneWall struct { South string Up bool Waterlogged bool West string East string North string } func (b MossyCobblestoneWall) Encode() (string, BlockProperties) { return "minecraft:mossy_cobblestone_wall", BlockProperties{ "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, "north": b.North, "south": b.South, } } func (b MossyCobblestoneWall) New(props BlockProperties) Block { return MossyCobblestoneWall{ South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], East: props["east"], North: props["north"], } } ================================================ FILE: server/world/block/mossyStoneBrickSlab.go ================================================ package block import ( "strconv" ) type MossyStoneBrickSlab struct { Type string Waterlogged bool } func (b MossyStoneBrickSlab) Encode() (string, BlockProperties) { return "minecraft:mossy_stone_brick_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b MossyStoneBrickSlab) New(props BlockProperties) Block { return MossyStoneBrickSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/mossyStoneBrickStairs.go ================================================ package block import ( "strconv" ) type MossyStoneBrickStairs struct { Half string Shape string Waterlogged bool Facing string } func (b MossyStoneBrickStairs) Encode() (string, BlockProperties) { return "minecraft:mossy_stone_brick_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b MossyStoneBrickStairs) New(props BlockProperties) Block { return MossyStoneBrickStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/mossyStoneBrickWall.go ================================================ package block import ( "strconv" ) type MossyStoneBrickWall struct { North string South string Up bool Waterlogged bool West string East string } func (b MossyStoneBrickWall) Encode() (string, BlockProperties) { return "minecraft:mossy_stone_brick_wall", BlockProperties{ "south": b.South, "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, "north": b.North, } } func (b MossyStoneBrickWall) New(props BlockProperties) Block { return MossyStoneBrickWall{ Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], East: props["east"], North: props["north"], South: props["south"], } } ================================================ FILE: server/world/block/mossyStoneBricks.go ================================================ package block type MossyStoneBricks struct { } func (b MossyStoneBricks) Encode() (string, BlockProperties) { return "minecraft:mossy_stone_bricks", BlockProperties{} } func (b MossyStoneBricks) New(props BlockProperties) Block { return MossyStoneBricks{} } ================================================ FILE: server/world/block/movingPiston.go ================================================ package block type MovingPiston struct { Type string Facing string } func (b MovingPiston) Encode() (string, BlockProperties) { return "minecraft:moving_piston", BlockProperties{ "type": b.Type, "facing": b.Facing, } } func (b MovingPiston) New(props BlockProperties) Block { return MovingPiston{ Facing: props["facing"], Type: props["type"], } } ================================================ FILE: server/world/block/mud.go ================================================ package block type Mud struct { } func (b Mud) Encode() (string, BlockProperties) { return "minecraft:mud", BlockProperties{} } func (b Mud) New(props BlockProperties) Block { return Mud{} } ================================================ FILE: server/world/block/mudBrickSlab.go ================================================ package block import ( "strconv" ) type MudBrickSlab struct { Type string Waterlogged bool } func (b MudBrickSlab) Encode() (string, BlockProperties) { return "minecraft:mud_brick_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b MudBrickSlab) New(props BlockProperties) Block { return MudBrickSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/mudBrickStairs.go ================================================ package block import ( "strconv" ) type MudBrickStairs struct { Waterlogged bool Facing string Half string Shape string } func (b MudBrickStairs) Encode() (string, BlockProperties) { return "minecraft:mud_brick_stairs", BlockProperties{ "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, } } func (b MudBrickStairs) New(props BlockProperties) Block { return MudBrickStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/mudBrickWall.go ================================================ package block import ( "strconv" ) type MudBrickWall struct { West string East string North string South string Up bool Waterlogged bool } func (b MudBrickWall) Encode() (string, BlockProperties) { return "minecraft:mud_brick_wall", BlockProperties{ "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, "north": b.North, "south": b.South, } } func (b MudBrickWall) New(props BlockProperties) Block { return MudBrickWall{ East: props["east"], North: props["north"], South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], } } ================================================ FILE: server/world/block/mudBricks.go ================================================ package block type MudBricks struct { } func (b MudBricks) Encode() (string, BlockProperties) { return "minecraft:mud_bricks", BlockProperties{} } func (b MudBricks) New(props BlockProperties) Block { return MudBricks{} } ================================================ FILE: server/world/block/muddyMangroveRoots.go ================================================ package block type MuddyMangroveRoots struct { Axis string } func (b MuddyMangroveRoots) Encode() (string, BlockProperties) { return "minecraft:muddy_mangrove_roots", BlockProperties{ "axis": b.Axis, } } func (b MuddyMangroveRoots) New(props BlockProperties) Block { return MuddyMangroveRoots{ Axis: props["axis"], } } ================================================ FILE: server/world/block/mushroomStem.go ================================================ package block import ( "strconv" ) type MushroomStem struct { Up bool West bool Down bool East bool North bool South bool } func (b MushroomStem) Encode() (string, BlockProperties) { return "minecraft:mushroom_stem", BlockProperties{ "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "up": strconv.FormatBool(b.Up), "west": strconv.FormatBool(b.West), "down": strconv.FormatBool(b.Down), "east": strconv.FormatBool(b.East), } } func (b MushroomStem) New(props BlockProperties) Block { return MushroomStem{ Up: props["up"] != "false", West: props["west"] != "false", Down: props["down"] != "false", East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", } } ================================================ FILE: server/world/block/mycelium.go ================================================ package block import ( "strconv" ) type Mycelium struct { Snowy bool } func (b Mycelium) Encode() (string, BlockProperties) { return "minecraft:mycelium", BlockProperties{ "snowy": strconv.FormatBool(b.Snowy), } } func (b Mycelium) New(props BlockProperties) Block { return Mycelium{ Snowy: props["snowy"] != "false", } } ================================================ FILE: server/world/block/netherBrickFence.go ================================================ package block import ( "strconv" ) type NetherBrickFence struct { East bool North bool South bool Waterlogged bool West bool } func (b NetherBrickFence) Encode() (string, BlockProperties) { return "minecraft:nether_brick_fence", BlockProperties{ "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), } } func (b NetherBrickFence) New(props BlockProperties) Block { return NetherBrickFence{ West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/netherBrickSlab.go ================================================ package block import ( "strconv" ) type NetherBrickSlab struct { Type string Waterlogged bool } func (b NetherBrickSlab) Encode() (string, BlockProperties) { return "minecraft:nether_brick_slab", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "type": b.Type, } } func (b NetherBrickSlab) New(props BlockProperties) Block { return NetherBrickSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/netherBrickStairs.go ================================================ package block import ( "strconv" ) type NetherBrickStairs struct { Half string Shape string Waterlogged bool Facing string } func (b NetherBrickStairs) Encode() (string, BlockProperties) { return "minecraft:nether_brick_stairs", BlockProperties{ "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, } } func (b NetherBrickStairs) New(props BlockProperties) Block { return NetherBrickStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/netherBrickWall.go ================================================ package block import ( "strconv" ) type NetherBrickWall struct { East string North string South string Up bool Waterlogged bool West string } func (b NetherBrickWall) Encode() (string, BlockProperties) { return "minecraft:nether_brick_wall", BlockProperties{ "north": b.North, "south": b.South, "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, } } func (b NetherBrickWall) New(props BlockProperties) Block { return NetherBrickWall{ North: props["north"], South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], East: props["east"], } } ================================================ FILE: server/world/block/netherBricks.go ================================================ package block type NetherBricks struct { } func (b NetherBricks) Encode() (string, BlockProperties) { return "minecraft:nether_bricks", BlockProperties{} } func (b NetherBricks) New(props BlockProperties) Block { return NetherBricks{} } ================================================ FILE: server/world/block/netherGoldOre.go ================================================ package block type NetherGoldOre struct { } func (b NetherGoldOre) Encode() (string, BlockProperties) { return "minecraft:nether_gold_ore", BlockProperties{} } func (b NetherGoldOre) New(props BlockProperties) Block { return NetherGoldOre{} } ================================================ FILE: server/world/block/netherPortal.go ================================================ package block type NetherPortal struct { Axis string } func (b NetherPortal) Encode() (string, BlockProperties) { return "minecraft:nether_portal", BlockProperties{ "axis": b.Axis, } } func (b NetherPortal) New(props BlockProperties) Block { return NetherPortal{ Axis: props["axis"], } } ================================================ FILE: server/world/block/netherQuartzOre.go ================================================ package block type NetherQuartzOre struct { } func (b NetherQuartzOre) Encode() (string, BlockProperties) { return "minecraft:nether_quartz_ore", BlockProperties{} } func (b NetherQuartzOre) New(props BlockProperties) Block { return NetherQuartzOre{} } ================================================ FILE: server/world/block/netherSprouts.go ================================================ package block type NetherSprouts struct { } func (b NetherSprouts) Encode() (string, BlockProperties) { return "minecraft:nether_sprouts", BlockProperties{} } func (b NetherSprouts) New(props BlockProperties) Block { return NetherSprouts{} } ================================================ FILE: server/world/block/netherWart.go ================================================ package block import ( "strconv" ) type NetherWart struct { Age int } func (b NetherWart) Encode() (string, BlockProperties) { return "minecraft:nether_wart", BlockProperties{ "age": strconv.Itoa(b.Age), } } func (b NetherWart) New(props BlockProperties) Block { return NetherWart{ Age: atoi(props["age"]), } } ================================================ FILE: server/world/block/netherWartBlock.go ================================================ package block type NetherWartBlock struct { } func (b NetherWartBlock) Encode() (string, BlockProperties) { return "minecraft:nether_wart_block", BlockProperties{} } func (b NetherWartBlock) New(props BlockProperties) Block { return NetherWartBlock{} } ================================================ FILE: server/world/block/netheriteBlock.go ================================================ package block type NetheriteBlock struct { } func (b NetheriteBlock) Encode() (string, BlockProperties) { return "minecraft:netherite_block", BlockProperties{} } func (b NetheriteBlock) New(props BlockProperties) Block { return NetheriteBlock{} } ================================================ FILE: server/world/block/netherrack.go ================================================ package block type Netherrack struct { } func (b Netherrack) Encode() (string, BlockProperties) { return "minecraft:netherrack", BlockProperties{} } func (b Netherrack) New(props BlockProperties) Block { return Netherrack{} } ================================================ FILE: server/world/block/noteBlock.go ================================================ package block import ( "strconv" ) type NoteBlock struct { Instrument string Note int Powered bool } func (b NoteBlock) Encode() (string, BlockProperties) { return "minecraft:note_block", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "instrument": b.Instrument, "note": strconv.Itoa(b.Note), } } func (b NoteBlock) New(props BlockProperties) Block { return NoteBlock{ Note: atoi(props["note"]), Powered: props["powered"] != "false", Instrument: props["instrument"], } } ================================================ FILE: server/world/block/oakButton.go ================================================ package block import ( "strconv" ) type OakButton struct { Facing string Powered bool Face string } func (b OakButton) Encode() (string, BlockProperties) { return "minecraft:oak_button", BlockProperties{ "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), "face": b.Face, } } func (b OakButton) New(props BlockProperties) Block { return OakButton{ Face: props["face"], Facing: props["facing"], Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/oakDoor.go ================================================ package block import ( "strconv" ) type OakDoor struct { Powered bool Facing string Half string Hinge string Open bool } func (b OakDoor) Encode() (string, BlockProperties) { return "minecraft:oak_door", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, "half": b.Half, "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), } } func (b OakDoor) New(props BlockProperties) Block { return OakDoor{ Powered: props["powered"] != "false", Facing: props["facing"], Half: props["half"], Hinge: props["hinge"], Open: props["open"] != "false", } } ================================================ FILE: server/world/block/oakFence.go ================================================ package block import ( "strconv" ) type OakFence struct { East bool North bool South bool Waterlogged bool West bool } func (b OakFence) Encode() (string, BlockProperties) { return "minecraft:oak_fence", BlockProperties{ "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), } } func (b OakFence) New(props BlockProperties) Block { return OakFence{ East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", } } ================================================ FILE: server/world/block/oakFenceGate.go ================================================ package block import ( "strconv" ) type OakFenceGate struct { InWall bool Open bool Powered bool Facing string } func (b OakFenceGate) Encode() (string, BlockProperties) { return "minecraft:oak_fence_gate", BlockProperties{ "facing": b.Facing, "in_wall": strconv.FormatBool(b.InWall), "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), } } func (b OakFenceGate) New(props BlockProperties) Block { return OakFenceGate{ Facing: props["facing"], InWall: props["in_wall"] != "false", Open: props["open"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/oakHangingSign.go ================================================ package block import ( "strconv" ) type OakHangingSign struct { Waterlogged bool Attached bool Rotation int } func (b OakHangingSign) Encode() (string, BlockProperties) { return "minecraft:oak_hanging_sign", BlockProperties{ "attached": strconv.FormatBool(b.Attached), "rotation": strconv.Itoa(b.Rotation), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b OakHangingSign) New(props BlockProperties) Block { return OakHangingSign{ Rotation: atoi(props["rotation"]), Waterlogged: props["waterlogged"] != "false", Attached: props["attached"] != "false", } } ================================================ FILE: server/world/block/oakLeaves.go ================================================ package block import ( "strconv" ) type OakLeaves struct { Persistent bool Waterlogged bool Distance int } func (b OakLeaves) Encode() (string, BlockProperties) { return "minecraft:oak_leaves", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "distance": strconv.Itoa(b.Distance), "persistent": strconv.FormatBool(b.Persistent), } } func (b OakLeaves) New(props BlockProperties) Block { return OakLeaves{ Distance: atoi(props["distance"]), Persistent: props["persistent"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/oakLog.go ================================================ package block type OakLog struct { Axis string } func (b OakLog) Encode() (string, BlockProperties) { return "minecraft:oak_log", BlockProperties{ "axis": b.Axis, } } func (b OakLog) New(props BlockProperties) Block { return OakLog{ Axis: props["axis"], } } ================================================ FILE: server/world/block/oakPlanks.go ================================================ package block type OakPlanks struct { } func (b OakPlanks) Encode() (string, BlockProperties) { return "minecraft:oak_planks", BlockProperties{} } func (b OakPlanks) New(props BlockProperties) Block { return OakPlanks{} } ================================================ FILE: server/world/block/oakPressurePlate.go ================================================ package block import ( "strconv" ) type OakPressurePlate struct { Powered bool } func (b OakPressurePlate) Encode() (string, BlockProperties) { return "minecraft:oak_pressure_plate", BlockProperties{ "powered": strconv.FormatBool(b.Powered), } } func (b OakPressurePlate) New(props BlockProperties) Block { return OakPressurePlate{ Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/oakSapling.go ================================================ package block import ( "strconv" ) type OakSapling struct { Stage int } func (b OakSapling) Encode() (string, BlockProperties) { return "minecraft:oak_sapling", BlockProperties{ "stage": strconv.Itoa(b.Stage), } } func (b OakSapling) New(props BlockProperties) Block { return OakSapling{ Stage: atoi(props["stage"]), } } ================================================ FILE: server/world/block/oakSign.go ================================================ package block import ( "strconv" ) type OakSign struct { Rotation int Waterlogged bool } func (b OakSign) Encode() (string, BlockProperties) { return "minecraft:oak_sign", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b OakSign) New(props BlockProperties) Block { return OakSign{ Rotation: atoi(props["rotation"]), Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/oakSlab.go ================================================ package block import ( "strconv" ) type OakSlab struct { Type string Waterlogged bool } func (b OakSlab) Encode() (string, BlockProperties) { return "minecraft:oak_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b OakSlab) New(props BlockProperties) Block { return OakSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/oakStairs.go ================================================ package block import ( "strconv" ) type OakStairs struct { Facing string Half string Shape string Waterlogged bool } func (b OakStairs) Encode() (string, BlockProperties) { return "minecraft:oak_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b OakStairs) New(props BlockProperties) Block { return OakStairs{ Facing: props["facing"], Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/oakTrapdoor.go ================================================ package block import ( "strconv" ) type OakTrapdoor struct { Waterlogged bool Facing string Half string Open bool Powered bool } func (b OakTrapdoor) Encode() (string, BlockProperties) { return "minecraft:oak_trapdoor", BlockProperties{ "half": b.Half, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b OakTrapdoor) New(props BlockProperties) Block { return OakTrapdoor{ Half: props["half"], Open: props["open"] != "false", Powered: props["powered"] != "false", Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/oakWallHangingSign.go ================================================ package block import ( "strconv" ) type OakWallHangingSign struct { Waterlogged bool Facing string } func (b OakWallHangingSign) Encode() (string, BlockProperties) { return "minecraft:oak_wall_hanging_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b OakWallHangingSign) New(props BlockProperties) Block { return OakWallHangingSign{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/oakWallSign.go ================================================ package block import ( "strconv" ) type OakWallSign struct { Waterlogged bool Facing string } func (b OakWallSign) Encode() (string, BlockProperties) { return "minecraft:oak_wall_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b OakWallSign) New(props BlockProperties) Block { return OakWallSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/oakWood.go ================================================ package block type OakWood struct { Axis string } func (b OakWood) Encode() (string, BlockProperties) { return "minecraft:oak_wood", BlockProperties{ "axis": b.Axis, } } func (b OakWood) New(props BlockProperties) Block { return OakWood{ Axis: props["axis"], } } ================================================ FILE: server/world/block/observer.go ================================================ package block import ( "strconv" ) type Observer struct { Facing string Powered bool } func (b Observer) Encode() (string, BlockProperties) { return "minecraft:observer", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, } } func (b Observer) New(props BlockProperties) Block { return Observer{ Facing: props["facing"], Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/obsidian.go ================================================ package block type Obsidian struct { } func (b Obsidian) Encode() (string, BlockProperties) { return "minecraft:obsidian", BlockProperties{} } func (b Obsidian) New(props BlockProperties) Block { return Obsidian{} } ================================================ FILE: server/world/block/ochreFroglight.go ================================================ package block type OchreFroglight struct { Axis string } func (b OchreFroglight) Encode() (string, BlockProperties) { return "minecraft:ochre_froglight", BlockProperties{ "axis": b.Axis, } } func (b OchreFroglight) New(props BlockProperties) Block { return OchreFroglight{ Axis: props["axis"], } } ================================================ FILE: server/world/block/orangeBanner.go ================================================ package block import ( "strconv" ) type OrangeBanner struct { Rotation int } func (b OrangeBanner) Encode() (string, BlockProperties) { return "minecraft:orange_banner", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), } } func (b OrangeBanner) New(props BlockProperties) Block { return OrangeBanner{ Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/orangeBed.go ================================================ package block import ( "strconv" ) type OrangeBed struct { Part string Facing string Occupied bool } func (b OrangeBed) Encode() (string, BlockProperties) { return "minecraft:orange_bed", BlockProperties{ "facing": b.Facing, "occupied": strconv.FormatBool(b.Occupied), "part": b.Part, } } func (b OrangeBed) New(props BlockProperties) Block { return OrangeBed{ Occupied: props["occupied"] != "false", Part: props["part"], Facing: props["facing"], } } ================================================ FILE: server/world/block/orangeCandle.go ================================================ package block import ( "strconv" ) type OrangeCandle struct { Candles int Lit bool Waterlogged bool } func (b OrangeCandle) Encode() (string, BlockProperties) { return "minecraft:orange_candle", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "candles": strconv.Itoa(b.Candles), "lit": strconv.FormatBool(b.Lit), } } func (b OrangeCandle) New(props BlockProperties) Block { return OrangeCandle{ Candles: atoi(props["candles"]), Lit: props["lit"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/orangeCandleCake.go ================================================ package block import ( "strconv" ) type OrangeCandleCake struct { Lit bool } func (b OrangeCandleCake) Encode() (string, BlockProperties) { return "minecraft:orange_candle_cake", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b OrangeCandleCake) New(props BlockProperties) Block { return OrangeCandleCake{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/orangeCarpet.go ================================================ package block type OrangeCarpet struct { } func (b OrangeCarpet) Encode() (string, BlockProperties) { return "minecraft:orange_carpet", BlockProperties{} } func (b OrangeCarpet) New(props BlockProperties) Block { return OrangeCarpet{} } ================================================ FILE: server/world/block/orangeConcrete.go ================================================ package block type OrangeConcrete struct { } func (b OrangeConcrete) Encode() (string, BlockProperties) { return "minecraft:orange_concrete", BlockProperties{} } func (b OrangeConcrete) New(props BlockProperties) Block { return OrangeConcrete{} } ================================================ FILE: server/world/block/orangeConcretePowder.go ================================================ package block type OrangeConcretePowder struct { } func (b OrangeConcretePowder) Encode() (string, BlockProperties) { return "minecraft:orange_concrete_powder", BlockProperties{} } func (b OrangeConcretePowder) New(props BlockProperties) Block { return OrangeConcretePowder{} } ================================================ FILE: server/world/block/orangeGlazedTerracotta.go ================================================ package block type OrangeGlazedTerracotta struct { Facing string } func (b OrangeGlazedTerracotta) Encode() (string, BlockProperties) { return "minecraft:orange_glazed_terracotta", BlockProperties{ "facing": b.Facing, } } func (b OrangeGlazedTerracotta) New(props BlockProperties) Block { return OrangeGlazedTerracotta{ Facing: props["facing"], } } ================================================ FILE: server/world/block/orangeShulkerBox.go ================================================ package block type OrangeShulkerBox struct { Facing string } func (b OrangeShulkerBox) Encode() (string, BlockProperties) { return "minecraft:orange_shulker_box", BlockProperties{ "facing": b.Facing, } } func (b OrangeShulkerBox) New(props BlockProperties) Block { return OrangeShulkerBox{ Facing: props["facing"], } } ================================================ FILE: server/world/block/orangeStainedGlass.go ================================================ package block type OrangeStainedGlass struct { } func (b OrangeStainedGlass) Encode() (string, BlockProperties) { return "minecraft:orange_stained_glass", BlockProperties{} } func (b OrangeStainedGlass) New(props BlockProperties) Block { return OrangeStainedGlass{} } ================================================ FILE: server/world/block/orangeStainedGlassPane.go ================================================ package block import ( "strconv" ) type OrangeStainedGlassPane struct { South bool Waterlogged bool West bool East bool North bool } func (b OrangeStainedGlassPane) Encode() (string, BlockProperties) { return "minecraft:orange_stained_glass_pane", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), } } func (b OrangeStainedGlassPane) New(props BlockProperties) Block { return OrangeStainedGlassPane{ East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", } } ================================================ FILE: server/world/block/orangeTerracotta.go ================================================ package block type OrangeTerracotta struct { } func (b OrangeTerracotta) Encode() (string, BlockProperties) { return "minecraft:orange_terracotta", BlockProperties{} } func (b OrangeTerracotta) New(props BlockProperties) Block { return OrangeTerracotta{} } ================================================ FILE: server/world/block/orangeTulip.go ================================================ package block type OrangeTulip struct { } func (b OrangeTulip) Encode() (string, BlockProperties) { return "minecraft:orange_tulip", BlockProperties{} } func (b OrangeTulip) New(props BlockProperties) Block { return OrangeTulip{} } ================================================ FILE: server/world/block/orangeWallBanner.go ================================================ package block type OrangeWallBanner struct { Facing string } func (b OrangeWallBanner) Encode() (string, BlockProperties) { return "minecraft:orange_wall_banner", BlockProperties{ "facing": b.Facing, } } func (b OrangeWallBanner) New(props BlockProperties) Block { return OrangeWallBanner{ Facing: props["facing"], } } ================================================ FILE: server/world/block/orangeWool.go ================================================ package block type OrangeWool struct { } func (b OrangeWool) Encode() (string, BlockProperties) { return "minecraft:orange_wool", BlockProperties{} } func (b OrangeWool) New(props BlockProperties) Block { return OrangeWool{} } ================================================ FILE: server/world/block/oxeyeDaisy.go ================================================ package block type OxeyeDaisy struct { } func (b OxeyeDaisy) Encode() (string, BlockProperties) { return "minecraft:oxeye_daisy", BlockProperties{} } func (b OxeyeDaisy) New(props BlockProperties) Block { return OxeyeDaisy{} } ================================================ FILE: server/world/block/oxidizedChiseledCopper.go ================================================ package block type OxidizedChiseledCopper struct { } func (b OxidizedChiseledCopper) Encode() (string, BlockProperties) { return "minecraft:oxidized_chiseled_copper", BlockProperties{} } func (b OxidizedChiseledCopper) New(props BlockProperties) Block { return OxidizedChiseledCopper{} } ================================================ FILE: server/world/block/oxidizedCopper.go ================================================ package block type OxidizedCopper struct { } func (b OxidizedCopper) Encode() (string, BlockProperties) { return "minecraft:oxidized_copper", BlockProperties{} } func (b OxidizedCopper) New(props BlockProperties) Block { return OxidizedCopper{} } ================================================ FILE: server/world/block/oxidizedCopperBulb.go ================================================ package block import ( "strconv" ) type OxidizedCopperBulb struct { Lit bool Powered bool } func (b OxidizedCopperBulb) Encode() (string, BlockProperties) { return "minecraft:oxidized_copper_bulb", BlockProperties{ "lit": strconv.FormatBool(b.Lit), "powered": strconv.FormatBool(b.Powered), } } func (b OxidizedCopperBulb) New(props BlockProperties) Block { return OxidizedCopperBulb{ Powered: props["powered"] != "false", Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/oxidizedCopperDoor.go ================================================ package block import ( "strconv" ) type OxidizedCopperDoor struct { Powered bool Facing string Half string Hinge string Open bool } func (b OxidizedCopperDoor) Encode() (string, BlockProperties) { return "minecraft:oxidized_copper_door", BlockProperties{ "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, "half": b.Half, "hinge": b.Hinge, } } func (b OxidizedCopperDoor) New(props BlockProperties) Block { return OxidizedCopperDoor{ Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], Half: props["half"], Hinge: props["hinge"], } } ================================================ FILE: server/world/block/oxidizedCopperGrate.go ================================================ package block import ( "strconv" ) type OxidizedCopperGrate struct { Waterlogged bool } func (b OxidizedCopperGrate) Encode() (string, BlockProperties) { return "minecraft:oxidized_copper_grate", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b OxidizedCopperGrate) New(props BlockProperties) Block { return OxidizedCopperGrate{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/oxidizedCopperTrapdoor.go ================================================ package block import ( "strconv" ) type OxidizedCopperTrapdoor struct { Facing string Half string Open bool Powered bool Waterlogged bool } func (b OxidizedCopperTrapdoor) Encode() (string, BlockProperties) { return "minecraft:oxidized_copper_trapdoor", BlockProperties{ "facing": b.Facing, "half": b.Half, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b OxidizedCopperTrapdoor) New(props BlockProperties) Block { return OxidizedCopperTrapdoor{ Open: props["open"] != "false", Powered: props["powered"] != "false", Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/oxidizedCutCopper.go ================================================ package block type OxidizedCutCopper struct { } func (b OxidizedCutCopper) Encode() (string, BlockProperties) { return "minecraft:oxidized_cut_copper", BlockProperties{} } func (b OxidizedCutCopper) New(props BlockProperties) Block { return OxidizedCutCopper{} } ================================================ FILE: server/world/block/oxidizedCutCopperSlab.go ================================================ package block import ( "strconv" ) type OxidizedCutCopperSlab struct { Type string Waterlogged bool } func (b OxidizedCutCopperSlab) Encode() (string, BlockProperties) { return "minecraft:oxidized_cut_copper_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b OxidizedCutCopperSlab) New(props BlockProperties) Block { return OxidizedCutCopperSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/oxidizedCutCopperStairs.go ================================================ package block import ( "strconv" ) type OxidizedCutCopperStairs struct { Half string Shape string Waterlogged bool Facing string } func (b OxidizedCutCopperStairs) Encode() (string, BlockProperties) { return "minecraft:oxidized_cut_copper_stairs", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, "shape": b.Shape, } } func (b OxidizedCutCopperStairs) New(props BlockProperties) Block { return OxidizedCutCopperStairs{ Facing: props["facing"], Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/packedIce.go ================================================ package block type PackedIce struct { } func (b PackedIce) Encode() (string, BlockProperties) { return "minecraft:packed_ice", BlockProperties{} } func (b PackedIce) New(props BlockProperties) Block { return PackedIce{} } ================================================ FILE: server/world/block/packedMud.go ================================================ package block type PackedMud struct { } func (b PackedMud) Encode() (string, BlockProperties) { return "minecraft:packed_mud", BlockProperties{} } func (b PackedMud) New(props BlockProperties) Block { return PackedMud{} } ================================================ FILE: server/world/block/pearlescentFroglight.go ================================================ package block type PearlescentFroglight struct { Axis string } func (b PearlescentFroglight) Encode() (string, BlockProperties) { return "minecraft:pearlescent_froglight", BlockProperties{ "axis": b.Axis, } } func (b PearlescentFroglight) New(props BlockProperties) Block { return PearlescentFroglight{ Axis: props["axis"], } } ================================================ FILE: server/world/block/peony.go ================================================ package block type Peony struct { Half string } func (b Peony) Encode() (string, BlockProperties) { return "minecraft:peony", BlockProperties{ "half": b.Half, } } func (b Peony) New(props BlockProperties) Block { return Peony{ Half: props["half"], } } ================================================ FILE: server/world/block/petrifiedOakSlab.go ================================================ package block import ( "strconv" ) type PetrifiedOakSlab struct { Type string Waterlogged bool } func (b PetrifiedOakSlab) Encode() (string, BlockProperties) { return "minecraft:petrified_oak_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b PetrifiedOakSlab) New(props BlockProperties) Block { return PetrifiedOakSlab{ Waterlogged: props["waterlogged"] != "false", Type: props["type"], } } ================================================ FILE: server/world/block/piglinHead.go ================================================ package block import ( "strconv" ) type PiglinHead struct { Powered bool Rotation int } func (b PiglinHead) Encode() (string, BlockProperties) { return "minecraft:piglin_head", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "rotation": strconv.Itoa(b.Rotation), } } func (b PiglinHead) New(props BlockProperties) Block { return PiglinHead{ Powered: props["powered"] != "false", Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/piglinWallHead.go ================================================ package block import ( "strconv" ) type PiglinWallHead struct { Facing string Powered bool } func (b PiglinWallHead) Encode() (string, BlockProperties) { return "minecraft:piglin_wall_head", BlockProperties{ "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), } } func (b PiglinWallHead) New(props BlockProperties) Block { return PiglinWallHead{ Powered: props["powered"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/pinkBanner.go ================================================ package block import ( "strconv" ) type PinkBanner struct { Rotation int } func (b PinkBanner) Encode() (string, BlockProperties) { return "minecraft:pink_banner", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), } } func (b PinkBanner) New(props BlockProperties) Block { return PinkBanner{ Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/pinkBed.go ================================================ package block import ( "strconv" ) type PinkBed struct { Facing string Occupied bool Part string } func (b PinkBed) Encode() (string, BlockProperties) { return "minecraft:pink_bed", BlockProperties{ "occupied": strconv.FormatBool(b.Occupied), "part": b.Part, "facing": b.Facing, } } func (b PinkBed) New(props BlockProperties) Block { return PinkBed{ Part: props["part"], Facing: props["facing"], Occupied: props["occupied"] != "false", } } ================================================ FILE: server/world/block/pinkCandle.go ================================================ package block import ( "strconv" ) type PinkCandle struct { Candles int Lit bool Waterlogged bool } func (b PinkCandle) Encode() (string, BlockProperties) { return "minecraft:pink_candle", BlockProperties{ "candles": strconv.Itoa(b.Candles), "lit": strconv.FormatBool(b.Lit), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b PinkCandle) New(props BlockProperties) Block { return PinkCandle{ Lit: props["lit"] != "false", Waterlogged: props["waterlogged"] != "false", Candles: atoi(props["candles"]), } } ================================================ FILE: server/world/block/pinkCandleCake.go ================================================ package block import ( "strconv" ) type PinkCandleCake struct { Lit bool } func (b PinkCandleCake) Encode() (string, BlockProperties) { return "minecraft:pink_candle_cake", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b PinkCandleCake) New(props BlockProperties) Block { return PinkCandleCake{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/pinkCarpet.go ================================================ package block type PinkCarpet struct { } func (b PinkCarpet) Encode() (string, BlockProperties) { return "minecraft:pink_carpet", BlockProperties{} } func (b PinkCarpet) New(props BlockProperties) Block { return PinkCarpet{} } ================================================ FILE: server/world/block/pinkConcrete.go ================================================ package block type PinkConcrete struct { } func (b PinkConcrete) Encode() (string, BlockProperties) { return "minecraft:pink_concrete", BlockProperties{} } func (b PinkConcrete) New(props BlockProperties) Block { return PinkConcrete{} } ================================================ FILE: server/world/block/pinkConcretePowder.go ================================================ package block type PinkConcretePowder struct { } func (b PinkConcretePowder) Encode() (string, BlockProperties) { return "minecraft:pink_concrete_powder", BlockProperties{} } func (b PinkConcretePowder) New(props BlockProperties) Block { return PinkConcretePowder{} } ================================================ FILE: server/world/block/pinkGlazedTerracotta.go ================================================ package block type PinkGlazedTerracotta struct { Facing string } func (b PinkGlazedTerracotta) Encode() (string, BlockProperties) { return "minecraft:pink_glazed_terracotta", BlockProperties{ "facing": b.Facing, } } func (b PinkGlazedTerracotta) New(props BlockProperties) Block { return PinkGlazedTerracotta{ Facing: props["facing"], } } ================================================ FILE: server/world/block/pinkPetals.go ================================================ package block import ( "strconv" ) type PinkPetals struct { Facing string FlowerAmount int } func (b PinkPetals) Encode() (string, BlockProperties) { return "minecraft:pink_petals", BlockProperties{ "facing": b.Facing, "flower_amount": strconv.Itoa(b.FlowerAmount), } } func (b PinkPetals) New(props BlockProperties) Block { return PinkPetals{ Facing: props["facing"], FlowerAmount: atoi(props["flower_amount"]), } } ================================================ FILE: server/world/block/pinkShulkerBox.go ================================================ package block type PinkShulkerBox struct { Facing string } func (b PinkShulkerBox) Encode() (string, BlockProperties) { return "minecraft:pink_shulker_box", BlockProperties{ "facing": b.Facing, } } func (b PinkShulkerBox) New(props BlockProperties) Block { return PinkShulkerBox{ Facing: props["facing"], } } ================================================ FILE: server/world/block/pinkStainedGlass.go ================================================ package block type PinkStainedGlass struct { } func (b PinkStainedGlass) Encode() (string, BlockProperties) { return "minecraft:pink_stained_glass", BlockProperties{} } func (b PinkStainedGlass) New(props BlockProperties) Block { return PinkStainedGlass{} } ================================================ FILE: server/world/block/pinkStainedGlassPane.go ================================================ package block import ( "strconv" ) type PinkStainedGlassPane struct { West bool East bool North bool South bool Waterlogged bool } func (b PinkStainedGlassPane) Encode() (string, BlockProperties) { return "minecraft:pink_stained_glass_pane", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), } } func (b PinkStainedGlassPane) New(props BlockProperties) Block { return PinkStainedGlassPane{ South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", } } ================================================ FILE: server/world/block/pinkTerracotta.go ================================================ package block type PinkTerracotta struct { } func (b PinkTerracotta) Encode() (string, BlockProperties) { return "minecraft:pink_terracotta", BlockProperties{} } func (b PinkTerracotta) New(props BlockProperties) Block { return PinkTerracotta{} } ================================================ FILE: server/world/block/pinkTulip.go ================================================ package block type PinkTulip struct { } func (b PinkTulip) Encode() (string, BlockProperties) { return "minecraft:pink_tulip", BlockProperties{} } func (b PinkTulip) New(props BlockProperties) Block { return PinkTulip{} } ================================================ FILE: server/world/block/pinkWallBanner.go ================================================ package block type PinkWallBanner struct { Facing string } func (b PinkWallBanner) Encode() (string, BlockProperties) { return "minecraft:pink_wall_banner", BlockProperties{ "facing": b.Facing, } } func (b PinkWallBanner) New(props BlockProperties) Block { return PinkWallBanner{ Facing: props["facing"], } } ================================================ FILE: server/world/block/pinkWool.go ================================================ package block type PinkWool struct { } func (b PinkWool) Encode() (string, BlockProperties) { return "minecraft:pink_wool", BlockProperties{} } func (b PinkWool) New(props BlockProperties) Block { return PinkWool{} } ================================================ FILE: server/world/block/piston.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Piston struct { Extended bool Facing string } func (b Piston) Encode() (string, BlockProperties) { return "minecraft:piston", BlockProperties{ "extended": strconv.FormatBool(b.Extended), "facing": b.Facing, } } func (b Piston) New(props BlockProperties) Block { return Piston{ Extended: props["extended"] != "false", Facing: props["facing"], } } func (b Piston) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:piston", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/pistonHead.go ================================================ package block import ( "strconv" ) type PistonHead struct { Facing string Short bool Type string } func (b PistonHead) Encode() (string, BlockProperties) { return "minecraft:piston_head", BlockProperties{ "facing": b.Facing, "short": strconv.FormatBool(b.Short), "type": b.Type, } } func (b PistonHead) New(props BlockProperties) Block { return PistonHead{ Type: props["type"], Facing: props["facing"], Short: props["short"] != "false", } } ================================================ FILE: server/world/block/pitcherCrop.go ================================================ package block import ( "strconv" ) type PitcherCrop struct { Half string Age int } func (b PitcherCrop) Encode() (string, BlockProperties) { return "minecraft:pitcher_crop", BlockProperties{ "half": b.Half, "age": strconv.Itoa(b.Age), } } func (b PitcherCrop) New(props BlockProperties) Block { return PitcherCrop{ Half: props["half"], Age: atoi(props["age"]), } } ================================================ FILE: server/world/block/pitcherPlant.go ================================================ package block type PitcherPlant struct { Half string } func (b PitcherPlant) Encode() (string, BlockProperties) { return "minecraft:pitcher_plant", BlockProperties{ "half": b.Half, } } func (b PitcherPlant) New(props BlockProperties) Block { return PitcherPlant{ Half: props["half"], } } ================================================ FILE: server/world/block/playerHead.go ================================================ package block import ( "strconv" ) type PlayerHead struct { Powered bool Rotation int } func (b PlayerHead) Encode() (string, BlockProperties) { return "minecraft:player_head", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "rotation": strconv.Itoa(b.Rotation), } } func (b PlayerHead) New(props BlockProperties) Block { return PlayerHead{ Powered: props["powered"] != "false", Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/playerWallHead.go ================================================ package block import ( "strconv" ) type PlayerWallHead struct { Powered bool Facing string } func (b PlayerWallHead) Encode() (string, BlockProperties) { return "minecraft:player_wall_head", BlockProperties{ "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), } } func (b PlayerWallHead) New(props BlockProperties) Block { return PlayerWallHead{ Facing: props["facing"], Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/podzol.go ================================================ package block import ( "strconv" ) type Podzol struct { Snowy bool } func (b Podzol) Encode() (string, BlockProperties) { return "minecraft:podzol", BlockProperties{ "snowy": strconv.FormatBool(b.Snowy), } } func (b Podzol) New(props BlockProperties) Block { return Podzol{ Snowy: props["snowy"] != "false", } } ================================================ FILE: server/world/block/pointedDripstone.go ================================================ package block import ( "strconv" ) type PointedDripstone struct { VerticalDirection string Waterlogged bool Thickness string } func (b PointedDripstone) Encode() (string, BlockProperties) { return "minecraft:pointed_dripstone", BlockProperties{ "thickness": b.Thickness, "vertical_direction": b.VerticalDirection, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b PointedDripstone) New(props BlockProperties) Block { return PointedDripstone{ VerticalDirection: props["vertical_direction"], Waterlogged: props["waterlogged"] != "false", Thickness: props["thickness"], } } ================================================ FILE: server/world/block/polishedAndesite.go ================================================ package block type PolishedAndesite struct { } func (b PolishedAndesite) Encode() (string, BlockProperties) { return "minecraft:polished_andesite", BlockProperties{} } func (b PolishedAndesite) New(props BlockProperties) Block { return PolishedAndesite{} } ================================================ FILE: server/world/block/polishedAndesiteSlab.go ================================================ package block import ( "strconv" ) type PolishedAndesiteSlab struct { Type string Waterlogged bool } func (b PolishedAndesiteSlab) Encode() (string, BlockProperties) { return "minecraft:polished_andesite_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b PolishedAndesiteSlab) New(props BlockProperties) Block { return PolishedAndesiteSlab{ Waterlogged: props["waterlogged"] != "false", Type: props["type"], } } ================================================ FILE: server/world/block/polishedAndesiteStairs.go ================================================ package block import ( "strconv" ) type PolishedAndesiteStairs struct { Waterlogged bool Facing string Half string Shape string } func (b PolishedAndesiteStairs) Encode() (string, BlockProperties) { return "minecraft:polished_andesite_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b PolishedAndesiteStairs) New(props BlockProperties) Block { return PolishedAndesiteStairs{ Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/polishedBasalt.go ================================================ package block type PolishedBasalt struct { Axis string } func (b PolishedBasalt) Encode() (string, BlockProperties) { return "minecraft:polished_basalt", BlockProperties{ "axis": b.Axis, } } func (b PolishedBasalt) New(props BlockProperties) Block { return PolishedBasalt{ Axis: props["axis"], } } ================================================ FILE: server/world/block/polishedBlackstone.go ================================================ package block type PolishedBlackstone struct { } func (b PolishedBlackstone) Encode() (string, BlockProperties) { return "minecraft:polished_blackstone", BlockProperties{} } func (b PolishedBlackstone) New(props BlockProperties) Block { return PolishedBlackstone{} } ================================================ FILE: server/world/block/polishedBlackstoneBrickSlab.go ================================================ package block import ( "strconv" ) type PolishedBlackstoneBrickSlab struct { Type string Waterlogged bool } func (b PolishedBlackstoneBrickSlab) Encode() (string, BlockProperties) { return "minecraft:polished_blackstone_brick_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b PolishedBlackstoneBrickSlab) New(props BlockProperties) Block { return PolishedBlackstoneBrickSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/polishedBlackstoneBrickStairs.go ================================================ package block import ( "strconv" ) type PolishedBlackstoneBrickStairs struct { Half string Shape string Waterlogged bool Facing string } func (b PolishedBlackstoneBrickStairs) Encode() (string, BlockProperties) { return "minecraft:polished_blackstone_brick_stairs", BlockProperties{ "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b PolishedBlackstoneBrickStairs) New(props BlockProperties) Block { return PolishedBlackstoneBrickStairs{ Facing: props["facing"], Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/polishedBlackstoneBrickWall.go ================================================ package block import ( "strconv" ) type PolishedBlackstoneBrickWall struct { Waterlogged bool West string East string North string South string Up bool } func (b PolishedBlackstoneBrickWall) Encode() (string, BlockProperties) { return "minecraft:polished_blackstone_brick_wall", BlockProperties{ "east": b.East, "north": b.North, "south": b.South, "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, } } func (b PolishedBlackstoneBrickWall) New(props BlockProperties) Block { return PolishedBlackstoneBrickWall{ South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], East: props["east"], North: props["north"], } } ================================================ FILE: server/world/block/polishedBlackstoneBricks.go ================================================ package block type PolishedBlackstoneBricks struct { } func (b PolishedBlackstoneBricks) Encode() (string, BlockProperties) { return "minecraft:polished_blackstone_bricks", BlockProperties{} } func (b PolishedBlackstoneBricks) New(props BlockProperties) Block { return PolishedBlackstoneBricks{} } ================================================ FILE: server/world/block/polishedBlackstoneButton.go ================================================ package block import ( "strconv" ) type PolishedBlackstoneButton struct { Face string Facing string Powered bool } func (b PolishedBlackstoneButton) Encode() (string, BlockProperties) { return "minecraft:polished_blackstone_button", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "face": b.Face, "facing": b.Facing, } } func (b PolishedBlackstoneButton) New(props BlockProperties) Block { return PolishedBlackstoneButton{ Face: props["face"], Facing: props["facing"], Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/polishedBlackstonePressurePlate.go ================================================ package block import ( "strconv" ) type PolishedBlackstonePressurePlate struct { Powered bool } func (b PolishedBlackstonePressurePlate) Encode() (string, BlockProperties) { return "minecraft:polished_blackstone_pressure_plate", BlockProperties{ "powered": strconv.FormatBool(b.Powered), } } func (b PolishedBlackstonePressurePlate) New(props BlockProperties) Block { return PolishedBlackstonePressurePlate{ Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/polishedBlackstoneSlab.go ================================================ package block import ( "strconv" ) type PolishedBlackstoneSlab struct { Type string Waterlogged bool } func (b PolishedBlackstoneSlab) Encode() (string, BlockProperties) { return "minecraft:polished_blackstone_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b PolishedBlackstoneSlab) New(props BlockProperties) Block { return PolishedBlackstoneSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/polishedBlackstoneStairs.go ================================================ package block import ( "strconv" ) type PolishedBlackstoneStairs struct { Half string Shape string Waterlogged bool Facing string } func (b PolishedBlackstoneStairs) Encode() (string, BlockProperties) { return "minecraft:polished_blackstone_stairs", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, "shape": b.Shape, } } func (b PolishedBlackstoneStairs) New(props BlockProperties) Block { return PolishedBlackstoneStairs{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Shape: props["shape"], } } ================================================ FILE: server/world/block/polishedBlackstoneWall.go ================================================ package block import ( "strconv" ) type PolishedBlackstoneWall struct { Up bool Waterlogged bool West string East string North string South string } func (b PolishedBlackstoneWall) Encode() (string, BlockProperties) { return "minecraft:polished_blackstone_wall", BlockProperties{ "south": b.South, "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, "north": b.North, } } func (b PolishedBlackstoneWall) New(props BlockProperties) Block { return PolishedBlackstoneWall{ North: props["north"], South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], East: props["east"], } } ================================================ FILE: server/world/block/polishedDeepslate.go ================================================ package block type PolishedDeepslate struct { } func (b PolishedDeepslate) Encode() (string, BlockProperties) { return "minecraft:polished_deepslate", BlockProperties{} } func (b PolishedDeepslate) New(props BlockProperties) Block { return PolishedDeepslate{} } ================================================ FILE: server/world/block/polishedDeepslateSlab.go ================================================ package block import ( "strconv" ) type PolishedDeepslateSlab struct { Waterlogged bool Type string } func (b PolishedDeepslateSlab) Encode() (string, BlockProperties) { return "minecraft:polished_deepslate_slab", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "type": b.Type, } } func (b PolishedDeepslateSlab) New(props BlockProperties) Block { return PolishedDeepslateSlab{ Waterlogged: props["waterlogged"] != "false", Type: props["type"], } } ================================================ FILE: server/world/block/polishedDeepslateStairs.go ================================================ package block import ( "strconv" ) type PolishedDeepslateStairs struct { Waterlogged bool Facing string Half string Shape string } func (b PolishedDeepslateStairs) Encode() (string, BlockProperties) { return "minecraft:polished_deepslate_stairs", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, "shape": b.Shape, } } func (b PolishedDeepslateStairs) New(props BlockProperties) Block { return PolishedDeepslateStairs{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Shape: props["shape"], } } ================================================ FILE: server/world/block/polishedDeepslateWall.go ================================================ package block import ( "strconv" ) type PolishedDeepslateWall struct { East string North string South string Up bool Waterlogged bool West string } func (b PolishedDeepslateWall) Encode() (string, BlockProperties) { return "minecraft:polished_deepslate_wall", BlockProperties{ "north": b.North, "south": b.South, "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, } } func (b PolishedDeepslateWall) New(props BlockProperties) Block { return PolishedDeepslateWall{ East: props["east"], North: props["north"], South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], } } ================================================ FILE: server/world/block/polishedDiorite.go ================================================ package block type PolishedDiorite struct { } func (b PolishedDiorite) Encode() (string, BlockProperties) { return "minecraft:polished_diorite", BlockProperties{} } func (b PolishedDiorite) New(props BlockProperties) Block { return PolishedDiorite{} } ================================================ FILE: server/world/block/polishedDioriteSlab.go ================================================ package block import ( "strconv" ) type PolishedDioriteSlab struct { Type string Waterlogged bool } func (b PolishedDioriteSlab) Encode() (string, BlockProperties) { return "minecraft:polished_diorite_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b PolishedDioriteSlab) New(props BlockProperties) Block { return PolishedDioriteSlab{ Waterlogged: props["waterlogged"] != "false", Type: props["type"], } } ================================================ FILE: server/world/block/polishedDioriteStairs.go ================================================ package block import ( "strconv" ) type PolishedDioriteStairs struct { Facing string Half string Shape string Waterlogged bool } func (b PolishedDioriteStairs) Encode() (string, BlockProperties) { return "minecraft:polished_diorite_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b PolishedDioriteStairs) New(props BlockProperties) Block { return PolishedDioriteStairs{ Facing: props["facing"], Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/polishedGranite.go ================================================ package block type PolishedGranite struct { } func (b PolishedGranite) Encode() (string, BlockProperties) { return "minecraft:polished_granite", BlockProperties{} } func (b PolishedGranite) New(props BlockProperties) Block { return PolishedGranite{} } ================================================ FILE: server/world/block/polishedGraniteSlab.go ================================================ package block import ( "strconv" ) type PolishedGraniteSlab struct { Type string Waterlogged bool } func (b PolishedGraniteSlab) Encode() (string, BlockProperties) { return "minecraft:polished_granite_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b PolishedGraniteSlab) New(props BlockProperties) Block { return PolishedGraniteSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/polishedGraniteStairs.go ================================================ package block import ( "strconv" ) type PolishedGraniteStairs struct { Facing string Half string Shape string Waterlogged bool } func (b PolishedGraniteStairs) Encode() (string, BlockProperties) { return "minecraft:polished_granite_stairs", BlockProperties{ "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b PolishedGraniteStairs) New(props BlockProperties) Block { return PolishedGraniteStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/polishedTuff.go ================================================ package block type PolishedTuff struct { } func (b PolishedTuff) Encode() (string, BlockProperties) { return "minecraft:polished_tuff", BlockProperties{} } func (b PolishedTuff) New(props BlockProperties) Block { return PolishedTuff{} } ================================================ FILE: server/world/block/polishedTuffSlab.go ================================================ package block import ( "strconv" ) type PolishedTuffSlab struct { Type string Waterlogged bool } func (b PolishedTuffSlab) Encode() (string, BlockProperties) { return "minecraft:polished_tuff_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b PolishedTuffSlab) New(props BlockProperties) Block { return PolishedTuffSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/polishedTuffStairs.go ================================================ package block import ( "strconv" ) type PolishedTuffStairs struct { Shape string Waterlogged bool Facing string Half string } func (b PolishedTuffStairs) Encode() (string, BlockProperties) { return "minecraft:polished_tuff_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b PolishedTuffStairs) New(props BlockProperties) Block { return PolishedTuffStairs{ Facing: props["facing"], Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/polishedTuffWall.go ================================================ package block import ( "strconv" ) type PolishedTuffWall struct { East string North string South string Up bool Waterlogged bool West string } func (b PolishedTuffWall) Encode() (string, BlockProperties) { return "minecraft:polished_tuff_wall", BlockProperties{ "east": b.East, "north": b.North, "south": b.South, "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, } } func (b PolishedTuffWall) New(props BlockProperties) Block { return PolishedTuffWall{ East: props["east"], North: props["north"], South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], } } ================================================ FILE: server/world/block/poppy.go ================================================ package block type Poppy struct { } func (b Poppy) Encode() (string, BlockProperties) { return "minecraft:poppy", BlockProperties{} } func (b Poppy) New(props BlockProperties) Block { return Poppy{} } ================================================ FILE: server/world/block/pos/pos.go ================================================ package pos func New(x, y, z int32) BlockPosition { return BlockPosition{x, y, z} } type BlockPosition [3]int32 // returns the absolute x position of the block in the world func (b BlockPosition) X() int32 { return b[0] } // returns the absolute y position of the block in the world func (b BlockPosition) Y() int32 { return b[1] } // returns the absolute z position of the block in the world func (b BlockPosition) Z() int32 { return b[2] } // returns the chunk position x of this block func (b BlockPosition) ChunkX() int32 { return b[0] >> 4 } // returns the chunk position y of this block func (b BlockPosition) Section() int32 { return b[1] >> 4 } // returns the chunk position z of this block func (b BlockPosition) ChunkZ() int32 { return b[2] >> 4 } // returns the relative x position of the block in its section func (b BlockPosition) SectionX() int32 { return b[0] & 0x0f } // returns the relative y position of the block in its section func (b BlockPosition) SectionY() int32 { return b[1] & 0x0f } // returns the relative z position of the block in its section func (b BlockPosition) SectionZ() int32 { return b[2] & 0x0f } func (b BlockPosition) Add(b1 BlockPosition) BlockPosition { return BlockPosition{ b[0] + b1[0], b[1] + b1[1], b[2] + b1[2], } } func (b BlockPosition) Sub(b1 BlockPosition) BlockPosition { return BlockPosition{ b[0] - b1[0], b[1] - b1[1], b[2] - b1[2], } } ================================================ FILE: server/world/block/potatoes.go ================================================ package block import ( "strconv" ) type Potatoes struct { Age int } func (b Potatoes) Encode() (string, BlockProperties) { return "minecraft:potatoes", BlockProperties{ "age": strconv.Itoa(b.Age), } } func (b Potatoes) New(props BlockProperties) Block { return Potatoes{ Age: atoi(props["age"]), } } ================================================ FILE: server/world/block/pottedAcaciaSapling.go ================================================ package block type PottedAcaciaSapling struct { } func (b PottedAcaciaSapling) Encode() (string, BlockProperties) { return "minecraft:potted_acacia_sapling", BlockProperties{} } func (b PottedAcaciaSapling) New(props BlockProperties) Block { return PottedAcaciaSapling{} } ================================================ FILE: server/world/block/pottedAllium.go ================================================ package block type PottedAllium struct { } func (b PottedAllium) Encode() (string, BlockProperties) { return "minecraft:potted_allium", BlockProperties{} } func (b PottedAllium) New(props BlockProperties) Block { return PottedAllium{} } ================================================ FILE: server/world/block/pottedAzaleaBush.go ================================================ package block type PottedAzaleaBush struct { } func (b PottedAzaleaBush) Encode() (string, BlockProperties) { return "minecraft:potted_azalea_bush", BlockProperties{} } func (b PottedAzaleaBush) New(props BlockProperties) Block { return PottedAzaleaBush{} } ================================================ FILE: server/world/block/pottedAzureBluet.go ================================================ package block type PottedAzureBluet struct { } func (b PottedAzureBluet) Encode() (string, BlockProperties) { return "minecraft:potted_azure_bluet", BlockProperties{} } func (b PottedAzureBluet) New(props BlockProperties) Block { return PottedAzureBluet{} } ================================================ FILE: server/world/block/pottedBamboo.go ================================================ package block type PottedBamboo struct { } func (b PottedBamboo) Encode() (string, BlockProperties) { return "minecraft:potted_bamboo", BlockProperties{} } func (b PottedBamboo) New(props BlockProperties) Block { return PottedBamboo{} } ================================================ FILE: server/world/block/pottedBirchSapling.go ================================================ package block type PottedBirchSapling struct { } func (b PottedBirchSapling) Encode() (string, BlockProperties) { return "minecraft:potted_birch_sapling", BlockProperties{} } func (b PottedBirchSapling) New(props BlockProperties) Block { return PottedBirchSapling{} } ================================================ FILE: server/world/block/pottedBlueOrchid.go ================================================ package block type PottedBlueOrchid struct { } func (b PottedBlueOrchid) Encode() (string, BlockProperties) { return "minecraft:potted_blue_orchid", BlockProperties{} } func (b PottedBlueOrchid) New(props BlockProperties) Block { return PottedBlueOrchid{} } ================================================ FILE: server/world/block/pottedBrownMushroom.go ================================================ package block type PottedBrownMushroom struct { } func (b PottedBrownMushroom) Encode() (string, BlockProperties) { return "minecraft:potted_brown_mushroom", BlockProperties{} } func (b PottedBrownMushroom) New(props BlockProperties) Block { return PottedBrownMushroom{} } ================================================ FILE: server/world/block/pottedCactus.go ================================================ package block type PottedCactus struct { } func (b PottedCactus) Encode() (string, BlockProperties) { return "minecraft:potted_cactus", BlockProperties{} } func (b PottedCactus) New(props BlockProperties) Block { return PottedCactus{} } ================================================ FILE: server/world/block/pottedCherrySapling.go ================================================ package block type PottedCherrySapling struct { } func (b PottedCherrySapling) Encode() (string, BlockProperties) { return "minecraft:potted_cherry_sapling", BlockProperties{} } func (b PottedCherrySapling) New(props BlockProperties) Block { return PottedCherrySapling{} } ================================================ FILE: server/world/block/pottedCornflower.go ================================================ package block type PottedCornflower struct { } func (b PottedCornflower) Encode() (string, BlockProperties) { return "minecraft:potted_cornflower", BlockProperties{} } func (b PottedCornflower) New(props BlockProperties) Block { return PottedCornflower{} } ================================================ FILE: server/world/block/pottedCrimsonFungus.go ================================================ package block type PottedCrimsonFungus struct { } func (b PottedCrimsonFungus) Encode() (string, BlockProperties) { return "minecraft:potted_crimson_fungus", BlockProperties{} } func (b PottedCrimsonFungus) New(props BlockProperties) Block { return PottedCrimsonFungus{} } ================================================ FILE: server/world/block/pottedCrimsonRoots.go ================================================ package block type PottedCrimsonRoots struct { } func (b PottedCrimsonRoots) Encode() (string, BlockProperties) { return "minecraft:potted_crimson_roots", BlockProperties{} } func (b PottedCrimsonRoots) New(props BlockProperties) Block { return PottedCrimsonRoots{} } ================================================ FILE: server/world/block/pottedDandelion.go ================================================ package block type PottedDandelion struct { } func (b PottedDandelion) Encode() (string, BlockProperties) { return "minecraft:potted_dandelion", BlockProperties{} } func (b PottedDandelion) New(props BlockProperties) Block { return PottedDandelion{} } ================================================ FILE: server/world/block/pottedDarkOakSapling.go ================================================ package block type PottedDarkOakSapling struct { } func (b PottedDarkOakSapling) Encode() (string, BlockProperties) { return "minecraft:potted_dark_oak_sapling", BlockProperties{} } func (b PottedDarkOakSapling) New(props BlockProperties) Block { return PottedDarkOakSapling{} } ================================================ FILE: server/world/block/pottedDeadBush.go ================================================ package block type PottedDeadBush struct { } func (b PottedDeadBush) Encode() (string, BlockProperties) { return "minecraft:potted_dead_bush", BlockProperties{} } func (b PottedDeadBush) New(props BlockProperties) Block { return PottedDeadBush{} } ================================================ FILE: server/world/block/pottedFern.go ================================================ package block type PottedFern struct { } func (b PottedFern) Encode() (string, BlockProperties) { return "minecraft:potted_fern", BlockProperties{} } func (b PottedFern) New(props BlockProperties) Block { return PottedFern{} } ================================================ FILE: server/world/block/pottedFloweringAzaleaBush.go ================================================ package block type PottedFloweringAzaleaBush struct { } func (b PottedFloweringAzaleaBush) Encode() (string, BlockProperties) { return "minecraft:potted_flowering_azalea_bush", BlockProperties{} } func (b PottedFloweringAzaleaBush) New(props BlockProperties) Block { return PottedFloweringAzaleaBush{} } ================================================ FILE: server/world/block/pottedJungleSapling.go ================================================ package block type PottedJungleSapling struct { } func (b PottedJungleSapling) Encode() (string, BlockProperties) { return "minecraft:potted_jungle_sapling", BlockProperties{} } func (b PottedJungleSapling) New(props BlockProperties) Block { return PottedJungleSapling{} } ================================================ FILE: server/world/block/pottedLilyOfTheValley.go ================================================ package block type PottedLilyOfTheValley struct { } func (b PottedLilyOfTheValley) Encode() (string, BlockProperties) { return "minecraft:potted_lily_of_the_valley", BlockProperties{} } func (b PottedLilyOfTheValley) New(props BlockProperties) Block { return PottedLilyOfTheValley{} } ================================================ FILE: server/world/block/pottedMangrovePropagule.go ================================================ package block type PottedMangrovePropagule struct { } func (b PottedMangrovePropagule) Encode() (string, BlockProperties) { return "minecraft:potted_mangrove_propagule", BlockProperties{} } func (b PottedMangrovePropagule) New(props BlockProperties) Block { return PottedMangrovePropagule{} } ================================================ FILE: server/world/block/pottedOakSapling.go ================================================ package block type PottedOakSapling struct { } func (b PottedOakSapling) Encode() (string, BlockProperties) { return "minecraft:potted_oak_sapling", BlockProperties{} } func (b PottedOakSapling) New(props BlockProperties) Block { return PottedOakSapling{} } ================================================ FILE: server/world/block/pottedOrangeTulip.go ================================================ package block type PottedOrangeTulip struct { } func (b PottedOrangeTulip) Encode() (string, BlockProperties) { return "minecraft:potted_orange_tulip", BlockProperties{} } func (b PottedOrangeTulip) New(props BlockProperties) Block { return PottedOrangeTulip{} } ================================================ FILE: server/world/block/pottedOxeyeDaisy.go ================================================ package block type PottedOxeyeDaisy struct { } func (b PottedOxeyeDaisy) Encode() (string, BlockProperties) { return "minecraft:potted_oxeye_daisy", BlockProperties{} } func (b PottedOxeyeDaisy) New(props BlockProperties) Block { return PottedOxeyeDaisy{} } ================================================ FILE: server/world/block/pottedPinkTulip.go ================================================ package block type PottedPinkTulip struct { } func (b PottedPinkTulip) Encode() (string, BlockProperties) { return "minecraft:potted_pink_tulip", BlockProperties{} } func (b PottedPinkTulip) New(props BlockProperties) Block { return PottedPinkTulip{} } ================================================ FILE: server/world/block/pottedPoppy.go ================================================ package block type PottedPoppy struct { } func (b PottedPoppy) Encode() (string, BlockProperties) { return "minecraft:potted_poppy", BlockProperties{} } func (b PottedPoppy) New(props BlockProperties) Block { return PottedPoppy{} } ================================================ FILE: server/world/block/pottedRedMushroom.go ================================================ package block type PottedRedMushroom struct { } func (b PottedRedMushroom) Encode() (string, BlockProperties) { return "minecraft:potted_red_mushroom", BlockProperties{} } func (b PottedRedMushroom) New(props BlockProperties) Block { return PottedRedMushroom{} } ================================================ FILE: server/world/block/pottedRedTulip.go ================================================ package block type PottedRedTulip struct { } func (b PottedRedTulip) Encode() (string, BlockProperties) { return "minecraft:potted_red_tulip", BlockProperties{} } func (b PottedRedTulip) New(props BlockProperties) Block { return PottedRedTulip{} } ================================================ FILE: server/world/block/pottedSpruceSapling.go ================================================ package block type PottedSpruceSapling struct { } func (b PottedSpruceSapling) Encode() (string, BlockProperties) { return "minecraft:potted_spruce_sapling", BlockProperties{} } func (b PottedSpruceSapling) New(props BlockProperties) Block { return PottedSpruceSapling{} } ================================================ FILE: server/world/block/pottedTorchflower.go ================================================ package block type PottedTorchflower struct { } func (b PottedTorchflower) Encode() (string, BlockProperties) { return "minecraft:potted_torchflower", BlockProperties{} } func (b PottedTorchflower) New(props BlockProperties) Block { return PottedTorchflower{} } ================================================ FILE: server/world/block/pottedWarpedFungus.go ================================================ package block type PottedWarpedFungus struct { } func (b PottedWarpedFungus) Encode() (string, BlockProperties) { return "minecraft:potted_warped_fungus", BlockProperties{} } func (b PottedWarpedFungus) New(props BlockProperties) Block { return PottedWarpedFungus{} } ================================================ FILE: server/world/block/pottedWarpedRoots.go ================================================ package block type PottedWarpedRoots struct { } func (b PottedWarpedRoots) Encode() (string, BlockProperties) { return "minecraft:potted_warped_roots", BlockProperties{} } func (b PottedWarpedRoots) New(props BlockProperties) Block { return PottedWarpedRoots{} } ================================================ FILE: server/world/block/pottedWhiteTulip.go ================================================ package block type PottedWhiteTulip struct { } func (b PottedWhiteTulip) Encode() (string, BlockProperties) { return "minecraft:potted_white_tulip", BlockProperties{} } func (b PottedWhiteTulip) New(props BlockProperties) Block { return PottedWhiteTulip{} } ================================================ FILE: server/world/block/pottedWitherRose.go ================================================ package block type PottedWitherRose struct { } func (b PottedWitherRose) Encode() (string, BlockProperties) { return "minecraft:potted_wither_rose", BlockProperties{} } func (b PottedWitherRose) New(props BlockProperties) Block { return PottedWitherRose{} } ================================================ FILE: server/world/block/powderSnow.go ================================================ package block type PowderSnow struct { } func (b PowderSnow) Encode() (string, BlockProperties) { return "minecraft:powder_snow", BlockProperties{} } func (b PowderSnow) New(props BlockProperties) Block { return PowderSnow{} } ================================================ FILE: server/world/block/powderSnowCauldron.go ================================================ package block import ( "strconv" ) type PowderSnowCauldron struct { Level int } func (b PowderSnowCauldron) Encode() (string, BlockProperties) { return "minecraft:powder_snow_cauldron", BlockProperties{ "level": strconv.Itoa(b.Level), } } func (b PowderSnowCauldron) New(props BlockProperties) Block { return PowderSnowCauldron{ Level: atoi(props["level"]), } } ================================================ FILE: server/world/block/poweredRail.go ================================================ package block import ( "strconv" ) type PoweredRail struct { Powered bool Shape string Waterlogged bool } func (b PoweredRail) Encode() (string, BlockProperties) { return "minecraft:powered_rail", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b PoweredRail) New(props BlockProperties) Block { return PoweredRail{ Powered: props["powered"] != "false", Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/prismarine.go ================================================ package block type Prismarine struct { } func (b Prismarine) Encode() (string, BlockProperties) { return "minecraft:prismarine", BlockProperties{} } func (b Prismarine) New(props BlockProperties) Block { return Prismarine{} } ================================================ FILE: server/world/block/prismarineBrickSlab.go ================================================ package block import ( "strconv" ) type PrismarineBrickSlab struct { Type string Waterlogged bool } func (b PrismarineBrickSlab) Encode() (string, BlockProperties) { return "minecraft:prismarine_brick_slab", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "type": b.Type, } } func (b PrismarineBrickSlab) New(props BlockProperties) Block { return PrismarineBrickSlab{ Waterlogged: props["waterlogged"] != "false", Type: props["type"], } } ================================================ FILE: server/world/block/prismarineBrickStairs.go ================================================ package block import ( "strconv" ) type PrismarineBrickStairs struct { Half string Shape string Waterlogged bool Facing string } func (b PrismarineBrickStairs) Encode() (string, BlockProperties) { return "minecraft:prismarine_brick_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b PrismarineBrickStairs) New(props BlockProperties) Block { return PrismarineBrickStairs{ Facing: props["facing"], Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/prismarineBricks.go ================================================ package block type PrismarineBricks struct { } func (b PrismarineBricks) Encode() (string, BlockProperties) { return "minecraft:prismarine_bricks", BlockProperties{} } func (b PrismarineBricks) New(props BlockProperties) Block { return PrismarineBricks{} } ================================================ FILE: server/world/block/prismarineSlab.go ================================================ package block import ( "strconv" ) type PrismarineSlab struct { Type string Waterlogged bool } func (b PrismarineSlab) Encode() (string, BlockProperties) { return "minecraft:prismarine_slab", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "type": b.Type, } } func (b PrismarineSlab) New(props BlockProperties) Block { return PrismarineSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/prismarineStairs.go ================================================ package block import ( "strconv" ) type PrismarineStairs struct { Shape string Waterlogged bool Facing string Half string } func (b PrismarineStairs) Encode() (string, BlockProperties) { return "minecraft:prismarine_stairs", BlockProperties{ "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, } } func (b PrismarineStairs) New(props BlockProperties) Block { return PrismarineStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/prismarineWall.go ================================================ package block import ( "strconv" ) type PrismarineWall struct { West string East string North string South string Up bool Waterlogged bool } func (b PrismarineWall) Encode() (string, BlockProperties) { return "minecraft:prismarine_wall", BlockProperties{ "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, "north": b.North, "south": b.South, } } func (b PrismarineWall) New(props BlockProperties) Block { return PrismarineWall{ North: props["north"], South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], East: props["east"], } } ================================================ FILE: server/world/block/pumpkin.go ================================================ package block type Pumpkin struct { } func (b Pumpkin) Encode() (string, BlockProperties) { return "minecraft:pumpkin", BlockProperties{} } func (b Pumpkin) New(props BlockProperties) Block { return Pumpkin{} } ================================================ FILE: server/world/block/pumpkinStem.go ================================================ package block import ( "strconv" ) type PumpkinStem struct { Age int } func (b PumpkinStem) Encode() (string, BlockProperties) { return "minecraft:pumpkin_stem", BlockProperties{ "age": strconv.Itoa(b.Age), } } func (b PumpkinStem) New(props BlockProperties) Block { return PumpkinStem{ Age: atoi(props["age"]), } } ================================================ FILE: server/world/block/purpleBanner.go ================================================ package block import ( "strconv" ) type PurpleBanner struct { Rotation int } func (b PurpleBanner) Encode() (string, BlockProperties) { return "minecraft:purple_banner", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), } } func (b PurpleBanner) New(props BlockProperties) Block { return PurpleBanner{ Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/purpleBed.go ================================================ package block import ( "strconv" ) type PurpleBed struct { Facing string Occupied bool Part string } func (b PurpleBed) Encode() (string, BlockProperties) { return "minecraft:purple_bed", BlockProperties{ "facing": b.Facing, "occupied": strconv.FormatBool(b.Occupied), "part": b.Part, } } func (b PurpleBed) New(props BlockProperties) Block { return PurpleBed{ Facing: props["facing"], Occupied: props["occupied"] != "false", Part: props["part"], } } ================================================ FILE: server/world/block/purpleCandle.go ================================================ package block import ( "strconv" ) type PurpleCandle struct { Candles int Lit bool Waterlogged bool } func (b PurpleCandle) Encode() (string, BlockProperties) { return "minecraft:purple_candle", BlockProperties{ "candles": strconv.Itoa(b.Candles), "lit": strconv.FormatBool(b.Lit), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b PurpleCandle) New(props BlockProperties) Block { return PurpleCandle{ Candles: atoi(props["candles"]), Lit: props["lit"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/purpleCandleCake.go ================================================ package block import ( "strconv" ) type PurpleCandleCake struct { Lit bool } func (b PurpleCandleCake) Encode() (string, BlockProperties) { return "minecraft:purple_candle_cake", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b PurpleCandleCake) New(props BlockProperties) Block { return PurpleCandleCake{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/purpleCarpet.go ================================================ package block type PurpleCarpet struct { } func (b PurpleCarpet) Encode() (string, BlockProperties) { return "minecraft:purple_carpet", BlockProperties{} } func (b PurpleCarpet) New(props BlockProperties) Block { return PurpleCarpet{} } ================================================ FILE: server/world/block/purpleConcrete.go ================================================ package block type PurpleConcrete struct { } func (b PurpleConcrete) Encode() (string, BlockProperties) { return "minecraft:purple_concrete", BlockProperties{} } func (b PurpleConcrete) New(props BlockProperties) Block { return PurpleConcrete{} } ================================================ FILE: server/world/block/purpleConcretePowder.go ================================================ package block type PurpleConcretePowder struct { } func (b PurpleConcretePowder) Encode() (string, BlockProperties) { return "minecraft:purple_concrete_powder", BlockProperties{} } func (b PurpleConcretePowder) New(props BlockProperties) Block { return PurpleConcretePowder{} } ================================================ FILE: server/world/block/purpleGlazedTerracotta.go ================================================ package block type PurpleGlazedTerracotta struct { Facing string } func (b PurpleGlazedTerracotta) Encode() (string, BlockProperties) { return "minecraft:purple_glazed_terracotta", BlockProperties{ "facing": b.Facing, } } func (b PurpleGlazedTerracotta) New(props BlockProperties) Block { return PurpleGlazedTerracotta{ Facing: props["facing"], } } ================================================ FILE: server/world/block/purpleShulkerBox.go ================================================ package block type PurpleShulkerBox struct { Facing string } func (b PurpleShulkerBox) Encode() (string, BlockProperties) { return "minecraft:purple_shulker_box", BlockProperties{ "facing": b.Facing, } } func (b PurpleShulkerBox) New(props BlockProperties) Block { return PurpleShulkerBox{ Facing: props["facing"], } } ================================================ FILE: server/world/block/purpleStainedGlass.go ================================================ package block type PurpleStainedGlass struct { } func (b PurpleStainedGlass) Encode() (string, BlockProperties) { return "minecraft:purple_stained_glass", BlockProperties{} } func (b PurpleStainedGlass) New(props BlockProperties) Block { return PurpleStainedGlass{} } ================================================ FILE: server/world/block/purpleStainedGlassPane.go ================================================ package block import ( "strconv" ) type PurpleStainedGlassPane struct { East bool North bool South bool Waterlogged bool West bool } func (b PurpleStainedGlassPane) Encode() (string, BlockProperties) { return "minecraft:purple_stained_glass_pane", BlockProperties{ "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), } } func (b PurpleStainedGlassPane) New(props BlockProperties) Block { return PurpleStainedGlassPane{ South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", } } ================================================ FILE: server/world/block/purpleTerracotta.go ================================================ package block type PurpleTerracotta struct { } func (b PurpleTerracotta) Encode() (string, BlockProperties) { return "minecraft:purple_terracotta", BlockProperties{} } func (b PurpleTerracotta) New(props BlockProperties) Block { return PurpleTerracotta{} } ================================================ FILE: server/world/block/purpleWallBanner.go ================================================ package block type PurpleWallBanner struct { Facing string } func (b PurpleWallBanner) Encode() (string, BlockProperties) { return "minecraft:purple_wall_banner", BlockProperties{ "facing": b.Facing, } } func (b PurpleWallBanner) New(props BlockProperties) Block { return PurpleWallBanner{ Facing: props["facing"], } } ================================================ FILE: server/world/block/purpleWool.go ================================================ package block type PurpleWool struct { } func (b PurpleWool) Encode() (string, BlockProperties) { return "minecraft:purple_wool", BlockProperties{} } func (b PurpleWool) New(props BlockProperties) Block { return PurpleWool{} } ================================================ FILE: server/world/block/purpurBlock.go ================================================ package block type PurpurBlock struct { } func (b PurpurBlock) Encode() (string, BlockProperties) { return "minecraft:purpur_block", BlockProperties{} } func (b PurpurBlock) New(props BlockProperties) Block { return PurpurBlock{} } ================================================ FILE: server/world/block/purpurPillar.go ================================================ package block type PurpurPillar struct { Axis string } func (b PurpurPillar) Encode() (string, BlockProperties) { return "minecraft:purpur_pillar", BlockProperties{ "axis": b.Axis, } } func (b PurpurPillar) New(props BlockProperties) Block { return PurpurPillar{ Axis: props["axis"], } } ================================================ FILE: server/world/block/purpurSlab.go ================================================ package block import ( "strconv" ) type PurpurSlab struct { Waterlogged bool Type string } func (b PurpurSlab) Encode() (string, BlockProperties) { return "minecraft:purpur_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b PurpurSlab) New(props BlockProperties) Block { return PurpurSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/purpurStairs.go ================================================ package block import ( "strconv" ) type PurpurStairs struct { Waterlogged bool Facing string Half string Shape string } func (b PurpurStairs) Encode() (string, BlockProperties) { return "minecraft:purpur_stairs", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, "shape": b.Shape, } } func (b PurpurStairs) New(props BlockProperties) Block { return PurpurStairs{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Shape: props["shape"], } } ================================================ FILE: server/world/block/quartzBlock.go ================================================ package block type QuartzBlock struct { } func (b QuartzBlock) Encode() (string, BlockProperties) { return "minecraft:quartz_block", BlockProperties{} } func (b QuartzBlock) New(props BlockProperties) Block { return QuartzBlock{} } ================================================ FILE: server/world/block/quartzBricks.go ================================================ package block type QuartzBricks struct { } func (b QuartzBricks) Encode() (string, BlockProperties) { return "minecraft:quartz_bricks", BlockProperties{} } func (b QuartzBricks) New(props BlockProperties) Block { return QuartzBricks{} } ================================================ FILE: server/world/block/quartzPillar.go ================================================ package block type QuartzPillar struct { Axis string } func (b QuartzPillar) Encode() (string, BlockProperties) { return "minecraft:quartz_pillar", BlockProperties{ "axis": b.Axis, } } func (b QuartzPillar) New(props BlockProperties) Block { return QuartzPillar{ Axis: props["axis"], } } ================================================ FILE: server/world/block/quartzSlab.go ================================================ package block import ( "strconv" ) type QuartzSlab struct { Type string Waterlogged bool } func (b QuartzSlab) Encode() (string, BlockProperties) { return "minecraft:quartz_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b QuartzSlab) New(props BlockProperties) Block { return QuartzSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/quartzStairs.go ================================================ package block import ( "strconv" ) type QuartzStairs struct { Shape string Waterlogged bool Facing string Half string } func (b QuartzStairs) Encode() (string, BlockProperties) { return "minecraft:quartz_stairs", BlockProperties{ "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, } } func (b QuartzStairs) New(props BlockProperties) Block { return QuartzStairs{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Shape: props["shape"], } } ================================================ FILE: server/world/block/rail.go ================================================ package block import ( "strconv" ) type Rail struct { Shape string Waterlogged bool } func (b Rail) Encode() (string, BlockProperties) { return "minecraft:rail", BlockProperties{ "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b Rail) New(props BlockProperties) Block { return Rail{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/rawCopperBlock.go ================================================ package block type RawCopperBlock struct { } func (b RawCopperBlock) Encode() (string, BlockProperties) { return "minecraft:raw_copper_block", BlockProperties{} } func (b RawCopperBlock) New(props BlockProperties) Block { return RawCopperBlock{} } ================================================ FILE: server/world/block/rawGoldBlock.go ================================================ package block type RawGoldBlock struct { } func (b RawGoldBlock) Encode() (string, BlockProperties) { return "minecraft:raw_gold_block", BlockProperties{} } func (b RawGoldBlock) New(props BlockProperties) Block { return RawGoldBlock{} } ================================================ FILE: server/world/block/rawIronBlock.go ================================================ package block type RawIronBlock struct { } func (b RawIronBlock) Encode() (string, BlockProperties) { return "minecraft:raw_iron_block", BlockProperties{} } func (b RawIronBlock) New(props BlockProperties) Block { return RawIronBlock{} } ================================================ FILE: server/world/block/redBanner.go ================================================ package block import ( "strconv" ) type RedBanner struct { Rotation int } func (b RedBanner) Encode() (string, BlockProperties) { return "minecraft:red_banner", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), } } func (b RedBanner) New(props BlockProperties) Block { return RedBanner{ Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/redBed.go ================================================ package block import ( "strconv" ) type RedBed struct { Part string Facing string Occupied bool } func (b RedBed) Encode() (string, BlockProperties) { return "minecraft:red_bed", BlockProperties{ "part": b.Part, "facing": b.Facing, "occupied": strconv.FormatBool(b.Occupied), } } func (b RedBed) New(props BlockProperties) Block { return RedBed{ Part: props["part"], Facing: props["facing"], Occupied: props["occupied"] != "false", } } ================================================ FILE: server/world/block/redCandle.go ================================================ package block import ( "strconv" ) type RedCandle struct { Lit bool Waterlogged bool Candles int } func (b RedCandle) Encode() (string, BlockProperties) { return "minecraft:red_candle", BlockProperties{ "candles": strconv.Itoa(b.Candles), "lit": strconv.FormatBool(b.Lit), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b RedCandle) New(props BlockProperties) Block { return RedCandle{ Lit: props["lit"] != "false", Waterlogged: props["waterlogged"] != "false", Candles: atoi(props["candles"]), } } ================================================ FILE: server/world/block/redCandleCake.go ================================================ package block import ( "strconv" ) type RedCandleCake struct { Lit bool } func (b RedCandleCake) Encode() (string, BlockProperties) { return "minecraft:red_candle_cake", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b RedCandleCake) New(props BlockProperties) Block { return RedCandleCake{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/redCarpet.go ================================================ package block type RedCarpet struct { } func (b RedCarpet) Encode() (string, BlockProperties) { return "minecraft:red_carpet", BlockProperties{} } func (b RedCarpet) New(props BlockProperties) Block { return RedCarpet{} } ================================================ FILE: server/world/block/redConcrete.go ================================================ package block type RedConcrete struct { } func (b RedConcrete) Encode() (string, BlockProperties) { return "minecraft:red_concrete", BlockProperties{} } func (b RedConcrete) New(props BlockProperties) Block { return RedConcrete{} } ================================================ FILE: server/world/block/redConcretePowder.go ================================================ package block type RedConcretePowder struct { } func (b RedConcretePowder) Encode() (string, BlockProperties) { return "minecraft:red_concrete_powder", BlockProperties{} } func (b RedConcretePowder) New(props BlockProperties) Block { return RedConcretePowder{} } ================================================ FILE: server/world/block/redGlazedTerracotta.go ================================================ package block type RedGlazedTerracotta struct { Facing string } func (b RedGlazedTerracotta) Encode() (string, BlockProperties) { return "minecraft:red_glazed_terracotta", BlockProperties{ "facing": b.Facing, } } func (b RedGlazedTerracotta) New(props BlockProperties) Block { return RedGlazedTerracotta{ Facing: props["facing"], } } ================================================ FILE: server/world/block/redMushroom.go ================================================ package block type RedMushroom struct { } func (b RedMushroom) Encode() (string, BlockProperties) { return "minecraft:red_mushroom", BlockProperties{} } func (b RedMushroom) New(props BlockProperties) Block { return RedMushroom{} } ================================================ FILE: server/world/block/redMushroomBlock.go ================================================ package block import ( "strconv" ) type RedMushroomBlock struct { Down bool East bool North bool South bool Up bool West bool } func (b RedMushroomBlock) Encode() (string, BlockProperties) { return "minecraft:red_mushroom_block", BlockProperties{ "down": strconv.FormatBool(b.Down), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "up": strconv.FormatBool(b.Up), "west": strconv.FormatBool(b.West), } } func (b RedMushroomBlock) New(props BlockProperties) Block { return RedMushroomBlock{ North: props["north"] != "false", South: props["south"] != "false", Up: props["up"] != "false", West: props["west"] != "false", Down: props["down"] != "false", East: props["east"] != "false", } } ================================================ FILE: server/world/block/redNetherBrickSlab.go ================================================ package block import ( "strconv" ) type RedNetherBrickSlab struct { Waterlogged bool Type string } func (b RedNetherBrickSlab) Encode() (string, BlockProperties) { return "minecraft:red_nether_brick_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b RedNetherBrickSlab) New(props BlockProperties) Block { return RedNetherBrickSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/redNetherBrickStairs.go ================================================ package block import ( "strconv" ) type RedNetherBrickStairs struct { Half string Shape string Waterlogged bool Facing string } func (b RedNetherBrickStairs) Encode() (string, BlockProperties) { return "minecraft:red_nether_brick_stairs", BlockProperties{ "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b RedNetherBrickStairs) New(props BlockProperties) Block { return RedNetherBrickStairs{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Shape: props["shape"], } } ================================================ FILE: server/world/block/redNetherBrickWall.go ================================================ package block import ( "strconv" ) type RedNetherBrickWall struct { Waterlogged bool West string East string North string South string Up bool } func (b RedNetherBrickWall) Encode() (string, BlockProperties) { return "minecraft:red_nether_brick_wall", BlockProperties{ "north": b.North, "south": b.South, "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, } } func (b RedNetherBrickWall) New(props BlockProperties) Block { return RedNetherBrickWall{ North: props["north"], South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], East: props["east"], } } ================================================ FILE: server/world/block/redNetherBricks.go ================================================ package block type RedNetherBricks struct { } func (b RedNetherBricks) Encode() (string, BlockProperties) { return "minecraft:red_nether_bricks", BlockProperties{} } func (b RedNetherBricks) New(props BlockProperties) Block { return RedNetherBricks{} } ================================================ FILE: server/world/block/redSand.go ================================================ package block type RedSand struct { } func (b RedSand) Encode() (string, BlockProperties) { return "minecraft:red_sand", BlockProperties{} } func (b RedSand) New(props BlockProperties) Block { return RedSand{} } ================================================ FILE: server/world/block/redSandstone.go ================================================ package block type RedSandstone struct { } func (b RedSandstone) Encode() (string, BlockProperties) { return "minecraft:red_sandstone", BlockProperties{} } func (b RedSandstone) New(props BlockProperties) Block { return RedSandstone{} } ================================================ FILE: server/world/block/redSandstoneSlab.go ================================================ package block import ( "strconv" ) type RedSandstoneSlab struct { Type string Waterlogged bool } func (b RedSandstoneSlab) Encode() (string, BlockProperties) { return "minecraft:red_sandstone_slab", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "type": b.Type, } } func (b RedSandstoneSlab) New(props BlockProperties) Block { return RedSandstoneSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/redSandstoneStairs.go ================================================ package block import ( "strconv" ) type RedSandstoneStairs struct { Waterlogged bool Facing string Half string Shape string } func (b RedSandstoneStairs) Encode() (string, BlockProperties) { return "minecraft:red_sandstone_stairs", BlockProperties{ "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, } } func (b RedSandstoneStairs) New(props BlockProperties) Block { return RedSandstoneStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/redSandstoneWall.go ================================================ package block import ( "strconv" ) type RedSandstoneWall struct { Up bool Waterlogged bool West string East string North string South string } func (b RedSandstoneWall) Encode() (string, BlockProperties) { return "minecraft:red_sandstone_wall", BlockProperties{ "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, "north": b.North, "south": b.South, } } func (b RedSandstoneWall) New(props BlockProperties) Block { return RedSandstoneWall{ East: props["east"], North: props["north"], South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], } } ================================================ FILE: server/world/block/redShulkerBox.go ================================================ package block type RedShulkerBox struct { Facing string } func (b RedShulkerBox) Encode() (string, BlockProperties) { return "minecraft:red_shulker_box", BlockProperties{ "facing": b.Facing, } } func (b RedShulkerBox) New(props BlockProperties) Block { return RedShulkerBox{ Facing: props["facing"], } } ================================================ FILE: server/world/block/redStainedGlass.go ================================================ package block type RedStainedGlass struct { } func (b RedStainedGlass) Encode() (string, BlockProperties) { return "minecraft:red_stained_glass", BlockProperties{} } func (b RedStainedGlass) New(props BlockProperties) Block { return RedStainedGlass{} } ================================================ FILE: server/world/block/redStainedGlassPane.go ================================================ package block import ( "strconv" ) type RedStainedGlassPane struct { West bool East bool North bool South bool Waterlogged bool } func (b RedStainedGlassPane) Encode() (string, BlockProperties) { return "minecraft:red_stained_glass_pane", BlockProperties{ "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b RedStainedGlassPane) New(props BlockProperties) Block { return RedStainedGlassPane{ South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", } } ================================================ FILE: server/world/block/redTerracotta.go ================================================ package block type RedTerracotta struct { } func (b RedTerracotta) Encode() (string, BlockProperties) { return "minecraft:red_terracotta", BlockProperties{} } func (b RedTerracotta) New(props BlockProperties) Block { return RedTerracotta{} } ================================================ FILE: server/world/block/redTulip.go ================================================ package block type RedTulip struct { } func (b RedTulip) Encode() (string, BlockProperties) { return "minecraft:red_tulip", BlockProperties{} } func (b RedTulip) New(props BlockProperties) Block { return RedTulip{} } ================================================ FILE: server/world/block/redWallBanner.go ================================================ package block type RedWallBanner struct { Facing string } func (b RedWallBanner) Encode() (string, BlockProperties) { return "minecraft:red_wall_banner", BlockProperties{ "facing": b.Facing, } } func (b RedWallBanner) New(props BlockProperties) Block { return RedWallBanner{ Facing: props["facing"], } } ================================================ FILE: server/world/block/redWool.go ================================================ package block type RedWool struct { } func (b RedWool) Encode() (string, BlockProperties) { return "minecraft:red_wool", BlockProperties{} } func (b RedWool) New(props BlockProperties) Block { return RedWool{} } ================================================ FILE: server/world/block/redstoneBlock.go ================================================ package block type RedstoneBlock struct { } func (b RedstoneBlock) Encode() (string, BlockProperties) { return "minecraft:redstone_block", BlockProperties{} } func (b RedstoneBlock) New(props BlockProperties) Block { return RedstoneBlock{} } ================================================ FILE: server/world/block/redstoneLamp.go ================================================ package block import ( "strconv" ) type RedstoneLamp struct { Lit bool } func (b RedstoneLamp) Encode() (string, BlockProperties) { return "minecraft:redstone_lamp", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b RedstoneLamp) New(props BlockProperties) Block { return RedstoneLamp{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/redstoneOre.go ================================================ package block import ( "strconv" ) type RedstoneOre struct { Lit bool } func (b RedstoneOre) Encode() (string, BlockProperties) { return "minecraft:redstone_ore", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b RedstoneOre) New(props BlockProperties) Block { return RedstoneOre{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/redstoneTorch.go ================================================ package block import ( "strconv" ) type RedstoneTorch struct { Lit bool } func (b RedstoneTorch) Encode() (string, BlockProperties) { return "minecraft:redstone_torch", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b RedstoneTorch) New(props BlockProperties) Block { return RedstoneTorch{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/redstoneWallTorch.go ================================================ package block import ( "strconv" ) type RedstoneWallTorch struct { Facing string Lit bool } func (b RedstoneWallTorch) Encode() (string, BlockProperties) { return "minecraft:redstone_wall_torch", BlockProperties{ "lit": strconv.FormatBool(b.Lit), "facing": b.Facing, } } func (b RedstoneWallTorch) New(props BlockProperties) Block { return RedstoneWallTorch{ Facing: props["facing"], Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/redstoneWire.go ================================================ package block import ( "strconv" ) type RedstoneWire struct { East string North string Power int South string West string } func (b RedstoneWire) Encode() (string, BlockProperties) { return "minecraft:redstone_wire", BlockProperties{ "north": b.North, "power": strconv.Itoa(b.Power), "south": b.South, "west": b.West, "east": b.East, } } func (b RedstoneWire) New(props BlockProperties) Block { return RedstoneWire{ Power: atoi(props["power"]), South: props["south"], West: props["west"], East: props["east"], North: props["north"], } } ================================================ FILE: server/world/block/reinforcedDeepslate.go ================================================ package block type ReinforcedDeepslate struct { } func (b ReinforcedDeepslate) Encode() (string, BlockProperties) { return "minecraft:reinforced_deepslate", BlockProperties{} } func (b ReinforcedDeepslate) New(props BlockProperties) Block { return ReinforcedDeepslate{} } ================================================ FILE: server/world/block/repeater.go ================================================ package block import ( "strconv" ) type Repeater struct { Locked bool Powered bool Delay int Facing string } func (b Repeater) Encode() (string, BlockProperties) { return "minecraft:repeater", BlockProperties{ "locked": strconv.FormatBool(b.Locked), "powered": strconv.FormatBool(b.Powered), "delay": strconv.Itoa(b.Delay), "facing": b.Facing, } } func (b Repeater) New(props BlockProperties) Block { return Repeater{ Locked: props["locked"] != "false", Powered: props["powered"] != "false", Delay: atoi(props["delay"]), Facing: props["facing"], } } ================================================ FILE: server/world/block/repeatingCommandBlock.go ================================================ package block import ( "strconv" ) type RepeatingCommandBlock struct { Facing string Conditional bool } func (b RepeatingCommandBlock) Encode() (string, BlockProperties) { return "minecraft:repeating_command_block", BlockProperties{ "conditional": strconv.FormatBool(b.Conditional), "facing": b.Facing, } } func (b RepeatingCommandBlock) New(props BlockProperties) Block { return RepeatingCommandBlock{ Conditional: props["conditional"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/respawnAnchor.go ================================================ package block import ( "strconv" ) type RespawnAnchor struct { Charges int } func (b RespawnAnchor) Encode() (string, BlockProperties) { return "minecraft:respawn_anchor", BlockProperties{ "charges": strconv.Itoa(b.Charges), } } func (b RespawnAnchor) New(props BlockProperties) Block { return RespawnAnchor{ Charges: atoi(props["charges"]), } } ================================================ FILE: server/world/block/rootedDirt.go ================================================ package block type RootedDirt struct { } func (b RootedDirt) Encode() (string, BlockProperties) { return "minecraft:rooted_dirt", BlockProperties{} } func (b RootedDirt) New(props BlockProperties) Block { return RootedDirt{} } ================================================ FILE: server/world/block/roseBush.go ================================================ package block type RoseBush struct { Half string } func (b RoseBush) Encode() (string, BlockProperties) { return "minecraft:rose_bush", BlockProperties{ "half": b.Half, } } func (b RoseBush) New(props BlockProperties) Block { return RoseBush{ Half: props["half"], } } ================================================ FILE: server/world/block/sand.go ================================================ package block type Sand struct { } func (b Sand) Encode() (string, BlockProperties) { return "minecraft:sand", BlockProperties{} } func (b Sand) New(props BlockProperties) Block { return Sand{} } ================================================ FILE: server/world/block/sandstone.go ================================================ package block type Sandstone struct { } func (b Sandstone) Encode() (string, BlockProperties) { return "minecraft:sandstone", BlockProperties{} } func (b Sandstone) New(props BlockProperties) Block { return Sandstone{} } ================================================ FILE: server/world/block/sandstoneSlab.go ================================================ package block import ( "strconv" ) type SandstoneSlab struct { Type string Waterlogged bool } func (b SandstoneSlab) Encode() (string, BlockProperties) { return "minecraft:sandstone_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b SandstoneSlab) New(props BlockProperties) Block { return SandstoneSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/sandstoneStairs.go ================================================ package block import ( "strconv" ) type SandstoneStairs struct { Facing string Half string Shape string Waterlogged bool } func (b SandstoneStairs) Encode() (string, BlockProperties) { return "minecraft:sandstone_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b SandstoneStairs) New(props BlockProperties) Block { return SandstoneStairs{ Facing: props["facing"], Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/sandstoneWall.go ================================================ package block import ( "strconv" ) type SandstoneWall struct { South string Up bool Waterlogged bool West string East string North string } func (b SandstoneWall) Encode() (string, BlockProperties) { return "minecraft:sandstone_wall", BlockProperties{ "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, "north": b.North, "south": b.South, } } func (b SandstoneWall) New(props BlockProperties) Block { return SandstoneWall{ Waterlogged: props["waterlogged"] != "false", West: props["west"], East: props["east"], North: props["north"], South: props["south"], Up: props["up"] != "false", } } ================================================ FILE: server/world/block/scaffolding.go ================================================ package block import ( "strconv" ) type Scaffolding struct { Waterlogged bool Bottom bool Distance int } func (b Scaffolding) Encode() (string, BlockProperties) { return "minecraft:scaffolding", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "bottom": strconv.FormatBool(b.Bottom), "distance": strconv.Itoa(b.Distance), } } func (b Scaffolding) New(props BlockProperties) Block { return Scaffolding{ Waterlogged: props["waterlogged"] != "false", Bottom: props["bottom"] != "false", Distance: atoi(props["distance"]), } } ================================================ FILE: server/world/block/sculk.go ================================================ package block type Sculk struct { } func (b Sculk) Encode() (string, BlockProperties) { return "minecraft:sculk", BlockProperties{} } func (b Sculk) New(props BlockProperties) Block { return Sculk{} } ================================================ FILE: server/world/block/sculkCatalyst.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type SculkCatalyst struct { Bloom bool } func (b SculkCatalyst) Encode() (string, BlockProperties) { return "minecraft:sculk_catalyst", BlockProperties{ "bloom": strconv.FormatBool(b.Bloom), } } func (b SculkCatalyst) New(props BlockProperties) Block { return SculkCatalyst{ Bloom: props["bloom"] != "false", } } func (b SculkCatalyst) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:sculk_catalyst", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/sculkSensor.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type SculkSensor struct { Power int SculkSensorPhase string Waterlogged bool } func (b SculkSensor) Encode() (string, BlockProperties) { return "minecraft:sculk_sensor", BlockProperties{ "power": strconv.Itoa(b.Power), "sculk_sensor_phase": b.SculkSensorPhase, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b SculkSensor) New(props BlockProperties) Block { return SculkSensor{ Power: atoi(props["power"]), SculkSensorPhase: props["sculk_sensor_phase"], Waterlogged: props["waterlogged"] != "false", } } func (b SculkSensor) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:sculk_sensor", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/sculkShrieker.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type SculkShrieker struct { CanSummon bool Shrieking bool Waterlogged bool } func (b SculkShrieker) Encode() (string, BlockProperties) { return "minecraft:sculk_shrieker", BlockProperties{ "can_summon": strconv.FormatBool(b.CanSummon), "shrieking": strconv.FormatBool(b.Shrieking), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b SculkShrieker) New(props BlockProperties) Block { return SculkShrieker{ CanSummon: props["can_summon"] != "false", Shrieking: props["shrieking"] != "false", Waterlogged: props["waterlogged"] != "false", } } func (b SculkShrieker) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:sculk_shrieker", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/sculkVein.go ================================================ package block import ( "strconv" ) type SculkVein struct { North bool South bool Up bool Waterlogged bool West bool Down bool East bool } func (b SculkVein) Encode() (string, BlockProperties) { return "minecraft:sculk_vein", BlockProperties{ "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "down": strconv.FormatBool(b.Down), "east": strconv.FormatBool(b.East), } } func (b SculkVein) New(props BlockProperties) Block { return SculkVein{ Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", Down: props["down"] != "false", East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", } } ================================================ FILE: server/world/block/seaLantern.go ================================================ package block type SeaLantern struct { } func (b SeaLantern) Encode() (string, BlockProperties) { return "minecraft:sea_lantern", BlockProperties{} } func (b SeaLantern) New(props BlockProperties) Block { return SeaLantern{} } ================================================ FILE: server/world/block/seaPickle.go ================================================ package block import ( "strconv" ) type SeaPickle struct { Pickles int Waterlogged bool } func (b SeaPickle) Encode() (string, BlockProperties) { return "minecraft:sea_pickle", BlockProperties{ "pickles": strconv.Itoa(b.Pickles), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b SeaPickle) New(props BlockProperties) Block { return SeaPickle{ Waterlogged: props["waterlogged"] != "false", Pickles: atoi(props["pickles"]), } } ================================================ FILE: server/world/block/seagrass.go ================================================ package block type Seagrass struct { } func (b Seagrass) Encode() (string, BlockProperties) { return "minecraft:seagrass", BlockProperties{} } func (b Seagrass) New(props BlockProperties) Block { return Seagrass{} } ================================================ FILE: server/world/block/shortGrass.go ================================================ package block type ShortGrass struct { } func (b ShortGrass) Encode() (string, BlockProperties) { return "minecraft:short_grass", BlockProperties{} } func (b ShortGrass) New(props BlockProperties) Block { return ShortGrass{} } ================================================ FILE: server/world/block/shroomlight.go ================================================ package block type Shroomlight struct { } func (b Shroomlight) Encode() (string, BlockProperties) { return "minecraft:shroomlight", BlockProperties{} } func (b Shroomlight) New(props BlockProperties) Block { return Shroomlight{} } ================================================ FILE: server/world/block/shulkerBox.go ================================================ package block import ( "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type ShulkerBox struct { Facing string } func (b ShulkerBox) Encode() (string, BlockProperties) { return "minecraft:shulker_box", BlockProperties{ "facing": b.Facing, } } func (b ShulkerBox) New(props BlockProperties) Block { return ShulkerBox{ Facing: props["facing"], } } func (b ShulkerBox) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:shulker_box", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/skeletonSkull.go ================================================ package block import ( "strconv" ) type SkeletonSkull struct { Rotation int Powered bool } func (b SkeletonSkull) Encode() (string, BlockProperties) { return "minecraft:skeleton_skull", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), "powered": strconv.FormatBool(b.Powered), } } func (b SkeletonSkull) New(props BlockProperties) Block { return SkeletonSkull{ Powered: props["powered"] != "false", Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/skeletonWallSkull.go ================================================ package block import ( "strconv" ) type SkeletonWallSkull struct { Powered bool Facing string } func (b SkeletonWallSkull) Encode() (string, BlockProperties) { return "minecraft:skeleton_wall_skull", BlockProperties{ "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), } } func (b SkeletonWallSkull) New(props BlockProperties) Block { return SkeletonWallSkull{ Facing: props["facing"], Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/slimeBlock.go ================================================ package block type SlimeBlock struct { } func (b SlimeBlock) Encode() (string, BlockProperties) { return "minecraft:slime_block", BlockProperties{} } func (b SlimeBlock) New(props BlockProperties) Block { return SlimeBlock{} } ================================================ FILE: server/world/block/smallAmethystBud.go ================================================ package block import ( "strconv" ) type SmallAmethystBud struct { Waterlogged bool Facing string } func (b SmallAmethystBud) Encode() (string, BlockProperties) { return "minecraft:small_amethyst_bud", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b SmallAmethystBud) New(props BlockProperties) Block { return SmallAmethystBud{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/smallDripleaf.go ================================================ package block import ( "strconv" ) type SmallDripleaf struct { Facing string Half string Waterlogged bool } func (b SmallDripleaf) Encode() (string, BlockProperties) { return "minecraft:small_dripleaf", BlockProperties{ "half": b.Half, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b SmallDripleaf) New(props BlockProperties) Block { return SmallDripleaf{ Facing: props["facing"], Half: props["half"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/smithingTable.go ================================================ package block type SmithingTable struct { } func (b SmithingTable) Encode() (string, BlockProperties) { return "minecraft:smithing_table", BlockProperties{} } func (b SmithingTable) New(props BlockProperties) Block { return SmithingTable{} } ================================================ FILE: server/world/block/smoker.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Smoker struct { Facing string Lit bool } func (b Smoker) Encode() (string, BlockProperties) { return "minecraft:smoker", BlockProperties{ "facing": b.Facing, "lit": strconv.FormatBool(b.Lit), } } func (b Smoker) New(props BlockProperties) Block { return Smoker{ Facing: props["facing"], Lit: props["lit"] != "false", } } func (b Smoker) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:smoker", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/smoothBasalt.go ================================================ package block type SmoothBasalt struct { } func (b SmoothBasalt) Encode() (string, BlockProperties) { return "minecraft:smooth_basalt", BlockProperties{} } func (b SmoothBasalt) New(props BlockProperties) Block { return SmoothBasalt{} } ================================================ FILE: server/world/block/smoothQuartz.go ================================================ package block type SmoothQuartz struct { } func (b SmoothQuartz) Encode() (string, BlockProperties) { return "minecraft:smooth_quartz", BlockProperties{} } func (b SmoothQuartz) New(props BlockProperties) Block { return SmoothQuartz{} } ================================================ FILE: server/world/block/smoothQuartzSlab.go ================================================ package block import ( "strconv" ) type SmoothQuartzSlab struct { Type string Waterlogged bool } func (b SmoothQuartzSlab) Encode() (string, BlockProperties) { return "minecraft:smooth_quartz_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b SmoothQuartzSlab) New(props BlockProperties) Block { return SmoothQuartzSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/smoothQuartzStairs.go ================================================ package block import ( "strconv" ) type SmoothQuartzStairs struct { Half string Shape string Waterlogged bool Facing string } func (b SmoothQuartzStairs) Encode() (string, BlockProperties) { return "minecraft:smooth_quartz_stairs", BlockProperties{ "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b SmoothQuartzStairs) New(props BlockProperties) Block { return SmoothQuartzStairs{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Shape: props["shape"], } } ================================================ FILE: server/world/block/smoothRedSandstone.go ================================================ package block type SmoothRedSandstone struct { } func (b SmoothRedSandstone) Encode() (string, BlockProperties) { return "minecraft:smooth_red_sandstone", BlockProperties{} } func (b SmoothRedSandstone) New(props BlockProperties) Block { return SmoothRedSandstone{} } ================================================ FILE: server/world/block/smoothRedSandstoneSlab.go ================================================ package block import ( "strconv" ) type SmoothRedSandstoneSlab struct { Type string Waterlogged bool } func (b SmoothRedSandstoneSlab) Encode() (string, BlockProperties) { return "minecraft:smooth_red_sandstone_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b SmoothRedSandstoneSlab) New(props BlockProperties) Block { return SmoothRedSandstoneSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/smoothRedSandstoneStairs.go ================================================ package block import ( "strconv" ) type SmoothRedSandstoneStairs struct { Facing string Half string Shape string Waterlogged bool } func (b SmoothRedSandstoneStairs) Encode() (string, BlockProperties) { return "minecraft:smooth_red_sandstone_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b SmoothRedSandstoneStairs) New(props BlockProperties) Block { return SmoothRedSandstoneStairs{ Facing: props["facing"], Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/smoothSandstone.go ================================================ package block type SmoothSandstone struct { } func (b SmoothSandstone) Encode() (string, BlockProperties) { return "minecraft:smooth_sandstone", BlockProperties{} } func (b SmoothSandstone) New(props BlockProperties) Block { return SmoothSandstone{} } ================================================ FILE: server/world/block/smoothSandstoneSlab.go ================================================ package block import ( "strconv" ) type SmoothSandstoneSlab struct { Type string Waterlogged bool } func (b SmoothSandstoneSlab) Encode() (string, BlockProperties) { return "minecraft:smooth_sandstone_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b SmoothSandstoneSlab) New(props BlockProperties) Block { return SmoothSandstoneSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/smoothSandstoneStairs.go ================================================ package block import ( "strconv" ) type SmoothSandstoneStairs struct { Half string Shape string Waterlogged bool Facing string } func (b SmoothSandstoneStairs) Encode() (string, BlockProperties) { return "minecraft:smooth_sandstone_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b SmoothSandstoneStairs) New(props BlockProperties) Block { return SmoothSandstoneStairs{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Shape: props["shape"], } } ================================================ FILE: server/world/block/smoothStone.go ================================================ package block type SmoothStone struct { } func (b SmoothStone) Encode() (string, BlockProperties) { return "minecraft:smooth_stone", BlockProperties{} } func (b SmoothStone) New(props BlockProperties) Block { return SmoothStone{} } ================================================ FILE: server/world/block/smoothStoneSlab.go ================================================ package block import ( "strconv" ) type SmoothStoneSlab struct { Type string Waterlogged bool } func (b SmoothStoneSlab) Encode() (string, BlockProperties) { return "minecraft:smooth_stone_slab", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "type": b.Type, } } func (b SmoothStoneSlab) New(props BlockProperties) Block { return SmoothStoneSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/snifferEgg.go ================================================ package block import ( "strconv" ) type SnifferEgg struct { Hatch int } func (b SnifferEgg) Encode() (string, BlockProperties) { return "minecraft:sniffer_egg", BlockProperties{ "hatch": strconv.Itoa(b.Hatch), } } func (b SnifferEgg) New(props BlockProperties) Block { return SnifferEgg{ Hatch: atoi(props["hatch"]), } } ================================================ FILE: server/world/block/snow.go ================================================ package block import ( "strconv" ) type Snow struct { Layers int } func (b Snow) Encode() (string, BlockProperties) { return "minecraft:snow", BlockProperties{ "layers": strconv.Itoa(b.Layers), } } func (b Snow) New(props BlockProperties) Block { return Snow{ Layers: atoi(props["layers"]), } } ================================================ FILE: server/world/block/snowBlock.go ================================================ package block type SnowBlock struct { } func (b SnowBlock) Encode() (string, BlockProperties) { return "minecraft:snow_block", BlockProperties{} } func (b SnowBlock) New(props BlockProperties) Block { return SnowBlock{} } ================================================ FILE: server/world/block/soulCampfire.go ================================================ package block import ( "strconv" ) type SoulCampfire struct { Waterlogged bool Facing string Lit bool SignalFire bool } func (b SoulCampfire) Encode() (string, BlockProperties) { return "minecraft:soul_campfire", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "lit": strconv.FormatBool(b.Lit), "signal_fire": strconv.FormatBool(b.SignalFire), } } func (b SoulCampfire) New(props BlockProperties) Block { return SoulCampfire{ Lit: props["lit"] != "false", SignalFire: props["signal_fire"] != "false", Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/soulFire.go ================================================ package block type SoulFire struct { } func (b SoulFire) Encode() (string, BlockProperties) { return "minecraft:soul_fire", BlockProperties{} } func (b SoulFire) New(props BlockProperties) Block { return SoulFire{} } ================================================ FILE: server/world/block/soulLantern.go ================================================ package block import ( "strconv" ) type SoulLantern struct { Hanging bool Waterlogged bool } func (b SoulLantern) Encode() (string, BlockProperties) { return "minecraft:soul_lantern", BlockProperties{ "hanging": strconv.FormatBool(b.Hanging), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b SoulLantern) New(props BlockProperties) Block { return SoulLantern{ Hanging: props["hanging"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/soulSand.go ================================================ package block type SoulSand struct { } func (b SoulSand) Encode() (string, BlockProperties) { return "minecraft:soul_sand", BlockProperties{} } func (b SoulSand) New(props BlockProperties) Block { return SoulSand{} } ================================================ FILE: server/world/block/soulSoil.go ================================================ package block type SoulSoil struct { } func (b SoulSoil) Encode() (string, BlockProperties) { return "minecraft:soul_soil", BlockProperties{} } func (b SoulSoil) New(props BlockProperties) Block { return SoulSoil{} } ================================================ FILE: server/world/block/soulTorch.go ================================================ package block type SoulTorch struct { } func (b SoulTorch) Encode() (string, BlockProperties) { return "minecraft:soul_torch", BlockProperties{} } func (b SoulTorch) New(props BlockProperties) Block { return SoulTorch{} } ================================================ FILE: server/world/block/soulWallTorch.go ================================================ package block type SoulWallTorch struct { Facing string } func (b SoulWallTorch) Encode() (string, BlockProperties) { return "minecraft:soul_wall_torch", BlockProperties{ "facing": b.Facing, } } func (b SoulWallTorch) New(props BlockProperties) Block { return SoulWallTorch{ Facing: props["facing"], } } ================================================ FILE: server/world/block/spawner.go ================================================ package block type Spawner struct { } func (b Spawner) Encode() (string, BlockProperties) { return "minecraft:spawner", BlockProperties{} } func (b Spawner) New(props BlockProperties) Block { return Spawner{} } ================================================ FILE: server/world/block/sponge.go ================================================ package block type Sponge struct { } func (b Sponge) Encode() (string, BlockProperties) { return "minecraft:sponge", BlockProperties{} } func (b Sponge) New(props BlockProperties) Block { return Sponge{} } ================================================ FILE: server/world/block/sporeBlossom.go ================================================ package block type SporeBlossom struct { } func (b SporeBlossom) Encode() (string, BlockProperties) { return "minecraft:spore_blossom", BlockProperties{} } func (b SporeBlossom) New(props BlockProperties) Block { return SporeBlossom{} } ================================================ FILE: server/world/block/spruceButton.go ================================================ package block import ( "strconv" ) type SpruceButton struct { Face string Facing string Powered bool } func (b SpruceButton) Encode() (string, BlockProperties) { return "minecraft:spruce_button", BlockProperties{ "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), "face": b.Face, } } func (b SpruceButton) New(props BlockProperties) Block { return SpruceButton{ Face: props["face"], Facing: props["facing"], Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/spruceDoor.go ================================================ package block import ( "strconv" ) type SpruceDoor struct { Hinge string Open bool Powered bool Facing string Half string } func (b SpruceDoor) Encode() (string, BlockProperties) { return "minecraft:spruce_door", BlockProperties{ "facing": b.Facing, "half": b.Half, "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), } } func (b SpruceDoor) New(props BlockProperties) Block { return SpruceDoor{ Hinge: props["hinge"], Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/spruceFence.go ================================================ package block import ( "strconv" ) type SpruceFence struct { East bool North bool South bool Waterlogged bool West bool } func (b SpruceFence) Encode() (string, BlockProperties) { return "minecraft:spruce_fence", BlockProperties{ "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b SpruceFence) New(props BlockProperties) Block { return SpruceFence{ North: props["north"] != "false", South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", } } ================================================ FILE: server/world/block/spruceFenceGate.go ================================================ package block import ( "strconv" ) type SpruceFenceGate struct { Open bool Powered bool Facing string InWall bool } func (b SpruceFenceGate) Encode() (string, BlockProperties) { return "minecraft:spruce_fence_gate", BlockProperties{ "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, "in_wall": strconv.FormatBool(b.InWall), } } func (b SpruceFenceGate) New(props BlockProperties) Block { return SpruceFenceGate{ Facing: props["facing"], InWall: props["in_wall"] != "false", Open: props["open"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/spruceHangingSign.go ================================================ package block import ( "strconv" ) type SpruceHangingSign struct { Attached bool Rotation int Waterlogged bool } func (b SpruceHangingSign) Encode() (string, BlockProperties) { return "minecraft:spruce_hanging_sign", BlockProperties{ "attached": strconv.FormatBool(b.Attached), "rotation": strconv.Itoa(b.Rotation), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b SpruceHangingSign) New(props BlockProperties) Block { return SpruceHangingSign{ Attached: props["attached"] != "false", Rotation: atoi(props["rotation"]), Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/spruceLeaves.go ================================================ package block import ( "strconv" ) type SpruceLeaves struct { Persistent bool Waterlogged bool Distance int } func (b SpruceLeaves) Encode() (string, BlockProperties) { return "minecraft:spruce_leaves", BlockProperties{ "persistent": strconv.FormatBool(b.Persistent), "waterlogged": strconv.FormatBool(b.Waterlogged), "distance": strconv.Itoa(b.Distance), } } func (b SpruceLeaves) New(props BlockProperties) Block { return SpruceLeaves{ Waterlogged: props["waterlogged"] != "false", Distance: atoi(props["distance"]), Persistent: props["persistent"] != "false", } } ================================================ FILE: server/world/block/spruceLog.go ================================================ package block type SpruceLog struct { Axis string } func (b SpruceLog) Encode() (string, BlockProperties) { return "minecraft:spruce_log", BlockProperties{ "axis": b.Axis, } } func (b SpruceLog) New(props BlockProperties) Block { return SpruceLog{ Axis: props["axis"], } } ================================================ FILE: server/world/block/sprucePlanks.go ================================================ package block type SprucePlanks struct { } func (b SprucePlanks) Encode() (string, BlockProperties) { return "minecraft:spruce_planks", BlockProperties{} } func (b SprucePlanks) New(props BlockProperties) Block { return SprucePlanks{} } ================================================ FILE: server/world/block/sprucePressurePlate.go ================================================ package block import ( "strconv" ) type SprucePressurePlate struct { Powered bool } func (b SprucePressurePlate) Encode() (string, BlockProperties) { return "minecraft:spruce_pressure_plate", BlockProperties{ "powered": strconv.FormatBool(b.Powered), } } func (b SprucePressurePlate) New(props BlockProperties) Block { return SprucePressurePlate{ Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/spruceSapling.go ================================================ package block import ( "strconv" ) type SpruceSapling struct { Stage int } func (b SpruceSapling) Encode() (string, BlockProperties) { return "minecraft:spruce_sapling", BlockProperties{ "stage": strconv.Itoa(b.Stage), } } func (b SpruceSapling) New(props BlockProperties) Block { return SpruceSapling{ Stage: atoi(props["stage"]), } } ================================================ FILE: server/world/block/spruceSign.go ================================================ package block import ( "strconv" ) type SpruceSign struct { Waterlogged bool Rotation int } func (b SpruceSign) Encode() (string, BlockProperties) { return "minecraft:spruce_sign", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b SpruceSign) New(props BlockProperties) Block { return SpruceSign{ Waterlogged: props["waterlogged"] != "false", Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/spruceSlab.go ================================================ package block import ( "strconv" ) type SpruceSlab struct { Waterlogged bool Type string } func (b SpruceSlab) Encode() (string, BlockProperties) { return "minecraft:spruce_slab", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "type": b.Type, } } func (b SpruceSlab) New(props BlockProperties) Block { return SpruceSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/spruceStairs.go ================================================ package block import ( "strconv" ) type SpruceStairs struct { Waterlogged bool Facing string Half string Shape string } func (b SpruceStairs) Encode() (string, BlockProperties) { return "minecraft:spruce_stairs", BlockProperties{ "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b SpruceStairs) New(props BlockProperties) Block { return SpruceStairs{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Shape: props["shape"], } } ================================================ FILE: server/world/block/spruceTrapdoor.go ================================================ package block import ( "strconv" ) type SpruceTrapdoor struct { Half string Open bool Powered bool Waterlogged bool Facing string } func (b SpruceTrapdoor) Encode() (string, BlockProperties) { return "minecraft:spruce_trapdoor", BlockProperties{ "half": b.Half, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b SpruceTrapdoor) New(props BlockProperties) Block { return SpruceTrapdoor{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Open: props["open"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/spruceWallHangingSign.go ================================================ package block import ( "strconv" ) type SpruceWallHangingSign struct { Waterlogged bool Facing string } func (b SpruceWallHangingSign) Encode() (string, BlockProperties) { return "minecraft:spruce_wall_hanging_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b SpruceWallHangingSign) New(props BlockProperties) Block { return SpruceWallHangingSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/spruceWallSign.go ================================================ package block import ( "strconv" ) type SpruceWallSign struct { Facing string Waterlogged bool } func (b SpruceWallSign) Encode() (string, BlockProperties) { return "minecraft:spruce_wall_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b SpruceWallSign) New(props BlockProperties) Block { return SpruceWallSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/spruceWood.go ================================================ package block type SpruceWood struct { Axis string } func (b SpruceWood) Encode() (string, BlockProperties) { return "minecraft:spruce_wood", BlockProperties{ "axis": b.Axis, } } func (b SpruceWood) New(props BlockProperties) Block { return SpruceWood{ Axis: props["axis"], } } ================================================ FILE: server/world/block/stickyPiston.go ================================================ package block import ( "strconv" ) type StickyPiston struct { Extended bool Facing string } func (b StickyPiston) Encode() (string, BlockProperties) { return "minecraft:sticky_piston", BlockProperties{ "extended": strconv.FormatBool(b.Extended), "facing": b.Facing, } } func (b StickyPiston) New(props BlockProperties) Block { return StickyPiston{ Facing: props["facing"], Extended: props["extended"] != "false", } } ================================================ FILE: server/world/block/stone.go ================================================ package block type Stone struct { } func (b Stone) Encode() (string, BlockProperties) { return "minecraft:stone", BlockProperties{} } func (b Stone) New(props BlockProperties) Block { return Stone{} } ================================================ FILE: server/world/block/stoneBrickSlab.go ================================================ package block import ( "strconv" ) type StoneBrickSlab struct { Waterlogged bool Type string } func (b StoneBrickSlab) Encode() (string, BlockProperties) { return "minecraft:stone_brick_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b StoneBrickSlab) New(props BlockProperties) Block { return StoneBrickSlab{ Waterlogged: props["waterlogged"] != "false", Type: props["type"], } } ================================================ FILE: server/world/block/stoneBrickStairs.go ================================================ package block import ( "strconv" ) type StoneBrickStairs struct { Half string Shape string Waterlogged bool Facing string } func (b StoneBrickStairs) Encode() (string, BlockProperties) { return "minecraft:stone_brick_stairs", BlockProperties{ "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, } } func (b StoneBrickStairs) New(props BlockProperties) Block { return StoneBrickStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/stoneBrickWall.go ================================================ package block import ( "strconv" ) type StoneBrickWall struct { West string East string North string South string Up bool Waterlogged bool } func (b StoneBrickWall) Encode() (string, BlockProperties) { return "minecraft:stone_brick_wall", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, "north": b.North, "south": b.South, "up": strconv.FormatBool(b.Up), } } func (b StoneBrickWall) New(props BlockProperties) Block { return StoneBrickWall{ South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], East: props["east"], North: props["north"], } } ================================================ FILE: server/world/block/stoneBricks.go ================================================ package block type StoneBricks struct { } func (b StoneBricks) Encode() (string, BlockProperties) { return "minecraft:stone_bricks", BlockProperties{} } func (b StoneBricks) New(props BlockProperties) Block { return StoneBricks{} } ================================================ FILE: server/world/block/stoneButton.go ================================================ package block import ( "strconv" ) type StoneButton struct { Face string Facing string Powered bool } func (b StoneButton) Encode() (string, BlockProperties) { return "minecraft:stone_button", BlockProperties{ "face": b.Face, "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), } } func (b StoneButton) New(props BlockProperties) Block { return StoneButton{ Facing: props["facing"], Powered: props["powered"] != "false", Face: props["face"], } } ================================================ FILE: server/world/block/stonePressurePlate.go ================================================ package block import ( "strconv" ) type StonePressurePlate struct { Powered bool } func (b StonePressurePlate) Encode() (string, BlockProperties) { return "minecraft:stone_pressure_plate", BlockProperties{ "powered": strconv.FormatBool(b.Powered), } } func (b StonePressurePlate) New(props BlockProperties) Block { return StonePressurePlate{ Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/stoneSlab.go ================================================ package block import ( "strconv" ) type StoneSlab struct { Type string Waterlogged bool } func (b StoneSlab) Encode() (string, BlockProperties) { return "minecraft:stone_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b StoneSlab) New(props BlockProperties) Block { return StoneSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/stoneStairs.go ================================================ package block import ( "strconv" ) type StoneStairs struct { Shape string Waterlogged bool Facing string Half string } func (b StoneStairs) Encode() (string, BlockProperties) { return "minecraft:stone_stairs", BlockProperties{ "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, } } func (b StoneStairs) New(props BlockProperties) Block { return StoneStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/stonecutter.go ================================================ package block type Stonecutter struct { Facing string } func (b Stonecutter) Encode() (string, BlockProperties) { return "minecraft:stonecutter", BlockProperties{ "facing": b.Facing, } } func (b Stonecutter) New(props BlockProperties) Block { return Stonecutter{ Facing: props["facing"], } } ================================================ FILE: server/world/block/strippedAcaciaLog.go ================================================ package block type StrippedAcaciaLog struct { Axis string } func (b StrippedAcaciaLog) Encode() (string, BlockProperties) { return "minecraft:stripped_acacia_log", BlockProperties{ "axis": b.Axis, } } func (b StrippedAcaciaLog) New(props BlockProperties) Block { return StrippedAcaciaLog{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedAcaciaWood.go ================================================ package block type StrippedAcaciaWood struct { Axis string } func (b StrippedAcaciaWood) Encode() (string, BlockProperties) { return "minecraft:stripped_acacia_wood", BlockProperties{ "axis": b.Axis, } } func (b StrippedAcaciaWood) New(props BlockProperties) Block { return StrippedAcaciaWood{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedBambooBlock.go ================================================ package block type StrippedBambooBlock struct { Axis string } func (b StrippedBambooBlock) Encode() (string, BlockProperties) { return "minecraft:stripped_bamboo_block", BlockProperties{ "axis": b.Axis, } } func (b StrippedBambooBlock) New(props BlockProperties) Block { return StrippedBambooBlock{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedBirchLog.go ================================================ package block type StrippedBirchLog struct { Axis string } func (b StrippedBirchLog) Encode() (string, BlockProperties) { return "minecraft:stripped_birch_log", BlockProperties{ "axis": b.Axis, } } func (b StrippedBirchLog) New(props BlockProperties) Block { return StrippedBirchLog{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedBirchWood.go ================================================ package block type StrippedBirchWood struct { Axis string } func (b StrippedBirchWood) Encode() (string, BlockProperties) { return "minecraft:stripped_birch_wood", BlockProperties{ "axis": b.Axis, } } func (b StrippedBirchWood) New(props BlockProperties) Block { return StrippedBirchWood{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedCherryLog.go ================================================ package block type StrippedCherryLog struct { Axis string } func (b StrippedCherryLog) Encode() (string, BlockProperties) { return "minecraft:stripped_cherry_log", BlockProperties{ "axis": b.Axis, } } func (b StrippedCherryLog) New(props BlockProperties) Block { return StrippedCherryLog{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedCherryWood.go ================================================ package block type StrippedCherryWood struct { Axis string } func (b StrippedCherryWood) Encode() (string, BlockProperties) { return "minecraft:stripped_cherry_wood", BlockProperties{ "axis": b.Axis, } } func (b StrippedCherryWood) New(props BlockProperties) Block { return StrippedCherryWood{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedCrimsonHyphae.go ================================================ package block type StrippedCrimsonHyphae struct { Axis string } func (b StrippedCrimsonHyphae) Encode() (string, BlockProperties) { return "minecraft:stripped_crimson_hyphae", BlockProperties{ "axis": b.Axis, } } func (b StrippedCrimsonHyphae) New(props BlockProperties) Block { return StrippedCrimsonHyphae{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedCrimsonStem.go ================================================ package block type StrippedCrimsonStem struct { Axis string } func (b StrippedCrimsonStem) Encode() (string, BlockProperties) { return "minecraft:stripped_crimson_stem", BlockProperties{ "axis": b.Axis, } } func (b StrippedCrimsonStem) New(props BlockProperties) Block { return StrippedCrimsonStem{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedDarkOakLog.go ================================================ package block type StrippedDarkOakLog struct { Axis string } func (b StrippedDarkOakLog) Encode() (string, BlockProperties) { return "minecraft:stripped_dark_oak_log", BlockProperties{ "axis": b.Axis, } } func (b StrippedDarkOakLog) New(props BlockProperties) Block { return StrippedDarkOakLog{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedDarkOakWood.go ================================================ package block type StrippedDarkOakWood struct { Axis string } func (b StrippedDarkOakWood) Encode() (string, BlockProperties) { return "minecraft:stripped_dark_oak_wood", BlockProperties{ "axis": b.Axis, } } func (b StrippedDarkOakWood) New(props BlockProperties) Block { return StrippedDarkOakWood{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedJungleLog.go ================================================ package block type StrippedJungleLog struct { Axis string } func (b StrippedJungleLog) Encode() (string, BlockProperties) { return "minecraft:stripped_jungle_log", BlockProperties{ "axis": b.Axis, } } func (b StrippedJungleLog) New(props BlockProperties) Block { return StrippedJungleLog{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedJungleWood.go ================================================ package block type StrippedJungleWood struct { Axis string } func (b StrippedJungleWood) Encode() (string, BlockProperties) { return "minecraft:stripped_jungle_wood", BlockProperties{ "axis": b.Axis, } } func (b StrippedJungleWood) New(props BlockProperties) Block { return StrippedJungleWood{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedMangroveLog.go ================================================ package block type StrippedMangroveLog struct { Axis string } func (b StrippedMangroveLog) Encode() (string, BlockProperties) { return "minecraft:stripped_mangrove_log", BlockProperties{ "axis": b.Axis, } } func (b StrippedMangroveLog) New(props BlockProperties) Block { return StrippedMangroveLog{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedMangroveWood.go ================================================ package block type StrippedMangroveWood struct { Axis string } func (b StrippedMangroveWood) Encode() (string, BlockProperties) { return "minecraft:stripped_mangrove_wood", BlockProperties{ "axis": b.Axis, } } func (b StrippedMangroveWood) New(props BlockProperties) Block { return StrippedMangroveWood{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedOakLog.go ================================================ package block type StrippedOakLog struct { Axis string } func (b StrippedOakLog) Encode() (string, BlockProperties) { return "minecraft:stripped_oak_log", BlockProperties{ "axis": b.Axis, } } func (b StrippedOakLog) New(props BlockProperties) Block { return StrippedOakLog{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedOakWood.go ================================================ package block type StrippedOakWood struct { Axis string } func (b StrippedOakWood) Encode() (string, BlockProperties) { return "minecraft:stripped_oak_wood", BlockProperties{ "axis": b.Axis, } } func (b StrippedOakWood) New(props BlockProperties) Block { return StrippedOakWood{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedSpruceLog.go ================================================ package block type StrippedSpruceLog struct { Axis string } func (b StrippedSpruceLog) Encode() (string, BlockProperties) { return "minecraft:stripped_spruce_log", BlockProperties{ "axis": b.Axis, } } func (b StrippedSpruceLog) New(props BlockProperties) Block { return StrippedSpruceLog{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedSpruceWood.go ================================================ package block type StrippedSpruceWood struct { Axis string } func (b StrippedSpruceWood) Encode() (string, BlockProperties) { return "minecraft:stripped_spruce_wood", BlockProperties{ "axis": b.Axis, } } func (b StrippedSpruceWood) New(props BlockProperties) Block { return StrippedSpruceWood{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedWarpedHyphae.go ================================================ package block type StrippedWarpedHyphae struct { Axis string } func (b StrippedWarpedHyphae) Encode() (string, BlockProperties) { return "minecraft:stripped_warped_hyphae", BlockProperties{ "axis": b.Axis, } } func (b StrippedWarpedHyphae) New(props BlockProperties) Block { return StrippedWarpedHyphae{ Axis: props["axis"], } } ================================================ FILE: server/world/block/strippedWarpedStem.go ================================================ package block type StrippedWarpedStem struct { Axis string } func (b StrippedWarpedStem) Encode() (string, BlockProperties) { return "minecraft:stripped_warped_stem", BlockProperties{ "axis": b.Axis, } } func (b StrippedWarpedStem) New(props BlockProperties) Block { return StrippedWarpedStem{ Axis: props["axis"], } } ================================================ FILE: server/world/block/structureBlock.go ================================================ package block import ( "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type StructureBlock struct { Mode string } func (b StructureBlock) Encode() (string, BlockProperties) { return "minecraft:structure_block", BlockProperties{ "mode": b.Mode, } } func (b StructureBlock) New(props BlockProperties) Block { return StructureBlock{ Mode: props["mode"], } } func (b StructureBlock) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:structure_block", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/structureVoid.go ================================================ package block type StructureVoid struct { } func (b StructureVoid) Encode() (string, BlockProperties) { return "minecraft:structure_void", BlockProperties{} } func (b StructureVoid) New(props BlockProperties) Block { return StructureVoid{} } ================================================ FILE: server/world/block/sugarCane.go ================================================ package block import ( "strconv" ) type SugarCane struct { Age int } func (b SugarCane) Encode() (string, BlockProperties) { return "minecraft:sugar_cane", BlockProperties{ "age": strconv.Itoa(b.Age), } } func (b SugarCane) New(props BlockProperties) Block { return SugarCane{ Age: atoi(props["age"]), } } ================================================ FILE: server/world/block/sunflower.go ================================================ package block type Sunflower struct { Half string } func (b Sunflower) Encode() (string, BlockProperties) { return "minecraft:sunflower", BlockProperties{ "half": b.Half, } } func (b Sunflower) New(props BlockProperties) Block { return Sunflower{ Half: props["half"], } } ================================================ FILE: server/world/block/suspiciousGravel.go ================================================ package block import ( "strconv" ) type SuspiciousGravel struct { Dusted int } func (b SuspiciousGravel) Encode() (string, BlockProperties) { return "minecraft:suspicious_gravel", BlockProperties{ "dusted": strconv.Itoa(b.Dusted), } } func (b SuspiciousGravel) New(props BlockProperties) Block { return SuspiciousGravel{ Dusted: atoi(props["dusted"]), } } ================================================ FILE: server/world/block/suspiciousSand.go ================================================ package block import ( "strconv" ) type SuspiciousSand struct { Dusted int } func (b SuspiciousSand) Encode() (string, BlockProperties) { return "minecraft:suspicious_sand", BlockProperties{ "dusted": strconv.Itoa(b.Dusted), } } func (b SuspiciousSand) New(props BlockProperties) Block { return SuspiciousSand{ Dusted: atoi(props["dusted"]), } } ================================================ FILE: server/world/block/sweetBerryBush.go ================================================ package block import ( "strconv" ) type SweetBerryBush struct { Age int } func (b SweetBerryBush) Encode() (string, BlockProperties) { return "minecraft:sweet_berry_bush", BlockProperties{ "age": strconv.Itoa(b.Age), } } func (b SweetBerryBush) New(props BlockProperties) Block { return SweetBerryBush{ Age: atoi(props["age"]), } } ================================================ FILE: server/world/block/tallGrass.go ================================================ package block type TallGrass struct { Half string } func (b TallGrass) Encode() (string, BlockProperties) { return "minecraft:tall_grass", BlockProperties{ "half": b.Half, } } func (b TallGrass) New(props BlockProperties) Block { return TallGrass{ Half: props["half"], } } ================================================ FILE: server/world/block/tallSeagrass.go ================================================ package block type TallSeagrass struct { Half string } func (b TallSeagrass) Encode() (string, BlockProperties) { return "minecraft:tall_seagrass", BlockProperties{ "half": b.Half, } } func (b TallSeagrass) New(props BlockProperties) Block { return TallSeagrass{ Half: props["half"], } } ================================================ FILE: server/world/block/target.go ================================================ package block import ( "strconv" ) type Target struct { Power int } func (b Target) Encode() (string, BlockProperties) { return "minecraft:target", BlockProperties{ "power": strconv.Itoa(b.Power), } } func (b Target) New(props BlockProperties) Block { return Target{ Power: atoi(props["power"]), } } ================================================ FILE: server/world/block/terracotta.go ================================================ package block type Terracotta struct { } func (b Terracotta) Encode() (string, BlockProperties) { return "minecraft:terracotta", BlockProperties{} } func (b Terracotta) New(props BlockProperties) Block { return Terracotta{} } ================================================ FILE: server/world/block/tintedGlass.go ================================================ package block type TintedGlass struct { } func (b TintedGlass) Encode() (string, BlockProperties) { return "minecraft:tinted_glass", BlockProperties{} } func (b TintedGlass) New(props BlockProperties) Block { return TintedGlass{} } ================================================ FILE: server/world/block/tnt.go ================================================ package block import ( "strconv" ) type Tnt struct { Unstable bool } func (b Tnt) Encode() (string, BlockProperties) { return "minecraft:tnt", BlockProperties{ "unstable": strconv.FormatBool(b.Unstable), } } func (b Tnt) New(props BlockProperties) Block { return Tnt{ Unstable: props["unstable"] != "false", } } ================================================ FILE: server/world/block/torch.go ================================================ package block type Torch struct { } func (b Torch) Encode() (string, BlockProperties) { return "minecraft:torch", BlockProperties{} } func (b Torch) New(props BlockProperties) Block { return Torch{} } ================================================ FILE: server/world/block/torchflower.go ================================================ package block type Torchflower struct { } func (b Torchflower) Encode() (string, BlockProperties) { return "minecraft:torchflower", BlockProperties{} } func (b Torchflower) New(props BlockProperties) Block { return Torchflower{} } ================================================ FILE: server/world/block/torchflowerCrop.go ================================================ package block import ( "strconv" ) type TorchflowerCrop struct { Age int } func (b TorchflowerCrop) Encode() (string, BlockProperties) { return "minecraft:torchflower_crop", BlockProperties{ "age": strconv.Itoa(b.Age), } } func (b TorchflowerCrop) New(props BlockProperties) Block { return TorchflowerCrop{ Age: atoi(props["age"]), } } ================================================ FILE: server/world/block/trappedChest.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type TrappedChest struct { Waterlogged bool Type string Facing string } func (b TrappedChest) Encode() (string, BlockProperties) { return "minecraft:trapped_chest", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "type": b.Type, "facing": b.Facing, } } func (b TrappedChest) New(props BlockProperties) Block { return TrappedChest{ Waterlogged: props["waterlogged"] != "false", Type: props["type"], Facing: props["facing"], } } func (b TrappedChest) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:trapped_chest", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/trialSpawner.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type TrialSpawner struct { TrialSpawnerState string Ominous bool } func (b TrialSpawner) Encode() (string, BlockProperties) { return "minecraft:trial_spawner", BlockProperties{ "ominous": strconv.FormatBool(b.Ominous), "trial_spawner_state": b.TrialSpawnerState, } } func (b TrialSpawner) New(props BlockProperties) Block { return TrialSpawner{ Ominous: props["ominous"] != "false", TrialSpawnerState: props["trial_spawner_state"], } } func (b TrialSpawner) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:trial_spawner", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/tripwire.go ================================================ package block import ( "strconv" ) type Tripwire struct { East bool North bool Powered bool South bool West bool Attached bool Disarmed bool } func (b Tripwire) Encode() (string, BlockProperties) { return "minecraft:tripwire", BlockProperties{ "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), "powered": strconv.FormatBool(b.Powered), "south": strconv.FormatBool(b.South), "west": strconv.FormatBool(b.West), "attached": strconv.FormatBool(b.Attached), "disarmed": strconv.FormatBool(b.Disarmed), } } func (b Tripwire) New(props BlockProperties) Block { return Tripwire{ North: props["north"] != "false", Powered: props["powered"] != "false", South: props["south"] != "false", West: props["west"] != "false", Attached: props["attached"] != "false", Disarmed: props["disarmed"] != "false", East: props["east"] != "false", } } ================================================ FILE: server/world/block/tripwireHook.go ================================================ package block import ( "strconv" ) type TripwireHook struct { Powered bool Attached bool Facing string } func (b TripwireHook) Encode() (string, BlockProperties) { return "minecraft:tripwire_hook", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "attached": strconv.FormatBool(b.Attached), "facing": b.Facing, } } func (b TripwireHook) New(props BlockProperties) Block { return TripwireHook{ Facing: props["facing"], Powered: props["powered"] != "false", Attached: props["attached"] != "false", } } ================================================ FILE: server/world/block/tubeCoral.go ================================================ package block import ( "strconv" ) type TubeCoral struct { Waterlogged bool } func (b TubeCoral) Encode() (string, BlockProperties) { return "minecraft:tube_coral", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b TubeCoral) New(props BlockProperties) Block { return TubeCoral{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/tubeCoralBlock.go ================================================ package block type TubeCoralBlock struct { } func (b TubeCoralBlock) Encode() (string, BlockProperties) { return "minecraft:tube_coral_block", BlockProperties{} } func (b TubeCoralBlock) New(props BlockProperties) Block { return TubeCoralBlock{} } ================================================ FILE: server/world/block/tubeCoralFan.go ================================================ package block import ( "strconv" ) type TubeCoralFan struct { Waterlogged bool } func (b TubeCoralFan) Encode() (string, BlockProperties) { return "minecraft:tube_coral_fan", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b TubeCoralFan) New(props BlockProperties) Block { return TubeCoralFan{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/tubeCoralWallFan.go ================================================ package block import ( "strconv" ) type TubeCoralWallFan struct { Waterlogged bool Facing string } func (b TubeCoralWallFan) Encode() (string, BlockProperties) { return "minecraft:tube_coral_wall_fan", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b TubeCoralWallFan) New(props BlockProperties) Block { return TubeCoralWallFan{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/tuff.go ================================================ package block type Tuff struct { } func (b Tuff) Encode() (string, BlockProperties) { return "minecraft:tuff", BlockProperties{} } func (b Tuff) New(props BlockProperties) Block { return Tuff{} } ================================================ FILE: server/world/block/tuffBrickSlab.go ================================================ package block import ( "strconv" ) type TuffBrickSlab struct { Type string Waterlogged bool } func (b TuffBrickSlab) Encode() (string, BlockProperties) { return "minecraft:tuff_brick_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b TuffBrickSlab) New(props BlockProperties) Block { return TuffBrickSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/tuffBrickStairs.go ================================================ package block import ( "strconv" ) type TuffBrickStairs struct { Facing string Half string Shape string Waterlogged bool } func (b TuffBrickStairs) Encode() (string, BlockProperties) { return "minecraft:tuff_brick_stairs", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, "shape": b.Shape, } } func (b TuffBrickStairs) New(props BlockProperties) Block { return TuffBrickStairs{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Shape: props["shape"], } } ================================================ FILE: server/world/block/tuffBrickWall.go ================================================ package block import ( "strconv" ) type TuffBrickWall struct { North string South string Up bool Waterlogged bool West string East string } func (b TuffBrickWall) Encode() (string, BlockProperties) { return "minecraft:tuff_brick_wall", BlockProperties{ "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, "east": b.East, "north": b.North, "south": b.South, } } func (b TuffBrickWall) New(props BlockProperties) Block { return TuffBrickWall{ North: props["north"], South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], East: props["east"], } } ================================================ FILE: server/world/block/tuffBricks.go ================================================ package block type TuffBricks struct { } func (b TuffBricks) Encode() (string, BlockProperties) { return "minecraft:tuff_bricks", BlockProperties{} } func (b TuffBricks) New(props BlockProperties) Block { return TuffBricks{} } ================================================ FILE: server/world/block/tuffSlab.go ================================================ package block import ( "strconv" ) type TuffSlab struct { Type string Waterlogged bool } func (b TuffSlab) Encode() (string, BlockProperties) { return "minecraft:tuff_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b TuffSlab) New(props BlockProperties) Block { return TuffSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/tuffStairs.go ================================================ package block import ( "strconv" ) type TuffStairs struct { Waterlogged bool Facing string Half string Shape string } func (b TuffStairs) Encode() (string, BlockProperties) { return "minecraft:tuff_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b TuffStairs) New(props BlockProperties) Block { return TuffStairs{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Shape: props["shape"], } } ================================================ FILE: server/world/block/tuffWall.go ================================================ package block import ( "strconv" ) type TuffWall struct { West string East string North string South string Up bool Waterlogged bool } func (b TuffWall) Encode() (string, BlockProperties) { return "minecraft:tuff_wall", BlockProperties{ "east": b.East, "north": b.North, "south": b.South, "up": strconv.FormatBool(b.Up), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": b.West, } } func (b TuffWall) New(props BlockProperties) Block { return TuffWall{ North: props["north"], South: props["south"], Up: props["up"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"], East: props["east"], } } ================================================ FILE: server/world/block/turtleEgg.go ================================================ package block import ( "strconv" ) type TurtleEgg struct { Eggs int Hatch int } func (b TurtleEgg) Encode() (string, BlockProperties) { return "minecraft:turtle_egg", BlockProperties{ "eggs": strconv.Itoa(b.Eggs), "hatch": strconv.Itoa(b.Hatch), } } func (b TurtleEgg) New(props BlockProperties) Block { return TurtleEgg{ Eggs: atoi(props["eggs"]), Hatch: atoi(props["hatch"]), } } ================================================ FILE: server/world/block/twistingVines.go ================================================ package block import ( "strconv" ) type TwistingVines struct { Age int } func (b TwistingVines) Encode() (string, BlockProperties) { return "minecraft:twisting_vines", BlockProperties{ "age": strconv.Itoa(b.Age), } } func (b TwistingVines) New(props BlockProperties) Block { return TwistingVines{ Age: atoi(props["age"]), } } ================================================ FILE: server/world/block/twistingVinesPlant.go ================================================ package block type TwistingVinesPlant struct { } func (b TwistingVinesPlant) Encode() (string, BlockProperties) { return "minecraft:twisting_vines_plant", BlockProperties{} } func (b TwistingVinesPlant) New(props BlockProperties) Block { return TwistingVinesPlant{} } ================================================ FILE: server/world/block/vault.go ================================================ package block import ( "strconv" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type Vault struct { Facing string Ominous bool VaultState string } func (b Vault) Encode() (string, BlockProperties) { return "minecraft:vault", BlockProperties{ "facing": b.Facing, "ominous": strconv.FormatBool(b.Ominous), "vault_state": b.VaultState, } } func (b Vault) New(props BlockProperties) Block { return Vault{ Facing: props["facing"], Ominous: props["ominous"] != "false", VaultState: props["vault_state"], } } func (b Vault) BlockEntity(pos pos.BlockPosition) chunk.BlockEntity { return chunk.BlockEntity{ Id: "minecraft:vault", X: pos.X(), Y: pos.Y(), Z: pos.Z(), } } ================================================ FILE: server/world/block/verdantFroglight.go ================================================ package block type VerdantFroglight struct { Axis string } func (b VerdantFroglight) Encode() (string, BlockProperties) { return "minecraft:verdant_froglight", BlockProperties{ "axis": b.Axis, } } func (b VerdantFroglight) New(props BlockProperties) Block { return VerdantFroglight{ Axis: props["axis"], } } ================================================ FILE: server/world/block/vine.go ================================================ package block import ( "strconv" ) type Vine struct { North bool South bool Up bool West bool East bool } func (b Vine) Encode() (string, BlockProperties) { return "minecraft:vine", BlockProperties{ "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "up": strconv.FormatBool(b.Up), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), } } func (b Vine) New(props BlockProperties) Block { return Vine{ North: props["north"] != "false", South: props["south"] != "false", Up: props["up"] != "false", West: props["west"] != "false", East: props["east"] != "false", } } ================================================ FILE: server/world/block/voidAir.go ================================================ package block type VoidAir struct { } func (b VoidAir) Encode() (string, BlockProperties) { return "minecraft:void_air", BlockProperties{} } func (b VoidAir) New(props BlockProperties) Block { return VoidAir{} } ================================================ FILE: server/world/block/wallTorch.go ================================================ package block type WallTorch struct { Facing string } func (b WallTorch) Encode() (string, BlockProperties) { return "minecraft:wall_torch", BlockProperties{ "facing": b.Facing, } } func (b WallTorch) New(props BlockProperties) Block { return WallTorch{ Facing: props["facing"], } } ================================================ FILE: server/world/block/warpedButton.go ================================================ package block import ( "strconv" ) type WarpedButton struct { Facing string Powered bool Face string } func (b WarpedButton) Encode() (string, BlockProperties) { return "minecraft:warped_button", BlockProperties{ "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), "face": b.Face, } } func (b WarpedButton) New(props BlockProperties) Block { return WarpedButton{ Facing: props["facing"], Powered: props["powered"] != "false", Face: props["face"], } } ================================================ FILE: server/world/block/warpedDoor.go ================================================ package block import ( "strconv" ) type WarpedDoor struct { Powered bool Facing string Half string Hinge string Open bool } func (b WarpedDoor) Encode() (string, BlockProperties) { return "minecraft:warped_door", BlockProperties{ "facing": b.Facing, "half": b.Half, "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), } } func (b WarpedDoor) New(props BlockProperties) Block { return WarpedDoor{ Facing: props["facing"], Half: props["half"], Hinge: props["hinge"], Open: props["open"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/warpedFence.go ================================================ package block import ( "strconv" ) type WarpedFence struct { West bool East bool North bool South bool Waterlogged bool } func (b WarpedFence) Encode() (string, BlockProperties) { return "minecraft:warped_fence", BlockProperties{ "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), } } func (b WarpedFence) New(props BlockProperties) Block { return WarpedFence{ Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", South: props["south"] != "false", } } ================================================ FILE: server/world/block/warpedFenceGate.go ================================================ package block import ( "strconv" ) type WarpedFenceGate struct { Facing string InWall bool Open bool Powered bool } func (b WarpedFenceGate) Encode() (string, BlockProperties) { return "minecraft:warped_fence_gate", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, "in_wall": strconv.FormatBool(b.InWall), "open": strconv.FormatBool(b.Open), } } func (b WarpedFenceGate) New(props BlockProperties) Block { return WarpedFenceGate{ Facing: props["facing"], InWall: props["in_wall"] != "false", Open: props["open"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/warpedFungus.go ================================================ package block type WarpedFungus struct { } func (b WarpedFungus) Encode() (string, BlockProperties) { return "minecraft:warped_fungus", BlockProperties{} } func (b WarpedFungus) New(props BlockProperties) Block { return WarpedFungus{} } ================================================ FILE: server/world/block/warpedHangingSign.go ================================================ package block import ( "strconv" ) type WarpedHangingSign struct { Attached bool Rotation int Waterlogged bool } func (b WarpedHangingSign) Encode() (string, BlockProperties) { return "minecraft:warped_hanging_sign", BlockProperties{ "attached": strconv.FormatBool(b.Attached), "rotation": strconv.Itoa(b.Rotation), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WarpedHangingSign) New(props BlockProperties) Block { return WarpedHangingSign{ Attached: props["attached"] != "false", Rotation: atoi(props["rotation"]), Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/warpedHyphae.go ================================================ package block type WarpedHyphae struct { Axis string } func (b WarpedHyphae) Encode() (string, BlockProperties) { return "minecraft:warped_hyphae", BlockProperties{ "axis": b.Axis, } } func (b WarpedHyphae) New(props BlockProperties) Block { return WarpedHyphae{ Axis: props["axis"], } } ================================================ FILE: server/world/block/warpedNylium.go ================================================ package block type WarpedNylium struct { } func (b WarpedNylium) Encode() (string, BlockProperties) { return "minecraft:warped_nylium", BlockProperties{} } func (b WarpedNylium) New(props BlockProperties) Block { return WarpedNylium{} } ================================================ FILE: server/world/block/warpedPlanks.go ================================================ package block type WarpedPlanks struct { } func (b WarpedPlanks) Encode() (string, BlockProperties) { return "minecraft:warped_planks", BlockProperties{} } func (b WarpedPlanks) New(props BlockProperties) Block { return WarpedPlanks{} } ================================================ FILE: server/world/block/warpedPressurePlate.go ================================================ package block import ( "strconv" ) type WarpedPressurePlate struct { Powered bool } func (b WarpedPressurePlate) Encode() (string, BlockProperties) { return "minecraft:warped_pressure_plate", BlockProperties{ "powered": strconv.FormatBool(b.Powered), } } func (b WarpedPressurePlate) New(props BlockProperties) Block { return WarpedPressurePlate{ Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/warpedRoots.go ================================================ package block type WarpedRoots struct { } func (b WarpedRoots) Encode() (string, BlockProperties) { return "minecraft:warped_roots", BlockProperties{} } func (b WarpedRoots) New(props BlockProperties) Block { return WarpedRoots{} } ================================================ FILE: server/world/block/warpedSign.go ================================================ package block import ( "strconv" ) type WarpedSign struct { Waterlogged bool Rotation int } func (b WarpedSign) Encode() (string, BlockProperties) { return "minecraft:warped_sign", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "rotation": strconv.Itoa(b.Rotation), } } func (b WarpedSign) New(props BlockProperties) Block { return WarpedSign{ Rotation: atoi(props["rotation"]), Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/warpedSlab.go ================================================ package block import ( "strconv" ) type WarpedSlab struct { Type string Waterlogged bool } func (b WarpedSlab) Encode() (string, BlockProperties) { return "minecraft:warped_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WarpedSlab) New(props BlockProperties) Block { return WarpedSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/warpedStairs.go ================================================ package block import ( "strconv" ) type WarpedStairs struct { Facing string Half string Shape string Waterlogged bool } func (b WarpedStairs) Encode() (string, BlockProperties) { return "minecraft:warped_stairs", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, "shape": b.Shape, } } func (b WarpedStairs) New(props BlockProperties) Block { return WarpedStairs{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Shape: props["shape"], } } ================================================ FILE: server/world/block/warpedStem.go ================================================ package block type WarpedStem struct { Axis string } func (b WarpedStem) Encode() (string, BlockProperties) { return "minecraft:warped_stem", BlockProperties{ "axis": b.Axis, } } func (b WarpedStem) New(props BlockProperties) Block { return WarpedStem{ Axis: props["axis"], } } ================================================ FILE: server/world/block/warpedTrapdoor.go ================================================ package block import ( "strconv" ) type WarpedTrapdoor struct { Half string Open bool Powered bool Waterlogged bool Facing string } func (b WarpedTrapdoor) Encode() (string, BlockProperties) { return "minecraft:warped_trapdoor", BlockProperties{ "half": b.Half, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b WarpedTrapdoor) New(props BlockProperties) Block { return WarpedTrapdoor{ Facing: props["facing"], Half: props["half"], Open: props["open"] != "false", Powered: props["powered"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/warpedWallHangingSign.go ================================================ package block import ( "strconv" ) type WarpedWallHangingSign struct { Facing string Waterlogged bool } func (b WarpedWallHangingSign) Encode() (string, BlockProperties) { return "minecraft:warped_wall_hanging_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WarpedWallHangingSign) New(props BlockProperties) Block { return WarpedWallHangingSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/warpedWallSign.go ================================================ package block import ( "strconv" ) type WarpedWallSign struct { Facing string Waterlogged bool } func (b WarpedWallSign) Encode() (string, BlockProperties) { return "minecraft:warped_wall_sign", BlockProperties{ "facing": b.Facing, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WarpedWallSign) New(props BlockProperties) Block { return WarpedWallSign{ Facing: props["facing"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/warpedWartBlock.go ================================================ package block type WarpedWartBlock struct { } func (b WarpedWartBlock) Encode() (string, BlockProperties) { return "minecraft:warped_wart_block", BlockProperties{} } func (b WarpedWartBlock) New(props BlockProperties) Block { return WarpedWartBlock{} } ================================================ FILE: server/world/block/water.go ================================================ package block import ( "strconv" ) type Water struct { Level int } func (b Water) Encode() (string, BlockProperties) { return "minecraft:water", BlockProperties{ "level": strconv.Itoa(b.Level), } } func (b Water) New(props BlockProperties) Block { return Water{ Level: atoi(props["level"]), } } ================================================ FILE: server/world/block/waterCauldron.go ================================================ package block import ( "strconv" ) type WaterCauldron struct { Level int } func (b WaterCauldron) Encode() (string, BlockProperties) { return "minecraft:water_cauldron", BlockProperties{ "level": strconv.Itoa(b.Level), } } func (b WaterCauldron) New(props BlockProperties) Block { return WaterCauldron{ Level: atoi(props["level"]), } } ================================================ FILE: server/world/block/waxedChiseledCopper.go ================================================ package block type WaxedChiseledCopper struct { } func (b WaxedChiseledCopper) Encode() (string, BlockProperties) { return "minecraft:waxed_chiseled_copper", BlockProperties{} } func (b WaxedChiseledCopper) New(props BlockProperties) Block { return WaxedChiseledCopper{} } ================================================ FILE: server/world/block/waxedCopperBlock.go ================================================ package block type WaxedCopperBlock struct { } func (b WaxedCopperBlock) Encode() (string, BlockProperties) { return "minecraft:waxed_copper_block", BlockProperties{} } func (b WaxedCopperBlock) New(props BlockProperties) Block { return WaxedCopperBlock{} } ================================================ FILE: server/world/block/waxedCopperBulb.go ================================================ package block import ( "strconv" ) type WaxedCopperBulb struct { Lit bool Powered bool } func (b WaxedCopperBulb) Encode() (string, BlockProperties) { return "minecraft:waxed_copper_bulb", BlockProperties{ "lit": strconv.FormatBool(b.Lit), "powered": strconv.FormatBool(b.Powered), } } func (b WaxedCopperBulb) New(props BlockProperties) Block { return WaxedCopperBulb{ Powered: props["powered"] != "false", Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/waxedCopperDoor.go ================================================ package block import ( "strconv" ) type WaxedCopperDoor struct { Open bool Powered bool Facing string Half string Hinge string } func (b WaxedCopperDoor) Encode() (string, BlockProperties) { return "minecraft:waxed_copper_door", BlockProperties{ "facing": b.Facing, "half": b.Half, "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), } } func (b WaxedCopperDoor) New(props BlockProperties) Block { return WaxedCopperDoor{ Powered: props["powered"] != "false", Facing: props["facing"], Half: props["half"], Hinge: props["hinge"], Open: props["open"] != "false", } } ================================================ FILE: server/world/block/waxedCopperGrate.go ================================================ package block import ( "strconv" ) type WaxedCopperGrate struct { Waterlogged bool } func (b WaxedCopperGrate) Encode() (string, BlockProperties) { return "minecraft:waxed_copper_grate", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WaxedCopperGrate) New(props BlockProperties) Block { return WaxedCopperGrate{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/waxedCopperTrapdoor.go ================================================ package block import ( "strconv" ) type WaxedCopperTrapdoor struct { Waterlogged bool Facing string Half string Open bool Powered bool } func (b WaxedCopperTrapdoor) Encode() (string, BlockProperties) { return "minecraft:waxed_copper_trapdoor", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, "open": strconv.FormatBool(b.Open), } } func (b WaxedCopperTrapdoor) New(props BlockProperties) Block { return WaxedCopperTrapdoor{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Open: props["open"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/waxedCutCopper.go ================================================ package block type WaxedCutCopper struct { } func (b WaxedCutCopper) Encode() (string, BlockProperties) { return "minecraft:waxed_cut_copper", BlockProperties{} } func (b WaxedCutCopper) New(props BlockProperties) Block { return WaxedCutCopper{} } ================================================ FILE: server/world/block/waxedCutCopperSlab.go ================================================ package block import ( "strconv" ) type WaxedCutCopperSlab struct { Waterlogged bool Type string } func (b WaxedCutCopperSlab) Encode() (string, BlockProperties) { return "minecraft:waxed_cut_copper_slab", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), "type": b.Type, } } func (b WaxedCutCopperSlab) New(props BlockProperties) Block { return WaxedCutCopperSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/waxedCutCopperStairs.go ================================================ package block import ( "strconv" ) type WaxedCutCopperStairs struct { Facing string Half string Shape string Waterlogged bool } func (b WaxedCutCopperStairs) Encode() (string, BlockProperties) { return "minecraft:waxed_cut_copper_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WaxedCutCopperStairs) New(props BlockProperties) Block { return WaxedCutCopperStairs{ Facing: props["facing"], Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/waxedExposedChiseledCopper.go ================================================ package block type WaxedExposedChiseledCopper struct { } func (b WaxedExposedChiseledCopper) Encode() (string, BlockProperties) { return "minecraft:waxed_exposed_chiseled_copper", BlockProperties{} } func (b WaxedExposedChiseledCopper) New(props BlockProperties) Block { return WaxedExposedChiseledCopper{} } ================================================ FILE: server/world/block/waxedExposedCopper.go ================================================ package block type WaxedExposedCopper struct { } func (b WaxedExposedCopper) Encode() (string, BlockProperties) { return "minecraft:waxed_exposed_copper", BlockProperties{} } func (b WaxedExposedCopper) New(props BlockProperties) Block { return WaxedExposedCopper{} } ================================================ FILE: server/world/block/waxedExposedCopperBulb.go ================================================ package block import ( "strconv" ) type WaxedExposedCopperBulb struct { Lit bool Powered bool } func (b WaxedExposedCopperBulb) Encode() (string, BlockProperties) { return "minecraft:waxed_exposed_copper_bulb", BlockProperties{ "lit": strconv.FormatBool(b.Lit), "powered": strconv.FormatBool(b.Powered), } } func (b WaxedExposedCopperBulb) New(props BlockProperties) Block { return WaxedExposedCopperBulb{ Lit: props["lit"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/waxedExposedCopperDoor.go ================================================ package block import ( "strconv" ) type WaxedExposedCopperDoor struct { Facing string Half string Hinge string Open bool Powered bool } func (b WaxedExposedCopperDoor) Encode() (string, BlockProperties) { return "minecraft:waxed_exposed_copper_door", BlockProperties{ "facing": b.Facing, "half": b.Half, "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), } } func (b WaxedExposedCopperDoor) New(props BlockProperties) Block { return WaxedExposedCopperDoor{ Half: props["half"], Hinge: props["hinge"], Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/waxedExposedCopperGrate.go ================================================ package block import ( "strconv" ) type WaxedExposedCopperGrate struct { Waterlogged bool } func (b WaxedExposedCopperGrate) Encode() (string, BlockProperties) { return "minecraft:waxed_exposed_copper_grate", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WaxedExposedCopperGrate) New(props BlockProperties) Block { return WaxedExposedCopperGrate{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/waxedExposedCopperTrapdoor.go ================================================ package block import ( "strconv" ) type WaxedExposedCopperTrapdoor struct { Facing string Half string Open bool Powered bool Waterlogged bool } func (b WaxedExposedCopperTrapdoor) Encode() (string, BlockProperties) { return "minecraft:waxed_exposed_copper_trapdoor", BlockProperties{ "half": b.Half, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b WaxedExposedCopperTrapdoor) New(props BlockProperties) Block { return WaxedExposedCopperTrapdoor{ Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], Open: props["open"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/waxedExposedCutCopper.go ================================================ package block type WaxedExposedCutCopper struct { } func (b WaxedExposedCutCopper) Encode() (string, BlockProperties) { return "minecraft:waxed_exposed_cut_copper", BlockProperties{} } func (b WaxedExposedCutCopper) New(props BlockProperties) Block { return WaxedExposedCutCopper{} } ================================================ FILE: server/world/block/waxedExposedCutCopperSlab.go ================================================ package block import ( "strconv" ) type WaxedExposedCutCopperSlab struct { Type string Waterlogged bool } func (b WaxedExposedCutCopperSlab) Encode() (string, BlockProperties) { return "minecraft:waxed_exposed_cut_copper_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WaxedExposedCutCopperSlab) New(props BlockProperties) Block { return WaxedExposedCutCopperSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/waxedExposedCutCopperStairs.go ================================================ package block import ( "strconv" ) type WaxedExposedCutCopperStairs struct { Half string Shape string Waterlogged bool Facing string } func (b WaxedExposedCutCopperStairs) Encode() (string, BlockProperties) { return "minecraft:waxed_exposed_cut_copper_stairs", BlockProperties{ "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b WaxedExposedCutCopperStairs) New(props BlockProperties) Block { return WaxedExposedCutCopperStairs{ Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], } } ================================================ FILE: server/world/block/waxedOxidizedChiseledCopper.go ================================================ package block type WaxedOxidizedChiseledCopper struct { } func (b WaxedOxidizedChiseledCopper) Encode() (string, BlockProperties) { return "minecraft:waxed_oxidized_chiseled_copper", BlockProperties{} } func (b WaxedOxidizedChiseledCopper) New(props BlockProperties) Block { return WaxedOxidizedChiseledCopper{} } ================================================ FILE: server/world/block/waxedOxidizedCopper.go ================================================ package block type WaxedOxidizedCopper struct { } func (b WaxedOxidizedCopper) Encode() (string, BlockProperties) { return "minecraft:waxed_oxidized_copper", BlockProperties{} } func (b WaxedOxidizedCopper) New(props BlockProperties) Block { return WaxedOxidizedCopper{} } ================================================ FILE: server/world/block/waxedOxidizedCopperBulb.go ================================================ package block import ( "strconv" ) type WaxedOxidizedCopperBulb struct { Lit bool Powered bool } func (b WaxedOxidizedCopperBulb) Encode() (string, BlockProperties) { return "minecraft:waxed_oxidized_copper_bulb", BlockProperties{ "lit": strconv.FormatBool(b.Lit), "powered": strconv.FormatBool(b.Powered), } } func (b WaxedOxidizedCopperBulb) New(props BlockProperties) Block { return WaxedOxidizedCopperBulb{ Lit: props["lit"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/waxedOxidizedCopperDoor.go ================================================ package block import ( "strconv" ) type WaxedOxidizedCopperDoor struct { Hinge string Open bool Powered bool Facing string Half string } func (b WaxedOxidizedCopperDoor) Encode() (string, BlockProperties) { return "minecraft:waxed_oxidized_copper_door", BlockProperties{ "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, "half": b.Half, } } func (b WaxedOxidizedCopperDoor) New(props BlockProperties) Block { return WaxedOxidizedCopperDoor{ Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], Half: props["half"], Hinge: props["hinge"], } } ================================================ FILE: server/world/block/waxedOxidizedCopperGrate.go ================================================ package block import ( "strconv" ) type WaxedOxidizedCopperGrate struct { Waterlogged bool } func (b WaxedOxidizedCopperGrate) Encode() (string, BlockProperties) { return "minecraft:waxed_oxidized_copper_grate", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WaxedOxidizedCopperGrate) New(props BlockProperties) Block { return WaxedOxidizedCopperGrate{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/waxedOxidizedCopperTrapdoor.go ================================================ package block import ( "strconv" ) type WaxedOxidizedCopperTrapdoor struct { Facing string Half string Open bool Powered bool Waterlogged bool } func (b WaxedOxidizedCopperTrapdoor) Encode() (string, BlockProperties) { return "minecraft:waxed_oxidized_copper_trapdoor", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, "open": strconv.FormatBool(b.Open), } } func (b WaxedOxidizedCopperTrapdoor) New(props BlockProperties) Block { return WaxedOxidizedCopperTrapdoor{ Facing: props["facing"], Half: props["half"], Open: props["open"] != "false", Powered: props["powered"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/waxedOxidizedCutCopper.go ================================================ package block type WaxedOxidizedCutCopper struct { } func (b WaxedOxidizedCutCopper) Encode() (string, BlockProperties) { return "minecraft:waxed_oxidized_cut_copper", BlockProperties{} } func (b WaxedOxidizedCutCopper) New(props BlockProperties) Block { return WaxedOxidizedCutCopper{} } ================================================ FILE: server/world/block/waxedOxidizedCutCopperSlab.go ================================================ package block import ( "strconv" ) type WaxedOxidizedCutCopperSlab struct { Type string Waterlogged bool } func (b WaxedOxidizedCutCopperSlab) Encode() (string, BlockProperties) { return "minecraft:waxed_oxidized_cut_copper_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WaxedOxidizedCutCopperSlab) New(props BlockProperties) Block { return WaxedOxidizedCutCopperSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/waxedOxidizedCutCopperStairs.go ================================================ package block import ( "strconv" ) type WaxedOxidizedCutCopperStairs struct { Facing string Half string Shape string Waterlogged bool } func (b WaxedOxidizedCutCopperStairs) Encode() (string, BlockProperties) { return "minecraft:waxed_oxidized_cut_copper_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WaxedOxidizedCutCopperStairs) New(props BlockProperties) Block { return WaxedOxidizedCutCopperStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/waxedWeatheredChiseledCopper.go ================================================ package block type WaxedWeatheredChiseledCopper struct { } func (b WaxedWeatheredChiseledCopper) Encode() (string, BlockProperties) { return "minecraft:waxed_weathered_chiseled_copper", BlockProperties{} } func (b WaxedWeatheredChiseledCopper) New(props BlockProperties) Block { return WaxedWeatheredChiseledCopper{} } ================================================ FILE: server/world/block/waxedWeatheredCopper.go ================================================ package block type WaxedWeatheredCopper struct { } func (b WaxedWeatheredCopper) Encode() (string, BlockProperties) { return "minecraft:waxed_weathered_copper", BlockProperties{} } func (b WaxedWeatheredCopper) New(props BlockProperties) Block { return WaxedWeatheredCopper{} } ================================================ FILE: server/world/block/waxedWeatheredCopperBulb.go ================================================ package block import ( "strconv" ) type WaxedWeatheredCopperBulb struct { Lit bool Powered bool } func (b WaxedWeatheredCopperBulb) Encode() (string, BlockProperties) { return "minecraft:waxed_weathered_copper_bulb", BlockProperties{ "lit": strconv.FormatBool(b.Lit), "powered": strconv.FormatBool(b.Powered), } } func (b WaxedWeatheredCopperBulb) New(props BlockProperties) Block { return WaxedWeatheredCopperBulb{ Lit: props["lit"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/waxedWeatheredCopperDoor.go ================================================ package block import ( "strconv" ) type WaxedWeatheredCopperDoor struct { Hinge string Open bool Powered bool Facing string Half string } func (b WaxedWeatheredCopperDoor) Encode() (string, BlockProperties) { return "minecraft:waxed_weathered_copper_door", BlockProperties{ "facing": b.Facing, "half": b.Half, "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), } } func (b WaxedWeatheredCopperDoor) New(props BlockProperties) Block { return WaxedWeatheredCopperDoor{ Facing: props["facing"], Half: props["half"], Hinge: props["hinge"], Open: props["open"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/waxedWeatheredCopperGrate.go ================================================ package block import ( "strconv" ) type WaxedWeatheredCopperGrate struct { Waterlogged bool } func (b WaxedWeatheredCopperGrate) Encode() (string, BlockProperties) { return "minecraft:waxed_weathered_copper_grate", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WaxedWeatheredCopperGrate) New(props BlockProperties) Block { return WaxedWeatheredCopperGrate{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/waxedWeatheredCopperTrapdoor.go ================================================ package block import ( "strconv" ) type WaxedWeatheredCopperTrapdoor struct { Waterlogged bool Facing string Half string Open bool Powered bool } func (b WaxedWeatheredCopperTrapdoor) Encode() (string, BlockProperties) { return "minecraft:waxed_weathered_copper_trapdoor", BlockProperties{ "half": b.Half, "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, } } func (b WaxedWeatheredCopperTrapdoor) New(props BlockProperties) Block { return WaxedWeatheredCopperTrapdoor{ Open: props["open"] != "false", Powered: props["powered"] != "false", Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/waxedWeatheredCutCopper.go ================================================ package block type WaxedWeatheredCutCopper struct { } func (b WaxedWeatheredCutCopper) Encode() (string, BlockProperties) { return "minecraft:waxed_weathered_cut_copper", BlockProperties{} } func (b WaxedWeatheredCutCopper) New(props BlockProperties) Block { return WaxedWeatheredCutCopper{} } ================================================ FILE: server/world/block/waxedWeatheredCutCopperSlab.go ================================================ package block import ( "strconv" ) type WaxedWeatheredCutCopperSlab struct { Type string Waterlogged bool } func (b WaxedWeatheredCutCopperSlab) Encode() (string, BlockProperties) { return "minecraft:waxed_weathered_cut_copper_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WaxedWeatheredCutCopperSlab) New(props BlockProperties) Block { return WaxedWeatheredCutCopperSlab{ Type: props["type"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/waxedWeatheredCutCopperStairs.go ================================================ package block import ( "strconv" ) type WaxedWeatheredCutCopperStairs struct { Waterlogged bool Facing string Half string Shape string } func (b WaxedWeatheredCutCopperStairs) Encode() (string, BlockProperties) { return "minecraft:waxed_weathered_cut_copper_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WaxedWeatheredCutCopperStairs) New(props BlockProperties) Block { return WaxedWeatheredCutCopperStairs{ Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/weatheredChiseledCopper.go ================================================ package block type WeatheredChiseledCopper struct { } func (b WeatheredChiseledCopper) Encode() (string, BlockProperties) { return "minecraft:weathered_chiseled_copper", BlockProperties{} } func (b WeatheredChiseledCopper) New(props BlockProperties) Block { return WeatheredChiseledCopper{} } ================================================ FILE: server/world/block/weatheredCopper.go ================================================ package block type WeatheredCopper struct { } func (b WeatheredCopper) Encode() (string, BlockProperties) { return "minecraft:weathered_copper", BlockProperties{} } func (b WeatheredCopper) New(props BlockProperties) Block { return WeatheredCopper{} } ================================================ FILE: server/world/block/weatheredCopperBulb.go ================================================ package block import ( "strconv" ) type WeatheredCopperBulb struct { Lit bool Powered bool } func (b WeatheredCopperBulb) Encode() (string, BlockProperties) { return "minecraft:weathered_copper_bulb", BlockProperties{ "lit": strconv.FormatBool(b.Lit), "powered": strconv.FormatBool(b.Powered), } } func (b WeatheredCopperBulb) New(props BlockProperties) Block { return WeatheredCopperBulb{ Lit: props["lit"] != "false", Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/weatheredCopperDoor.go ================================================ package block import ( "strconv" ) type WeatheredCopperDoor struct { Powered bool Facing string Half string Hinge string Open bool } func (b WeatheredCopperDoor) Encode() (string, BlockProperties) { return "minecraft:weathered_copper_door", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "facing": b.Facing, "half": b.Half, "hinge": b.Hinge, "open": strconv.FormatBool(b.Open), } } func (b WeatheredCopperDoor) New(props BlockProperties) Block { return WeatheredCopperDoor{ Hinge: props["hinge"], Open: props["open"] != "false", Powered: props["powered"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/weatheredCopperGrate.go ================================================ package block import ( "strconv" ) type WeatheredCopperGrate struct { Waterlogged bool } func (b WeatheredCopperGrate) Encode() (string, BlockProperties) { return "minecraft:weathered_copper_grate", BlockProperties{ "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WeatheredCopperGrate) New(props BlockProperties) Block { return WeatheredCopperGrate{ Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/weatheredCopperTrapdoor.go ================================================ package block import ( "strconv" ) type WeatheredCopperTrapdoor struct { Half string Open bool Powered bool Waterlogged bool Facing string } func (b WeatheredCopperTrapdoor) Encode() (string, BlockProperties) { return "minecraft:weathered_copper_trapdoor", BlockProperties{ "open": strconv.FormatBool(b.Open), "powered": strconv.FormatBool(b.Powered), "waterlogged": strconv.FormatBool(b.Waterlogged), "facing": b.Facing, "half": b.Half, } } func (b WeatheredCopperTrapdoor) New(props BlockProperties) Block { return WeatheredCopperTrapdoor{ Open: props["open"] != "false", Powered: props["powered"] != "false", Waterlogged: props["waterlogged"] != "false", Facing: props["facing"], Half: props["half"], } } ================================================ FILE: server/world/block/weatheredCutCopper.go ================================================ package block type WeatheredCutCopper struct { } func (b WeatheredCutCopper) Encode() (string, BlockProperties) { return "minecraft:weathered_cut_copper", BlockProperties{} } func (b WeatheredCutCopper) New(props BlockProperties) Block { return WeatheredCutCopper{} } ================================================ FILE: server/world/block/weatheredCutCopperSlab.go ================================================ package block import ( "strconv" ) type WeatheredCutCopperSlab struct { Type string Waterlogged bool } func (b WeatheredCutCopperSlab) Encode() (string, BlockProperties) { return "minecraft:weathered_cut_copper_slab", BlockProperties{ "type": b.Type, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WeatheredCutCopperSlab) New(props BlockProperties) Block { return WeatheredCutCopperSlab{ Waterlogged: props["waterlogged"] != "false", Type: props["type"], } } ================================================ FILE: server/world/block/weatheredCutCopperStairs.go ================================================ package block import ( "strconv" ) type WeatheredCutCopperStairs struct { Waterlogged bool Facing string Half string Shape string } func (b WeatheredCutCopperStairs) Encode() (string, BlockProperties) { return "minecraft:weathered_cut_copper_stairs", BlockProperties{ "facing": b.Facing, "half": b.Half, "shape": b.Shape, "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WeatheredCutCopperStairs) New(props BlockProperties) Block { return WeatheredCutCopperStairs{ Facing: props["facing"], Half: props["half"], Shape: props["shape"], Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/weepingVines.go ================================================ package block import ( "strconv" ) type WeepingVines struct { Age int } func (b WeepingVines) Encode() (string, BlockProperties) { return "minecraft:weeping_vines", BlockProperties{ "age": strconv.Itoa(b.Age), } } func (b WeepingVines) New(props BlockProperties) Block { return WeepingVines{ Age: atoi(props["age"]), } } ================================================ FILE: server/world/block/weepingVinesPlant.go ================================================ package block type WeepingVinesPlant struct { } func (b WeepingVinesPlant) Encode() (string, BlockProperties) { return "minecraft:weeping_vines_plant", BlockProperties{} } func (b WeepingVinesPlant) New(props BlockProperties) Block { return WeepingVinesPlant{} } ================================================ FILE: server/world/block/wetSponge.go ================================================ package block type WetSponge struct { } func (b WetSponge) Encode() (string, BlockProperties) { return "minecraft:wet_sponge", BlockProperties{} } func (b WetSponge) New(props BlockProperties) Block { return WetSponge{} } ================================================ FILE: server/world/block/wheat.go ================================================ package block import ( "strconv" ) type Wheat struct { Age int } func (b Wheat) Encode() (string, BlockProperties) { return "minecraft:wheat", BlockProperties{ "age": strconv.Itoa(b.Age), } } func (b Wheat) New(props BlockProperties) Block { return Wheat{ Age: atoi(props["age"]), } } ================================================ FILE: server/world/block/whiteBanner.go ================================================ package block import ( "strconv" ) type WhiteBanner struct { Rotation int } func (b WhiteBanner) Encode() (string, BlockProperties) { return "minecraft:white_banner", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), } } func (b WhiteBanner) New(props BlockProperties) Block { return WhiteBanner{ Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/whiteBed.go ================================================ package block import ( "strconv" ) type WhiteBed struct { Facing string Occupied bool Part string } func (b WhiteBed) Encode() (string, BlockProperties) { return "minecraft:white_bed", BlockProperties{ "part": b.Part, "facing": b.Facing, "occupied": strconv.FormatBool(b.Occupied), } } func (b WhiteBed) New(props BlockProperties) Block { return WhiteBed{ Facing: props["facing"], Occupied: props["occupied"] != "false", Part: props["part"], } } ================================================ FILE: server/world/block/whiteCandle.go ================================================ package block import ( "strconv" ) type WhiteCandle struct { Candles int Lit bool Waterlogged bool } func (b WhiteCandle) Encode() (string, BlockProperties) { return "minecraft:white_candle", BlockProperties{ "candles": strconv.Itoa(b.Candles), "lit": strconv.FormatBool(b.Lit), "waterlogged": strconv.FormatBool(b.Waterlogged), } } func (b WhiteCandle) New(props BlockProperties) Block { return WhiteCandle{ Lit: props["lit"] != "false", Waterlogged: props["waterlogged"] != "false", Candles: atoi(props["candles"]), } } ================================================ FILE: server/world/block/whiteCandleCake.go ================================================ package block import ( "strconv" ) type WhiteCandleCake struct { Lit bool } func (b WhiteCandleCake) Encode() (string, BlockProperties) { return "minecraft:white_candle_cake", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b WhiteCandleCake) New(props BlockProperties) Block { return WhiteCandleCake{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/whiteCarpet.go ================================================ package block type WhiteCarpet struct { } func (b WhiteCarpet) Encode() (string, BlockProperties) { return "minecraft:white_carpet", BlockProperties{} } func (b WhiteCarpet) New(props BlockProperties) Block { return WhiteCarpet{} } ================================================ FILE: server/world/block/whiteConcrete.go ================================================ package block type WhiteConcrete struct { } func (b WhiteConcrete) Encode() (string, BlockProperties) { return "minecraft:white_concrete", BlockProperties{} } func (b WhiteConcrete) New(props BlockProperties) Block { return WhiteConcrete{} } ================================================ FILE: server/world/block/whiteConcretePowder.go ================================================ package block type WhiteConcretePowder struct { } func (b WhiteConcretePowder) Encode() (string, BlockProperties) { return "minecraft:white_concrete_powder", BlockProperties{} } func (b WhiteConcretePowder) New(props BlockProperties) Block { return WhiteConcretePowder{} } ================================================ FILE: server/world/block/whiteGlazedTerracotta.go ================================================ package block type WhiteGlazedTerracotta struct { Facing string } func (b WhiteGlazedTerracotta) Encode() (string, BlockProperties) { return "minecraft:white_glazed_terracotta", BlockProperties{ "facing": b.Facing, } } func (b WhiteGlazedTerracotta) New(props BlockProperties) Block { return WhiteGlazedTerracotta{ Facing: props["facing"], } } ================================================ FILE: server/world/block/whiteShulkerBox.go ================================================ package block type WhiteShulkerBox struct { Facing string } func (b WhiteShulkerBox) Encode() (string, BlockProperties) { return "minecraft:white_shulker_box", BlockProperties{ "facing": b.Facing, } } func (b WhiteShulkerBox) New(props BlockProperties) Block { return WhiteShulkerBox{ Facing: props["facing"], } } ================================================ FILE: server/world/block/whiteStainedGlass.go ================================================ package block type WhiteStainedGlass struct { } func (b WhiteStainedGlass) Encode() (string, BlockProperties) { return "minecraft:white_stained_glass", BlockProperties{} } func (b WhiteStainedGlass) New(props BlockProperties) Block { return WhiteStainedGlass{} } ================================================ FILE: server/world/block/whiteStainedGlassPane.go ================================================ package block import ( "strconv" ) type WhiteStainedGlassPane struct { North bool South bool Waterlogged bool West bool East bool } func (b WhiteStainedGlassPane) Encode() (string, BlockProperties) { return "minecraft:white_stained_glass_pane", BlockProperties{ "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), "north": strconv.FormatBool(b.North), } } func (b WhiteStainedGlassPane) New(props BlockProperties) Block { return WhiteStainedGlassPane{ South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", } } ================================================ FILE: server/world/block/whiteTerracotta.go ================================================ package block type WhiteTerracotta struct { } func (b WhiteTerracotta) Encode() (string, BlockProperties) { return "minecraft:white_terracotta", BlockProperties{} } func (b WhiteTerracotta) New(props BlockProperties) Block { return WhiteTerracotta{} } ================================================ FILE: server/world/block/whiteTulip.go ================================================ package block type WhiteTulip struct { } func (b WhiteTulip) Encode() (string, BlockProperties) { return "minecraft:white_tulip", BlockProperties{} } func (b WhiteTulip) New(props BlockProperties) Block { return WhiteTulip{} } ================================================ FILE: server/world/block/whiteWallBanner.go ================================================ package block type WhiteWallBanner struct { Facing string } func (b WhiteWallBanner) Encode() (string, BlockProperties) { return "minecraft:white_wall_banner", BlockProperties{ "facing": b.Facing, } } func (b WhiteWallBanner) New(props BlockProperties) Block { return WhiteWallBanner{ Facing: props["facing"], } } ================================================ FILE: server/world/block/whiteWool.go ================================================ package block type WhiteWool struct { } func (b WhiteWool) Encode() (string, BlockProperties) { return "minecraft:white_wool", BlockProperties{} } func (b WhiteWool) New(props BlockProperties) Block { return WhiteWool{} } ================================================ FILE: server/world/block/witherRose.go ================================================ package block type WitherRose struct { } func (b WitherRose) Encode() (string, BlockProperties) { return "minecraft:wither_rose", BlockProperties{} } func (b WitherRose) New(props BlockProperties) Block { return WitherRose{} } ================================================ FILE: server/world/block/witherSkeletonSkull.go ================================================ package block import ( "strconv" ) type WitherSkeletonSkull struct { Powered bool Rotation int } func (b WitherSkeletonSkull) Encode() (string, BlockProperties) { return "minecraft:wither_skeleton_skull", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "rotation": strconv.Itoa(b.Rotation), } } func (b WitherSkeletonSkull) New(props BlockProperties) Block { return WitherSkeletonSkull{ Powered: props["powered"] != "false", Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/witherSkeletonWallSkull.go ================================================ package block import ( "strconv" ) type WitherSkeletonWallSkull struct { Facing string Powered bool } func (b WitherSkeletonWallSkull) Encode() (string, BlockProperties) { return "minecraft:wither_skeleton_wall_skull", BlockProperties{ "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), } } func (b WitherSkeletonWallSkull) New(props BlockProperties) Block { return WitherSkeletonWallSkull{ Facing: props["facing"], Powered: props["powered"] != "false", } } ================================================ FILE: server/world/block/yellowBanner.go ================================================ package block import ( "strconv" ) type YellowBanner struct { Rotation int } func (b YellowBanner) Encode() (string, BlockProperties) { return "minecraft:yellow_banner", BlockProperties{ "rotation": strconv.Itoa(b.Rotation), } } func (b YellowBanner) New(props BlockProperties) Block { return YellowBanner{ Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/yellowBed.go ================================================ package block import ( "strconv" ) type YellowBed struct { Facing string Occupied bool Part string } func (b YellowBed) Encode() (string, BlockProperties) { return "minecraft:yellow_bed", BlockProperties{ "occupied": strconv.FormatBool(b.Occupied), "part": b.Part, "facing": b.Facing, } } func (b YellowBed) New(props BlockProperties) Block { return YellowBed{ Facing: props["facing"], Occupied: props["occupied"] != "false", Part: props["part"], } } ================================================ FILE: server/world/block/yellowCandle.go ================================================ package block import ( "strconv" ) type YellowCandle struct { Candles int Lit bool Waterlogged bool } func (b YellowCandle) Encode() (string, BlockProperties) { return "minecraft:yellow_candle", BlockProperties{ "lit": strconv.FormatBool(b.Lit), "waterlogged": strconv.FormatBool(b.Waterlogged), "candles": strconv.Itoa(b.Candles), } } func (b YellowCandle) New(props BlockProperties) Block { return YellowCandle{ Candles: atoi(props["candles"]), Lit: props["lit"] != "false", Waterlogged: props["waterlogged"] != "false", } } ================================================ FILE: server/world/block/yellowCandleCake.go ================================================ package block import ( "strconv" ) type YellowCandleCake struct { Lit bool } func (b YellowCandleCake) Encode() (string, BlockProperties) { return "minecraft:yellow_candle_cake", BlockProperties{ "lit": strconv.FormatBool(b.Lit), } } func (b YellowCandleCake) New(props BlockProperties) Block { return YellowCandleCake{ Lit: props["lit"] != "false", } } ================================================ FILE: server/world/block/yellowCarpet.go ================================================ package block type YellowCarpet struct { } func (b YellowCarpet) Encode() (string, BlockProperties) { return "minecraft:yellow_carpet", BlockProperties{} } func (b YellowCarpet) New(props BlockProperties) Block { return YellowCarpet{} } ================================================ FILE: server/world/block/yellowConcrete.go ================================================ package block type YellowConcrete struct { } func (b YellowConcrete) Encode() (string, BlockProperties) { return "minecraft:yellow_concrete", BlockProperties{} } func (b YellowConcrete) New(props BlockProperties) Block { return YellowConcrete{} } ================================================ FILE: server/world/block/yellowConcretePowder.go ================================================ package block type YellowConcretePowder struct { } func (b YellowConcretePowder) Encode() (string, BlockProperties) { return "minecraft:yellow_concrete_powder", BlockProperties{} } func (b YellowConcretePowder) New(props BlockProperties) Block { return YellowConcretePowder{} } ================================================ FILE: server/world/block/yellowGlazedTerracotta.go ================================================ package block type YellowGlazedTerracotta struct { Facing string } func (b YellowGlazedTerracotta) Encode() (string, BlockProperties) { return "minecraft:yellow_glazed_terracotta", BlockProperties{ "facing": b.Facing, } } func (b YellowGlazedTerracotta) New(props BlockProperties) Block { return YellowGlazedTerracotta{ Facing: props["facing"], } } ================================================ FILE: server/world/block/yellowShulkerBox.go ================================================ package block type YellowShulkerBox struct { Facing string } func (b YellowShulkerBox) Encode() (string, BlockProperties) { return "minecraft:yellow_shulker_box", BlockProperties{ "facing": b.Facing, } } func (b YellowShulkerBox) New(props BlockProperties) Block { return YellowShulkerBox{ Facing: props["facing"], } } ================================================ FILE: server/world/block/yellowStainedGlass.go ================================================ package block type YellowStainedGlass struct { } func (b YellowStainedGlass) Encode() (string, BlockProperties) { return "minecraft:yellow_stained_glass", BlockProperties{} } func (b YellowStainedGlass) New(props BlockProperties) Block { return YellowStainedGlass{} } ================================================ FILE: server/world/block/yellowStainedGlassPane.go ================================================ package block import ( "strconv" ) type YellowStainedGlassPane struct { East bool North bool South bool Waterlogged bool West bool } func (b YellowStainedGlassPane) Encode() (string, BlockProperties) { return "minecraft:yellow_stained_glass_pane", BlockProperties{ "north": strconv.FormatBool(b.North), "south": strconv.FormatBool(b.South), "waterlogged": strconv.FormatBool(b.Waterlogged), "west": strconv.FormatBool(b.West), "east": strconv.FormatBool(b.East), } } func (b YellowStainedGlassPane) New(props BlockProperties) Block { return YellowStainedGlassPane{ South: props["south"] != "false", Waterlogged: props["waterlogged"] != "false", West: props["west"] != "false", East: props["east"] != "false", North: props["north"] != "false", } } ================================================ FILE: server/world/block/yellowTerracotta.go ================================================ package block type YellowTerracotta struct { } func (b YellowTerracotta) Encode() (string, BlockProperties) { return "minecraft:yellow_terracotta", BlockProperties{} } func (b YellowTerracotta) New(props BlockProperties) Block { return YellowTerracotta{} } ================================================ FILE: server/world/block/yellowWallBanner.go ================================================ package block type YellowWallBanner struct { Facing string } func (b YellowWallBanner) Encode() (string, BlockProperties) { return "minecraft:yellow_wall_banner", BlockProperties{ "facing": b.Facing, } } func (b YellowWallBanner) New(props BlockProperties) Block { return YellowWallBanner{ Facing: props["facing"], } } ================================================ FILE: server/world/block/yellowWool.go ================================================ package block type YellowWool struct { } func (b YellowWool) Encode() (string, BlockProperties) { return "minecraft:yellow_wool", BlockProperties{} } func (b YellowWool) New(props BlockProperties) Block { return YellowWool{} } ================================================ FILE: server/world/block/zombieHead.go ================================================ package block import ( "strconv" ) type ZombieHead struct { Powered bool Rotation int } func (b ZombieHead) Encode() (string, BlockProperties) { return "minecraft:zombie_head", BlockProperties{ "powered": strconv.FormatBool(b.Powered), "rotation": strconv.Itoa(b.Rotation), } } func (b ZombieHead) New(props BlockProperties) Block { return ZombieHead{ Powered: props["powered"] != "false", Rotation: atoi(props["rotation"]), } } ================================================ FILE: server/world/block/zombieWallHead.go ================================================ package block import ( "strconv" ) type ZombieWallHead struct { Facing string Powered bool } func (b ZombieWallHead) Encode() (string, BlockProperties) { return "minecraft:zombie_wall_head", BlockProperties{ "facing": b.Facing, "powered": strconv.FormatBool(b.Powered), } } func (b ZombieWallHead) New(props BlockProperties) Block { return ZombieWallHead{ Facing: props["facing"], Powered: props["powered"] != "false", } } ================================================ FILE: server/world/chunk/anvil.go ================================================ package chunk type AnvilBlock struct { Properties map[string]string Name string } ================================================ FILE: server/world/chunk/chunk.go ================================================ // Package chunk provides a way of encoding and modifying chunks package chunk import ( "fmt" "unsafe" "github.com/zeppelinmc/zeppelin/server/container" "github.com/zeppelinmc/zeppelin/server/world/chunk/heightmaps" "github.com/zeppelinmc/zeppelin/server/world/chunk/section" ) type Generator interface { NewChunk(x, z int32) Chunk GenerateWorldSpawn() (x, y, z int32) } const MinChunkY = -4 type BlockEntity struct { Id string `nbt:"id"` X int32 `nbt:"x"` Y int32 `nbt:"y"` Z int32 `nbt:"z"` KeepPacked bool `nbt:"keepPacked"` // for chest entities Items container.Container `nbt:"Items,omitempty"` } type Chunk struct /*{ //LastModified int64 X, Y, Z int32 Heightmaps heightmaps.Heightmaps Sections []*section.Section BlockEntities []BlockEntity }*/{ DataVersion int32 Heightmaps heightmaps.Heightmaps InhabitedTime int64 LastUpdate int64 Status string BlockEntities []BlockEntity `nbt:"block_entities,omitempty"` Sections []section.Section `nbt:"sections"` X int32 `nbt:"xPos"` Y int32 `nbt:"yPos"` Z int32 `nbt:"zPos"` } func NewChunk(x, z int32) Chunk { c := Chunk{ Y: MinChunkY, X: x, Z: z, //LastModified: time.Now().UnixMilli(), Sections: make([]section.Section, 24), } for i := range c.Sections { c.Sections[i] = section.Section{ Y: int8(i - MinChunkY), BlockStates: section.AnvilBlockStates{ Palette: []section.AnvilBlock{{Name: "minecraft:air"}}, }, Biomes: section.AnvilBiomes{ Palette: []string{"minecraft:plains"}, }, SkyLight: *(*[]int8)(unsafe.Pointer(&fullLightBuffer)), } } return c } // X and Z should be relative to the chunk (aka x&0x0f, z&0x0f), but Y should be absolute. func (chunk *Chunk) Block(x, y, z int32) (section.AnvilBlock, error) { secIndex := (y >> 4) - chunk.Y if secIndex < 0 || secIndex >= int32(len(chunk.Sections)) { return section.AnvilBlock{}, fmt.Errorf("null section") } sec := chunk.Sections[secIndex] return sec.Block(byte(x), byte(y)&0x0f, byte(z)), nil } // This function does not update the block for the players, so it should not be used. X and Z should be relative to the chunk (aka x&0x0f, z&0x0f), but Y should be absolute. func (chunk *Chunk) SetBlock(x, y, z int32, b section.AnvilBlock) (state int64, err error) { //c.LastModified = time.Now().UnixMilli() secIndex := (y >> 4) - chunk.Y if secIndex < 0 || secIndex >= int32(len(chunk.Sections)) { return 0, fmt.Errorf("null section") } sec := chunk.Sections[secIndex] return sec.SetBlock(byte(x), byte(y)&0x0f, byte(z), b), nil } // This function does not update the block for the players, so it should not be used. X and Z should be relative to the chunk (aka x&0x0f, z&0x0f), but Y should be absolute. func (chunk *Chunk) SetSkylightLevel(x, y, z int32, value byte) error { //c.LastModified = time.Now().UnixMilli() secIndex := (y >> 4) - chunk.Y if secIndex < 0 || secIndex >= int32(len(chunk.Sections)) { return fmt.Errorf("null section") } sec := chunk.Sections[secIndex] return sec.SetSkylightLevel(int(x), int(y)&0x0f, int(z), value) } // X and Z should be relative to the chunk (aka x&0x0f, z&0x0f), but Y should be absolute. func (chunk *Chunk) SkyLightLevel(x, y, z int32) (byte, error) { secIndex := (y >> 4) - chunk.Y if secIndex < 0 || secIndex >= int32(len(chunk.Sections)) { return 0, fmt.Errorf("null section") } sec := chunk.Sections[secIndex] return sec.SkyLightLevel(int(x), int(y)&0x0f, int(z)) } // Returns the block state at the position. All of the position values should be absolute (aka (chunkPos<<4)+pos) func (chunk *Chunk) BlockEntity(x, y, z int32) (*BlockEntity, bool) { for _, entity := range chunk.BlockEntities { if entity.X == x && entity.Y == y && entity.Z == z { return &entity, true } } return nil, false } // This function does not update the block for the players, so it should not be used. All of the position values should be absolute (aka (chunkPos<<4)+pos func (chunk *Chunk) SetBlockEntity(x, y, z int32, be BlockEntity) { //c.LastModified = time.Now().UnixMilli() var index int = -1 be.X, be.Y, be.Z = x, y, z for i, entity := range chunk.BlockEntities { if entity.X == x && entity.Y == y && entity.Z == z { index = i break } } if index == -1 { chunk.BlockEntities = append(chunk.BlockEntities, be) return } chunk.BlockEntities[index] = be } ================================================ FILE: server/world/chunk/encode.go ================================================ package chunk import ( "bytes" "slices" "unsafe" "github.com/zeppelinmc/zeppelin/protocol/net/io/buffers" "github.com/zeppelinmc/zeppelin/protocol/net/io/encoding" "github.com/zeppelinmc/zeppelin/protocol/net/packet/play" "github.com/zeppelinmc/zeppelin/server/world/chunk/section" "github.com/zeppelinmc/zeppelin/util/log" ) var emptyLightBuffer = make([]byte, 2048) var fullLightBuffer = make([]byte, 2048) func init() { for i := range fullLightBuffer { fullLightBuffer[i] = 0xFF } } func (chunk *Chunk) Encode(biomeIndexes []string) *play.ChunkDataUpdateLight { buf := buffers.Buffers.Get().(*bytes.Buffer) buf.Reset() defer buffers.Buffers.Put(buf) return chunk.EncodeBuf(biomeIndexes, buf) } func (chunk *Chunk) EncodeBuf(biomeIndexes []string, buf *bytes.Buffer) *play.ChunkDataUpdateLight { bstateId := int32(slices.Index(biomeIndexes, "minecraft:plains")) w := encoding.NewWriter(buf) pk := &play.ChunkDataUpdateLight{ CX: chunk.X, CZ: chunk.Z, Data: buf, Heightmaps: *(*play.Heightmaps)(unsafe.Pointer(&chunk.Heightmaps)), //BlockEntities: make([]play.BlockEntity, len(chunk.BlockEntities)), SkyLightMask: make(encoding.BitSet, 1), EmptySkyLightMask: make(encoding.BitSet, 1), SkyLightArrays: make([][]byte, 1, len(chunk.Sections)+1), BlockLightMask: make(encoding.BitSet, 1), EmptyBlockLightMask: make(encoding.BitSet, 1), BlockLightArrays: make([][]byte, 1, len(chunk.Sections)+1), } pk.SkyLightMask.Set(1) pk.EmptySkyLightMask.Set(1) pk.SkyLightArrays[0] = emptyLightBuffer pk.BlockLightMask.Set(1) pk.EmptyBlockLightMask.Set(1) pk.BlockLightArrays[0] = emptyLightBuffer /*for i, entity := range chunk.BlockEntities { pk.BlockEntities[i] = play.BlockEntity{ X: entity.X, Y: entity.Y, Z: entity.Z, Type: registry.BlockEntityType.Get(entity.Id), Data: entity, } }*/ for secI, sec := range chunk.Sections { var blockCount int16 = 1024 blockBitsPerEntry, biomeBitsPerEntry := sec.BPE() //var airId = -1 /*for i, state := range blockPalette { name, _ := state.Encode() if name == "minecraft:air" { airId = i break } } if airId == -1 { blockCount = 4096 } if blockCount != 4096 { for _, long := range blockStates { var pos int for i := 0; i < 64; i++ { if blockCount == 4096 { break } if pos+blockBitsPerEntry > 64-pos { break } var entry = (long >> pos) & (int64((1 << blockBitsPerEntry) - 1)) if entry != int64(airId) { blockCount++ } pos += blockBitsPerEntry } } }*/ //Block Count w.Short(blockCount) // // Block Palette // w.Ubyte(byte(blockBitsPerEntry)) switch { case blockBitsPerEntry == 0: stateId, _ := section.BlockStateId(sec.BlockStates.Palette[0]) w.VarInt(stateId) case blockBitsPerEntry >= 4 && blockBitsPerEntry <= 8: w.VarInt(int32(len(sec.BlockStates.Palette))) for _, e := range sec.BlockStates.Palette { stateId, _ := section.BlockStateId(e) w.VarInt(stateId) } case blockBitsPerEntry == 15: // no palette default: log.Println("invalid block bits per entry", blockBitsPerEntry, (len(sec.BlockStates.Data)*64)/4096) } w.VarInt(int32(len(sec.BlockStates.Data))) for _, long := range sec.BlockStates.Data { w.Long(long) } // // Biome Palette // w.Ubyte(byte(biomeBitsPerEntry)) switch { case biomeBitsPerEntry == 0: //pale := biomePalette[0] /*stateId := int32(slices.Index(biomeIndexes, pale)) if stateId == -1 { fmt.Println("h", pale) }*/ w.VarInt(bstateId) case biomeBitsPerEntry >= 1 && biomeBitsPerEntry <= 3: w.VarInt(int32(len(sec.Biomes.Palette))) for _, e := range sec.Biomes.Palette { _ = e /*stateId := int32(slices.Index(biomeIndexes, e)) if stateId == -1 { fmt.Println("h", e) }*/ w.VarInt(bstateId) } case biomeBitsPerEntry == 6: // no palette default: log.Println("invalid biome bits per entry", pk.CX, pk.CZ, sec.Y, biomeBitsPerEntry) } w.VarInt(int32(len(sec.Biomes.Data))) for _, long := range sec.Biomes.Data { w.Long(long) } // // Lighting // if sec.SkyLight != nil { pk.SkyLightMask.Set(secI + 1) if allZero(sec.SkyLight) { pk.EmptySkyLightMask.Set(secI + 1) } pk.SkyLightArrays = append(pk.SkyLightArrays, *(*[]byte)(unsafe.Pointer(&sec.SkyLight))) } if sec.BlockLight != nil { pk.BlockLightMask.Set(secI + 1) if allZero(sec.BlockLight) { pk.EmptyBlockLightMask.Set(secI + 1) } pk.BlockLightArrays = append(pk.BlockLightArrays, *(*[]byte)(unsafe.Pointer(&sec.BlockLight))) } } /*pk.SkyLightArrays = append(pk.SkyLightArrays, emptyLightBuffer) pk.SkyLightMask.Set(len(chunk.sections)) pk.EmptySkyLightMask.Set(len(chunk.sections)) pk.BlockLightArrays = append(pk.BlockLightArrays, emptyLightBuffer) pk.BlockLightMask.Set(len(chunk.sections)) pk.EmptyBlockLightMask.Set(len(chunk.sections))*/ //for i := 0; i < 24; i++ { // fmt.Println(pk.SkyLightMask.Get(i), len(pk.SkyLightArrays[i+1])) //} //pk.Data = buf.Bytes() return pk } func allZero(inp []int8) bool { for _, i := range inp { if i != 0 { return false } } return true } ================================================ FILE: server/world/chunk/heightmaps/heightmaps.go ================================================ package heightmaps /* credit to https://github.com/aimjel for these calculations */ const MinY = -64 const HeightMapBitsPerEntry = 9 type Heightmap []int64 type Heightmaps struct { MotionBlocking Heightmap `nbt:"MOTION_BLOCKING"` WorldSurface Heightmap `nbt:"WORLD_SURFACE"` } func (hm Heightmap) offset(x, z int32) (int32, int32) { blockNumber := z + x*16 startLong := (blockNumber * HeightMapBitsPerEntry) / 63 stateOffset := (blockNumber * HeightMapBitsPerEntry) % 63 return startLong, stateOffset } func (hm Heightmap) Get(x, z int32) int32 { i, off := hm.offset(x, z) states := hm[i] >> off return int32(states & (1<> 6 stateOffset := blockNumber & 63 return startLong, stateOffset } // X, Y, Z should be relative to the chunk section (AKA x&0x0f, y&0x0f, z&0x0f) func (s *Section) Block(x, y, z byte) AnvilBlock { if len(s.BlockStates.Data) == 0 { return s.BlockStates.Palette[0] } long, off := s.offset(int(x), int(y), int(z)) l := s.BlockStates.Data[long] index := (l >> off) & (1<> off) & (1< len(s.SkyLight) { return 0, fmt.Errorf("light index exceeds light length") } var mask uint8 = 0x0f var shift uint8 = 0 if math.Remainder(float64(index), 2) != 0 { mask = 0xf0 shift = 4 } index /= 2 return (uint8(s.SkyLight[index]) & mask) >> shift, nil } func (s *Section) SetSkylightLevel(x, y, z int, level byte) error { if level > 0x0F { return fmt.Errorf("light level must not exceed 4 bits (15)") } index := (y << 8) | (z << 4) | x if index < 0 || int(index) > len(s.SkyLight) { return fmt.Errorf("light index exceeds light length") } var mask uint8 = 0x0f if math.Remainder(float64(index), 2) != 0 { mask = 0xf0 level <<= 4 } index /= 2 s.SkyLight[index] = s.SkyLight[index] & ^int8(mask) s.SkyLight[index] |= int8(level) return nil } func blockBitsPerEntry(paletteSize int) int { ln := bits.Len32(uint32(paletteSize) - 1) if ln <= 4 && ln != 0 { ln = 4 } //log.Println(paletteSize, ln) return ln } func biomeBitsPerEntry(paletteSize int) int { return bits.Len32(uint32(paletteSize - 1)) } ================================================ FILE: server/world/dimension/dimension.go ================================================ package dimension import ( "bytes" "fmt" "os" "sync" "github.com/zeppelinmc/zeppelin/server/world/block/pos" "github.com/zeppelinmc/zeppelin/server/world/chunk" "github.com/zeppelinmc/zeppelin/server/world/chunk/section" "github.com/zeppelinmc/zeppelin/server/world/dimension/window" "github.com/zeppelinmc/zeppelin/server/world/level" "github.com/zeppelinmc/zeppelin/server/world/level/region" "github.com/zeppelinmc/zeppelin/util/log" ) func New(regionPath, typ, name string, chunkGenerator chunk.Generator, level level.Level) *Dimension { return &Dimension{ regions: make(map[uint64]*region.File), regionPath: regionPath, typ: typ, name: name, generator: chunkGenerator, WindowManager: window.NewManager(), Level: level, } } type Dimension struct { reg_mu sync.Mutex regions map[uint64]*region.File Level level.Level generator chunk.Generator WindowManager *window.WindowManager typ string name string regionPath string } func (d *Dimension) Type() string { return d.typ } func (d *Dimension) Name() string { return d.name } func (d *Dimension) Save() { d.syncWindows() //s.saveAllRegions() d.Level.Close() log.Infoln("Saved dimension", d.name) } func (d *Dimension) syncWindows() { d.WindowManager.Range(func(i pos.BlockPosition, w *window.Window) { if w.ChunkEntityType != "" { d.SetBlockEntity(i, chunk.BlockEntity{ X: i.X(), Y: i.Y(), Z: i.Z(), Id: w.ChunkEntityType, Items: w.Items, }) } }) } func (d *Dimension) saveAllRegions() { d.reg_mu.Lock() defer d.reg_mu.Unlock() _ = os.MkdirAll(d.regionPath, 0755) for hash, reg := range d.regions { rx, rz := d.regionUnhash(hash) path := fmt.Sprintf("%s/r.%d.%d.mca", d.regionPath, rx, rz) file, err := os.Create(path) if err != nil { continue } if reg.Encode(file, region.CompressionZlib) != nil { continue } if file.Close() != nil { continue } } } func (d *Dimension) LoadedChunks() int32 { d.reg_mu.Lock() defer d.reg_mu.Unlock() var count int32 for _, reg := range d.regions { count += reg.LoadedChunks() } return count } func (d *Dimension) Block(x, y, z int32) (section.AnvilBlock, error) { chunkX, chunkZ := x>>4, z>>4 chunk, err := d.GetChunk(chunkX, chunkZ) if err != nil { return section.AnvilBlock{}, err } return chunk.Block(x&0x0f, y, z&0x0f) } func (d *Dimension) SetBlock(pos pos.BlockPosition, b section.AnvilBlock, placeSound bool) (state int64, err error) { chunkX, chunkZ := pos.ChunkX(), pos.ChunkZ() chunk, err := d.GetChunk(chunkX, chunkZ) if err != nil { return 0, err } i, err := chunk.SetBlock(pos.SectionX(), pos.Y(), pos.SectionZ(), b) if err != nil { return i, err } //s.broadcast.UpdateBlock(pos, b, s.name, placeSound) return i, err } func (d *Dimension) SetBlockEntity(pos pos.BlockPosition, be chunk.BlockEntity) error { chunkX, chunkZ := pos.ChunkX(), pos.ChunkZ() chunk, err := d.GetChunk(chunkX, chunkZ) if err != nil { return err } chunk.SetBlockEntity(pos.X(), pos.Y(), pos.Z(), be) //s.broadcast.UpdateBlockEntity(pos, be, s.name) return nil } func (d *Dimension) BlockEntity(x, y, z int32) (*chunk.BlockEntity, bool) { chunkX, chunkZ := x>>4, z>>4 chunk, err := d.GetChunk(chunkX, chunkZ) if err != nil { return nil, false } return chunk.BlockEntity(x, y, z) } func (d *Dimension) GetChunkBuf(x, z int32, buf *bytes.Buffer) (*chunk.Chunk, error) { rx, rz := d.chunkPosToRegionPos(x, z) region, err := d.getRegion(rx, rz) if err != nil { if d.generator != nil { region = d.newRegion(rx, rz) } else { return nil, err } } return region.GetChunkBuf(x, z, buf) } func (d *Dimension) GetChunk(x, z int32) (*chunk.Chunk, error) { rx, rz := d.chunkPosToRegionPos(x, z) region, err := d.getRegion(rx, rz) if err != nil { if d.generator != nil { region = d.newRegion(rx, rz) } else { return nil, err } } return region.GetChunk(x, z) } func (d *Dimension) newRegion(rx, rz int32) *region.File { d.reg_mu.Lock() defer d.reg_mu.Unlock() hash := d.regionHash(rx, rz) d.regions[hash] = new(region.File) region.Empty(d.regions[hash], rx, rz, d.generator) return d.regions[hash] } func (d *Dimension) getRegion(rx, rz int32) (*region.File, error) { d.reg_mu.Lock() defer d.reg_mu.Unlock() if r, ok := d.regions[d.regionHash(rx, rz)]; ok { return r, nil } reg, err := d.openRegion(rx, rz) if err != nil { return nil, err } return reg, err } func (d *Dimension) regionHash(rx, rz int32) uint64 { return uint64(uint32(rx)) | uint64(uint32(rz))<<32 } func (d *Dimension) regionUnhash(hash uint64) (rx, rz int32) { urx := uint32(hash) urz := uint32(hash >> 32) return int32(urx), int32(urz) } func (d *Dimension) chunkPosToRegionPos(x, z int32) (rx, rz int32) { return x >> 5, z >> 5 } func (d *Dimension) openRegion(rx, rz int32) (*region.File, error) { path := fmt.Sprintf("%s/r.%d.%d.mca", d.regionPath, rx, rz) file, err := os.Open(path) if err != nil { return nil, err } //defer file.Close() hash := d.regionHash(rx, rz) d.regions[hash] = new(region.File) err = region.Decode(file, d.regions[hash], rx, rz, d.generator) return d.regions[hash], err } ================================================ FILE: server/world/dimension/manager.go ================================================ package dimension import ( "github.com/zeppelinmc/zeppelin/util/log" "strings" ) func NewDimensionManager(dimensions map[string]*Dimension) DimensionManager { return DimensionManager{dimensions: dimensions} } type DimensionManager struct { dimensions map[string]*Dimension } // Dimension returns the dimension struct for the dimension name func (w *DimensionManager) Dimension(name string) *Dimension { if !strings.Contains(name, ":") { name = "minecraft:" + name } return w.dimensions[name] } func (w *DimensionManager) Save() { for _, dim := range w.dimensions { dim.Save() } log.Infoln("Closed world") } func (w *DimensionManager) RegisterDimension(name string, dim *Dimension) { w.dimensions[name] = dim } func (w *DimensionManager) LoadedChunks() int32 { var count int32 for _, dim := range w.dimensions { count += dim.LoadedChunks() } return count } ================================================ FILE: server/world/dimension/tick.go ================================================ package dimension func (d *Dimension) tick() { } ================================================ FILE: server/world/dimension/window/window.go ================================================ package window import ( "fmt" "sync" "sync/atomic" "github.com/zeppelinmc/zeppelin/protocol/text" "github.com/zeppelinmc/zeppelin/server/container" "github.com/zeppelinmc/zeppelin/server/world/block/pos" ) var windowId atomic.Int32 type WindowManager struct { windows map[pos.BlockPosition]*Window mu sync.RWMutex } func NewManager() *WindowManager { return &WindowManager{windows: make(map[pos.BlockPosition]*Window)} } func (mgr *WindowManager) AddWindow(position pos.BlockPosition, w *Window) error { if w.Id == 0 { return fmt.Errorf("window id should not be 0") } mgr.mu.Lock() defer mgr.mu.Unlock() mgr.windows[position] = w return nil } func (mgr *WindowManager) Range(itr func(pos.BlockPosition, *Window)) { mgr.mu.RLock() defer mgr.mu.RUnlock() for pos, w := range mgr.windows { itr(pos, w) } } func (mgr *WindowManager) At(x, y, z int32) (*Window, bool) { mgr.mu.RLock() defer mgr.mu.RUnlock() w, ok := mgr.windows[[3]int32{x, y, z}] return w, ok } func (mgr *WindowManager) Get(id int32) (pos.BlockPosition, *Window, bool) { mgr.mu.RLock() defer mgr.mu.RUnlock() for pos, w := range mgr.windows { if w.Id == id { return pos, w, true } } return [3]int32{}, nil, false } // window types are found at https://wiki.vg/Inventory func (mgr *WindowManager) New(windowType, chunkEntityType string, items container.Container, title text.TextComponent) *Window { return &Window{ mgr: mgr, Items: items, Id: windowId.Add(1), Title: title, Type: windowType, ChunkEntityType: chunkEntityType, } } type Window struct { mgr *WindowManager ChunkEntityType string Items container.Container Id int32 Type string Title text.TextComponent Viewers byte } func (w *Window) Position() (x, y, z int32, ok bool) { pos, _, ok := w.mgr.Get(w.Id) return pos[0], pos[1], pos[2], ok } ================================================ FILE: server/world/level/entity.go ================================================ package level import "github.com/zeppelinmc/zeppelin/server/world/level/uuid" type Entity struct { Air int16 CustomName string CustomNameVisible bool FallDistance float32 Fire int16 Glowing bool HasVisualFire bool Id string `nbt:"id"` Invulnerable bool Motion [3]float64 NoGravity bool OnGround bool Passengers []Entity PortalCooldown int32 Pos [3]float64 Rotation [2]float32 Silent bool `nbt:"Silent,omitempty"` Tags []string TicksFrozen int32 `nbt:"TicksFrozen,omitempty"` UUID uuid.UUID //TODO add state subclasses } ================================================ FILE: server/world/level/item/attribute_modifiers.go ================================================ package item type AttributeModifiers struct { Modifiers []Modifier `nbt:"modifier"` ShowInTooltip bool `nbt:"show_in_tooltip"` } type ModifierOperation string const ( AddValue ModifierOperation = "add_value" AddMultipliedBase ModifierOperation = "add_multiplied_base" AddMultipliedTotal ModifierOperation = "add_multiplied_total" ) type Modifier struct { Type string `nbt:"type"` Slot string `nbt:"slot"` Id string `nbt:"id"` Amount float64 `nbt:"amount"` Operator ModifierOperation `nbt:"operation"` } ================================================ FILE: server/world/level/item/banner_patterns.go ================================================ package item type BannerPattern struct { Color string `nbt:"color"` Pattern any `nbt:"pattern"` } ================================================ FILE: server/world/level/item/bees.go ================================================ package item import "github.com/zeppelinmc/zeppelin/server/entity" type Bee struct { EntityData entity.LevelEntity `nbt:"entity_data"` // import cycle :( MinimumTicksInHive int32 `nbt:"min_ticks_in_hive"` TicksInHive int32 `nbt:"ticks_in_hive"` } ================================================ FILE: server/world/level/item/bucket_entity_data.go ================================================ package item type BucketEntityData struct { NoAI bool `nbt:"NoAI"` Silent bool `nbt:"Silent"` NoGravity bool `nbt:"NoGravity"` Glowing bool `nbt:"Glowing"` Invulnerable bool `nbt:"Invulnerable"` Health float32 `nbt:"Health"` Age int32 `nbt:"Age"` Variant int32 `nbt:"Variant"` HuntingCooldown int64 `nbt:"HuntingCooldown"` BucketVariantTag int32 `nbt:"BucketVariantTag"` } ================================================ FILE: server/world/level/item/can_do.go ================================================ package item // Both CanBreak and CanPlace have the same contents so im using the same class type CanDo struct { ShowInTooltip bool `nbt:"show_in_tooltip"` State any `nbt:"state"` // Have to put any cause theres an infinite amount of key value pairs there could be Blocks any `nbt:"blocks"` //Can be string, or list NBT string `nbt:"nbt"` Predicates []Predicates `nbt:"predicates"` } type Predicates struct { State any `nbt:"state"` Blocks any `nbt:"blocks"` NBT string `nbt:"nbt"` } ================================================ FILE: server/world/level/item/container_loot.go ================================================ package item type ContainerLoot struct { LootTable string `nbt:"loot_table"` Seed int64 `nbt:"seed"` } ================================================ FILE: server/world/level/item/creative_slot_lock.go ================================================ package item // Do not add this tag at all if you don't need it! type CreativeSlotLock struct { } ================================================ FILE: server/world/level/item/enchantments.go ================================================ package item type Enchantments struct { ShowInTooltip bool `nbt:"show_in_tooltip"` Levels any `nbt:"levels"` } ================================================ FILE: server/world/level/item/entity_data.go ================================================ package item import "github.com/zeppelinmc/zeppelin/server/entity" type EntityData struct { EntityData entity.LevelEntity `nbt:"minecraft:entity_data"` // NBT } ================================================ FILE: server/world/level/item/fire_resistant.go ================================================ package item // Do not add this tag at all if you don't want it to be fire resistant! type FireResistant struct { } ================================================ FILE: server/world/level/item/firework_explosion.go ================================================ package item type FireworkExplosion struct { Shape string `nbt:"shape"` Colors []int32 `nbt:"colors"` FadeColors []int32 `nbt:"fade_colors"` HasTrail bool `nbt:"has_trail"` HasTwinkle bool `nbt:"has_twinkle"` } ================================================ FILE: server/world/level/item/fireworks.go ================================================ package item type Fireworks struct { FlightDuration int8 `nbt:"flight_duration"` Explosions []Explosion `nbt:"explosions"` } type Explosion struct { Shape string `nbt:"shape"` Colors []int32 `nbt:"colors"` FadeColors []int32 `nbt:"fade_colors"` HasTrail bool `nbt:"has_trail"` HasTwinkle bool `nbt:"has_twinkle"` } ================================================ FILE: server/world/level/item/food.go ================================================ package item type Food struct { Nutrition int32 `nbt:"nutrition"` Saturation float32 `nbt:"saturation"` CanAlwaysEat bool `nbt:"can_always_eat"` EatSeconds float32 `nbt:"eat_seconds"` UsingConvertsTo Item `nbt:"using_converts_to"` Effects []Effect `nbt:"effects"` } type Effects struct { Effect Effect `nbt:"effect"` Probability float32 `nbt:"probability"` } type Effect struct { ID string `nbt:"id"` Amplifier int8 `nbt:"amplifier"` Duration int32 `nbt:"duration"` Ambient bool `nbt:"ambient"` ShowParticles bool `nbt:"show_particles"` ShowIcon bool `nbt:"show_icon"` } ================================================ FILE: server/world/level/item/hide_additional_tooltip.go ================================================ package item // Do not add this tag at all if you don't want it to hide additional tooltip(s)! type HideAdditionalTooltip struct { } ================================================ FILE: server/world/level/item/hide_tooltip.go ================================================ package item // Do not add this tag at all if you don't want it to hide the tooltip! type HideTooltip struct { } ================================================ FILE: server/world/level/item/intangible_projectile.go ================================================ package item // Do not add this tag at all if you don't want it to intangible! type IntangibleProjectile struct { } ================================================ FILE: server/world/level/item/item.go ================================================ package item import ( "fmt" "slices" "github.com/zeppelinmc/zeppelin/protocol/net/slot" "github.com/zeppelinmc/zeppelin/protocol/net/tags" "github.com/zeppelinmc/zeppelin/server/registry" "github.com/zeppelinmc/zeppelin/server/world/chunk/section" ) type DataSlot int8 func (slot DataSlot) Network() int32 { switch { case slot == 100: return 8 case slot == 101: return 7 case slot == 102: return 6 case slot == 103: return 5 case slot == -106: return 45 case slot <= 8: return int32(slot + 36) case slot >= 80 && slot <= 83: return int32(slot - 79) default: return int32(slot) } } func DataSlotFrom(network int32) DataSlot { switch { case network == 8: return 100 case network == 7: return 101 case network == 6: return 102 case network == 5: return 103 case network == 45: return -106 case network >= 36 && network <= 44: return DataSlot(network - 36) case network >= 1 && network <= 4: return DataSlot(network + 79) default: return DataSlot(network) } } type Item struct { // The slot (as stored in the player data) Slot DataSlot `nbt:"Slot"` // the amount of items in the slot Count int32 `nbt:"count"` // The string id of this item Id string `nbt:"id"` // Components of this item (https://minecraft.wiki/w/Data_component_format#List_of_components) Components struct{} `nbt:"components"` /*struct { AttributeModifiers any `nbt:"minecraft:attribute_modifiers"` BannerPatterns []BannerPattern `nbt:"minecraft:banner_patterns"` BaseColor string `nbt:"minecraft:base_color"` Bees []Bee `nbt:"minecraft:bees"` BlockEntityData any `nbt:"minecraft:block_entity_data"` BlockState any `nbt:"minecraft:block_state"` BucketEntityData BucketEntityData `nbt:"minecraft:bucket_entity_data"` BundleContents []Item `nbt:"minecraft_bundle_contents"` CanBreak CanDo `nbt:"minecraft:can_break"` CanPlaceOn CanDo `nbt:"minecraft:can_place_on"` ChargedProjectiles []Item `nbt:"minecraft:charged_projectiles"` Container []Item `nbt:"minecraft:container"` ContainerLoot ContainerLoot `nbt:"minecraft_container_loot"` CustomData any `nbt:"minecraft:custom_data"` CustomModelData int32 `nbt:"minecraft:custom_model_data"` CustomName string `nbt:"minecraft:custom_name"` Damage int32 `nbt:"minecraft:damage"` DebugStickState any `nbt:"minecraft:debug_stick_state"` DyedColor any `nbt:"minecraft:dyed_color"` EnchantmentGlintOverride bool `nbt:"minecraft:enchantment_glint_override"` Enchantments Enchantments `nbt:"minecraft:enchantments"` EntityData state.LevelEntity `nbt:"minecraft:entity_data"` FireResistant FireResistant `nbt:"minecraft:fire_resistant"` FireworkExplosion FireworkExplosion `nbt:"minecraft:firework_explosion"` Fireworks Fireworks `nbt:"minecraft:fireworks"` Food Food `nbt:"minecraft:food"` HideAdditionalTooltip HideAdditionalTooltip `nbt:"minecraft:hide_additional_tooltip"` HideTooltip HideTooltip `nbt:"minecraft:hide_tooltip"` Instrument any `nbt:"minecraft:instrument"` IntangibleProjectile IntangibleProjectile `nbt:"minecraft:intangible_projectile"` ItemName string `nbt:"minecraft:item_name"` JukeboxPlayable JukeboxPlayable `nbt:"minecraft:jukebox_playable"` Lock string `nbt:"minecraft:lock"` LodestoneTracker LodestoneTracker `nbt:"minecraft:lodestone_tracker"` Lore []string `nbt:"minecraft:lore"` MapColor int32 `nbt:"minecraft:map_color"` MapDecorations any `nbt:"minecraft:map_decorations"` MapID int32 `nbt:"minecraft:map_id"` MaxDamage int32 `nbt:"minecraft:max_damage"` MaxStackSize int32 `nbt:"minecraft:max_stack_size"` NoteBlockSound string `nbt:"minecraft:note_block_sound"` OminousBottleAmplifier int32 `nbt:"minecraft:ominous_bottle_amplifier"` PotDecorations []string `nbt:"minecraft:pot_decorations"` PotionContents any `nbt:"minecraft:potion_contents"` Profile any `nbt:"minecraft:profile"` Rarity string `nbt:"minecraft:rarity"` Recipes []string `nbt:"minecraft:recipes"` RepairCost int32 `nbt:"minecraft:repair_cost"` StoredEnchantments StoredEnchantments `nbt:"minecraft:stored_enchantments"` SuspiciousStewEffects []SuspiciousStewEffect `nbt:"minecraft:suspicious_stew_effects"` Tool Tool `nbt:"minecraft:tool"` Trim Trim `nbt:"minecraft:trim"` Unbreakable Unbreakable `nbt:"minecraft:unbreakable"` WritableBookContent WritableBookContent `nbt:"minecraft:writable_book_content"` WrittenBookContent WrittenBookContent `nbt:"minecraft:written_book_content"` CreativeSlotLock CreativeSlotLock `nbt:"minecraft:creative_slot_lock"` MapPostProcessing int32 `nbt:"minecraft:map_post_processing"` } `nbt:"components"`*/ } // Is checks if the tag applies to the item func (item *Item) IsTag(tagName string) bool { return slices.Index(tags.Tags.Tags["minecraft:item"][tagName], registry.Item.Get(item.Id)) != -1 } func (item *Item) Is(i Item) bool { return item.Id == i.Id && item.Components == i.Components } // returns the block of the item, if found func (i Item) Block() (block section.Block, ok bool) { b := section.GetBlock(i.Id) _, ok = registry.Block.Lookup(i.Id) return b, ok } // New creates an item from the slot provided func New(slot int32, item slot.Slot) (Item, error) { i := Item{ Slot: DataSlotFrom(slot), Count: item.ItemCount, } id, ok := registry.Item.NameOf(item.ItemId) if !ok { return i, fmt.Errorf("invalid item id") } i.Id = id return i, nil } ================================================ FILE: server/world/level/item/items.go ================================================ package item var Air = Item{Id: "minecraft:air"} ================================================ FILE: server/world/level/item/jukebox_playable.go ================================================ package item type JukeboxPlayable struct { Song string `nbt:"song"` ShowInTooltip bool `nbt:"show_in_tooltip"` } ================================================ FILE: server/world/level/item/lodestone_tracker.go ================================================ package item type LodestoneTracker struct { Target Target `nbt:"target"` Tracked bool `nbt:"tracked"` } type Target struct { Pos []int32 `nbt:"pos"` Dimension string `nbt:"dimension"` } ================================================ FILE: server/world/level/item/map_post_processing.go ================================================ package item type MapPostProcessing struct { MapPostProcessing int32 `nbt:"map_post_processing"` } ================================================ FILE: server/world/level/item/stored_enchantments.go ================================================ package item type StoredEnchantments struct { Levels any `nbt:"levels"` ShowInTooltip bool `nbt:"show_in_tooltip"` } ================================================ FILE: server/world/level/item/susipicious_stew_effects.go ================================================ package item type SuspiciousStewEffect *struct { ID string `nbt:"id"` Duration int32 `nbt:"duration"` } ================================================ FILE: server/world/level/item/tool.go ================================================ package item type Tool struct { DefaultMiningSpeed float32 `nbt:"default_mining_speed"` DamagePerBlock int32 `nbt:"damage_per_block"` Rules []Rule `nbt:"rules"` } type Rule struct { Blocks any `nbt:"blocks"` Speed float32 `nbt:"speed"` CorrectForDrops bool `nbt:"correct_for_drops"` } ================================================ FILE: server/world/level/item/trim.go ================================================ package item type Trim struct { Pattern string `nbt:"pattern"` Material string `nbt:"material"` ShowInTooltip bool `nbt:"show_in_tooltip"` } ================================================ FILE: server/world/level/item/unbreakable.go ================================================ package item type Unbreakable struct { ShowInTooltip bool `nbt:"show_in_tooltip"` } ================================================ FILE: server/world/level/item/writable_book_content.go ================================================ package item type WritableBookContent struct { Pages any `nbt:"pages"` } ================================================ FILE: server/world/level/item/written_book_content.go ================================================ package item type WrittenBookContent struct { Pages any `nbt:"pages"` Title Title `nbt:"title"` Author string `nbt:"author"` Generation int32 `nbt:"generation"` Resolved bool `nbt:"resolved"` } type Title struct { Raw string `nbt:"raw"` Filtered string `nbt:"filtered"` } ================================================ FILE: server/world/level/level.go ================================================ // Package level provides documentation and loading of .dat files found in the world folder (according to https://minecraft.wiki) // .dat files are NBT (Named Binary Tag) files compressed with Gunzip. // when writing a .dat file, the previous .dat file is renamed to .dat_old package level import ( "compress/gzip" "errors" "github.com/zeppelinmc/zeppelin/properties" "io" "os" "strconv" "time" "github.com/zeppelinmc/zeppelin/protocol/nbt" "github.com/zeppelinmc/zeppelin/server/world/chunk" "github.com/zeppelinmc/zeppelin/server/world/level/seed" ) var ErrAlreadyClosed = errors.New("already closed") var SessionLock = []byte{0xE2, 0x98, 0x83} // GameRule is a string containing an integer or a boolean type GameRule string // Boolean returns the boolean inside of the game rule string func (rule GameRule) Boolean() (bool, error) { return strconv.ParseBool(string(rule)) } // Integer returns the int inside of the game rule string func (rule GameRule) Integer() (int, error) { return strconv.Atoi(string(rule)) } // UnixMilliTimestamp is date represented by the amount of milliseconds since January 1st, 1970 type UnixMilliTimestamp int64 func (stamp UnixMilliTimestamp) Time() time.Time { return time.UnixMilli(int64(stamp)) } func Now() UnixMilliTimestamp { return UnixMilliTimestamp(time.Now().UnixMilli()) } type DimensionGenerationSettings struct { Generator struct { BiomeSource struct { Preset string `nbt:"preset,omitempty"` Type string `nbt:"type"` } `nbt:"biome_source"` //Settings string `nbt:"settings"` // Can be both string and compound, skip for now Type string `nbt:"type"` } `nbt:"generator"` Type string `nbt:"type"` } type Level struct { Data struct { BorderCenterX float64 BorderCenterZ float64 BorderDamagePerBlock float64 BorderSize float64 BorderSafeZone float64 BorderSizeLerpTarget float64 BorderSizeLerpTime int64 BorderWarningBlocks float64 BorderWarningTime float64 DataPacks struct { Disabled []string Enabled []string } DataVersion int32 DayTime int64 Difficulty byte DifficultyLocked bool DragonFight struct { DragonKilled bool Gateways []int32 NeedsStateScanning bool PreviouslyKilled byte } GameRules map[string]GameRule GameType GameMode LastPlayed UnixMilliTimestamp LevelName string ServerBrands []string SpawnAngle float32 SpawnX, SpawnY, SpawnZ int32 Time int64 // time since the world has started in ticks Version struct { Id int32 Name string Series string Snapshot int8 } WanderingTraderId []int32 WanderingTraderSpawnChance int32 WanderingTraderSpawnDelay int32 WasModded bool WorldGenSettings struct { BonusChest bool `nbt:"bonus_chest"` Dimensions map[string]DimensionGenerationSettings `nbt:"dimensions"` GenerateFeatures bool `nbt:"generate_features"` Seed seed.Seed `nbt:"seed"` } AllowCommands bool `nbt:"allowCommands"` ClearWeatherTime int32 `nbt:"clearWeatherTime"` Hardcore bool `nbt:"hardcore"` Initialized bool `nbt:"initialized"` RainTime int32 `nbt:"rainTime"` Raining bool `nbt:"raining"` Thundertime int32 `nbt:"thunderTime"` Thundering bool `nbt:"thundering"` VersionInt int32 `nbt:"version"` } // the base path of the world basePath string `nbt:"-"` closed bool } // TODO fix EOF error // worldPath is the base path of the world func Open(worldPath string) (Level, error) { var level Level file, err := os.Open(worldPath + "/level.dat") if err != nil { return level, err } rd, err := gzip.NewReader(file) if err != nil { return level, err } var buf, _ = io.ReadAll(rd) rd.Close() file.Close() _, err = nbt.Unmarshal(buf, &level) level.basePath = worldPath return level, err } func Create(l Level) error { file, err := os.Create(l.basePath + "/level.dat") if err != nil { return err } w := gzip.NewWriter(file) defer w.Close() defer file.Close() return nbt.NewEncoder(w).Encode("", l) } func (l *Level) Close() error { if l.closed { return ErrAlreadyClosed } l.closed = true return Create(*l) } func New(gen chunk.Generator, props properties.ServerProperties, worldPath string) Level { var l Level l.Data.SpawnX, l.Data.SpawnY, l.Data.SpawnZ = gen.GenerateWorldSpawn() l.Data.AllowCommands = true l.Data.BorderDamagePerBlock = 0.2 l.Data.BorderSize = 60000000 l.Data.BorderSafeZone = 5 l.Data.BorderSizeLerpTarget = 60000000 l.Data.BorderWarningBlocks = 5 l.Data.BorderWarningTime = 15 l.Data.DataPacks.Enabled = []string{"vanilla"} l.Data.Difficulty = diffstr(props.Difficulty) l.Data.WorldGenSettings.Seed = seed.New(props.LevelSeed) l.Data.WorldGenSettings.GenerateFeatures = props.GenerateStructures l.Data.GameType = gmstr(props.Gamemode) l.Data.Hardcore = props.Hardcore l.Data.Initialized = true l.Data.LastPlayed = Now() l.Data.LevelName = props.LevelName l.Data.VersionInt = 19133 l.Data.Version.Id = 3953 l.Data.Version.Name = "1.21" l.Data.Version.Series = "main" l.Data.ServerBrands = []string{"Zeppelin"} l.basePath = worldPath return l } func (l *Level) Refresh(props properties.ServerProperties) { l.Data.AllowCommands = true l.Data.DataPacks.Enabled = []string{"vanilla"} l.Data.Difficulty = diffstr(props.Difficulty) l.Data.WorldGenSettings.GenerateFeatures = props.GenerateStructures l.Data.GameType = gmstr(props.Gamemode) l.Data.Hardcore = props.Hardcore l.Data.Initialized = true l.Data.LastPlayed = Now() l.Data.LevelName = props.LevelName l.Data.VersionInt = 19133 l.Data.Version.Id = 3953 l.Data.Version.Name = "1.21" l.Data.Version.Series = "main" l.Data.ServerBrands = []string{"Zeppelin"} } func diffstr(str string) byte { switch str { case "peaceful": return 0 case "normal": return 2 case "hard": return 3 default: return 1 } } func gmstr(str string) GameMode { switch str { case "creative": return GameModeCreative case "adventure": return GameModeAdventure case "spectator": return GameModeSpectator default: return GameModeSurvival } } ================================================ FILE: server/world/level/playerdata.go ================================================ package level import ( "bytes" "compress/gzip" "fmt" "io" "os" "github.com/google/uuid" "github.com/zeppelinmc/zeppelin/protocol/nbt" "github.com/zeppelinmc/zeppelin/protocol/net/packet/play" "github.com/zeppelinmc/zeppelin/server/container" "github.com/zeppelinmc/zeppelin/server/entity" datauuid "github.com/zeppelinmc/zeppelin/server/world/level/uuid" ) type Player struct { // the path of this playerdata file, not a field in the nbt path string `nbt:"-"` // the base path of the world basePath string `nbt:"-"` AbsorptionAmount float32 Air int16 Brain struct { Memories struct{} `nbt:"memories"` } DataVersion int32 DeathTime int16 Dimension string EnderItems container.Container FallFlying bool Fire int16 Health float32 HurtByTimestamp int32 HurtTime int16 Inventory container.Container Invulnerable bool LastDeathLocation struct { Dimension string `nbt:"dimension"` Pos [3]int32 `nbt:"pos"` } Motion [3]float64 OnGround bool PortalCooldown int32 Pos [3]float64 Rotation [2]float32 Score int32 SelectedItemSlot int32 SleepTimer int16 UUID datauuid.UUID XpLevel int32 XpP float32 XpSeed int32 XpTotal int32 Abilities PlayerAbilities `nbt:"abilities"` ActiveEffects []struct { Duration int32 `nbt:"duration"` Id string `nbt:"id"` ShowIcon bool `nbt:"show_icon"` ShowParticles bool `nbt:"show_particles"` } `nbt:"active_effects"` Attributes []entity.Attribute `nbt:"attributes"` CurrentImpulseContextResetGraceTime int32 `nbt:"current_impulse_context_reset_grace_time"` FoodExhaustionLevel float32 `nbt:"foodExhaustionLevel"` FoodLevel int32 `nbt:"foodLevel"` FoodSaturationLevel float32 `nbt:"foodSaturationLevel"` FoodTickTimer int32 `nbt:"foodTickTimer"` IgnoreFallDamageFromCurrentExplosion bool `nbt:"ignore_fall_damage_from_current_explosion"` PlayerGameType GameMode `nbt:"playerGameType"` RecipeBook RecipeBook `nbt:"recipeBook"` SeenCredits bool `nbt:"seenCredits"` SpawnExtraParticlesOnFall bool `nbt:"spawn_extra_particles_on_fall"` WardenSpawnTracker struct { CooldownTicks int32 `nbt:"cooldown_ticks"` TicksSinceLastWarning int32 `nbt:"ticks_since_last_warning"` WarningLevel int32 `nbt:"warning_level"` } `nbt:"warden_spawn_tracker"` } func (data *Player) Save() error { os.MkdirAll(data.basePath+"/playerdata", 0755) os.Rename(data.path, data.path+"_old") file, err := os.Create(data.path) if err != nil { return err } gzip := gzip.NewWriter(file) if err := nbt.NewEncoder(gzip).Encode("", *data); err != nil { return err } if err := gzip.Close(); err != nil { return err } return file.Close() } func (w *Level) PlayerData(uuid string) (Player, error) { var playerData Player path := fmt.Sprintf("%s/playerdata/%s.dat", w.basePath, uuid) file, err := os.Open(path) if err != nil { return playerData, err } rd, err := gzip.NewReader(file) if err != nil { return playerData, err } var buf, _ = io.ReadAll(rd) rd.Close() file.Close() _, err = nbt.NewDecoder(bytes.NewReader(buf)).Decode(&playerData) playerData.path = path return playerData, err } func (w *Level) NewPlayerData(uuid uuid.UUID) Player { return Player{ path: fmt.Sprintf("%s/playerdata/%s.dat", w.basePath, uuid), basePath: w.basePath, Pos: [3]float64{float64(w.Data.SpawnX), float64(w.Data.SpawnY), float64(w.Data.SpawnZ)}, Health: 20, FoodSaturationLevel: 5, FoodLevel: 20, Fire: -20, UUID: datauuid.New(uuid), Dimension: "minecraft:overworld", OnGround: true, PlayerGameType: w.Data.GameType, Abilities: PlayerAbilities{ FlySpeed: 0.05, Instabuild: w.Data.GameType == GameModeCreative, Invulnerable: w.Data.GameType == GameModeCreative, MayFly: w.Data.GameType == GameModeCreative, MayBuild: w.Data.GameType != GameModeAdventure, WalkSpeed: 0.1, }, Attributes: []entity.Attribute{ { Base: 4.5, Id: "minecraft:player.block_interaction_range", }, { Base: 0.1, Id: "minecraft:generic.movement_speed", }, { Base: 3, Id: "minecraft:player.entity_interaction_range", }, }, } } type RecipeBook struct { IsBlastingFurnaceFilteringCraftable bool `nbt:"isBlastingFurnaceFilteringCraftable"` IsBlastingFurnaceGuiOpen bool `nbt:"isBlastingFurnaceGuiOpen"` IsFilteringCraftable bool `nbt:"isFilteringCraftable"` IsFurnaceFilteringCraftable bool `nbt:"isFurnaceFilteringCraftable"` IsFurnaceGuiOpen bool `nbt:"isFurnaceGuiOpen"` IsGuiOpen bool `nbt:"isGuiOpen"` IsSmokerFilteringCraftable bool `nbt:"isSmokerFilteringCraftable"` IsSmokerGuiOpen bool `nbt:"isSmokerGuiOpen"` Recipes []string `nbt:"recipes"` ToBeDisplayed []string `nbt:"toBeDisplayed"` } // Game Mode type GameMode int32 const ( GameModeSurvival GameMode = iota GameModeCreative GameModeAdventure GameModeSpectator ) type PlayerAbilities struct { FlySpeed float32 `nbt:"flySpeed"` Flying bool `nbt:"flying"` Instabuild bool `nbt:"instabuild"` Invulnerable bool `nbt:"invulnerable"` MayBuild bool `nbt:"mayBuild"` MayFly bool `nbt:"mayfly"` WalkSpeed float32 `nbt:"walkSpeed"` } func (a PlayerAbilities) Encode(fovModifier float32) *play.PlayerAbilitiesClientbound { var flags int8 if a.Invulnerable { flags |= 0x01 } if a.Flying { flags |= 0x02 } if a.MayFly { flags |= 0x04 } if a.Instabuild { flags |= 0x08 } return &play.PlayerAbilitiesClientbound{ Flags: flags, FlyingSpeed: a.FlySpeed, FOVModifier: fovModifier, } } ================================================ FILE: server/world/level/region/anvil.go ================================================ // Package region provides decoding and encoding of Region (.mca) files package region const DataVersion = 3953 ================================================ FILE: server/world/level/region/region_dec.go ================================================ package region import ( "bytes" "compress/gzip" "fmt" "io" "sync" "github.com/4kills/go-zlib" "github.com/aimjel/minecraft/nbt" "github.com/zeppelinmc/zeppelin/protocol/net/io/buffers" "github.com/zeppelinmc/zeppelin/protocol/net/io/compress" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) type File struct { rx, rz int32 generator chunk.Generator reader io.ReaderAt locations []byte chunks map[uint64]*chunk.Chunk chu_mu sync.Mutex } func chunkLocation(l int32) (offset, size int32) { offset = ((l >> 8) & 0xFFFFFF) size = l & 0xFF return offset * 4096, size * 4096 } func (r *File) generateChunkAt(x, z int32, tgt *chunk.Chunk, generator chunk.Generator) { c := generator.NewChunk(x, z) *tgt = c } func (r *File) LoadedChunks() int32 { r.chu_mu.Lock() defer r.chu_mu.Unlock() return int32(len(r.chunks)) } func (r *File) GetChunk(x, z int32) (*chunk.Chunk, error) { var chunkBuffer = buffers.Buffers.Get().(*bytes.Buffer) chunkBuffer.Reset() defer buffers.Buffers.Put(chunkBuffer) return r.GetChunkBuf(x, z, chunkBuffer) } func (r *File) GetChunkBuf(x, z int32, chunkBuffer *bytes.Buffer) (*chunk.Chunk, error) { hash := ChunkHash(x, z) r.chu_mu.Lock() defer r.chu_mu.Unlock() if c, ok := r.chunks[hash]; ok { return c, nil } locationIndex := 4 * ((x & 31) + (z&31)<<5) if int(locationIndex) >= len(r.locations) { if r.generator != nil { r.chunks[hash] = new(chunk.Chunk) r.generateChunkAt(x, z, r.chunks[hash], r.generator) return r.chunks[hash], nil } return nil, fmt.Errorf("chunk %d %d not found", x, z) } l := r.locations[locationIndex : locationIndex+4] loc := int32(l[0])<<24 | int32(l[1])<<16 | int32(l[2])<<8 | int32(l[3]) offset, size := chunkLocation(loc) if offset == 0 && size == 0 { if r.generator != nil { r.chunks[hash] = new(chunk.Chunk) r.generateChunkAt(x, z, r.chunks[hash], r.generator) return r.chunks[hash], nil } return nil, fmt.Errorf("chunk %d %d not found", x, z) } var chunkHeader [5]byte _, err := r.reader.ReadAt(chunkHeader[:], int64(offset)) if err != nil { return nil, err } length := (int32(chunkHeader[0])<<24 | int32(chunkHeader[1])<<16 | int32(chunkHeader[2])<<8 | int32(chunkHeader[3])) - 1 compression := chunkHeader[4] if length == 0 { return nil, fmt.Errorf("chunk %d %d not found", x, z) } var reader = io.NewSectionReader(r.reader, int64(offset)+5, int64(length)) switch compression { case CompressionZlib: z := compress.RZlib.Get().(*zlib.Reader) z.Reset(reader, nil) chunkBuffer.ReadFrom(z) compress.RZlib.Put(z) case CompressionGzip: g := compress.RGzip.Get().(*gzip.Reader) g.Reset(reader) chunkBuffer.ReadFrom(g) compress.RGzip.Put(z) case CompressionNone: chunkBuffer.ReadFrom(reader) } var anvil = new(chunk.Chunk) if err := nbt.Unmarshal(chunkBuffer.Bytes(), anvil); err != nil { return nil, err } for i := range anvil.Sections { (&anvil.Sections[i]).Init() } r.chunks[hash] = anvil /*if emptySections == len(r.chunks[hash].Sections) && r.generateEmpty && r.generator != nil { r.chunks[hash] = new(chunk.Chunk) r.generateChunkAt(x, z, r.chunks[hash], r.generator) return r.chunks[hash], nil }*/ return anvil, err } func Empty(f *File, rx, rz int32, generator chunk.Generator) { *f = File{ chunks: make(map[uint64]*chunk.Chunk), rx: rx, rz: rz, generator: generator, } } func Decode(r io.ReaderAt, f *File, rx, rz int32, generator chunk.Generator) error { var locationTable = make([]byte, 4096) _, err := r.ReadAt(locationTable, 0) if err != nil { return err } *f = File{ chunks: make(map[uint64]*chunk.Chunk), rx: rx, rz: rz, generator: generator, locations: locationTable, reader: r, } return nil //return f.decodeAll(locationTable, r) } func ChunkHash(x, z int32) uint64 { return uint64(uint32(z))<<32 | uint64(uint32(x)) } ================================================ FILE: server/world/level/region/region_enc.go ================================================ package region import ( "bytes" "fmt" "time" "encoding/binary" "os" "github.com/zeppelinmc/zeppelin/protocol/nbt" "github.com/zeppelinmc/zeppelin/protocol/net/io/buffers" ) type bufferCloser struct { *bytes.Buffer } func (bufferCloser) Close() error { return nil } const ( CompressionGzip = iota + 1 CompressionZlib CompressionNone CompressionLZ4 ) // 4096B var MaxCompressedPacketSize = 4096 // Encode writes itself to w. func (f *File) Encode(w *os.File, compressionScheme byte) error { var locationTable [4096]byte var timestampTable [4096]byte var chunksOffset = len(locationTable) + len(timestampTable) var buf = new(bytes.Buffer) var chunkBuffer = buffers.Buffers.Get().(*bytes.Buffer) defer buffers.Buffers.Put(chunkBuffer) for _, chunk := range f.chunks { locationIndex := ((uint32(chunk.X) % 32) + (uint32(chunk.Z)%32)*32) * 4 lastModified := time.Now().UnixMilli() // this has no purpose binary.BigEndian.PutUint32(timestampTable[locationIndex:locationIndex+4], uint32(lastModified)) offset := (buf.Len() + chunksOffset) / 4096 locationTable[locationIndex+0], locationTable[locationIndex+1], locationTable[locationIndex+2], locationTable[locationIndex+3] = byte(offset>>16), byte(offset>>8), byte(offset), 1 chunkBuffer.Reset() if err := nbt.NewEncoder(chunkBuffer).Encode("", chunk); err != nil { return err } var data []byte var err error switch compressionScheme { case CompressionGzip: //data, err = compress.CompressGzip(chunkBuffer.Bytes(), nil) if err != nil { return err } case CompressionZlib: /*data, err = compress.CompressZlib(chunkBuffer.Bytes(), nil) if err != nil { return err }*/ case CompressionNone: data = chunkBuffer.Bytes() default: return fmt.Errorf("unknown compression scheme %d", compressionScheme) } chunkLength := chunkBuffer.Len() + 1 if _, err := buf.Write([]byte{ byte(chunkLength >> 24), byte(chunkLength >> 16), byte(chunkLength >> 8), byte(chunkLength), compressionScheme, }); err != nil { return err } if _, err := buf.Write(data); err != nil { return err } if _, err := buf.Write(make([]byte, (4096-(buf.Len()%4096))%4096)); err != nil { return err } } if _, err := w.Write(locationTable[:]); err != nil { return err } if _, err := w.Write(timestampTable[:]); err != nil { return err } _, err := buf.WriteTo(w) return err } ================================================ FILE: server/world/level/seed/seed.go ================================================ // Package seed provides parsing of string seeds and generating them package seed import ( "crypto/sha256" "encoding/binary" "math" "math/rand" ) type Seed int64 // First 8 bytes of the SHA-256 hash of the world's seed. Used client side for biome noise func (s Seed) Hash() int64 { hash := sha256.Sum256(binary.BigEndian.AppendUint64(nil, uint64(s))) return int64(binary.BigEndian.Uint64(hash[:8])) } func Random() Seed { return Seed(rand.Int63()) } func New(str string) Seed { return Seed(hashCode(str)) } // HashCode is an implementation of Java's hashCode function. It used to turn any string seed into a long seed func hashCode(s string) int64 { if len(s) == 0 { return 0 } var result int64 n := len(s) for i := 0; i < len(s)-1; i++ { result += int64(s[i]) * int64(math.Pow(31, float64(n-(i+1)))) } return result + int64(s[int(n)-1]) } ================================================ FILE: server/world/level/uuid/uuid.go ================================================ // Package uuid provides a type for UUIDs stored in level files package uuid import "github.com/google/uuid" func New(u uuid.UUID) UUID { return UUID{ int32(u[0])<<24 | int32(u[1])<<16 | int32(u[2])<<8 | int32(u[3]), int32(u[4])<<24 | int32(u[5])<<16 | int32(u[6])<<8 | int32(u[7]), int32(u[8])<<24 | int32(u[9])<<16 | int32(u[10])<<8 | int32(u[11]), int32(u[12])<<24 | int32(u[13])<<16 | int32(u[14])<<8 | int32(u[15]), } } // A uuid saved in playerdata and state files contains 4 integers of the 128 bit uuid ordered from most to least significant type UUID [4]int32 // Returns the UUID object of this data uuid func (u UUID) UUID() uuid.UUID { return uuid.UUID{ byte(u[0] >> 24), byte(u[0] >> 16), byte(u[0] >> 8), byte(u[0]), byte(u[1] >> 24), byte(u[1] >> 16), byte(u[1] >> 8), byte(u[1]), byte(u[2] >> 24), byte(u[2] >> 16), byte(u[2] >> 8), byte(u[2]), byte(u[3] >> 24), byte(u[3] >> 16), byte(u[3] >> 8), byte(u[3]), } } ================================================ FILE: server/world/terrain/superflat.go ================================================ package terrain import ( "math/rand" "github.com/zeppelinmc/zeppelin/server/world/chunk" ) // superflat chunk generator type SuperflatTerrain struct { } func (SuperflatTerrain) NewChunk(cx, cz int32) chunk.Chunk { c := chunk.NewChunk(cx, cz) for x := int32(0); x < 16; x++ { for z := int32(0); z < 16; z++ { c.SetBlock(x, 4, z, grassBlock) c.SetBlock(x, 2, z, dirt) c.SetBlock(x, 1, z, dirt) c.SetBlock(x, 0, z, bedrock) } } return c } func (SuperflatTerrain) GenerateWorldSpawn() (x, y, z int32) { return rand.Int31n(160), 5, rand.Int31n(160) } ================================================ FILE: server/world/terrain/terrain.go ================================================ package terrain import ( "math" "math/rand" "github.com/aquilax/go-perlin" "github.com/zeppelinmc/zeppelin/server/world/block" "github.com/zeppelinmc/zeppelin/server/world/chunk" "github.com/zeppelinmc/zeppelin/server/world/chunk/section" ) type TerrainGenerator struct { noise *perlin.Perlin seed int64 } func (g TerrainGenerator) GenerateWorldSpawn() (x, y, z int32) { x, z = rand.Int31n(160), rand.Int31n(160) y = int32(math.Ceil(g.y(x, z))) return } func (g TerrainGenerator) y(x, z int32) float64 { return g.noise.Noise2D(float64(x)/30, float64(z)/30)*10 + 80 } func (g TerrainGenerator) NewChunk(cx, cz int32) chunk.Chunk { c := chunk.NewChunk(cx, cz) var ( treeY int32 ) for x := int32(0); x < 16; x++ { for z := int32(0); z < 16; z++ { absX, absZ := (cx<<4)+x, (cz<<4)+z y := int32(g.y(absX, absZ)) if y <= -64 { y = -64 } else if y >= 320 { y = 320 } c.Heightmaps.WorldSurface.Set(x, z, y) c.Heightmaps.MotionBlocking.Set(x, z, y) c.SetBlock(x, y, z, grassBlock) for s := int32(chunk.MinChunkY * 16); s < y; s++ { c.SetBlock(x, int32(s), z, dirt) } if x == 7 && z == 7 { treeY = y } } } if rand.Int31()&0x01 == 00 { g.generateTree(c, 7, 7, treeY) } return c } // tree, woody plant that regularly renews its growth (perennial). Most plants classified as trees have a single self-supporting trunk containing woody tissues, and in most species the trunk produces secondary limbs, called branches func (g TerrainGenerator) generateTree(c chunk.Chunk, x, z, surface int32) { // set the block under the tree to be dirt c.SetBlock(x, surface, z, dirt) // set 4 layers of oak logs c.SetBlock(x, surface+1, z, oakLog) c.SetBlock(x, surface+2, z, oakLog) c.SetBlock(x, surface+3, z, oakLog) c.SetBlock(x, surface+4, z, oakLog) for i := x - 2; i <= x+2; i++ { for j := z - 2; j <= z+2; j++ { // generate the bottom 2 layers of the tree's leaves (3x3 excluding corners) if !isCorner(i, j, x-2, z-2, x+2, z+2) { c.SetBlock(i, surface+5, j, oakLeaves) if i != x || j != z { c.SetBlock(i, surface+4, j, oakLeaves) } } // generate the top 2 layers of the tree's leaves (both 2x2 and one excluding corners) if i >= x-1 && i <= x+1 && j >= z-1 && j <= z+1 { c.SetBlock(i, surface+6, j, oakLeaves) if !isCorner(i, j, x-1, z-1, x+1, z+1) { c.SetBlock(i, surface+7, j, oakLeaves) } } } } } func NewTerrainGenerator(seed int64) TerrainGenerator { return TerrainGenerator{ noise: perlin.NewPerlin(2, 2, 1, seed), seed: seed, } } func isCorner(x, z, minX, minZ, maxX, maxZ int32) bool { return (x == minX && z == minZ) || (x == maxX && z == maxZ) || (x == maxX && z == minZ) || (x == minZ && z == maxZ) } var grassBlock = section.AnvilBlock{Name: "minecraft:grass_block"} //block.GrassBlock{} var dirt = section.AnvilBlock{Name: "minecraft:dirt"} var bedrock = section.AnvilBlock{Name: "minecraft:bedrock"} var oakLog = section.AnvilBlock{Name: "minecraft:oak_log", Properties: map[string]string{"axis": block.AxisY}} var oakLeaves = section.AnvilBlock{Name: "minecraft:leaves", Properties: map[string]string{"distance": "1"}} ================================================ FILE: server/world/world.go ================================================ package world import ( "fmt" "github.com/zeppelinmc/zeppelin/properties" "os" "sync/atomic" //"github.com/zeppelinmc/zeppelin/server/session" "github.com/zeppelinmc/zeppelin/server/world/chunk" "github.com/zeppelinmc/zeppelin/server/world/dimension" "github.com/zeppelinmc/zeppelin/server/world/level" "github.com/zeppelinmc/zeppelin/server/world/terrain" ) type World struct { level.Level dimension.DimensionManager //Broadcast *session.Broadcast levelPrepared bool props properties.ServerProperties lock *os.File path string worldAge, dayTime atomic.Int64 } const version = 19133 func NewWorld(props properties.ServerProperties) (*World, error) { var err error w := &World{ path: props.LevelName, //Broadcast: session.NewBroadcast(props), props: props, } owgen := terrain.NewTerrainGenerator(int64(w.Data.WorldGenSettings.Seed)) w.Level, err = level.Open(props.LevelName) if err != nil { fmt.Println(err) _ = w.prepareLevel(owgen, props) } if w.Level.Data.VersionInt > version { return nil, fmt.Errorf("world is too old") } if w.Level.Data.VersionInt < version { return nil, fmt.Errorf("world is too new") } if w.obtainLock() != nil { return nil, fmt.Errorf("failed to obtain session.lock") } w.worldAge.Store(w.Level.Data.Time) w.dayTime.Store(w.Level.Data.DayTime) w.DimensionManager = dimension.NewDimensionManager(map[string]*dimension.Dimension{ "minecraft:overworld": dimension.New( props.LevelName+"/region", "minecraft:overworld", "minecraft:overworld", //w.Broadcast, //owgen, nil, w.Level, ), }) w.Level.Refresh(w.props) return w, nil } // prepareLevel creates a new level.dat file and other world folders func (w *World) prepareLevel(owgen chunk.Generator, props properties.ServerProperties) error { w.Level = level.New(owgen, props, w.path) return anyerror( os.MkdirAll(w.path+"/playerdata", 0755), os.Mkdir(w.path+"/region", 0755), os.Mkdir(w.path+"/poi", 0755), os.Mkdir(w.path+"/entities", 0755), os.MkdirAll(w.path+"/DIM-1/region", 0755), os.MkdirAll(w.path+"/DIM1/region", 0755), ) } func anyerror(err ...error) error { for _, err := range err { if err != nil { return err } } return nil } func (w *World) obtainLock() error { f, err := os.OpenFile(w.path+"/session.lock", os.O_RDWR|os.O_CREATE, 0755) if err != nil { return err } f.Write(level.SessionLock) w.lock = f return nil } // increments the day time and world age by one tick and returns the updated time func (w *World) IncrementTime() (worldAge, dayTime int64) { worldAge = w.worldAge.Add(1) dayTime = w.dayTime.Add(1) return } func (w *World) Time() (worldAge, dayTime int64) { return w.worldAge.Load(), w.dayTime.Load() } func (w *World) DaytimeAdd(delta int64) { w.dayTime.Add(delta) } func (w *World) DaytimeSet(v int64) { w.dayTime.Store(v) } func (w *World) WorldAgeSet(v int64) { w.worldAge.Store(v) } ================================================ FILE: util/atomic/atomic.go ================================================ package atomic import "sync/atomic" type AtomicValue[T any] struct { v atomic.Value } func (a *AtomicValue[T]) Get() T { val := a.v.Load() if val == nil { var e T return e } v, _ := val.(T) return v } func (a *AtomicValue[T]) Set(t T) { a.v.Store(t) } func Value[T any](value T) AtomicValue[T] { val := AtomicValue[T]{} val.Set(value) return val } ================================================ FILE: util/atomic/slice.go ================================================ package atomic import ( "sync/atomic" "unsafe" ) // Pointer is the size of pointers var Pointer = unsafe.Sizeof(0) //go:linkname mallocgc runtime.mallocgc func mallocgc(size uintptr, typ unsafe.Pointer, needzero bool) unsafe.Pointer func memcpy(dst, src unsafe.Pointer, n uintptr) { dstS := unsafe.Slice((*byte)(dst), n) srcS := unsafe.Slice((*byte)(src), n) copy(dstS, srcS) } func Make(len, cap, sizeOfElement uintptr) Slice { return Slice{ ptr: uintptr(mallocgc(cap, nil, false)), len: len, cap: cap, sizeOfElement: sizeOfElement, } } // Slice is an atomic slice with all read only fields. Entries cannot be removed. type Slice struct { ptr, len, cap uintptr //not atomic sizeOfElement uintptr } func (a *Slice) Len() uintptr { return atomic.LoadUintptr(&a.len) } func (a *Slice) Cap() uintptr { return atomic.LoadUintptr(&a.cap) } func (a *Slice) Pointer() unsafe.Pointer { return unsafe.Pointer(atomic.LoadUintptr(&a.ptr)) } // At returns the element at the specified index, while checking that the index is in bounds func (a *Slice) At(index uintptr) unsafe.Pointer { if a.Cap() < index { panic("out of bounds") } if a.Len() < index { atomic.StoreUintptr(&a.len, index+1) } return a.Element(index) } // Element returns the element at the specified index, without checking that the index is in bounds func (a *Slice) Element(index uintptr) unsafe.Pointer { return unsafe.Add(a.Pointer(), index*a.sizeOfElement) } // Grow grows the slice to capacity of cap func (a *Slice) Grow(cap uintptr) { newPtr := mallocgc(cap*a.sizeOfElement, nil, false) length := a.Len() memcpy(newPtr, a.Pointer(), a.sizeOfElement*length) atomic.StoreUintptr(&a.ptr, uintptr(newPtr)) atomic.StoreUintptr(&a.cap, cap) } // TrimStart removes the first count elements from the slice func (a *Slice) TrimStart(count uintptr) { if count > a.Cap() { panic("out of bounds") } atomic.AddUintptr(&a.ptr, count*a.sizeOfElement) } // TrimEnd removes the last count elements from the slice func (a *Slice) TrimEnd(count uintptr) { if count > a.Cap() { panic("out of bounds") } atomic.AddUintptr(&a.len, -count*a.sizeOfElement) } // Append adds the elements from the specified pointers to the slice func (a *Slice) Append(elements ...unsafe.Pointer) { currentLength := a.Len() currentCapacity := a.Cap() count := uintptr(len(elements)) // need to expand the slice if newLength := currentLength + count; newLength > currentCapacity { a.Grow(newLength) a.Append(elements...) return } basePtr := unsafe.Add(a.Pointer(), currentLength*a.sizeOfElement) for _, element := range elements { memcpy(basePtr, element, a.sizeOfElement) basePtr = unsafe.Add(basePtr, a.sizeOfElement) } atomic.AddUintptr(&a.len, count) } ================================================ FILE: util/console/console.go ================================================ package console import ( "bufio" "fmt" "os" "os/signal" "strings" "unsafe" "github.com/zeppelinmc/zeppelin/protocol/text" "github.com/zeppelinmc/zeppelin/server" "github.com/zeppelinmc/zeppelin/util/log" ) type console struct{} func (c console) SystemMessage(t text.TextComponent) error { log.Chat(t) return nil } var Console console func GetFlag(name string) (string, bool) { name = "--" + name + "=" for _, a := range os.Args { if i := strings.Index(a, name); i == 0 { if len(name)+i < len(a) { return a[len(name)+i:], true } } } return "", false } func StartConsole(srv *server.Server) { var line string var scanner = bufio.NewScanner(os.Stdin) interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt, os.Kill) go func() { for range interrupt { newText := "\r> stop" fmt.Print(newText) l := len(line) + 3 // the addtitional 3 chars are "\r> " if l > len(newText) { fmt.Print(strings.Repeat(" ", l-len(newText))) } fmt.Println() srv.Stop() os.Stdin.Close() } }() for { if !scanner.Scan() { break } line = scanner.Text() srv.CommandManager.Call(line, Console) fmt.Print("\r> ") } } func StartRawConsole(srv *server.Server) { var char [1]byte var currentLine string var previousLines []string var previousLinesIndex int var currentLineIndex int charl: for { os.Stdin.Read(char[:]) if char[0] == 27 { os.Stdin.Read(char[:]) if char[0] != 91 { continue } os.Stdin.Read(char[:]) switch char[0] { case 'A': //up if len(previousLines[previousLinesIndex:]) == 0 { continue } l := previousLines[previousLinesIndex] previousLinesIndex++ fmt.Print("\r> ", l) if l, l0 := len(currentLine), len(l); l > l0 { fmt.Print(strings.Repeat(" ", l-l0)) } currentLineIndex = len(l) - 1 currentLine = l case 'B': //down case 'C': //right if currentLineIndex == len(currentLine) { continue } fmt.Printf("%c", currentLine[currentLineIndex]) currentLineIndex++ case 'D': //left if currentLineIndex == 0 { continue } currentLineIndex-- fmt.Print("\b") } continue } switch char[0] { case '\b', 127: //backspace if len(currentLine) == 0 { continue } fmt.Print("\b \b") currentLine = currentLine[:len(currentLine)-1] currentLineIndex-- case 3: //ctrl-c newText := "\r> stop" fmt.Print(newText) l := len(currentLine) + 3 // the addtitional 3 chars are "\r> " if l > len(newText) { fmt.Print(strings.Repeat(" ", l-len(newText))) } fmt.Println() srv.Stop() break charl case 13: // enter if currentLine == "" { continue } fmt.Println() srv.CommandManager.Call(currentLine, Console) previousLines = append([]string{currentLine}, previousLines...) currentLine = "" currentLineIndex = 0 fmt.Print("\r> ") default: if currentLineIndex < len(currentLine) { *unsafe.StringData(currentLine[currentLineIndex:]) = char[0] } else { currentLine += fmt.Sprintf("%c", char[0]) } currentLineIndex++ fmt.Printf("%c", char[0]) } } } //8 erase //3 ================================================ FILE: util/log/log.go ================================================ package log import ( "fmt" "math" "net" "runtime" "runtime/debug" "strings" "sync" "time" "unsafe" "github.com/fatih/color" "github.com/zeppelinmc/zeppelin/protocol/text" ) var timeColor = color.New(color.FgHiBlack).SprintFunc() var stackColor = color.New(color.FgHiBlack).SprintFunc() var infoColor = color.New(color.FgHiBlue, color.Bold).SprintFunc() var errorColor = color.New(color.FgRed, color.Bold).SprintFunc() var warningColor = color.New(color.FgYellow, color.Bold).SprintFunc() var chatColor = color.New(color.FgHiGreen, color.Bold).SprintFunc() var buildInfo, _ = debug.ReadBuildInfo() var mainModuleName = buildInfo.Main.Path[strings.LastIndex(buildInfo.Main.Path, "/")+1:] func FormatAddr(logIps bool, addr net.Addr) string { if logIps { return "[" + addr.String() + "] " } return "" } func timeString() string { time := time.Now() return fmt.Sprintf("%02d:%02d:%02d", time.Hour(), time.Minute(), time.Second()) } func Time() string { return timeColor(timeString()) } var strs = sync.Pool{ New: func() any { return new(strings.Builder) }, } func SprintText(msg text.TextComponent) string { str := strs.Get().(*strings.Builder) str.Reset() defer strs.Put(str) var components = append([]text.TextComponent{msg}, msg.Extra...) for _, component := range components { c := colors[component.Color] if c == nil { c = colors["white"] } if component.Bold { c = c.Add(color.Bold) } if component.Strikethrough { c = c.Add(color.CrossedOut) } if component.Underlined { c = c.Add(color.Underline) } if component.Italic { c = c.Add(color.Italic) } str.WriteString(c.Sprint(component.Text)) } return strings.ReplaceAll(str.String(), "\n", "\n\r") } var colors = map[string]*color.Color{ "black": color.New(color.FgBlack), "dark_blue": color.New(color.FgBlue), "dark_green": color.New(color.FgGreen), "dark_aqua": color.New(color.FgCyan), "dark_red": color.New(color.FgRed, color.Bold), "dark_purple": color.New(color.FgMagenta), "gold": color.New(color.FgYellow, color.Bold), "gray": color.New(color.FgWhite), "dark_gray": color.New(color.FgHiBlack), "blue": color.New(color.FgHiBlue, color.Bold), "green": color.New(color.FgGreen), "aqua": color.New(color.FgHiCyan), "red": color.New(color.FgHiRed), "light_purple": color.New(color.FgHiMagenta), "yellow": color.New(color.FgHiYellow), "white": color.New(color.FgHiWhite), } var stackBuf = sync.Pool{ New: func() any { return make([]byte, 1024) }, } func stackCallerModule(i int) string { buf := stackBuf.Get().([]byte) defer stackBuf.Put(buf) buf = buf[:runtime.Stack(buf, false)] str := unsafe.String(unsafe.SliceData(buf), len(buf)) lines := strings.Split(str, "\n")[1:] i = int(math.RoundToEven(float64(i))) + 1 line := lines[i] sp := strings.Split(line, "/") if len(sp) == 0 { return "" } i = strings.Index(sp[len(sp)-1], ".") if i != -1 { sp[len(sp)-1] = sp[len(sp)-1][:i] } if i := strings.Index(sp[0], "."); i != -1 { sp = sp[2:] } modName := sp[0] pkgName := sp[len(sp)-1] if modName == "main" { modName = mainModuleName } return modName + "::" + pkgName } /* Println prints the content prefixed and suffixed with a carriage return with an endline in the end. Unlike fmt.Println, this doesn't add spaces between the elements This should be used if raw terminal is enabled, but it works without it aswell */ func Println(v ...any) (i int, err error) { if i0, err := fmt.Print("\r"); err != nil { return i0, err } else { i += i0 } if i0, err := fmt.Print(v...); err != nil { return i0, err } else { i += i0 } i0, err := fmt.Println("\r") return i + i0, err } /* Print prints the content prefixed and suffixed with a carriage return. This should be used if raw terminal is enabled, but it works without it aswell */ func Print(v ...any) (i int, err error) { if i0, err := fmt.Print("\r"); err != nil { return i0, err } else { i += i0 } i0, err := fmt.Print(v...) return i + i0, err } /* Printf prints the content formatted, and prefixed and suffixed with a carriage return. This should be used if raw terminal is enabled, but it works without it aswell */ func Printf(format string, v ...any) (i int, err error) { return fmt.Printf("\r"+format, v...) } /* Println prints the content formatted, and prefixed and suffixed with a carriage return with an endline in the end. Unlike fmt.Println, this doesn't add spaces between the elements This should be used if raw terminal is enabled, but it works without it aswell */ func Printlnf(format string, v ...any) (i int, err error) { if i0, err := fmt.Print("\r"); err != nil { return i0, err } else { i += i0 } if i0, err := fmt.Printf(format, v...); err != nil { return i0, err } else { i += i0 } i0, err := fmt.Println("\r") return i + i0, err } func Chat(t text.TextComponent) { Printlnf("%s %s %s: %s", timeColor(timeString()), chatColor("CHAT "), stackColor(stackCallerModule(5)), SprintText(t)) } // prints the contents prefixed by a carriage return + time, blue info text and suffixed with a newline and "> " func Infoln(v ...any) { fmt.Printf("\r%s %s %s: ", timeColor(timeString()), infoColor("INFO "), stackColor(stackCallerModule(3))) fmt.Println(v...) fmt.Print("\r> ") } // prints the contents prefixed by a carriage return + blue info text and suffixed with a new line func InfolnClean(v ...any) { fmt.Printf("\r%s %s %s: ", timeColor(timeString()), infoColor("INFO "), stackColor(stackCallerModule(3))) fmt.Print(v...) fmt.Println("\r") } // prints the contents formatted prefixed by a carriage return + blue info text and suffixed with a new line func InfolnfClean(format string, v ...any) { fmt.Printf("\r%s %s %s: ", timeColor(timeString()), infoColor("INFO "), stackColor(stackCallerModule(3))) fmt.Printf(format, v...) fmt.Println("\r") } // prints the contents prefixed by a carriage return + blue info text func Info(v ...any) { fmt.Printf("\r%s %s %s: ", timeColor(timeString()), infoColor("INFO "), stackColor(stackCallerModule(3))) fmt.Print(v...) } // prints the contents prefixed by a carriage return + blue info text func Infof(format string, v ...any) { fmt.Printf("\r%s %s %s: %s", timeColor(timeString()), infoColor("INFO "), stackColor(stackCallerModule(3)), fmt.Sprintf(format, v...)) } // prints the contents prefixed by a carriage return + blue info text and suffixed with a newline and "> " func Infolnf(format string, v ...any) { fmt.Printf("\r%s %s %s: %s\n\r> ", timeColor(timeString()), infoColor("INFO "), stackColor(stackCallerModule(3)), fmt.Sprintf(format, v...)) } // prints the contents prefixed by a carriage return + blue info text and suffixed with a newline and "> " func Errorln(v ...any) { fmt.Printf("\r%s %s %s: ", timeColor(timeString()), errorColor("ERROR"), stackColor(stackCallerModule(3))) fmt.Println(v...) fmt.Print("\r> ") } // prints the contents prefixed by a carriage return + blue info text and suffixed with a new line func ErrorlnClean(v ...any) { fmt.Printf("\r%s %s %s: ", timeColor(timeString()), errorColor("ERROR"), stackColor(stackCallerModule(3))) fmt.Print(v...) fmt.Println("\r") } // prints the contents prefixed by a carriage return + blue info text func Error(v ...any) { fmt.Printf("\r%s %s %s: ", timeColor(timeString()), errorColor("ERROR"), stackColor(stackCallerModule(3))) fmt.Print(v...) } // prints the contents prefixed by a carriage return + blue info text func Errorf(format string, v ...any) { fmt.Printf("\r%s %s %s: %s", timeColor(timeString()), errorColor("ERROR"), stackColor(stackCallerModule(3)), fmt.Sprintf(format, v...)) } // prints the contents prefixed by a carriage return + blue info text and suffixed with a newline and "> " func Errorlnf(format string, v ...any) { fmt.Printf("\r%s %s %s: %s\n\r> ", timeColor(timeString()), errorColor("ERROR"), stackColor(stackCallerModule(3)), fmt.Sprintf(format, v...)) } // prints the contents prefixed by a carriage return + blue info text and suffixed with a newline and "> " func Warnln(v ...any) { fmt.Printf("\r%s %s %s: ", timeColor(timeString()), warningColor("WARN "), stackColor(stackCallerModule(3))) fmt.Println(v...) fmt.Print("\r> ") } // prints the contents prefixed by a carriage return + blue info text and suffixed with a new line func WarnlnClean(v ...any) { fmt.Printf("\r%s %s %s: ", timeColor(timeString()), warningColor("WARN "), stackColor(stackCallerModule(3))) fmt.Print(v...) fmt.Println("\r") } // prints the contents prefixed by a carriage return + blue info text func Warn(v ...any) { fmt.Printf("\r%s %s %s: ", timeColor(timeString()), warningColor("WARN "), stackColor(stackCallerModule(3))) fmt.Print(v...) } // prints the contents prefixed by a carriage return + blue info text func Warnf(format string, v ...any) { fmt.Printf("\r%s %s %s: %s", timeColor(timeString()), warningColor("WARN "), stackColor(stackCallerModule(3)), fmt.Sprintf(format, v...)) } // prints the contents prefixed by a carriage return + blue info text and suffixed with a newline and "> " func Warnlnf(format string, v ...any) { fmt.Printf("\r%s %s %s: %s\n\r> ", timeColor(timeString()), warningColor("WARN "), stackColor(stackCallerModule(3)), fmt.Sprintf(format, v...)) } ================================================ FILE: util/mapequal.go ================================================ package util func MapEqual(m1, m2 map[string]string) bool { if m1 == nil && m2 == nil { return true } if len(m1) != len(m2) { return false } for key, value1 := range m1 { if m2[key] != value1 { return false } } return true } ================================================ FILE: util/rot.go ================================================ package util import "math" func DegreesToAngle(degrees float32) byte { return byte(math.Round(float64(degrees) * (256.0 / 360.0))) } func AngleToDegrees(angle byte) float32 { return float32(angle) * (360.0 / 256.0) } const ( DirectionPX = "east" DirectionPZ = "south" DirectionNX = "west" DirectionNZ = "north" ) func YawDirection(yaw float32) string { normalizedYaw := NormalizeYaw(yaw) if normalizedYaw >= 315.0 || normalizedYaw < 45.0 { return DirectionPZ // North } else if normalizedYaw >= 45.0 && normalizedYaw < 135.0 { return DirectionPX // East } else if normalizedYaw >= 135.0 && normalizedYaw < 225.0 { return DirectionNZ // South } else if normalizedYaw >= 225.0 && normalizedYaw < 315.0 { return DirectionNX // West } return "" } func NormalizeYaw(yaw float32) float32 { yaw = EuclideanRemainder(yaw, 360) if yaw > 180 { yaw -= 360 } return yaw } func EuclideanRemainder(a, b float32) float32 { remainder := float32(math.Mod(float64(a), float64(b))) if remainder < 0 { remainder += b } return remainder } ================================================ FILE: util/unit.go ================================================ package util import ( "fmt" "strconv" "strings" ) var sizeUnits = map[string]uint64{ "kb": 1000, // kilobyte (decimal) "kib": 1024, // kibibyte (binary) "mb": 1000 * 1000, // megabyte (decimal) "mib": 1024 * 1024, // mebibyte (binary) "gb": 1000 * 1000 * 1000, // gigabyte (decimal) "gib": 1024 * 1024 * 1024, // gibibyte (binary) "tb": 1000 * 1000 * 1000 * 1000, // terabyte (decimal) "tib": 1024 * 1024 * 1024 * 1024, // tebibyte (binary) } // ParseSizeUnit parses a size string into a number of bytes. func ParseSizeUnit(sizeStr string) (uint64, error) { // Trim any surrounding whitespace and convert to lowercase. sizeStr = strings.TrimSpace(strings.ToLower(sizeStr)) // Find the position where the letters start. for unit := range sizeUnits { if strings.HasSuffix(sizeStr, unit) { // Extract the numeric part of the string. numberStr := strings.TrimSuffix(sizeStr, unit) number, err := strconv.ParseUint(numberStr, 10, 64) if err != nil { return 0, fmt.Errorf("invalid number format: %w", err) } // Convert the number to bytes using the corresponding unit. return number * sizeUnits[unit], nil } } number, err := strconv.ParseUint(sizeStr, 10, 64) return number, err } var sizeUnitsS = []struct { Unit string Factor uint64 }{ {"B", 1}, {"KiB", 1024}, {"MiB", 1024 * 1024}, {"GiB", 1024 * 1024 * 1024}, {"TiB", 1024 * 1024 * 1024 * 1024}, {"PiB", 1024 * 1024 * 1024 * 1024 * 1024}, } // FormatSizeUnit formats a number of bytes into a human-readable string. func FormatSizeUnit(bytes uint64) string { if bytes == 0 { return "0 B" } var result strings.Builder for i := len(sizeUnitsS) - 1; i >= 0; i-- { unit := sizeUnitsS[i] if bytes >= unit.Factor { value := float64(bytes) / float64(unit.Factor) result.WriteString(fmt.Sprintf("%.2f %s", value, unit.Unit)) return result.String() } } // This should never be reached since we handle all sizes return "0 B" }