* first join

* add new entities

* fix type on interpolation duration

* switch long to var long

* switch long to var long, round 2

* add flags to TextDisplay

* 1.19.4

* setView in Entity#teleport

* do not trigger touchTick if entity physics are disabled

* Add new 1.19.4 packets

* constant expr

* no localhost on github actions

* yoinked changes from 1.19.3 main

* update to forked changes

* remove potion command

* remove potion command

---------

Co-authored-by: GreatWyrm <alecmusante@gmail.com>

(cherry picked from commit 7f3144337d)
This commit is contained in:
Matt Worzala 2023-05-21 12:21:24 -04:00
parent b18eac80a4
commit 8f1f7e127d
38 changed files with 1391 additions and 128 deletions

View File

@ -54,6 +54,8 @@ public class Main {
commandManager.register(new ExecuteCommand());
commandManager.register(new RedirectTestCommand());
commandManager.register(new DebugGridCommand());
commandManager.register(new DisplayCommand());
commandManager.setUnknownCommandCallback((sender, command) -> sender.sendMessage(Component.text("Unknown command", NamedTextColor.RED)));

View File

@ -0,0 +1,91 @@
package net.minestom.demo.commands;
import net.kyori.adventure.text.Component;
import net.minestom.server.MinecraftServer;
import net.minestom.server.command.CommandSender;
import net.minestom.server.command.builder.Command;
import net.minestom.server.command.builder.CommandContext;
import net.minestom.server.command.builder.arguments.ArgumentType;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.EntityType;
import net.minestom.server.entity.Player;
import net.minestom.server.entity.metadata.display.AbstractDisplayMeta;
import net.minestom.server.entity.metadata.display.BlockDisplayMeta;
import net.minestom.server.entity.metadata.display.ItemDisplayMeta;
import net.minestom.server.entity.metadata.display.TextDisplayMeta;
import net.minestom.server.instance.block.Block;
import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material;
import net.minestom.server.utils.time.TimeUnit;
import org.jetbrains.annotations.NotNull;
public class DisplayCommand extends Command {
public DisplayCommand() {
super("display");
var follow = ArgumentType.Literal("follow");
addSyntax(this::spawnItem, ArgumentType.Literal("item"));
addSyntax(this::spawnBlock, ArgumentType.Literal("block"));
addSyntax(this::spawnText, ArgumentType.Literal("text"));
addSyntax(this::spawnItem, ArgumentType.Literal("item"), follow);
addSyntax(this::spawnBlock, ArgumentType.Literal("block"), follow);
addSyntax(this::spawnText, ArgumentType.Literal("text"), follow);
}
public void spawnItem(@NotNull CommandSender sender, @NotNull CommandContext context) {
if (!(sender instanceof Player player))
return;
var entity = new Entity(EntityType.ITEM_DISPLAY);
var meta = (ItemDisplayMeta) entity.getEntityMeta();
meta.setItemStack(ItemStack.of(Material.STICK));
entity.setInstance(player.getInstance(), player.getPosition());
if (context.has("follow")) {
startSmoothFollow(entity, player);
}
}
public void spawnBlock(@NotNull CommandSender sender, @NotNull CommandContext context) {
if (!(sender instanceof Player player))
return;
var entity = new Entity(EntityType.BLOCK_DISPLAY);
var meta = (BlockDisplayMeta) entity.getEntityMeta();
meta.setBlockState(Block.STONE_STAIRS.stateId());
entity.setInstance(player.getInstance(), player.getPosition());
if (context.has("follow")) {
startSmoothFollow(entity, player);
}
}
public void spawnText(@NotNull CommandSender sender, @NotNull CommandContext context) {
if (!(sender instanceof Player player))
return;
var entity = new Entity(EntityType.TEXT_DISPLAY);
var meta = (TextDisplayMeta) entity.getEntityMeta();
meta.setBillboardRenderConstraints(AbstractDisplayMeta.BillboardConstraints.CENTER);
meta.setText(Component.text("Hello, world!"));
entity.setInstance(player.getInstance(), player.getPosition());
if (context.has("follow")) {
startSmoothFollow(entity, player);
}
}
private void startSmoothFollow(@NotNull Entity entity, @NotNull Player player) {
MinecraftServer.getSchedulerManager().buildTask(() -> {
var meta = (AbstractDisplayMeta) entity.getEntityMeta();
meta.setNotifyAboutChanges(false);
meta.setInterpolationStartDelta(1);
meta.setInterpolationDuration(20);
meta.setTranslation(player.getPosition().sub(entity.getPosition()));
meta.setNotifyAboutChanges(true);
}).delay(20, TimeUnit.SERVER_TICK).repeat(20, TimeUnit.SERVER_TICK).schedule();
}
}

View File

@ -3,7 +3,7 @@ metadata.format.version = "1.1"
[versions]
# Important dependencies
minestomData = "53e0da5be1"
data = "1.19.4-rv2"
adventure = "4.12.0"
kotlin = "1.7.22"
hydrazine = "1.7.2"
@ -51,7 +51,7 @@ kotlin-stdlib-jdk8 = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-jdk
# Miscellaneous
hydrazine = { group = "com.github.MadMartian", name = "hydrazine-path-finding", version.ref = "hydrazine" }
minestomData = { group = "com.github.Minestom", name = "MinestomDataGenerator", version.ref = "minestomData" }
minestomData = { group = "dev.hollowcube", name = "minestom-ce-data", version.ref = "data" }
jetbrainsAnnotations = { group = "org.jetbrains", name = "annotations", version.ref = "jetbrainsAnnotations" }
hephaistos-common = { group = "io.github.jglrxavpok.hephaistos", name = "common", version.ref = "hephaistos" }
hephaistos-gson = { group = "io.github.jglrxavpok.hephaistos", name = "gson", version.ref = "hephaistos" }

View File

@ -21,18 +21,26 @@ interface EntityTypes {
EntityType BLAZE = EntityTypeImpl.get("minecraft:blaze");
EntityType BLOCK_DISPLAY = EntityTypeImpl.get("minecraft:block_display");
EntityType BOAT = EntityTypeImpl.get("minecraft:boat");
EntityType CHEST_BOAT = EntityTypeImpl.get("minecraft:chest_boat");
EntityType CAMEL = EntityTypeImpl.get("minecraft:camel");
EntityType CAT = EntityTypeImpl.get("minecraft:cat");
EntityType CAVE_SPIDER = EntityTypeImpl.get("minecraft:cave_spider");
EntityType CHEST_BOAT = EntityTypeImpl.get("minecraft:chest_boat");
EntityType CHEST_MINECART = EntityTypeImpl.get("minecraft:chest_minecart");
EntityType CHICKEN = EntityTypeImpl.get("minecraft:chicken");
EntityType COD = EntityTypeImpl.get("minecraft:cod");
EntityType COMMAND_BLOCK_MINECART = EntityTypeImpl.get("minecraft:command_block_minecart");
EntityType COW = EntityTypeImpl.get("minecraft:cow");
EntityType CREEPER = EntityTypeImpl.get("minecraft:creeper");
@ -45,12 +53,16 @@ interface EntityTypes {
EntityType DROWNED = EntityTypeImpl.get("minecraft:drowned");
EntityType EGG = EntityTypeImpl.get("minecraft:egg");
EntityType ELDER_GUARDIAN = EntityTypeImpl.get("minecraft:elder_guardian");
EntityType END_CRYSTAL = EntityTypeImpl.get("minecraft:end_crystal");
EntityType ENDER_DRAGON = EntityTypeImpl.get("minecraft:ender_dragon");
EntityType ENDER_PEARL = EntityTypeImpl.get("minecraft:ender_pearl");
EntityType ENDERMAN = EntityTypeImpl.get("minecraft:enderman");
EntityType ENDERMITE = EntityTypeImpl.get("minecraft:endermite");
@ -59,6 +71,8 @@ interface EntityTypes {
EntityType EVOKER_FANGS = EntityTypeImpl.get("minecraft:evoker_fangs");
EntityType EXPERIENCE_BOTTLE = EntityTypeImpl.get("minecraft:experience_bottle");
EntityType EXPERIENCE_ORB = EntityTypeImpl.get("minecraft:experience_orb");
EntityType EYE_OF_ENDER = EntityTypeImpl.get("minecraft:eye_of_ender");
@ -71,6 +85,8 @@ interface EntityTypes {
EntityType FROG = EntityTypeImpl.get("minecraft:frog");
EntityType FURNACE_MINECART = EntityTypeImpl.get("minecraft:furnace_minecart");
EntityType GHAST = EntityTypeImpl.get("minecraft:ghast");
EntityType GIANT = EntityTypeImpl.get("minecraft:giant");
@ -85,16 +101,22 @@ interface EntityTypes {
EntityType HOGLIN = EntityTypeImpl.get("minecraft:hoglin");
EntityType HOPPER_MINECART = EntityTypeImpl.get("minecraft:hopper_minecart");
EntityType HORSE = EntityTypeImpl.get("minecraft:horse");
EntityType HUSK = EntityTypeImpl.get("minecraft:husk");
EntityType ILLUSIONER = EntityTypeImpl.get("minecraft:illusioner");
EntityType INTERACTION = EntityTypeImpl.get("minecraft:interaction");
EntityType IRON_GOLEM = EntityTypeImpl.get("minecraft:iron_golem");
EntityType ITEM = EntityTypeImpl.get("minecraft:item");
EntityType ITEM_DISPLAY = EntityTypeImpl.get("minecraft:item_display");
EntityType ITEM_FRAME = EntityTypeImpl.get("minecraft:item_frame");
EntityType FIREBALL = EntityTypeImpl.get("minecraft:fireball");
@ -113,22 +135,10 @@ interface EntityTypes {
EntityType MINECART = EntityTypeImpl.get("minecraft:minecart");
EntityType CHEST_MINECART = EntityTypeImpl.get("minecraft:chest_minecart");
EntityType COMMAND_BLOCK_MINECART = EntityTypeImpl.get("minecraft:command_block_minecart");
EntityType FURNACE_MINECART = EntityTypeImpl.get("minecraft:furnace_minecart");
EntityType HOPPER_MINECART = EntityTypeImpl.get("minecraft:hopper_minecart");
EntityType SPAWNER_MINECART = EntityTypeImpl.get("minecraft:spawner_minecart");
EntityType TNT_MINECART = EntityTypeImpl.get("minecraft:tnt_minecart");
EntityType MOOSHROOM = EntityTypeImpl.get("minecraft:mooshroom");
EntityType MULE = EntityTypeImpl.get("minecraft:mule");
EntityType MOOSHROOM = EntityTypeImpl.get("minecraft:mooshroom");
EntityType OCELOT = EntityTypeImpl.get("minecraft:ocelot");
EntityType PAINTING = EntityTypeImpl.get("minecraft:painting");
@ -149,7 +159,7 @@ interface EntityTypes {
EntityType POLAR_BEAR = EntityTypeImpl.get("minecraft:polar_bear");
EntityType TNT = EntityTypeImpl.get("minecraft:tnt");
EntityType POTION = EntityTypeImpl.get("minecraft:potion");
EntityType PUFFERFISH = EntityTypeImpl.get("minecraft:pufferfish");
@ -175,10 +185,14 @@ interface EntityTypes {
EntityType SMALL_FIREBALL = EntityTypeImpl.get("minecraft:small_fireball");
EntityType SNIFFER = EntityTypeImpl.get("minecraft:sniffer");
EntityType SNOW_GOLEM = EntityTypeImpl.get("minecraft:snow_golem");
EntityType SNOWBALL = EntityTypeImpl.get("minecraft:snowball");
EntityType SPAWNER_MINECART = EntityTypeImpl.get("minecraft:spawner_minecart");
EntityType SPECTRAL_ARROW = EntityTypeImpl.get("minecraft:spectral_arrow");
EntityType SPIDER = EntityTypeImpl.get("minecraft:spider");
@ -191,18 +205,16 @@ interface EntityTypes {
EntityType TADPOLE = EntityTypeImpl.get("minecraft:tadpole");
EntityType EGG = EntityTypeImpl.get("minecraft:egg");
EntityType TEXT_DISPLAY = EntityTypeImpl.get("minecraft:text_display");
EntityType ENDER_PEARL = EntityTypeImpl.get("minecraft:ender_pearl");
EntityType TNT = EntityTypeImpl.get("minecraft:tnt");
EntityType EXPERIENCE_BOTTLE = EntityTypeImpl.get("minecraft:experience_bottle");
EntityType POTION = EntityTypeImpl.get("minecraft:potion");
EntityType TRIDENT = EntityTypeImpl.get("minecraft:trident");
EntityType TNT_MINECART = EntityTypeImpl.get("minecraft:tnt_minecart");
EntityType TRADER_LLAMA = EntityTypeImpl.get("minecraft:trader_llama");
EntityType TRIDENT = EntityTypeImpl.get("minecraft:trident");
EntityType TROPICAL_FISH = EntityTypeImpl.get("minecraft:tropical_fish");
EntityType TURTLE = EntityTypeImpl.get("minecraft:turtle");

View File

@ -41,10 +41,16 @@ interface Blocks {
Block ACACIA_PLANKS = BlockImpl.get("minecraft:acacia_planks");
Block CHERRY_PLANKS = BlockImpl.get("minecraft:cherry_planks");
Block DARK_OAK_PLANKS = BlockImpl.get("minecraft:dark_oak_planks");
Block MANGROVE_PLANKS = BlockImpl.get("minecraft:mangrove_planks");
Block BAMBOO_PLANKS = BlockImpl.get("minecraft:bamboo_planks");
Block BAMBOO_MOSAIC = BlockImpl.get("minecraft:bamboo_mosaic");
Block OAK_SAPLING = BlockImpl.get("minecraft:oak_sapling");
Block SPRUCE_SAPLING = BlockImpl.get("minecraft:spruce_sapling");
@ -55,6 +61,8 @@ interface Blocks {
Block ACACIA_SAPLING = BlockImpl.get("minecraft:acacia_sapling");
Block CHERRY_SAPLING = BlockImpl.get("minecraft:cherry_sapling");
Block DARK_OAK_SAPLING = BlockImpl.get("minecraft:dark_oak_sapling");
Block MANGROVE_PROPAGULE = BlockImpl.get("minecraft:mangrove_propagule");
@ -67,6 +75,8 @@ interface Blocks {
Block SAND = BlockImpl.get("minecraft:sand");
Block SUSPICIOUS_SAND = BlockImpl.get("minecraft:suspicious_sand");
Block RED_SAND = BlockImpl.get("minecraft:red_sand");
Block GRAVEL = BlockImpl.get("minecraft:gravel");
@ -95,6 +105,8 @@ interface Blocks {
Block ACACIA_LOG = BlockImpl.get("minecraft:acacia_log");
Block CHERRY_LOG = BlockImpl.get("minecraft:cherry_log");
Block DARK_OAK_LOG = BlockImpl.get("minecraft:dark_oak_log");
Block MANGROVE_LOG = BlockImpl.get("minecraft:mangrove_log");
@ -103,6 +115,8 @@ interface Blocks {
Block MUDDY_MANGROVE_ROOTS = BlockImpl.get("minecraft:muddy_mangrove_roots");
Block BAMBOO_BLOCK = BlockImpl.get("minecraft:bamboo_block");
Block STRIPPED_SPRUCE_LOG = BlockImpl.get("minecraft:stripped_spruce_log");
Block STRIPPED_BIRCH_LOG = BlockImpl.get("minecraft:stripped_birch_log");
@ -111,12 +125,16 @@ interface Blocks {
Block STRIPPED_ACACIA_LOG = BlockImpl.get("minecraft:stripped_acacia_log");
Block STRIPPED_CHERRY_LOG = BlockImpl.get("minecraft:stripped_cherry_log");
Block STRIPPED_DARK_OAK_LOG = BlockImpl.get("minecraft:stripped_dark_oak_log");
Block STRIPPED_OAK_LOG = BlockImpl.get("minecraft:stripped_oak_log");
Block STRIPPED_MANGROVE_LOG = BlockImpl.get("minecraft:stripped_mangrove_log");
Block STRIPPED_BAMBOO_BLOCK = BlockImpl.get("minecraft:stripped_bamboo_block");
Block OAK_WOOD = BlockImpl.get("minecraft:oak_wood");
Block SPRUCE_WOOD = BlockImpl.get("minecraft:spruce_wood");
@ -127,6 +145,8 @@ interface Blocks {
Block ACACIA_WOOD = BlockImpl.get("minecraft:acacia_wood");
Block CHERRY_WOOD = BlockImpl.get("minecraft:cherry_wood");
Block DARK_OAK_WOOD = BlockImpl.get("minecraft:dark_oak_wood");
Block MANGROVE_WOOD = BlockImpl.get("minecraft:mangrove_wood");
@ -141,6 +161,8 @@ interface Blocks {
Block STRIPPED_ACACIA_WOOD = BlockImpl.get("minecraft:stripped_acacia_wood");
Block STRIPPED_CHERRY_WOOD = BlockImpl.get("minecraft:stripped_cherry_wood");
Block STRIPPED_DARK_OAK_WOOD = BlockImpl.get("minecraft:stripped_dark_oak_wood");
Block STRIPPED_MANGROVE_WOOD = BlockImpl.get("minecraft:stripped_mangrove_wood");
@ -155,6 +177,8 @@ interface Blocks {
Block ACACIA_LEAVES = BlockImpl.get("minecraft:acacia_leaves");
Block CHERRY_LEAVES = BlockImpl.get("minecraft:cherry_leaves");
Block DARK_OAK_LEAVES = BlockImpl.get("minecraft:dark_oak_leaves");
Block MANGROVE_LEAVES = BlockImpl.get("minecraft:mangrove_leaves");
@ -275,6 +299,8 @@ interface Blocks {
Block DANDELION = BlockImpl.get("minecraft:dandelion");
Block TORCHFLOWER = BlockImpl.get("minecraft:torchflower");
Block POPPY = BlockImpl.get("minecraft:poppy");
Block BLUE_ORCHID = BlockImpl.get("minecraft:blue_orchid");
@ -313,6 +339,8 @@ interface Blocks {
Block BOOKSHELF = BlockImpl.get("minecraft:bookshelf");
Block CHISELED_BOOKSHELF = BlockImpl.get("minecraft:chiseled_bookshelf");
Block MOSSY_COBBLESTONE = BlockImpl.get("minecraft:mossy_cobblestone");
Block OBSIDIAN = BlockImpl.get("minecraft:obsidian");
@ -355,12 +383,16 @@ interface Blocks {
Block ACACIA_SIGN = BlockImpl.get("minecraft:acacia_sign");
Block CHERRY_SIGN = BlockImpl.get("minecraft:cherry_sign");
Block JUNGLE_SIGN = BlockImpl.get("minecraft:jungle_sign");
Block DARK_OAK_SIGN = BlockImpl.get("minecraft:dark_oak_sign");
Block MANGROVE_SIGN = BlockImpl.get("minecraft:mangrove_sign");
Block BAMBOO_SIGN = BlockImpl.get("minecraft:bamboo_sign");
Block OAK_DOOR = BlockImpl.get("minecraft:oak_door");
Block LADDER = BlockImpl.get("minecraft:ladder");
@ -377,12 +409,60 @@ interface Blocks {
Block ACACIA_WALL_SIGN = BlockImpl.get("minecraft:acacia_wall_sign");
Block CHERRY_WALL_SIGN = BlockImpl.get("minecraft:cherry_wall_sign");
Block JUNGLE_WALL_SIGN = BlockImpl.get("minecraft:jungle_wall_sign");
Block DARK_OAK_WALL_SIGN = BlockImpl.get("minecraft:dark_oak_wall_sign");
Block MANGROVE_WALL_SIGN = BlockImpl.get("minecraft:mangrove_wall_sign");
Block BAMBOO_WALL_SIGN = BlockImpl.get("minecraft:bamboo_wall_sign");
Block OAK_HANGING_SIGN = BlockImpl.get("minecraft:oak_hanging_sign");
Block SPRUCE_HANGING_SIGN = BlockImpl.get("minecraft:spruce_hanging_sign");
Block BIRCH_HANGING_SIGN = BlockImpl.get("minecraft:birch_hanging_sign");
Block ACACIA_HANGING_SIGN = BlockImpl.get("minecraft:acacia_hanging_sign");
Block CHERRY_HANGING_SIGN = BlockImpl.get("minecraft:cherry_hanging_sign");
Block JUNGLE_HANGING_SIGN = BlockImpl.get("minecraft:jungle_hanging_sign");
Block DARK_OAK_HANGING_SIGN = BlockImpl.get("minecraft:dark_oak_hanging_sign");
Block CRIMSON_HANGING_SIGN = BlockImpl.get("minecraft:crimson_hanging_sign");
Block WARPED_HANGING_SIGN = BlockImpl.get("minecraft:warped_hanging_sign");
Block MANGROVE_HANGING_SIGN = BlockImpl.get("minecraft:mangrove_hanging_sign");
Block BAMBOO_HANGING_SIGN = BlockImpl.get("minecraft:bamboo_hanging_sign");
Block OAK_WALL_HANGING_SIGN = BlockImpl.get("minecraft:oak_wall_hanging_sign");
Block SPRUCE_WALL_HANGING_SIGN = BlockImpl.get("minecraft:spruce_wall_hanging_sign");
Block BIRCH_WALL_HANGING_SIGN = BlockImpl.get("minecraft:birch_wall_hanging_sign");
Block ACACIA_WALL_HANGING_SIGN = BlockImpl.get("minecraft:acacia_wall_hanging_sign");
Block CHERRY_WALL_HANGING_SIGN = BlockImpl.get("minecraft:cherry_wall_hanging_sign");
Block JUNGLE_WALL_HANGING_SIGN = BlockImpl.get("minecraft:jungle_wall_hanging_sign");
Block DARK_OAK_WALL_HANGING_SIGN = BlockImpl.get("minecraft:dark_oak_wall_hanging_sign");
Block MANGROVE_WALL_HANGING_SIGN = BlockImpl.get("minecraft:mangrove_wall_hanging_sign");
Block CRIMSON_WALL_HANGING_SIGN = BlockImpl.get("minecraft:crimson_wall_hanging_sign");
Block WARPED_WALL_HANGING_SIGN = BlockImpl.get("minecraft:warped_wall_hanging_sign");
Block BAMBOO_WALL_HANGING_SIGN = BlockImpl.get("minecraft:bamboo_wall_hanging_sign");
Block LEVER = BlockImpl.get("minecraft:lever");
Block STONE_PRESSURE_PLATE = BlockImpl.get("minecraft:stone_pressure_plate");
@ -399,10 +479,14 @@ interface Blocks {
Block ACACIA_PRESSURE_PLATE = BlockImpl.get("minecraft:acacia_pressure_plate");
Block CHERRY_PRESSURE_PLATE = BlockImpl.get("minecraft:cherry_pressure_plate");
Block DARK_OAK_PRESSURE_PLATE = BlockImpl.get("minecraft:dark_oak_pressure_plate");
Block MANGROVE_PRESSURE_PLATE = BlockImpl.get("minecraft:mangrove_pressure_plate");
Block BAMBOO_PRESSURE_PLATE = BlockImpl.get("minecraft:bamboo_pressure_plate");
Block REDSTONE_ORE = BlockImpl.get("minecraft:redstone_ore");
Block DEEPSLATE_REDSTONE_ORE = BlockImpl.get("minecraft:deepslate_redstone_ore");
@ -499,10 +583,14 @@ interface Blocks {
Block ACACIA_TRAPDOOR = BlockImpl.get("minecraft:acacia_trapdoor");
Block CHERRY_TRAPDOOR = BlockImpl.get("minecraft:cherry_trapdoor");
Block DARK_OAK_TRAPDOOR = BlockImpl.get("minecraft:dark_oak_trapdoor");
Block MANGROVE_TRAPDOOR = BlockImpl.get("minecraft:mangrove_trapdoor");
Block BAMBOO_TRAPDOOR = BlockImpl.get("minecraft:bamboo_trapdoor");
Block STONE_BRICKS = BlockImpl.get("minecraft:stone_bricks");
Block MOSSY_STONE_BRICKS = BlockImpl.get("minecraft:mossy_stone_bricks");
@ -627,6 +715,8 @@ interface Blocks {
Block FLOWER_POT = BlockImpl.get("minecraft:flower_pot");
Block POTTED_TORCHFLOWER = BlockImpl.get("minecraft:potted_torchflower");
Block POTTED_OAK_SAPLING = BlockImpl.get("minecraft:potted_oak_sapling");
Block POTTED_SPRUCE_SAPLING = BlockImpl.get("minecraft:potted_spruce_sapling");
@ -637,6 +727,8 @@ interface Blocks {
Block POTTED_ACACIA_SAPLING = BlockImpl.get("minecraft:potted_acacia_sapling");
Block POTTED_CHERRY_SAPLING = BlockImpl.get("minecraft:potted_cherry_sapling");
Block POTTED_DARK_OAK_SAPLING = BlockImpl.get("minecraft:potted_dark_oak_sapling");
Block POTTED_MANGROVE_PROPAGULE = BlockImpl.get("minecraft:potted_mangrove_propagule");
@ -691,10 +783,14 @@ interface Blocks {
Block ACACIA_BUTTON = BlockImpl.get("minecraft:acacia_button");
Block CHERRY_BUTTON = BlockImpl.get("minecraft:cherry_button");
Block DARK_OAK_BUTTON = BlockImpl.get("minecraft:dark_oak_button");
Block MANGROVE_BUTTON = BlockImpl.get("minecraft:mangrove_button");
Block BAMBOO_BUTTON = BlockImpl.get("minecraft:bamboo_button");
Block SKELETON_SKULL = BlockImpl.get("minecraft:skeleton_skull");
Block SKELETON_WALL_SKULL = BlockImpl.get("minecraft:skeleton_wall_skull");
@ -719,6 +815,10 @@ interface Blocks {
Block DRAGON_WALL_HEAD = BlockImpl.get("minecraft:dragon_wall_head");
Block PIGLIN_HEAD = BlockImpl.get("minecraft:piglin_head");
Block PIGLIN_WALL_HEAD = BlockImpl.get("minecraft:piglin_wall_head");
Block ANVIL = BlockImpl.get("minecraft:anvil");
Block CHIPPED_ANVIL = BlockImpl.get("minecraft:chipped_anvil");
@ -819,10 +919,16 @@ interface Blocks {
Block ACACIA_STAIRS = BlockImpl.get("minecraft:acacia_stairs");
Block CHERRY_STAIRS = BlockImpl.get("minecraft:cherry_stairs");
Block DARK_OAK_STAIRS = BlockImpl.get("minecraft:dark_oak_stairs");
Block MANGROVE_STAIRS = BlockImpl.get("minecraft:mangrove_stairs");
Block BAMBOO_STAIRS = BlockImpl.get("minecraft:bamboo_stairs");
Block BAMBOO_MOSAIC_STAIRS = BlockImpl.get("minecraft:bamboo_mosaic_stairs");
Block SLIME_BLOCK = BlockImpl.get("minecraft:slime_block");
Block BARRIER = BlockImpl.get("minecraft:barrier");
@ -985,10 +1091,16 @@ interface Blocks {
Block ACACIA_SLAB = BlockImpl.get("minecraft:acacia_slab");
Block CHERRY_SLAB = BlockImpl.get("minecraft:cherry_slab");
Block DARK_OAK_SLAB = BlockImpl.get("minecraft:dark_oak_slab");
Block MANGROVE_SLAB = BlockImpl.get("minecraft:mangrove_slab");
Block BAMBOO_SLAB = BlockImpl.get("minecraft:bamboo_slab");
Block BAMBOO_MOSAIC_SLAB = BlockImpl.get("minecraft:bamboo_mosaic_slab");
Block STONE_SLAB = BlockImpl.get("minecraft:stone_slab");
Block SMOOTH_STONE_SLAB = BlockImpl.get("minecraft:smooth_stone_slab");
@ -1033,10 +1145,14 @@ interface Blocks {
Block ACACIA_FENCE_GATE = BlockImpl.get("minecraft:acacia_fence_gate");
Block CHERRY_FENCE_GATE = BlockImpl.get("minecraft:cherry_fence_gate");
Block DARK_OAK_FENCE_GATE = BlockImpl.get("minecraft:dark_oak_fence_gate");
Block MANGROVE_FENCE_GATE = BlockImpl.get("minecraft:mangrove_fence_gate");
Block BAMBOO_FENCE_GATE = BlockImpl.get("minecraft:bamboo_fence_gate");
Block SPRUCE_FENCE = BlockImpl.get("minecraft:spruce_fence");
Block BIRCH_FENCE = BlockImpl.get("minecraft:birch_fence");
@ -1045,10 +1161,14 @@ interface Blocks {
Block ACACIA_FENCE = BlockImpl.get("minecraft:acacia_fence");
Block CHERRY_FENCE = BlockImpl.get("minecraft:cherry_fence");
Block DARK_OAK_FENCE = BlockImpl.get("minecraft:dark_oak_fence");
Block MANGROVE_FENCE = BlockImpl.get("minecraft:mangrove_fence");
Block BAMBOO_FENCE = BlockImpl.get("minecraft:bamboo_fence");
Block SPRUCE_DOOR = BlockImpl.get("minecraft:spruce_door");
Block BIRCH_DOOR = BlockImpl.get("minecraft:birch_door");
@ -1057,10 +1177,14 @@ interface Blocks {
Block ACACIA_DOOR = BlockImpl.get("minecraft:acacia_door");
Block CHERRY_DOOR = BlockImpl.get("minecraft:cherry_door");
Block DARK_OAK_DOOR = BlockImpl.get("minecraft:dark_oak_door");
Block MANGROVE_DOOR = BlockImpl.get("minecraft:mangrove_door");
Block BAMBOO_DOOR = BlockImpl.get("minecraft:bamboo_door");
Block END_ROD = BlockImpl.get("minecraft:end_rod");
Block CHORUS_PLANT = BlockImpl.get("minecraft:chorus_plant");
@ -1075,6 +1199,8 @@ interface Blocks {
Block END_STONE_BRICKS = BlockImpl.get("minecraft:end_stone_bricks");
Block TORCHFLOWER_CROP = BlockImpl.get("minecraft:torchflower_crop");
Block BEETROOTS = BlockImpl.get("minecraft:beetroots");
Block DIRT_PATH = BlockImpl.get("minecraft:dirt_path");
@ -1793,6 +1919,8 @@ interface Blocks {
Block MOSS_CARPET = BlockImpl.get("minecraft:moss_carpet");
Block PINK_PETALS = BlockImpl.get("minecraft:pink_petals");
Block MOSS_BLOCK = BlockImpl.get("minecraft:moss_block");
Block BIG_DRIPLEAF = BlockImpl.get("minecraft:big_dripleaf");
@ -1870,4 +1998,6 @@ interface Blocks {
Block FROGSPAWN = BlockImpl.get("minecraft:frogspawn");
Block REINFORCED_DEEPSLATE = BlockImpl.get("minecraft:reinforced_deepslate");
Block DECORATED_POT = BlockImpl.get("minecraft:decorated_pot");
}

View File

@ -61,14 +61,20 @@ interface Materials {
Material ACACIA_PLANKS = MaterialImpl.get("minecraft:acacia_planks");
Material CHERRY_PLANKS = MaterialImpl.get("minecraft:cherry_planks");
Material DARK_OAK_PLANKS = MaterialImpl.get("minecraft:dark_oak_planks");
Material MANGROVE_PLANKS = MaterialImpl.get("minecraft:mangrove_planks");
Material BAMBOO_PLANKS = MaterialImpl.get("minecraft:bamboo_planks");
Material CRIMSON_PLANKS = MaterialImpl.get("minecraft:crimson_planks");
Material WARPED_PLANKS = MaterialImpl.get("minecraft:warped_planks");
Material BAMBOO_MOSAIC = MaterialImpl.get("minecraft:bamboo_mosaic");
Material OAK_SAPLING = MaterialImpl.get("minecraft:oak_sapling");
Material SPRUCE_SAPLING = MaterialImpl.get("minecraft:spruce_sapling");
@ -79,6 +85,8 @@ interface Materials {
Material ACACIA_SAPLING = MaterialImpl.get("minecraft:acacia_sapling");
Material CHERRY_SAPLING = MaterialImpl.get("minecraft:cherry_sapling");
Material DARK_OAK_SAPLING = MaterialImpl.get("minecraft:dark_oak_sapling");
Material MANGROVE_PROPAGULE = MaterialImpl.get("minecraft:mangrove_propagule");
@ -87,6 +95,8 @@ interface Materials {
Material SAND = MaterialImpl.get("minecraft:sand");
Material SUSPICIOUS_SAND = MaterialImpl.get("minecraft:suspicious_sand");
Material RED_SAND = MaterialImpl.get("minecraft:red_sand");
Material GRAVEL = MaterialImpl.get("minecraft:gravel");
@ -223,6 +233,8 @@ interface Materials {
Material ACACIA_LOG = MaterialImpl.get("minecraft:acacia_log");
Material CHERRY_LOG = MaterialImpl.get("minecraft:cherry_log");
Material DARK_OAK_LOG = MaterialImpl.get("minecraft:dark_oak_log");
Material MANGROVE_LOG = MaterialImpl.get("minecraft:mangrove_log");
@ -235,6 +247,8 @@ interface Materials {
Material WARPED_STEM = MaterialImpl.get("minecraft:warped_stem");
Material BAMBOO_BLOCK = MaterialImpl.get("minecraft:bamboo_block");
Material STRIPPED_OAK_LOG = MaterialImpl.get("minecraft:stripped_oak_log");
Material STRIPPED_SPRUCE_LOG = MaterialImpl.get("minecraft:stripped_spruce_log");
@ -245,6 +259,8 @@ interface Materials {
Material STRIPPED_ACACIA_LOG = MaterialImpl.get("minecraft:stripped_acacia_log");
Material STRIPPED_CHERRY_LOG = MaterialImpl.get("minecraft:stripped_cherry_log");
Material STRIPPED_DARK_OAK_LOG = MaterialImpl.get("minecraft:stripped_dark_oak_log");
Material STRIPPED_MANGROVE_LOG = MaterialImpl.get("minecraft:stripped_mangrove_log");
@ -263,6 +279,8 @@ interface Materials {
Material STRIPPED_ACACIA_WOOD = MaterialImpl.get("minecraft:stripped_acacia_wood");
Material STRIPPED_CHERRY_WOOD = MaterialImpl.get("minecraft:stripped_cherry_wood");
Material STRIPPED_DARK_OAK_WOOD = MaterialImpl.get("minecraft:stripped_dark_oak_wood");
Material STRIPPED_MANGROVE_WOOD = MaterialImpl.get("minecraft:stripped_mangrove_wood");
@ -271,6 +289,8 @@ interface Materials {
Material STRIPPED_WARPED_HYPHAE = MaterialImpl.get("minecraft:stripped_warped_hyphae");
Material STRIPPED_BAMBOO_BLOCK = MaterialImpl.get("minecraft:stripped_bamboo_block");
Material OAK_WOOD = MaterialImpl.get("minecraft:oak_wood");
Material SPRUCE_WOOD = MaterialImpl.get("minecraft:spruce_wood");
@ -281,6 +301,8 @@ interface Materials {
Material ACACIA_WOOD = MaterialImpl.get("minecraft:acacia_wood");
Material CHERRY_WOOD = MaterialImpl.get("minecraft:cherry_wood");
Material DARK_OAK_WOOD = MaterialImpl.get("minecraft:dark_oak_wood");
Material MANGROVE_WOOD = MaterialImpl.get("minecraft:mangrove_wood");
@ -299,6 +321,8 @@ interface Materials {
Material ACACIA_LEAVES = MaterialImpl.get("minecraft:acacia_leaves");
Material CHERRY_LEAVES = MaterialImpl.get("minecraft:cherry_leaves");
Material DARK_OAK_LEAVES = MaterialImpl.get("minecraft:dark_oak_leaves");
Material MANGROVE_LEAVES = MaterialImpl.get("minecraft:mangrove_leaves");
@ -397,6 +421,8 @@ interface Materials {
Material WITHER_ROSE = MaterialImpl.get("minecraft:wither_rose");
Material TORCHFLOWER = MaterialImpl.get("minecraft:torchflower");
Material SPORE_BLOSSOM = MaterialImpl.get("minecraft:spore_blossom");
Material BROWN_MUSHROOM = MaterialImpl.get("minecraft:brown_mushroom");
@ -423,6 +449,8 @@ interface Materials {
Material MOSS_CARPET = MaterialImpl.get("minecraft:moss_carpet");
Material PINK_PETALS = MaterialImpl.get("minecraft:pink_petals");
Material MOSS_BLOCK = MaterialImpl.get("minecraft:moss_block");
Material HANGING_ROOTS = MaterialImpl.get("minecraft:hanging_roots");
@ -443,10 +471,16 @@ interface Materials {
Material ACACIA_SLAB = MaterialImpl.get("minecraft:acacia_slab");
Material CHERRY_SLAB = MaterialImpl.get("minecraft:cherry_slab");
Material DARK_OAK_SLAB = MaterialImpl.get("minecraft:dark_oak_slab");
Material MANGROVE_SLAB = MaterialImpl.get("minecraft:mangrove_slab");
Material BAMBOO_SLAB = MaterialImpl.get("minecraft:bamboo_slab");
Material BAMBOO_MOSAIC_SLAB = MaterialImpl.get("minecraft:bamboo_mosaic_slab");
Material CRIMSON_SLAB = MaterialImpl.get("minecraft:crimson_slab");
Material WARPED_SLAB = MaterialImpl.get("minecraft:warped_slab");
@ -497,6 +531,10 @@ interface Materials {
Material BOOKSHELF = MaterialImpl.get("minecraft:bookshelf");
Material CHISELED_BOOKSHELF = MaterialImpl.get("minecraft:chiseled_bookshelf");
Material DECORATED_POT = MaterialImpl.get("minecraft:decorated_pot");
Material MOSSY_COBBLESTONE = MaterialImpl.get("minecraft:mossy_cobblestone");
Material OBSIDIAN = MaterialImpl.get("minecraft:obsidian");
@ -551,10 +589,14 @@ interface Materials {
Material ACACIA_FENCE = MaterialImpl.get("minecraft:acacia_fence");
Material CHERRY_FENCE = MaterialImpl.get("minecraft:cherry_fence");
Material DARK_OAK_FENCE = MaterialImpl.get("minecraft:dark_oak_fence");
Material MANGROVE_FENCE = MaterialImpl.get("minecraft:mangrove_fence");
Material BAMBOO_FENCE = MaterialImpl.get("minecraft:bamboo_fence");
Material CRIMSON_FENCE = MaterialImpl.get("minecraft:crimson_fence");
Material WARPED_FENCE = MaterialImpl.get("minecraft:warped_fence");
@ -691,10 +733,16 @@ interface Materials {
Material ACACIA_STAIRS = MaterialImpl.get("minecraft:acacia_stairs");
Material CHERRY_STAIRS = MaterialImpl.get("minecraft:cherry_stairs");
Material DARK_OAK_STAIRS = MaterialImpl.get("minecraft:dark_oak_stairs");
Material MANGROVE_STAIRS = MaterialImpl.get("minecraft:mangrove_stairs");
Material BAMBOO_STAIRS = MaterialImpl.get("minecraft:bamboo_stairs");
Material BAMBOO_MOSAIC_STAIRS = MaterialImpl.get("minecraft:bamboo_mosaic_stairs");
Material CRIMSON_STAIRS = MaterialImpl.get("minecraft:crimson_stairs");
Material WARPED_STAIRS = MaterialImpl.get("minecraft:warped_stairs");
@ -1283,10 +1331,14 @@ interface Materials {
Material ACACIA_BUTTON = MaterialImpl.get("minecraft:acacia_button");
Material CHERRY_BUTTON = MaterialImpl.get("minecraft:cherry_button");
Material DARK_OAK_BUTTON = MaterialImpl.get("minecraft:dark_oak_button");
Material MANGROVE_BUTTON = MaterialImpl.get("minecraft:mangrove_button");
Material BAMBOO_BUTTON = MaterialImpl.get("minecraft:bamboo_button");
Material CRIMSON_BUTTON = MaterialImpl.get("minecraft:crimson_button");
Material WARPED_BUTTON = MaterialImpl.get("minecraft:warped_button");
@ -1309,10 +1361,14 @@ interface Materials {
Material ACACIA_PRESSURE_PLATE = MaterialImpl.get("minecraft:acacia_pressure_plate");
Material CHERRY_PRESSURE_PLATE = MaterialImpl.get("minecraft:cherry_pressure_plate");
Material DARK_OAK_PRESSURE_PLATE = MaterialImpl.get("minecraft:dark_oak_pressure_plate");
Material MANGROVE_PRESSURE_PLATE = MaterialImpl.get("minecraft:mangrove_pressure_plate");
Material BAMBOO_PRESSURE_PLATE = MaterialImpl.get("minecraft:bamboo_pressure_plate");
Material CRIMSON_PRESSURE_PLATE = MaterialImpl.get("minecraft:crimson_pressure_plate");
Material WARPED_PRESSURE_PLATE = MaterialImpl.get("minecraft:warped_pressure_plate");
@ -1329,10 +1385,14 @@ interface Materials {
Material ACACIA_DOOR = MaterialImpl.get("minecraft:acacia_door");
Material CHERRY_DOOR = MaterialImpl.get("minecraft:cherry_door");
Material DARK_OAK_DOOR = MaterialImpl.get("minecraft:dark_oak_door");
Material MANGROVE_DOOR = MaterialImpl.get("minecraft:mangrove_door");
Material BAMBOO_DOOR = MaterialImpl.get("minecraft:bamboo_door");
Material CRIMSON_DOOR = MaterialImpl.get("minecraft:crimson_door");
Material WARPED_DOOR = MaterialImpl.get("minecraft:warped_door");
@ -1349,10 +1409,14 @@ interface Materials {
Material ACACIA_TRAPDOOR = MaterialImpl.get("minecraft:acacia_trapdoor");
Material CHERRY_TRAPDOOR = MaterialImpl.get("minecraft:cherry_trapdoor");
Material DARK_OAK_TRAPDOOR = MaterialImpl.get("minecraft:dark_oak_trapdoor");
Material MANGROVE_TRAPDOOR = MaterialImpl.get("minecraft:mangrove_trapdoor");
Material BAMBOO_TRAPDOOR = MaterialImpl.get("minecraft:bamboo_trapdoor");
Material CRIMSON_TRAPDOOR = MaterialImpl.get("minecraft:crimson_trapdoor");
Material WARPED_TRAPDOOR = MaterialImpl.get("minecraft:warped_trapdoor");
@ -1367,10 +1431,14 @@ interface Materials {
Material ACACIA_FENCE_GATE = MaterialImpl.get("minecraft:acacia_fence_gate");
Material CHERRY_FENCE_GATE = MaterialImpl.get("minecraft:cherry_fence_gate");
Material DARK_OAK_FENCE_GATE = MaterialImpl.get("minecraft:dark_oak_fence_gate");
Material MANGROVE_FENCE_GATE = MaterialImpl.get("minecraft:mangrove_fence_gate");
Material BAMBOO_FENCE_GATE = MaterialImpl.get("minecraft:bamboo_fence_gate");
Material CRIMSON_FENCE_GATE = MaterialImpl.get("minecraft:crimson_fence_gate");
Material WARPED_FENCE_GATE = MaterialImpl.get("minecraft:warped_fence_gate");
@ -1421,6 +1489,10 @@ interface Materials {
Material ACACIA_CHEST_BOAT = MaterialImpl.get("minecraft:acacia_chest_boat");
Material CHERRY_BOAT = MaterialImpl.get("minecraft:cherry_boat");
Material CHERRY_CHEST_BOAT = MaterialImpl.get("minecraft:cherry_chest_boat");
Material DARK_OAK_BOAT = MaterialImpl.get("minecraft:dark_oak_boat");
Material DARK_OAK_CHEST_BOAT = MaterialImpl.get("minecraft:dark_oak_chest_boat");
@ -1429,6 +1501,10 @@ interface Materials {
Material MANGROVE_CHEST_BOAT = MaterialImpl.get("minecraft:mangrove_chest_boat");
Material BAMBOO_RAFT = MaterialImpl.get("minecraft:bamboo_raft");
Material BAMBOO_CHEST_RAFT = MaterialImpl.get("minecraft:bamboo_chest_raft");
Material STRUCTURE_BLOCK = MaterialImpl.get("minecraft:structure_block");
Material JIGSAW = MaterialImpl.get("minecraft:jigsaw");
@ -1623,14 +1699,40 @@ interface Materials {
Material ACACIA_SIGN = MaterialImpl.get("minecraft:acacia_sign");
Material CHERRY_SIGN = MaterialImpl.get("minecraft:cherry_sign");
Material DARK_OAK_SIGN = MaterialImpl.get("minecraft:dark_oak_sign");
Material MANGROVE_SIGN = MaterialImpl.get("minecraft:mangrove_sign");
Material BAMBOO_SIGN = MaterialImpl.get("minecraft:bamboo_sign");
Material CRIMSON_SIGN = MaterialImpl.get("minecraft:crimson_sign");
Material WARPED_SIGN = MaterialImpl.get("minecraft:warped_sign");
Material OAK_HANGING_SIGN = MaterialImpl.get("minecraft:oak_hanging_sign");
Material SPRUCE_HANGING_SIGN = MaterialImpl.get("minecraft:spruce_hanging_sign");
Material BIRCH_HANGING_SIGN = MaterialImpl.get("minecraft:birch_hanging_sign");
Material JUNGLE_HANGING_SIGN = MaterialImpl.get("minecraft:jungle_hanging_sign");
Material ACACIA_HANGING_SIGN = MaterialImpl.get("minecraft:acacia_hanging_sign");
Material CHERRY_HANGING_SIGN = MaterialImpl.get("minecraft:cherry_hanging_sign");
Material DARK_OAK_HANGING_SIGN = MaterialImpl.get("minecraft:dark_oak_hanging_sign");
Material MANGROVE_HANGING_SIGN = MaterialImpl.get("minecraft:mangrove_hanging_sign");
Material BAMBOO_HANGING_SIGN = MaterialImpl.get("minecraft:bamboo_hanging_sign");
Material CRIMSON_HANGING_SIGN = MaterialImpl.get("minecraft:crimson_hanging_sign");
Material WARPED_HANGING_SIGN = MaterialImpl.get("minecraft:warped_hanging_sign");
Material BUCKET = MaterialImpl.get("minecraft:bucket");
Material WATER_BUCKET = MaterialImpl.get("minecraft:water_bucket");
@ -1841,6 +1943,8 @@ interface Materials {
Material CAT_SPAWN_EGG = MaterialImpl.get("minecraft:cat_spawn_egg");
Material CAMEL_SPAWN_EGG = MaterialImpl.get("minecraft:camel_spawn_egg");
Material CAVE_SPIDER_SPAWN_EGG = MaterialImpl.get("minecraft:cave_spider_spawn_egg");
Material CHICKEN_SPAWN_EGG = MaterialImpl.get("minecraft:chicken_spawn_egg");
@ -1859,6 +1963,8 @@ interface Materials {
Material ELDER_GUARDIAN_SPAWN_EGG = MaterialImpl.get("minecraft:elder_guardian_spawn_egg");
Material ENDER_DRAGON_SPAWN_EGG = MaterialImpl.get("minecraft:ender_dragon_spawn_egg");
Material ENDERMAN_SPAWN_EGG = MaterialImpl.get("minecraft:enderman_spawn_egg");
Material ENDERMITE_SPAWN_EGG = MaterialImpl.get("minecraft:endermite_spawn_egg");
@ -1883,6 +1989,8 @@ interface Materials {
Material HUSK_SPAWN_EGG = MaterialImpl.get("minecraft:husk_spawn_egg");
Material IRON_GOLEM_SPAWN_EGG = MaterialImpl.get("minecraft:iron_golem_spawn_egg");
Material LLAMA_SPAWN_EGG = MaterialImpl.get("minecraft:llama_spawn_egg");
Material MAGMA_CUBE_SPAWN_EGG = MaterialImpl.get("minecraft:magma_cube_spawn_egg");
@ -1929,6 +2037,10 @@ interface Materials {
Material SLIME_SPAWN_EGG = MaterialImpl.get("minecraft:slime_spawn_egg");
Material SNIFFER_SPAWN_EGG = MaterialImpl.get("minecraft:sniffer_spawn_egg");
Material SNOW_GOLEM_SPAWN_EGG = MaterialImpl.get("minecraft:snow_golem_spawn_egg");
Material SPIDER_SPAWN_EGG = MaterialImpl.get("minecraft:spider_spawn_egg");
Material SQUID_SPAWN_EGG = MaterialImpl.get("minecraft:squid_spawn_egg");
@ -1957,6 +2069,8 @@ interface Materials {
Material WITCH_SPAWN_EGG = MaterialImpl.get("minecraft:witch_spawn_egg");
Material WITHER_SPAWN_EGG = MaterialImpl.get("minecraft:wither_spawn_egg");
Material WITHER_SKELETON_SPAWN_EGG = MaterialImpl.get("minecraft:wither_skeleton_spawn_egg");
Material WOLF_SPAWN_EGG = MaterialImpl.get("minecraft:wolf_spawn_egg");
@ -2009,6 +2123,8 @@ interface Materials {
Material DRAGON_HEAD = MaterialImpl.get("minecraft:dragon_head");
Material PIGLIN_HEAD = MaterialImpl.get("minecraft:piglin_head");
Material NETHER_STAR = MaterialImpl.get("minecraft:nether_star");
Material PUMPKIN_PIE = MaterialImpl.get("minecraft:pumpkin_pie");
@ -2093,6 +2209,8 @@ interface Materials {
Material POPPED_CHORUS_FRUIT = MaterialImpl.get("minecraft:popped_chorus_fruit");
Material TORCHFLOWER_SEEDS = MaterialImpl.get("minecraft:torchflower_seeds");
Material BEETROOT = MaterialImpl.get("minecraft:beetroot");
Material BEETROOT_SEEDS = MaterialImpl.get("minecraft:beetroot_seeds");
@ -2308,4 +2426,38 @@ interface Materials {
Material FROGSPAWN = MaterialImpl.get("minecraft:frogspawn");
Material ECHO_SHARD = MaterialImpl.get("minecraft:echo_shard");
Material BRUSH = MaterialImpl.get("minecraft:brush");
Material NETHERITE_UPGRADE_SMITHING_TEMPLATE = MaterialImpl.get("minecraft:netherite_upgrade_smithing_template");
Material SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE = MaterialImpl.get("minecraft:sentry_armor_trim_smithing_template");
Material DUNE_ARMOR_TRIM_SMITHING_TEMPLATE = MaterialImpl.get("minecraft:dune_armor_trim_smithing_template");
Material COAST_ARMOR_TRIM_SMITHING_TEMPLATE = MaterialImpl.get("minecraft:coast_armor_trim_smithing_template");
Material WILD_ARMOR_TRIM_SMITHING_TEMPLATE = MaterialImpl.get("minecraft:wild_armor_trim_smithing_template");
Material WARD_ARMOR_TRIM_SMITHING_TEMPLATE = MaterialImpl.get("minecraft:ward_armor_trim_smithing_template");
Material EYE_ARMOR_TRIM_SMITHING_TEMPLATE = MaterialImpl.get("minecraft:eye_armor_trim_smithing_template");
Material VEX_ARMOR_TRIM_SMITHING_TEMPLATE = MaterialImpl.get("minecraft:vex_armor_trim_smithing_template");
Material TIDE_ARMOR_TRIM_SMITHING_TEMPLATE = MaterialImpl.get("minecraft:tide_armor_trim_smithing_template");
Material SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE = MaterialImpl.get("minecraft:snout_armor_trim_smithing_template");
Material RIB_ARMOR_TRIM_SMITHING_TEMPLATE = MaterialImpl.get("minecraft:rib_armor_trim_smithing_template");
Material SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE = MaterialImpl.get("minecraft:spire_armor_trim_smithing_template");
Material POTTERY_SHARD_ARCHER = MaterialImpl.get("minecraft:pottery_shard_archer");
Material POTTERY_SHARD_PRIZE = MaterialImpl.get("minecraft:pottery_shard_prize");
Material POTTERY_SHARD_ARMS_UP = MaterialImpl.get("minecraft:pottery_shard_arms_up");
Material POTTERY_SHARD_SKULL = MaterialImpl.get("minecraft:pottery_shard_skull");
}

View File

@ -63,6 +63,12 @@ interface Particles {
Particle FLAME = ParticleImpl.get("minecraft:flame");
Particle DRIPPING_CHERRY_LEAVES = ParticleImpl.get("minecraft:dripping_cherry_leaves");
Particle FALLING_CHERRY_LEAVES = ParticleImpl.get("minecraft:falling_cherry_leaves");
Particle LANDING_CHERRY_LEAVES = ParticleImpl.get("minecraft:landing_cherry_leaves");
Particle SCULK_SOUL = ParticleImpl.get("minecraft:sculk_soul");
Particle SCULK_CHARGE = ParticleImpl.get("minecraft:sculk_charge");

View File

@ -199,6 +199,36 @@ interface SoundEvents {
SoundEvent BLOCK_BAMBOO_SAPLING_PLACE = SoundEventImpl.get("minecraft:block.bamboo_sapling.place");
SoundEvent BLOCK_BAMBOO_WOOD_BREAK = SoundEventImpl.get("minecraft:block.bamboo_wood.break");
SoundEvent BLOCK_BAMBOO_WOOD_FALL = SoundEventImpl.get("minecraft:block.bamboo_wood.fall");
SoundEvent BLOCK_BAMBOO_WOOD_HIT = SoundEventImpl.get("minecraft:block.bamboo_wood.hit");
SoundEvent BLOCK_BAMBOO_WOOD_PLACE = SoundEventImpl.get("minecraft:block.bamboo_wood.place");
SoundEvent BLOCK_BAMBOO_WOOD_STEP = SoundEventImpl.get("minecraft:block.bamboo_wood.step");
SoundEvent BLOCK_BAMBOO_WOOD_DOOR_CLOSE = SoundEventImpl.get("minecraft:block.bamboo_wood_door.close");
SoundEvent BLOCK_BAMBOO_WOOD_DOOR_OPEN = SoundEventImpl.get("minecraft:block.bamboo_wood_door.open");
SoundEvent BLOCK_BAMBOO_WOOD_TRAPDOOR_CLOSE = SoundEventImpl.get("minecraft:block.bamboo_wood_trapdoor.close");
SoundEvent BLOCK_BAMBOO_WOOD_TRAPDOOR_OPEN = SoundEventImpl.get("minecraft:block.bamboo_wood_trapdoor.open");
SoundEvent BLOCK_BAMBOO_WOOD_BUTTON_CLICK_OFF = SoundEventImpl.get("minecraft:block.bamboo_wood_button.click_off");
SoundEvent BLOCK_BAMBOO_WOOD_BUTTON_CLICK_ON = SoundEventImpl.get("minecraft:block.bamboo_wood_button.click_on");
SoundEvent BLOCK_BAMBOO_WOOD_PRESSURE_PLATE_CLICK_OFF = SoundEventImpl.get("minecraft:block.bamboo_wood_pressure_plate.click_off");
SoundEvent BLOCK_BAMBOO_WOOD_PRESSURE_PLATE_CLICK_ON = SoundEventImpl.get("minecraft:block.bamboo_wood_pressure_plate.click_on");
SoundEvent BLOCK_BAMBOO_WOOD_FENCE_GATE_CLOSE = SoundEventImpl.get("minecraft:block.bamboo_wood_fence_gate.close");
SoundEvent BLOCK_BAMBOO_WOOD_FENCE_GATE_OPEN = SoundEventImpl.get("minecraft:block.bamboo_wood_fence_gate.open");
SoundEvent BLOCK_BARREL_CLOSE = SoundEventImpl.get("minecraft:block.barrel.close");
SoundEvent BLOCK_BARREL_OPEN = SoundEventImpl.get("minecraft:block.barrel.open");
@ -307,6 +337,10 @@ interface SoundEvents {
SoundEvent BLOCK_BREWING_STAND_BREW = SoundEventImpl.get("minecraft:block.brewing_stand.brew");
SoundEvent ITEM_BRUSH_BRUSHING = SoundEventImpl.get("minecraft:item.brush.brushing");
SoundEvent ITEM_BRUSH_BRUSH_SAND_COMPLETED = SoundEventImpl.get("minecraft:item.brush.brush_sand_completed");
SoundEvent BLOCK_BUBBLE_COLUMN_BUBBLE_POP = SoundEventImpl.get("minecraft:block.bubble_column.bubble_pop");
SoundEvent BLOCK_BUBBLE_COLUMN_UPWARDS_AMBIENT = SoundEventImpl.get("minecraft:block.bubble_column.upwards_ambient");
@ -359,6 +393,28 @@ interface SoundEvents {
SoundEvent BLOCK_CALCITE_FALL = SoundEventImpl.get("minecraft:block.calcite.fall");
SoundEvent ENTITY_CAMEL_AMBIENT = SoundEventImpl.get("minecraft:entity.camel.ambient");
SoundEvent ENTITY_CAMEL_DASH = SoundEventImpl.get("minecraft:entity.camel.dash");
SoundEvent ENTITY_CAMEL_DASH_READY = SoundEventImpl.get("minecraft:entity.camel.dash_ready");
SoundEvent ENTITY_CAMEL_DEATH = SoundEventImpl.get("minecraft:entity.camel.death");
SoundEvent ENTITY_CAMEL_EAT = SoundEventImpl.get("minecraft:entity.camel.eat");
SoundEvent ENTITY_CAMEL_HURT = SoundEventImpl.get("minecraft:entity.camel.hurt");
SoundEvent ENTITY_CAMEL_SADDLE = SoundEventImpl.get("minecraft:entity.camel.saddle");
SoundEvent ENTITY_CAMEL_SIT = SoundEventImpl.get("minecraft:entity.camel.sit");
SoundEvent ENTITY_CAMEL_STAND = SoundEventImpl.get("minecraft:entity.camel.stand");
SoundEvent ENTITY_CAMEL_STEP = SoundEventImpl.get("minecraft:entity.camel.step");
SoundEvent ENTITY_CAMEL_STEP_SAND = SoundEventImpl.get("minecraft:entity.camel.step_sand");
SoundEvent BLOCK_CAMPFIRE_CRACKLE = SoundEventImpl.get("minecraft:block.campfire.crackle");
SoundEvent BLOCK_CANDLE_AMBIENT = SoundEventImpl.get("minecraft:block.candle.ambient");
@ -415,6 +471,66 @@ interface SoundEvents {
SoundEvent BLOCK_CHAIN_STEP = SoundEventImpl.get("minecraft:block.chain.step");
SoundEvent BLOCK_CHERRY_WOOD_BREAK = SoundEventImpl.get("minecraft:block.cherry_wood.break");
SoundEvent BLOCK_CHERRY_WOOD_FALL = SoundEventImpl.get("minecraft:block.cherry_wood.fall");
SoundEvent BLOCK_CHERRY_WOOD_HIT = SoundEventImpl.get("minecraft:block.cherry_wood.hit");
SoundEvent BLOCK_CHERRY_WOOD_PLACE = SoundEventImpl.get("minecraft:block.cherry_wood.place");
SoundEvent BLOCK_CHERRY_WOOD_STEP = SoundEventImpl.get("minecraft:block.cherry_wood.step");
SoundEvent BLOCK_CHERRY_SAPLING_BREAK = SoundEventImpl.get("minecraft:block.cherry_sapling.break");
SoundEvent BLOCK_CHERRY_SAPLING_FALL = SoundEventImpl.get("minecraft:block.cherry_sapling.fall");
SoundEvent BLOCK_CHERRY_SAPLING_HIT = SoundEventImpl.get("minecraft:block.cherry_sapling.hit");
SoundEvent BLOCK_CHERRY_SAPLING_PLACE = SoundEventImpl.get("minecraft:block.cherry_sapling.place");
SoundEvent BLOCK_CHERRY_SAPLING_STEP = SoundEventImpl.get("minecraft:block.cherry_sapling.step");
SoundEvent BLOCK_CHERRY_LEAVES_BREAK = SoundEventImpl.get("minecraft:block.cherry_leaves.break");
SoundEvent BLOCK_CHERRY_LEAVES_FALL = SoundEventImpl.get("minecraft:block.cherry_leaves.fall");
SoundEvent BLOCK_CHERRY_LEAVES_HIT = SoundEventImpl.get("minecraft:block.cherry_leaves.hit");
SoundEvent BLOCK_CHERRY_LEAVES_PLACE = SoundEventImpl.get("minecraft:block.cherry_leaves.place");
SoundEvent BLOCK_CHERRY_LEAVES_STEP = SoundEventImpl.get("minecraft:block.cherry_leaves.step");
SoundEvent BLOCK_CHERRY_WOOD_HANGING_SIGN_STEP = SoundEventImpl.get("minecraft:block.cherry_wood_hanging_sign.step");
SoundEvent BLOCK_CHERRY_WOOD_HANGING_SIGN_BREAK = SoundEventImpl.get("minecraft:block.cherry_wood_hanging_sign.break");
SoundEvent BLOCK_CHERRY_WOOD_HANGING_SIGN_FALL = SoundEventImpl.get("minecraft:block.cherry_wood_hanging_sign.fall");
SoundEvent BLOCK_CHERRY_WOOD_HANGING_SIGN_HIT = SoundEventImpl.get("minecraft:block.cherry_wood_hanging_sign.hit");
SoundEvent BLOCK_CHERRY_WOOD_HANGING_SIGN_PLACE = SoundEventImpl.get("minecraft:block.cherry_wood_hanging_sign.place");
SoundEvent BLOCK_CHERRY_WOOD_DOOR_CLOSE = SoundEventImpl.get("minecraft:block.cherry_wood_door.close");
SoundEvent BLOCK_CHERRY_WOOD_DOOR_OPEN = SoundEventImpl.get("minecraft:block.cherry_wood_door.open");
SoundEvent BLOCK_CHERRY_WOOD_TRAPDOOR_CLOSE = SoundEventImpl.get("minecraft:block.cherry_wood_trapdoor.close");
SoundEvent BLOCK_CHERRY_WOOD_TRAPDOOR_OPEN = SoundEventImpl.get("minecraft:block.cherry_wood_trapdoor.open");
SoundEvent BLOCK_CHERRY_WOOD_BUTTON_CLICK_OFF = SoundEventImpl.get("minecraft:block.cherry_wood_button.click_off");
SoundEvent BLOCK_CHERRY_WOOD_BUTTON_CLICK_ON = SoundEventImpl.get("minecraft:block.cherry_wood_button.click_on");
SoundEvent BLOCK_CHERRY_WOOD_PRESSURE_PLATE_CLICK_OFF = SoundEventImpl.get("minecraft:block.cherry_wood_pressure_plate.click_off");
SoundEvent BLOCK_CHERRY_WOOD_PRESSURE_PLATE_CLICK_ON = SoundEventImpl.get("minecraft:block.cherry_wood_pressure_plate.click_on");
SoundEvent BLOCK_CHERRY_WOOD_FENCE_GATE_CLOSE = SoundEventImpl.get("minecraft:block.cherry_wood_fence_gate.close");
SoundEvent BLOCK_CHERRY_WOOD_FENCE_GATE_OPEN = SoundEventImpl.get("minecraft:block.cherry_wood_fence_gate.open");
SoundEvent BLOCK_CHEST_CLOSE = SoundEventImpl.get("minecraft:block.chest.close");
SoundEvent BLOCK_CHEST_LOCKED = SoundEventImpl.get("minecraft:block.chest.locked");
@ -431,6 +547,24 @@ interface SoundEvents {
SoundEvent ENTITY_CHICKEN_STEP = SoundEventImpl.get("minecraft:entity.chicken.step");
SoundEvent BLOCK_CHISELED_BOOKSHELF_BREAK = SoundEventImpl.get("minecraft:block.chiseled_bookshelf.break");
SoundEvent BLOCK_CHISELED_BOOKSHELF_FALL = SoundEventImpl.get("minecraft:block.chiseled_bookshelf.fall");
SoundEvent BLOCK_CHISELED_BOOKSHELF_HIT = SoundEventImpl.get("minecraft:block.chiseled_bookshelf.hit");
SoundEvent BLOCK_CHISELED_BOOKSHELF_INSERT = SoundEventImpl.get("minecraft:block.chiseled_bookshelf.insert");
SoundEvent BLOCK_CHISELED_BOOKSHELF_INSERT_ENCHANTED = SoundEventImpl.get("minecraft:block.chiseled_bookshelf.insert.enchanted");
SoundEvent BLOCK_CHISELED_BOOKSHELF_STEP = SoundEventImpl.get("minecraft:block.chiseled_bookshelf.step");
SoundEvent BLOCK_CHISELED_BOOKSHELF_PICKUP = SoundEventImpl.get("minecraft:block.chiseled_bookshelf.pickup");
SoundEvent BLOCK_CHISELED_BOOKSHELF_PICKUP_ENCHANTED = SoundEventImpl.get("minecraft:block.chiseled_bookshelf.pickup.enchanted");
SoundEvent BLOCK_CHISELED_BOOKSHELF_PLACE = SoundEventImpl.get("minecraft:block.chiseled_bookshelf.place");
SoundEvent BLOCK_CHORUS_FLOWER_DEATH = SoundEventImpl.get("minecraft:block.chorus_flower.death");
SoundEvent BLOCK_CHORUS_FLOWER_GROW = SoundEventImpl.get("minecraft:block.chorus_flower.grow");
@ -521,6 +655,18 @@ interface SoundEvents {
SoundEvent ITEM_CROSSBOW_SHOOT = SoundEventImpl.get("minecraft:item.crossbow.shoot");
SoundEvent BLOCK_DECORATED_POT_BREAK = SoundEventImpl.get("minecraft:block.decorated_pot.break");
SoundEvent BLOCK_DECORATED_POT_FALL = SoundEventImpl.get("minecraft:block.decorated_pot.fall");
SoundEvent BLOCK_DECORATED_POT_HIT = SoundEventImpl.get("minecraft:block.decorated_pot.hit");
SoundEvent BLOCK_DECORATED_POT_STEP = SoundEventImpl.get("minecraft:block.decorated_pot.step");
SoundEvent BLOCK_DECORATED_POT_PLACE = SoundEventImpl.get("minecraft:block.decorated_pot.place");
SoundEvent BLOCK_DECORATED_POT_SHATTER = SoundEventImpl.get("minecraft:block.decorated_pot.shatter");
SoundEvent BLOCK_DEEPSLATE_BRICKS_BREAK = SoundEventImpl.get("minecraft:block.deepslate_bricks.break");
SoundEvent BLOCK_DEEPSLATE_BRICKS_FALL = SoundEventImpl.get("minecraft:block.deepslate_bricks.fall");
@ -805,6 +951,16 @@ interface SoundEvents {
SoundEvent ENTITY_FOX_TELEPORT = SoundEventImpl.get("minecraft:entity.fox.teleport");
SoundEvent BLOCK_SUSPICIOUS_SAND_BREAK = SoundEventImpl.get("minecraft:block.suspicious_sand.break");
SoundEvent BLOCK_SUSPICIOUS_SAND_STEP = SoundEventImpl.get("minecraft:block.suspicious_sand.step");
SoundEvent BLOCK_SUSPICIOUS_SAND_PLACE = SoundEventImpl.get("minecraft:block.suspicious_sand.place");
SoundEvent BLOCK_SUSPICIOUS_SAND_HIT = SoundEventImpl.get("minecraft:block.suspicious_sand.hit");
SoundEvent BLOCK_SUSPICIOUS_SAND_FALL = SoundEventImpl.get("minecraft:block.suspicious_sand.fall");
SoundEvent BLOCK_FROGLIGHT_BREAK = SoundEventImpl.get("minecraft:block.froglight.break");
SoundEvent BLOCK_FROGLIGHT_FALL = SoundEventImpl.get("minecraft:block.froglight.fall");
@ -1019,6 +1175,36 @@ interface SoundEvents {
SoundEvent BLOCK_HANGING_ROOTS_STEP = SoundEventImpl.get("minecraft:block.hanging_roots.step");
SoundEvent BLOCK_HANGING_SIGN_STEP = SoundEventImpl.get("minecraft:block.hanging_sign.step");
SoundEvent BLOCK_HANGING_SIGN_BREAK = SoundEventImpl.get("minecraft:block.hanging_sign.break");
SoundEvent BLOCK_HANGING_SIGN_FALL = SoundEventImpl.get("minecraft:block.hanging_sign.fall");
SoundEvent BLOCK_HANGING_SIGN_HIT = SoundEventImpl.get("minecraft:block.hanging_sign.hit");
SoundEvent BLOCK_HANGING_SIGN_PLACE = SoundEventImpl.get("minecraft:block.hanging_sign.place");
SoundEvent BLOCK_NETHER_WOOD_HANGING_SIGN_STEP = SoundEventImpl.get("minecraft:block.nether_wood_hanging_sign.step");
SoundEvent BLOCK_NETHER_WOOD_HANGING_SIGN_BREAK = SoundEventImpl.get("minecraft:block.nether_wood_hanging_sign.break");
SoundEvent BLOCK_NETHER_WOOD_HANGING_SIGN_FALL = SoundEventImpl.get("minecraft:block.nether_wood_hanging_sign.fall");
SoundEvent BLOCK_NETHER_WOOD_HANGING_SIGN_HIT = SoundEventImpl.get("minecraft:block.nether_wood_hanging_sign.hit");
SoundEvent BLOCK_NETHER_WOOD_HANGING_SIGN_PLACE = SoundEventImpl.get("minecraft:block.nether_wood_hanging_sign.place");
SoundEvent BLOCK_BAMBOO_WOOD_HANGING_SIGN_STEP = SoundEventImpl.get("minecraft:block.bamboo_wood_hanging_sign.step");
SoundEvent BLOCK_BAMBOO_WOOD_HANGING_SIGN_BREAK = SoundEventImpl.get("minecraft:block.bamboo_wood_hanging_sign.break");
SoundEvent BLOCK_BAMBOO_WOOD_HANGING_SIGN_FALL = SoundEventImpl.get("minecraft:block.bamboo_wood_hanging_sign.fall");
SoundEvent BLOCK_BAMBOO_WOOD_HANGING_SIGN_HIT = SoundEventImpl.get("minecraft:block.bamboo_wood_hanging_sign.hit");
SoundEvent BLOCK_BAMBOO_WOOD_HANGING_SIGN_PLACE = SoundEventImpl.get("minecraft:block.bamboo_wood_hanging_sign.place");
SoundEvent ITEM_HOE_TILL = SoundEventImpl.get("minecraft:item.hoe.till");
SoundEvent ENTITY_HOGLIN_AMBIENT = SoundEventImpl.get("minecraft:entity.hoglin.ambient");
@ -1307,6 +1493,16 @@ interface SoundEvents {
SoundEvent BLOCK_MOSS_CARPET_STEP = SoundEventImpl.get("minecraft:block.moss_carpet.step");
SoundEvent BLOCK_PINK_PETALS_BREAK = SoundEventImpl.get("minecraft:block.pink_petals.break");
SoundEvent BLOCK_PINK_PETALS_FALL = SoundEventImpl.get("minecraft:block.pink_petals.fall");
SoundEvent BLOCK_PINK_PETALS_HIT = SoundEventImpl.get("minecraft:block.pink_petals.hit");
SoundEvent BLOCK_PINK_PETALS_PLACE = SoundEventImpl.get("minecraft:block.pink_petals.place");
SoundEvent BLOCK_PINK_PETALS_STEP = SoundEventImpl.get("minecraft:block.pink_petals.step");
SoundEvent BLOCK_MOSS_BREAK = SoundEventImpl.get("minecraft:block.moss.break");
SoundEvent BLOCK_MOSS_FALL = SoundEventImpl.get("minecraft:block.moss.fall");
@ -1423,6 +1619,8 @@ interface SoundEvents {
SoundEvent MUSIC_OVERWORLD_MEADOW = SoundEventImpl.get("minecraft:music.overworld.meadow");
SoundEvent MUSIC_OVERWORLD_CHERRY_GROVE = SoundEventImpl.get("minecraft:music.overworld.cherry_grove");
SoundEvent MUSIC_NETHER_NETHER_WASTES = SoundEventImpl.get("minecraft:music.nether.nether_wastes");
SoundEvent MUSIC_OVERWORLD_FROZEN_PEAKS = SoundEventImpl.get("minecraft:music.overworld.frozen_peaks");
@ -1451,6 +1649,38 @@ interface SoundEvents {
SoundEvent ITEM_NETHER_WART_PLANT = SoundEventImpl.get("minecraft:item.nether_wart.plant");
SoundEvent BLOCK_NETHER_WOOD_BREAK = SoundEventImpl.get("minecraft:block.nether_wood.break");
SoundEvent BLOCK_NETHER_WOOD_FALL = SoundEventImpl.get("minecraft:block.nether_wood.fall");
SoundEvent BLOCK_NETHER_WOOD_HIT = SoundEventImpl.get("minecraft:block.nether_wood.hit");
SoundEvent BLOCK_NETHER_WOOD_PLACE = SoundEventImpl.get("minecraft:block.nether_wood.place");
SoundEvent BLOCK_NETHER_WOOD_STEP = SoundEventImpl.get("minecraft:block.nether_wood.step");
SoundEvent BLOCK_NETHER_WOOD_DOOR_CLOSE = SoundEventImpl.get("minecraft:block.nether_wood_door.close");
SoundEvent BLOCK_NETHER_WOOD_DOOR_OPEN = SoundEventImpl.get("minecraft:block.nether_wood_door.open");
SoundEvent BLOCK_NETHER_WOOD_TRAPDOOR_CLOSE = SoundEventImpl.get("minecraft:block.nether_wood_trapdoor.close");
SoundEvent BLOCK_NETHER_WOOD_TRAPDOOR_OPEN = SoundEventImpl.get("minecraft:block.nether_wood_trapdoor.open");
SoundEvent BLOCK_NETHER_WOOD_BUTTON_CLICK_OFF = SoundEventImpl.get("minecraft:block.nether_wood_button.click_off");
SoundEvent BLOCK_NETHER_WOOD_BUTTON_CLICK_ON = SoundEventImpl.get("minecraft:block.nether_wood_button.click_on");
SoundEvent BLOCK_NETHER_WOOD_PRESSURE_PLATE_CLICK_OFF = SoundEventImpl.get("minecraft:block.nether_wood_pressure_plate.click_off");
SoundEvent BLOCK_NETHER_WOOD_PRESSURE_PLATE_CLICK_ON = SoundEventImpl.get("minecraft:block.nether_wood_pressure_plate.click_on");
SoundEvent BLOCK_NETHER_WOOD_FENCE_GATE_CLOSE = SoundEventImpl.get("minecraft:block.nether_wood_fence_gate.close");
SoundEvent BLOCK_NETHER_WOOD_FENCE_GATE_OPEN = SoundEventImpl.get("minecraft:block.nether_wood_fence_gate.open");
SoundEvent INTENTIONALLY_EMPTY = SoundEventImpl.get("minecraft:intentionally_empty");
SoundEvent BLOCK_PACKED_MUD_BREAK = SoundEventImpl.get("minecraft:block.packed_mud.break");
SoundEvent BLOCK_PACKED_MUD_FALL = SoundEventImpl.get("minecraft:block.packed_mud.fall");
@ -1573,6 +1803,18 @@ interface SoundEvents {
SoundEvent BLOCK_NOTE_BLOCK_BANJO = SoundEventImpl.get("minecraft:block.note_block.banjo");
SoundEvent BLOCK_NOTE_BLOCK_IMITATE_ZOMBIE = SoundEventImpl.get("minecraft:block.note_block.imitate.zombie");
SoundEvent BLOCK_NOTE_BLOCK_IMITATE_SKELETON = SoundEventImpl.get("minecraft:block.note_block.imitate.skeleton");
SoundEvent BLOCK_NOTE_BLOCK_IMITATE_CREEPER = SoundEventImpl.get("minecraft:block.note_block.imitate.creeper");
SoundEvent BLOCK_NOTE_BLOCK_IMITATE_ENDER_DRAGON = SoundEventImpl.get("minecraft:block.note_block.imitate.ender_dragon");
SoundEvent BLOCK_NOTE_BLOCK_IMITATE_WITHER_SKELETON = SoundEventImpl.get("minecraft:block.note_block.imitate.wither_skeleton");
SoundEvent BLOCK_NOTE_BLOCK_IMITATE_PIGLIN = SoundEventImpl.get("minecraft:block.note_block.imitate.piglin");
SoundEvent ENTITY_OCELOT_HURT = SoundEventImpl.get("minecraft:entity.ocelot.hurt");
SoundEvent ENTITY_OCELOT_AMBIENT = SoundEventImpl.get("minecraft:entity.ocelot.ambient");
@ -2183,6 +2425,30 @@ interface SoundEvents {
SoundEvent BLOCK_SMOKER_SMOKE = SoundEventImpl.get("minecraft:block.smoker.smoke");
SoundEvent ENTITY_SNIFFER_STEP = SoundEventImpl.get("minecraft:entity.sniffer.step");
SoundEvent ENTITY_SNIFFER_EAT = SoundEventImpl.get("minecraft:entity.sniffer.eat");
SoundEvent ENTITY_SNIFFER_IDLE = SoundEventImpl.get("minecraft:entity.sniffer.idle");
SoundEvent ENTITY_SNIFFER_HURT = SoundEventImpl.get("minecraft:entity.sniffer.hurt");
SoundEvent ENTITY_SNIFFER_DEATH = SoundEventImpl.get("minecraft:entity.sniffer.death");
SoundEvent ENTITY_SNIFFER_DROP_SEED = SoundEventImpl.get("minecraft:entity.sniffer.drop_seed");
SoundEvent ENTITY_SNIFFER_SCENTING = SoundEventImpl.get("minecraft:entity.sniffer.scenting");
SoundEvent ENTITY_SNIFFER_SNIFFING = SoundEventImpl.get("minecraft:entity.sniffer.sniffing");
SoundEvent ENTITY_SNIFFER_SEARCHING = SoundEventImpl.get("minecraft:entity.sniffer.searching");
SoundEvent ENTITY_SNIFFER_DIGGING = SoundEventImpl.get("minecraft:entity.sniffer.digging");
SoundEvent ENTITY_SNIFFER_DIGGING_STOP = SoundEventImpl.get("minecraft:entity.sniffer.digging_stop");
SoundEvent ENTITY_SNIFFER_HAPPY = SoundEventImpl.get("minecraft:entity.sniffer.happy");
SoundEvent ENTITY_SNOWBALL_THROW = SoundEventImpl.get("minecraft:entity.snowball.throw");
SoundEvent BLOCK_SNOW_BREAK = SoundEventImpl.get("minecraft:block.snow.break");
@ -2561,22 +2827,22 @@ interface SoundEvents {
SoundEvent BLOCK_WOODEN_TRAPDOOR_OPEN = SoundEventImpl.get("minecraft:block.wooden_trapdoor.open");
SoundEvent BLOCK_WOOD_BREAK = SoundEventImpl.get("minecraft:block.wood.break");
SoundEvent BLOCK_WOODEN_BUTTON_CLICK_OFF = SoundEventImpl.get("minecraft:block.wooden_button.click_off");
SoundEvent BLOCK_WOODEN_BUTTON_CLICK_ON = SoundEventImpl.get("minecraft:block.wooden_button.click_on");
SoundEvent BLOCK_WOODEN_PRESSURE_PLATE_CLICK_OFF = SoundEventImpl.get("minecraft:block.wooden_pressure_plate.click_off");
SoundEvent BLOCK_WOODEN_PRESSURE_PLATE_CLICK_ON = SoundEventImpl.get("minecraft:block.wooden_pressure_plate.click_on");
SoundEvent BLOCK_WOOD_BREAK = SoundEventImpl.get("minecraft:block.wood.break");
SoundEvent BLOCK_WOOD_FALL = SoundEventImpl.get("minecraft:block.wood.fall");
SoundEvent BLOCK_WOOD_HIT = SoundEventImpl.get("minecraft:block.wood.hit");
SoundEvent BLOCK_WOOD_PLACE = SoundEventImpl.get("minecraft:block.wood.place");
SoundEvent BLOCK_WOODEN_PRESSURE_PLATE_CLICK_OFF = SoundEventImpl.get("minecraft:block.wooden_pressure_plate.click_off");
SoundEvent BLOCK_WOODEN_PRESSURE_PLATE_CLICK_ON = SoundEventImpl.get("minecraft:block.wooden_pressure_plate.click_on");
SoundEvent BLOCK_WOOD_STEP = SoundEventImpl.get("minecraft:block.wood.step");
SoundEvent BLOCK_WOOL_BREAK = SoundEventImpl.get("minecraft:block.wool.break");

View File

@ -45,8 +45,8 @@ public final class MinecraftServer {
public static final ComponentLogger LOGGER = ComponentLogger.logger(MinecraftServer.class);
public static final String VERSION_NAME = "1.19.3";
public static final int PROTOCOL_VERSION = 761;
public static final String VERSION_NAME = "1.19.4";
public static final int PROTOCOL_VERSION = 762;
// Threads
public static final String THREAD_NAME_BENCHMARK = "Ms-Benchmark";

View File

@ -1,5 +1,6 @@
package net.minestom.server.command.builder.arguments.minecraft;
import net.minestom.server.command.CommandSender;
import net.minestom.server.command.builder.arguments.Argument;
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
import net.minestom.server.utils.StringUtils;
@ -19,7 +20,7 @@ public class ArgumentResource extends Argument<String> {
}
@Override
public @NotNull String parse(@NotNull String input) throws ArgumentSyntaxException {
public @NotNull String parse(@NotNull CommandSender sender, @NotNull String input) throws ArgumentSyntaxException {
if (input.contains(StringUtils.SPACE))
throw new ArgumentSyntaxException("Resource location cannot contain space character", input, SPACE_ERROR);

View File

@ -1,5 +1,6 @@
package net.minestom.server.command.builder.arguments.minecraft;
import net.minestom.server.command.CommandSender;
import net.minestom.server.command.builder.arguments.Argument;
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
import net.minestom.server.utils.StringUtils;
@ -19,7 +20,7 @@ public class ArgumentResourceOrTag extends Argument<String> {
}
@Override
public @NotNull String parse(@NotNull String input) throws ArgumentSyntaxException {
public @NotNull String parse(@NotNull CommandSender sender, @NotNull String input) throws ArgumentSyntaxException {
if (input.contains(StringUtils.SPACE))
throw new ArgumentSyntaxException("Resource location cannot contain space character", input, SPACE_ERROR);

View File

@ -301,6 +301,7 @@ public class Entity implements Viewable, Tickable, Schedulable, Snapshotable, Ev
this.position = position;
refreshCoordinate(position);
synchronizePosition(true);
setView(position.yaw(), position.pitch());
};
if (chunks != null && chunks.length > 0) {
@ -666,6 +667,8 @@ public class Entity implements Viewable, Tickable, Schedulable, Snapshotable, Ev
}
private void touchTick() {
if (!hasPhysics) return;
// TODO do not call every tick (it is pretty expensive)
final Pos position = this.position;
final BoundingBox boundingBox = this.boundingBox;

View File

@ -10,6 +10,9 @@ import net.minestom.server.entity.metadata.animal.tameable.WolfMeta;
import net.minestom.server.entity.metadata.arrow.ArrowMeta;
import net.minestom.server.entity.metadata.arrow.SpectralArrowMeta;
import net.minestom.server.entity.metadata.arrow.ThrownTridentMeta;
import net.minestom.server.entity.metadata.display.BlockDisplayMeta;
import net.minestom.server.entity.metadata.display.ItemDisplayMeta;
import net.minestom.server.entity.metadata.display.TextDisplayMeta;
import net.minestom.server.entity.metadata.flying.GhastMeta;
import net.minestom.server.entity.metadata.flying.PhantomMeta;
import net.minestom.server.entity.metadata.golem.IronGolemMeta;
@ -83,8 +86,10 @@ record EntityTypeImpl(Registry.EntityEntry registry) implements EntityType {
entry("minecraft:bat", BatMeta::new),
entry("minecraft:bee", BeeMeta::new),
entry("minecraft:blaze", BlazeMeta::new),
entry("minecraft:block_display", BlockDisplayMeta::new),
entry("minecraft:boat", BoatMeta::new),
entry("minecraft:chest_boat", EntityMeta::new), // TODO dedicated metadata
entry("minecraft:camel", CamelMeta::new),
entry("minecraft:cat", CatMeta::new),
entry("minecraft:cave_spider", CaveSpiderMeta::new),
entry("minecraft:chicken", ChickenMeta::new),
@ -118,8 +123,10 @@ record EntityTypeImpl(Registry.EntityEntry registry) implements EntityType {
entry("minecraft:horse", HorseMeta::new),
entry("minecraft:husk", HuskMeta::new),
entry("minecraft:illusioner", IllusionerMeta::new),
entry("minecraft:interaction", InteractionMeta::new),
entry("minecraft:iron_golem", IronGolemMeta::new),
entry("minecraft:item", ItemEntityMeta::new),
entry("minecraft:item_display", ItemDisplayMeta::new),
entry("minecraft:item_frame", ItemFrameMeta::new),
entry("minecraft:fireball", FireballMeta::new),
entry("minecraft:leash_knot", LeashKnotMeta::new),
@ -134,6 +141,7 @@ record EntityTypeImpl(Registry.EntityEntry registry) implements EntityType {
entry("minecraft:furnace_minecart", FurnaceMinecartMeta::new),
entry("minecraft:hopper_minecart", HopperMinecartMeta::new),
entry("minecraft:spawner_minecart", SpawnerMinecartMeta::new),
entry("minecraft:text_display", TextDisplayMeta::new),
entry("minecraft:tnt_minecart", TntMinecartMeta::new),
entry("minecraft:mule", MuleMeta::new),
entry("minecraft:mooshroom", MooshroomMeta::new),
@ -160,6 +168,7 @@ record EntityTypeImpl(Registry.EntityEntry registry) implements EntityType {
entry("minecraft:skeleton_horse", SkeletonHorseMeta::new),
entry("minecraft:slime", SlimeMeta::new),
entry("minecraft:small_fireball", SmallFireballMeta::new),
entry("minecraft:sniffer", SnifferMeta::new),
entry("minecraft:snow_golem", SnowGolemMeta::new),
entry("minecraft:snowball", SnowballMeta::new),
entry("minecraft:spectral_arrow", SpectralArrowMeta::new),

View File

@ -3,6 +3,7 @@ package net.minestom.server.entity;
import net.kyori.adventure.text.Component;
import net.minestom.server.coordinate.Point;
import net.minestom.server.entity.metadata.animal.FrogMeta;
import net.minestom.server.entity.metadata.animal.SnifferMeta;
import net.minestom.server.entity.metadata.animal.tameable.CatMeta;
import net.minestom.server.item.ItemStack;
import net.minestom.server.network.NetworkBuffer;
@ -31,7 +32,7 @@ public final class Metadata {
}
public static Entry<Long> Long(long value) {
return new MetadataImpl.EntryImpl<>(TYPE_LONG, value, NetworkBuffer.LONG);
return new MetadataImpl.EntryImpl<>(TYPE_LONG, value, NetworkBuffer.VAR_LONG);
}
public static Entry<Float> Float(float value) {
@ -78,8 +79,12 @@ public final class Metadata {
return new MetadataImpl.EntryImpl<>(TYPE_OPTUUID, value, NetworkBuffer.OPT_UUID);
}
public static Entry<Integer> OptBlockID(@Nullable Integer value) {
return new MetadataImpl.EntryImpl<>(TYPE_OPTBLOCKID, value, NetworkBuffer.OPT_BLOCK_ID);
public static Entry<Integer> BlockState(@Nullable Integer value) {
return new MetadataImpl.EntryImpl<>(TYPE_BLOCKSTATE, value, NetworkBuffer.BLOCK_STATE);
}
public static Entry<Integer> OptBlockState(@Nullable Integer value) {
return new MetadataImpl.EntryImpl<>(TYPE_OPTBLOCKSTATE, value, NetworkBuffer.OPT_BLOCK_STATE);
}
public static Entry<NBT> NBT(@NotNull NBT nbt) {
@ -109,6 +114,18 @@ public final class Metadata {
return new MetadataImpl.EntryImpl<>(TYPE_FROG_VARIANT, value, NetworkBuffer.FROG_VARIANT);
}
public static Entry<SnifferMeta.State> SnifferState(@NotNull SnifferMeta.State value) {
return new MetadataImpl.EntryImpl<>(TYPE_SNIFFER_STATE, value, NetworkBuffer.SNIFFER_STATE);
}
public static Entry<Point> Vector3(@NotNull Point value) {
return new MetadataImpl.EntryImpl<>(TYPE_VECTOR3, value, NetworkBuffer.VECTOR3);
}
public static Entry<float[]> Quaternion(float @NotNull[] value) {
return new MetadataImpl.EntryImpl<>(TYPE_QUATERNION, value, NetworkBuffer.QUATERNION);
}
public static final byte TYPE_BYTE = 0;
public static final byte TYPE_VARINT = 1;
public static final byte TYPE_LONG = 2;
@ -123,14 +140,20 @@ public final class Metadata {
public static final byte TYPE_OPTPOSITION = 11;
public static final byte TYPE_DIRECTION = 12;
public static final byte TYPE_OPTUUID = 13;
public static final byte TYPE_OPTBLOCKID = 14;
public static final byte TYPE_NBT = 15;
public static final byte TYPE_PARTICLE = 16;
public static final byte TYPE_VILLAGERDATA = 17;
public static final byte TYPE_OPTVARINT = 18;
public static final byte TYPE_POSE = 19;
public static final byte TYPE_CAT_VARIANT = 20;
public static final byte TYPE_FROG_VARIANT = 21;
public static final byte TYPE_BLOCKSTATE = 14;
public static final byte TYPE_OPTBLOCKSTATE = 15;
public static final byte TYPE_NBT = 16;
public static final byte TYPE_PARTICLE = 17;
public static final byte TYPE_VILLAGERDATA = 18;
public static final byte TYPE_OPTVARINT = 19;
public static final byte TYPE_POSE = 20;
public static final byte TYPE_CAT_VARIANT = 21;
public static final byte TYPE_FROG_VARIANT = 22;
public static final byte TYPE_OPTGLOBALPOS = 23;
public static final byte TYPE_PAINTINGVARIANT = 24;
public static final byte TYPE_SNIFFER_STATE = 25;
public static final byte TYPE_VECTOR3 = 26;
public static final byte TYPE_QUATERNION = 27;
private static final VarHandle NOTIFIED_CHANGES;

View File

@ -34,7 +34,7 @@ final class MetadataImpl {
EMPTY_VALUES.set(TYPE_OPTPOSITION, OptPosition(null));
EMPTY_VALUES.set(TYPE_DIRECTION, Direction(Direction.DOWN));
EMPTY_VALUES.set(TYPE_OPTUUID, OptUUID(null));
EMPTY_VALUES.set(TYPE_OPTBLOCKID, OptBlockID(null));
EMPTY_VALUES.set(TYPE_OPTBLOCKSTATE, OptBlockState(null));
EMPTY_VALUES.set(TYPE_NBT, NBT(NBTEnd.INSTANCE));
//EMPTY_VALUES.set(TYPE_PARTICLE -> throw new UnsupportedOperationException();
EMPTY_VALUES.set(TYPE_VILLAGERDATA, VillagerData(0, 0, 0));

View File

@ -61,6 +61,7 @@ import net.minestom.server.network.player.PlayerConnection;
import net.minestom.server.network.player.PlayerSocketConnection;
import net.minestom.server.recipe.Recipe;
import net.minestom.server.recipe.RecipeManager;
import net.minestom.server.registry.Registry;
import net.minestom.server.resourcepack.ResourcePack;
import net.minestom.server.scoreboard.BelowNameTag;
import net.minestom.server.scoreboard.Team;
@ -89,7 +90,7 @@ import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jglrxavpok.hephaistos.nbt.NBT;
import org.jglrxavpok.hephaistos.nbt.NBTCompound;
import org.jglrxavpok.hephaistos.nbt.NBTType;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
@ -248,13 +249,37 @@ public class Player extends LivingEntity implements CommandSender, Localizable,
public CompletableFuture<Void> UNSAFE_init(@NotNull Instance spawnInstance) {
this.dimensionType = spawnInstance.getDimensionType();
NBTCompound nbt = NBT.Compound(Map.of(
"minecraft:chat_type", Messenger.chatRegistry(),
"minecraft:dimension_type", MinecraftServer.getDimensionTypeManager().toNBT(),
"minecraft:worldgen/biome", MinecraftServer.getBiomeManager().toNBT()));
var registry = new HashMap<String, NBT>();
registry.put("minecraft:chat_type", Messenger.chatRegistry());
registry.put("minecraft:dimension_type", MinecraftServer.getDimensionTypeManager().toNBT());
registry.put("minecraft:worldgen/biome", MinecraftServer.getBiomeManager().toNBT());
var damageTypeData = Registry.load(Registry.Resource.DAMAGE_TYPES);
var damageTypes = new ArrayList<NBT>();
int i = 0;
for (var entry : damageTypeData.entrySet()) {
var elem = new HashMap<String, NBT>();
for (var e : entry.getValue().entrySet()) {
if (e.getValue() instanceof String s) {
elem.put(e.getKey(), NBT.String(s));
} else if (e.getValue() instanceof Double f) {
elem.put(e.getKey(), NBT.Float(f.floatValue()));
} else if (e.getValue() instanceof Integer integer) {
elem.put(e.getKey(), NBT.Int(integer));
}
}
damageTypes.add(NBT.Compound(Map.of(
"id", NBT.Int(i++),
"name", NBT.String(entry.getKey()),
"element", NBT.Compound(elem)
)));
}
registry.put("minecraft:damage_type", NBT.Compound(Map.of(
"type", NBT.String("minecraft:damage_type"),
"value", NBT.List(NBTType.TAG_Compound, damageTypes)
)));
final JoinGamePacket joinGamePacket = new JoinGamePacket(getEntityId(), false, gameMode, null,
List.of(dimensionType.getName().asString()), nbt, dimensionType.toString(), dimensionType.getName().asString(),
List.of(dimensionType.getName().asString()), NBT.Compound(registry), dimensionType.toString(), dimensionType.getName().asString(),
0, 0, MinecraftServer.getChunkViewDistance(), MinecraftServer.getChunkViewDistance(),
false, true, false, levelFlat, deathLocation);
sendPacket(joinGamePacket);
@ -1560,7 +1585,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable,
@ApiStatus.Internal
protected void synchronizePosition(boolean includeSelf) {
if (includeSelf) {
sendPacket(new PlayerPositionAndLookPacket(position, (byte) 0x00, getNextTeleportId(), false));
sendPacket(new PlayerPositionAndLookPacket(position, (byte) 0x00, getNextTeleportId()));
}
super.synchronizePosition(includeSelf);
}

View File

@ -4,11 +4,9 @@ import net.minestom.server.entity.Entity;
import net.minestom.server.entity.Metadata;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
public class AbstractHorseMeta extends AnimalMeta {
public static final byte OFFSET = AnimalMeta.MAX_OFFSET;
public static final byte MAX_OFFSET = OFFSET + 2;
public static final byte MAX_OFFSET = OFFSET + 1;
private final static byte TAMED_BIT = 0x02;
private final static byte SADDLED_BIT = 0x04;
@ -69,12 +67,4 @@ public class AbstractHorseMeta extends AnimalMeta {
setMaskBit(OFFSET, MOUTH_OPEN_BIT, value);
}
public UUID getOwner() {
return super.metadata.getIndex(OFFSET + 1, null);
}
public void setOwner(UUID value) {
super.metadata.setIndex(OFFSET + 1, Metadata.OptUUID(value));
}
}

View File

@ -0,0 +1,30 @@
package net.minestom.server.entity.metadata.animal;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.Metadata;
import org.jetbrains.annotations.NotNull;
public class CamelMeta extends AbstractHorseMeta {
public static final byte OFFSET = AbstractHorseMeta.MAX_OFFSET;
public static final byte MAX_OFFSET = OFFSET + 1;
public CamelMeta(@NotNull Entity entity, @NotNull Metadata metadata) {
super(entity, metadata);
}
public boolean isDashing() {
return super.metadata.getIndex(OFFSET, false);
}
public void setDashing(boolean value) {
super.metadata.setIndex(OFFSET, Metadata.Boolean(value));
}
public long getLastPoseChangeTick() {
return super.metadata.getIndex(OFFSET + 1, 0L);
}
public void setLastPoseChangeTick(long value) {
super.metadata.setIndex(OFFSET + 1, Metadata.Long(value));
}
}

View File

@ -0,0 +1,43 @@
package net.minestom.server.entity.metadata.animal;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.Metadata;
import org.jetbrains.annotations.NotNull;
public class SnifferMeta extends AnimalMeta {
public static final byte OFFSET = AnimalMeta.MAX_OFFSET;
public static final byte MAX_OFFSET = OFFSET + 2;
public SnifferMeta(@NotNull Entity entity, @NotNull Metadata metadata) {
super(entity, metadata);
}
public @NotNull State getState() {
return super.metadata.getIndex(OFFSET, State.IDLING);
}
public void setState(@NotNull State value) {
super.metadata.setIndex(OFFSET, Metadata.SnifferState(value));
}
public int getDropSeedAtTick() {
return super.metadata.getIndex(OFFSET + 1, 0);
}
public void setDropSeedAtTick(int value) {
super.metadata.setIndex(OFFSET + 1, Metadata.VarInt(value));
}
public enum State {
IDLING,
FEELING_HAPPY,
SCENTING,
SNIFFING,
SEARCHING,
DIGGING,
RISING;
private static final State[] VALUES = values();
}
}

View File

@ -0,0 +1,142 @@
package net.minestom.server.entity.metadata.display;
import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Vec;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.Metadata;
import net.minestom.server.entity.metadata.EntityMeta;
import org.jetbrains.annotations.NotNull;
public class AbstractDisplayMeta extends EntityMeta {
public static final byte OFFSET = EntityMeta.MAX_OFFSET;
public static final byte MAX_OFFSET = OFFSET + 14;
protected AbstractDisplayMeta(@NotNull Entity entity, @NotNull Metadata metadata) {
super(entity, metadata);
}
public long getInterpolationStartDelta() {
return super.metadata.getIndex(OFFSET, 0);
}
public void setInterpolationStartDelta(int value) {
super.metadata.setIndex(OFFSET, Metadata.VarInt(value));
}
public int getInterpolationDuration() {
return super.metadata.getIndex(OFFSET + 1, 0);
}
public void setInterpolationDuration(int value) {
super.metadata.setIndex(OFFSET + 1, Metadata.VarInt(value));
}
public @NotNull Point getTranslation() {
return super.metadata.getIndex(OFFSET + 2, Vec.ZERO);
}
public void setTranslation(@NotNull Point value) {
super.metadata.setIndex(OFFSET + 2, Metadata.Vector3(value));
}
public @NotNull Vec getScale() {
return super.metadata.getIndex(OFFSET + 3, Vec.ONE);
}
public void setScale(@NotNull Vec value) {
super.metadata.setIndex(OFFSET + 3, Metadata.Vector3(value));
}
public float @NotNull[] getLeftRotation() {
//todo replace with actual quaternion type
return super.metadata.getIndex(OFFSET + 4, new float[] {0, 0, 0, 1});
}
public void setLeftRotation(float @NotNull[] value) {
super.metadata.setIndex(OFFSET + 4, Metadata.Quaternion(value));
}
public float @NotNull[] getRightRotation() {
//todo replace with actual quaternion type
return super.metadata.getIndex(OFFSET + 5, new float[] {0, 0, 0, 1});
}
public void setRightRotation(float @NotNull[] value) {
super.metadata.setIndex(OFFSET + 5, Metadata.Quaternion(value));
}
public @NotNull BillboardConstraints getBillboardRenderConstraints() {
return BillboardConstraints.VALUES[super.metadata.getIndex(OFFSET + 6, (byte) 0)];
}
public void setBillboardRenderConstraints(@NotNull BillboardConstraints value) {
super.metadata.setIndex(OFFSET + 6, Metadata.Byte((byte) value.ordinal()));
}
public int getBrightnessOverride() {
return super.metadata.getIndex(OFFSET + 7, -1);
}
public void setBrightnessOverride(int value) {
super.metadata.setIndex(OFFSET + 7, Metadata.VarInt(value));
}
public float getViewRange() {
return super.metadata.getIndex(OFFSET + 8, 1.0F);
}
public void setViewRange(float value) {
super.metadata.setIndex(OFFSET + 8, Metadata.Float(value));
}
public float getShadowRadius() {
return super.metadata.getIndex(OFFSET + 9, 0.0F);
}
public void setShadowRadius(float value) {
super.metadata.setIndex(OFFSET + 9, Metadata.Float(value));
}
public float getShadowStrength() {
return super.metadata.getIndex(OFFSET + 10, 1.0F);
}
public void setShadowStrength(float value) {
super.metadata.setIndex(OFFSET + 10, Metadata.Float(value));
}
public float getWidth() {
return super.metadata.getIndex(OFFSET + 11, 0.0F);
}
public void setWidth(float value) {
super.metadata.setIndex(OFFSET + 11, Metadata.Float(value));
}
public float getHeight() {
return super.metadata.getIndex(OFFSET + 12, 0.0F);
}
public void setHeight(float value) {
super.metadata.setIndex(OFFSET + 12, Metadata.Float(value));
}
public int getGlowColorOverride() {
return super.metadata.getIndex(OFFSET + 13, 0);
}
public void setGlowColorOverride(int value) {
super.metadata.setIndex(OFFSET + 13, Metadata.VarInt(value));
}
public enum BillboardConstraints {
FIXED,
VERTICAL,
HORIZONTAL,
CENTER;
private final static BillboardConstraints[] VALUES = values();
}
}

View File

@ -0,0 +1,23 @@
package net.minestom.server.entity.metadata.display;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.Metadata;
import net.minestom.server.instance.block.Block;
import org.jetbrains.annotations.NotNull;
public class BlockDisplayMeta extends AbstractDisplayMeta {
public static final byte OFFSET = AbstractDisplayMeta.MAX_OFFSET;
public static final byte MAX_OFFSET = OFFSET + 1;
public BlockDisplayMeta(@NotNull Entity entity, @NotNull Metadata metadata) {
super(entity, metadata);
}
public int getBlockStateId() {
return super.metadata.getIndex(OFFSET, Block.AIR.stateId());
}
public void setBlockState(int value) {
super.metadata.setIndex(OFFSET, Metadata.BlockState(value));
}
}

View File

@ -0,0 +1,46 @@
package net.minestom.server.entity.metadata.display;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.Metadata;
import net.minestom.server.item.ItemStack;
import org.jetbrains.annotations.NotNull;
public class ItemDisplayMeta extends AbstractDisplayMeta {
public static final byte OFFSET = AbstractDisplayMeta.MAX_OFFSET;
public static final byte MAX_OFFSET = OFFSET + 2;
public ItemDisplayMeta(@NotNull Entity entity, @NotNull Metadata metadata) {
super(entity, metadata);
}
public @NotNull ItemStack getItemStack() {
return super.metadata.getIndex(OFFSET, ItemStack.AIR);
}
public void setItemStack(@NotNull ItemStack value) {
super.metadata.setIndex(OFFSET, Metadata.Slot(value));
}
public @NotNull DisplayContext getDisplayContext() {
return DisplayContext.VALUES[super.metadata.getIndex(OFFSET + 1, (byte) 0)];
}
public void setDisplayContext(@NotNull DisplayContext value) {
super.metadata.setIndex(OFFSET + 1, Metadata.Byte((byte) value.ordinal()));
}
public enum DisplayContext {
NONE,
THIRD_PERSON_LEFT_HAND,
THIRD_PERSON_RIGHT_HAND,
FIRST_PERSON_LEFT_HAND,
FIRST_PERSON_RIGHT_HAND,
HEAD,
GUI,
GROUND,
FIXED;
private final static DisplayContext[] VALUES = values();
}
}

View File

@ -0,0 +1,93 @@
package net.minestom.server.entity.metadata.display;
import net.kyori.adventure.text.Component;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.Metadata;
import org.jetbrains.annotations.NotNull;
public class TextDisplayMeta extends AbstractDisplayMeta {
public static final byte OFFSET = AbstractDisplayMeta.MAX_OFFSET;
public static final byte MAX_OFFSET = OFFSET + 5;
private static final byte SHADOW = 1;
private static final byte SEE_THROUGH = 2;
private static final byte USE_DEFAULT_BACKGROUND = 4;
private static final byte ALIGN_LEFT = 8;
private static final byte ALIGN_RIGHT = 16;
public TextDisplayMeta(@NotNull Entity entity, @NotNull Metadata metadata) {
super(entity, metadata);
}
public @NotNull Component getText() {
return super.metadata.getIndex(OFFSET, Component.empty());
}
public void setText(@NotNull Component value) {
super.metadata.setIndex(OFFSET, Metadata.Chat(value));
}
public int getLineWidth() {
return super.metadata.getIndex(OFFSET + 1, 200);
}
public void setLineWidth(int value) {
super.metadata.setIndex(OFFSET + 1, Metadata.VarInt(value));
}
public int getBackgroundColor() {
return super.metadata.getIndex(OFFSET + 2, 1073741824);
}
public void setBackgroundColor(int value) {
super.metadata.setIndex(OFFSET + 2, Metadata.VarInt(value));
}
public int getTextOpacity() {
return super.metadata.getIndex(OFFSET + 3, -1);
}
public void setTextOpacity(int value) {
super.metadata.setIndex(OFFSET + 3, Metadata.VarInt(value));
}
public boolean isShadow() {
return getMaskBit(OFFSET + 4, SHADOW);
}
public void setShadow(boolean value) {
setMaskBit(OFFSET + 4, SHADOW, value);
}
public boolean isSeeThrough() {
return getMaskBit(OFFSET + 4, SEE_THROUGH);
}
public void setSeeThrough(boolean value) {
setMaskBit(OFFSET + 4, SEE_THROUGH, value);
}
public boolean isUseDefaultBackground() {
return getMaskBit(OFFSET + 4, USE_DEFAULT_BACKGROUND);
}
public void setUseDefaultBackground(boolean value) {
setMaskBit(OFFSET + 4, USE_DEFAULT_BACKGROUND, value);
}
public boolean isAlignLeft() {
return getMaskBit(OFFSET + 4, ALIGN_LEFT);
}
public void setAlignLeft(boolean value) {
setMaskBit(OFFSET + 4, ALIGN_LEFT, value);
}
public boolean isAlignRight() {
return getMaskBit(OFFSET + 4, ALIGN_RIGHT);
}
public void setAlignRight(boolean value) {
setMaskBit(OFFSET + 4, ALIGN_RIGHT, value);
}
}

View File

@ -18,7 +18,7 @@ public class EndermanMeta extends MonsterMeta {
}
public void setCarriedBlockID(@Nullable Integer value) {
super.metadata.setIndex(OFFSET, Metadata.OptBlockID(value));
super.metadata.setIndex(OFFSET, Metadata.OptBlockState(value));
}
public boolean isScreaming() {

View File

@ -0,0 +1,41 @@
package net.minestom.server.entity.metadata.other;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.Metadata;
import net.minestom.server.entity.metadata.EntityMeta;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class InteractionMeta extends EntityMeta {
public static final byte OFFSET = EntityMeta.MAX_OFFSET;
public static final byte MAX_OFFSET = OFFSET + 3;
public InteractionMeta(@Nullable Entity entity, @NotNull Metadata metadata) {
super(entity, metadata);
}
public float getWidth() {
return super.metadata.getIndex(OFFSET, 0f);
}
public void setWidth(float value) {
super.metadata.setIndex(OFFSET, Metadata.Float(value));
}
public float getHeight() {
return super.metadata.getIndex(OFFSET + 1, 0f);
}
public void setHeight(float value) {
super.metadata.setIndex(OFFSET + 1, Metadata.Float(value));
}
public boolean getResponse() {
return super.metadata.getIndex(OFFSET + 2, false);
}
public void setResponse(boolean response) {
super.metadata.setIndex(OFFSET + 2, Metadata.Boolean(response));
}
}

View File

@ -61,7 +61,7 @@ public class PlayerPositionListener {
}
if (playerMoveEvent.isCancelled()) {
// Teleport to previous position
player.sendPacket(new PlayerPositionAndLookPacket(currentPosition, (byte) 0x00, player.getNextTeleportId(), false));
player.sendPacket(new PlayerPositionAndLookPacket(currentPosition, (byte) 0x00, player.getNextTeleportId()));
return;
}
final Pos eventPosition = playerMoveEvent.getNewPosition();

View File

@ -12,6 +12,7 @@ import net.kyori.adventure.text.Component;
import net.minestom.server.coordinate.Point;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.metadata.animal.FrogMeta;
import net.minestom.server.entity.metadata.animal.SnifferMeta;
import net.minestom.server.entity.metadata.animal.tameable.CatMeta;
import net.minestom.server.item.ItemStack;
import net.minestom.server.network.packet.server.play.data.DeathLocation;
@ -61,13 +62,17 @@ public final class NetworkBuffer {
public static final Type<Point> OPT_BLOCK_POSITION = NetworkBufferTypes.OPT_BLOCK_POSITION;
public static final Type<Direction> DIRECTION = NetworkBufferTypes.DIRECTION;
public static final Type<UUID> OPT_UUID = NetworkBufferTypes.OPT_UUID;
public static final Type<Integer> OPT_BLOCK_ID = NetworkBufferTypes.OPT_BLOCK_ID;
public static final Type<Integer> BLOCK_STATE = NetworkBufferTypes.BLOCK_STATE;
public static final Type<Integer> OPT_BLOCK_STATE = NetworkBufferTypes.OPT_BLOCK_STATE;
public static final Type<int[]> VILLAGER_DATA = NetworkBufferTypes.VILLAGER_DATA;
public static final Type<Integer> OPT_VAR_INT = NetworkBufferTypes.OPT_VAR_INT;
public static final Type<Entity.Pose> POSE = NetworkBufferTypes.POSE;
public static final Type<DeathLocation> DEATH_LOCATION = NetworkBufferTypes.DEATH_LOCATION;
public static final Type<CatMeta.Variant> CAT_VARIANT = NetworkBufferTypes.CAT_VARIANT;
public static final Type<FrogMeta.Variant> FROG_VARIANT = NetworkBufferTypes.FROG_VARIANT;
public static final Type<SnifferMeta.State> SNIFFER_STATE = NetworkBufferTypes.SNIFFER_STATE;
public static final Type<Point> VECTOR3 = NetworkBufferTypes.VECTOR3;
public static final Type<float[]> QUATERNION = NetworkBufferTypes.QUATERNION;
ByteBuffer nioBuffer;
final boolean resizable;

View File

@ -6,6 +6,7 @@ import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Vec;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.metadata.animal.FrogMeta;
import net.minestom.server.entity.metadata.animal.SnifferMeta;
import net.minestom.server.entity.metadata.animal.tameable.CatMeta;
import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material;
@ -459,7 +460,13 @@ final class NetworkBufferTypes {
if (!present) return null;
return buffer.read(UUID);
});
static final TypeImpl<Integer> OPT_BLOCK_ID = new TypeImpl<>(Integer.class,
static final TypeImpl<Integer> BLOCK_STATE = new TypeImpl<>(Integer.class,
(buffer, value) -> {
buffer.write(NetworkBuffer.VAR_INT, value);
return -1;
},
buffer -> buffer.read(VAR_INT));
static final TypeImpl<Integer> OPT_BLOCK_STATE = new TypeImpl<>(Integer.class,
(buffer, value) -> {
if (value == null) {
buffer.write(NetworkBuffer.VAR_INT, 0);
@ -543,6 +550,43 @@ final class NetworkBufferTypes {
final int ordinal = buffer.read(VAR_INT);
return FrogMeta.Variant.values()[ordinal];
});
static final TypeImpl<SnifferMeta.State> SNIFFER_STATE = new TypeImpl<>(SnifferMeta.State.class,
(buffer, value) -> {
buffer.write(VAR_INT, value.ordinal());
return -1;
},
buffer -> {
final int ordinal = buffer.read(VAR_INT);
return SnifferMeta.State.values()[ordinal];
});
static final TypeImpl<Point> VECTOR3 = new TypeImpl<>(Point.class,
(buffer, value) -> {
buffer.write(FLOAT, (float) value.x());
buffer.write(FLOAT, (float) value.y());
buffer.write(FLOAT, (float) value.z());
return -1;
},
buffer -> {
final float x = buffer.read(FLOAT);
final float y = buffer.read(FLOAT);
final float z = buffer.read(FLOAT);
return new Vec(x, y, z);
});
static final TypeImpl<float[]> QUATERNION = new TypeImpl<>(float[].class,
(buffer, value) -> {
buffer.write(FLOAT, value[0]);
buffer.write(FLOAT, value[1]);
buffer.write(FLOAT, value[2]);
buffer.write(FLOAT, value[3]);
return -1;
},
buffer -> {
final float x = buffer.read(FLOAT);
final float y = buffer.read(FLOAT);
final float z = buffer.read(FLOAT);
final float w = buffer.read(FLOAT);
return new float[]{x, y, z, w};
});
record TypeImpl<T>(@NotNull Class<T> type,
@NotNull TypeWriter<T> writer,

View File

@ -51,58 +51,64 @@ public sealed class ClientPacketsHandler permits ClientPacketsHandler.Status, Cl
}
public static final class Play extends ClientPacketsHandler {
private static int nextId = 0;
private static int nextPlayId() {
return nextId++;
}
public Play() {
register(0x00, ClientTeleportConfirmPacket::new);
register(0x01, ClientQueryBlockNbtPacket::new);
// 0x02 difficulty packet
register(0x03, ClientChatAckPacket::new);
register(0x04, ClientCommandChatPacket::new);
register(0x05, ClientChatMessagePacket::new);
register(0x06, ClientStatusPacket::new);
register(0x07, ClientSettingsPacket::new);
register(0x08, ClientTabCompletePacket::new);
register(0x09, ClientClickWindowButtonPacket::new);
register(0x0A, ClientClickWindowPacket::new);
register(0x0B, ClientCloseWindowPacket::new);
register(0x0C, ClientPluginMessagePacket::new);
register(0x0D, ClientEditBookPacket::new);
register(0x0E, ClientQueryEntityNbtPacket::new);
register(0x0F, ClientInteractEntityPacket::new);
register(0x10, ClientGenerateStructurePacket::new);
register(0x11, ClientKeepAlivePacket::new);
// 0x12 packet not used server-side
register(0x13, ClientPlayerPositionPacket::new);
register(0x14, ClientPlayerPositionAndRotationPacket::new);
register(0x15, ClientPlayerRotationPacket::new);
register(0x16, ClientPlayerPacket::new);
register(0x17, ClientVehicleMovePacket::new);
register(0x18, ClientSteerBoatPacket::new);
register(0x19, ClientPickItemPacket::new);
register(0x1A, ClientCraftRecipeRequest::new);
register(0x1B, ClientPlayerAbilitiesPacket::new);
register(0x1C, ClientPlayerDiggingPacket::new);
register(0x1D, ClientEntityActionPacket::new);
register(0x1E, ClientSteerVehiclePacket::new);
register(0x1F, ClientPongPacket::new);
register(0x20, ClientChatSessionUpdatePacket::new);
register(0x21, ClientSetRecipeBookStatePacket::new);
register(0x22, ClientSetDisplayedRecipePacket::new);
register(0x23, ClientNameItemPacket::new);
register(0x24, ClientResourcePackStatusPacket::new);
register(0x25, ClientAdvancementTabPacket::new);
register(0x26, ClientSelectTradePacket::new);
register(0x27, ClientSetBeaconEffectPacket::new);
register(0x28, ClientHeldItemChangePacket::new);
register(0x29, ClientUpdateCommandBlockPacket::new);
register(0x2A, ClientUpdateCommandBlockMinecartPacket::new);
register(0x2B, ClientCreativeInventoryActionPacket::new);
// 0x2B Update Jigsaw Block
register(0x2D, ClientUpdateStructureBlockPacket::new);
register(0x2E, ClientUpdateSignPacket::new);
register(0x2F, ClientAnimationPacket::new);
register(0x30, ClientSpectatePacket::new);
register(0x31, ClientPlayerBlockPlacementPacket::new);
register(0x32, ClientUseItemPacket::new);
register(nextPlayId(), ClientTeleportConfirmPacket::new);
register(nextPlayId(), ClientQueryBlockNbtPacket::new);
nextPlayId(); // difficulty packet
register(nextPlayId(), ClientChatAckPacket::new);
register(nextPlayId(), ClientCommandChatPacket::new);
register(nextPlayId(), ClientChatMessagePacket::new);
register(nextPlayId(), ClientChatSessionUpdatePacket::new);
register(nextPlayId(), ClientStatusPacket::new);
register(nextPlayId(), ClientSettingsPacket::new);
register(nextPlayId(), ClientTabCompletePacket::new);
register(nextPlayId(), ClientClickWindowButtonPacket::new);
register(nextPlayId(), ClientClickWindowPacket::new);
register(nextPlayId(), ClientCloseWindowPacket::new);
register(nextPlayId(), ClientPluginMessagePacket::new);
register(nextPlayId(), ClientEditBookPacket::new);
register(nextPlayId(), ClientQueryEntityNbtPacket::new);
register(nextPlayId(), ClientInteractEntityPacket::new);
register(nextPlayId(), ClientGenerateStructurePacket::new);
register(nextPlayId(), ClientKeepAlivePacket::new);
nextPlayId(); // lock difficulty
register(nextPlayId(), ClientPlayerPositionPacket::new);
register(nextPlayId(), ClientPlayerPositionAndRotationPacket::new);
register(nextPlayId(), ClientPlayerRotationPacket::new);
register(nextPlayId(), ClientPlayerPacket::new);
register(nextPlayId(), ClientVehicleMovePacket::new);
register(nextPlayId(), ClientSteerBoatPacket::new);
register(nextPlayId(), ClientPickItemPacket::new);
register(nextPlayId(), ClientCraftRecipeRequest::new);
register(nextPlayId(), ClientPlayerAbilitiesPacket::new);
register(nextPlayId(), ClientPlayerDiggingPacket::new);
register(nextPlayId(), ClientEntityActionPacket::new);
register(nextPlayId(), ClientSteerVehiclePacket::new);
register(nextPlayId(), ClientPongPacket::new);
register(nextPlayId(), ClientSetRecipeBookStatePacket::new);
register(nextPlayId(), ClientSetDisplayedRecipePacket::new);
register(nextPlayId(), ClientNameItemPacket::new);
register(nextPlayId(), ClientResourcePackStatusPacket::new);
register(nextPlayId(), ClientAdvancementTabPacket::new);
register(nextPlayId(), ClientSelectTradePacket::new);
register(nextPlayId(), ClientSetBeaconEffectPacket::new);
register(nextPlayId(), ClientHeldItemChangePacket::new);
register(nextPlayId(), ClientUpdateCommandBlockPacket::new);
register(nextPlayId(), ClientUpdateCommandBlockMinecartPacket::new);
register(nextPlayId(), ClientCreativeInventoryActionPacket::new);
nextPlayId(); // Update Jigsaw Block
register(nextPlayId(), ClientUpdateStructureBlockPacket::new);
register(nextPlayId(), ClientUpdateSignPacket::new);
register(nextPlayId(), ClientAnimationPacket::new);
register(nextPlayId(), ClientSpectatePacket::new);
register(nextPlayId(), ClientPlayerBlockPlacementPacket::new);
register(nextPlayId(), ClientUseItemPacket::new);
}
}
}

View File

@ -11,6 +11,7 @@ public final class ServerPacketIdentifier {
public static final int LOGIN_SET_COMPRESSION = 0x03;
public static final int LOGIN_PLUGIN_REQUEST = 0x04;
public static final int BUNDLE = nextPlayId();
public static final int SPAWN_ENTITY = nextPlayId();
public static final int SPAWN_EXPERIENCE_ORB = nextPlayId();
public static final int SPAWN_PLAYER = nextPlayId();
@ -23,6 +24,7 @@ public final class ServerPacketIdentifier {
public static final int BLOCK_CHANGE = nextPlayId();
public static final int BOSS_BAR = nextPlayId();
public static final int SERVER_DIFFICULTY = nextPlayId();
public static final int CHUNK_BIOMES = nextPlayId();
public static final int CLEAR_TITLES = nextPlayId();
public static final int TAB_COMPLETE = nextPlayId();
public static final int DECLARE_COMMANDS = nextPlayId();
@ -33,6 +35,7 @@ public final class ServerPacketIdentifier {
public static final int SET_COOLDOWN = nextPlayId();
public static final int CUSTOM_CHAT_COMPLETIONS = nextPlayId();
public static final int PLUGIN_MESSAGE = nextPlayId();
public static final int DAMAGE_EVENT = nextPlayId();
public static final int DELETE_CHAT_MESSAGE = nextPlayId();
public static final int DISCONNECT = nextPlayId();
public static final int DISGUISED_CHAT = nextPlayId();
@ -41,6 +44,7 @@ public final class ServerPacketIdentifier {
public static final int UNLOAD_CHUNK = nextPlayId();
public static final int CHANGE_GAME_STATE = nextPlayId();
public static final int OPEN_HORSE_WINDOW = nextPlayId();
public static final int HIT_ANIMATION = nextPlayId();
public static final int INITIALIZE_WORLD_BORDER = nextPlayId();
public static final int KEEP_ALIVE = nextPlayId();
public static final int CHUNK_DATA = nextPlayId();

View File

@ -0,0 +1,42 @@
package net.minestom.server.network.packet.server.play;
import net.minestom.server.coordinate.Vec;
import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static net.minestom.server.network.NetworkBuffer.*;
// Notes
// sourceEntityId - 0 indicates no source entity, otherwise it is entityId + 1
// sourceDirectId - 0 indicates no direct source. Direct attacks (e.g. melee) will have this number me the same as sourceEntityId, indirect attacks (e.g. projectiles) will have this be be the projectile entity id + 1
public record DamageEventPacket(int targetEntityId, int damageTypeId, int sourceEntityId, int sourceDirectId, @Nullable Vec sourcePos) implements ServerPacket {
public DamageEventPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT), reader.read(VAR_INT), reader.read(VAR_INT), reader.read(VAR_INT),
reader.read(BOOLEAN) ? new Vec(reader.read(DOUBLE), reader.read(DOUBLE), reader.read(DOUBLE)) : null
);
}
@Override
public int getId() {
return ServerPacketIdentifier.DAMAGE_EVENT;
}
@Override
public void write(@NotNull NetworkBuffer writer) {
writer.write(VAR_INT, targetEntityId);
writer.write(VAR_INT, targetEntityId);
writer.write(VAR_INT, targetEntityId);
writer.write(VAR_INT, targetEntityId);
if (sourcePos != null) {
writer.write(BOOLEAN, true);
writer.write(DOUBLE, sourcePos.x());
writer.write(DOUBLE, sourcePos.y());
writer.write(DOUBLE, sourcePos.z());
} else {
writer.write(BOOLEAN, false);
}
}
}

View File

@ -2,7 +2,6 @@ package net.minestom.server.network.packet.server.play;
import net.kyori.adventure.sound.Sound;
import net.minestom.server.adventure.AdventurePacketConvertor;
import net.minestom.server.coordinate.Point;
import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;

View File

@ -0,0 +1,27 @@
package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.FLOAT;
import static net.minestom.server.network.NetworkBuffer.VAR_INT;
public record HitAnimationPacket(int entityId, float yaw) implements ServerPacket {
public HitAnimationPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT), reader.read(FLOAT));
}
@Override
public void write(@NotNull NetworkBuffer writer) {
writer.write(VAR_INT, entityId);
writer.write(FLOAT, yaw);
}
@Override
public int getId() {
return ServerPacketIdentifier.HIT_ANIMATION;
}
}

View File

@ -8,11 +8,10 @@ import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.*;
public record PlayerPositionAndLookPacket(Pos position, byte flags, int teleportId,
boolean dismountVehicle) implements ServerPacket {
public record PlayerPositionAndLookPacket(Pos position, byte flags, int teleportId) implements ServerPacket {
public PlayerPositionAndLookPacket(@NotNull NetworkBuffer reader) {
this(new Pos(reader.read(DOUBLE), reader.read(DOUBLE), reader.read(DOUBLE), reader.read(FLOAT), reader.read(FLOAT)),
reader.read(BYTE), reader.read(VAR_INT), reader.read(BOOLEAN));
reader.read(BYTE), reader.read(VAR_INT));
}
@Override
@ -26,7 +25,6 @@ public record PlayerPositionAndLookPacket(Pos position, byte flags, int teleport
writer.write(BYTE, flags);
writer.write(VAR_INT, teleportId);
writer.write(BOOLEAN, dismountVehicle);
}
@Override

View File

@ -9,17 +9,17 @@ import org.jetbrains.annotations.Nullable;
import static net.minestom.server.network.NetworkBuffer.*;
public record ServerDataPacket(@Nullable Component motd, @Nullable String iconBase64,
public record ServerDataPacket(@Nullable Component motd, byte @Nullable [] iconBase64,
boolean enforcesSecureChat) implements ServerPacket {
public ServerDataPacket(@NotNull NetworkBuffer reader) {
this(reader.readOptional(COMPONENT), reader.readOptional(STRING),
this(reader.read(COMPONENT), reader.readOptional(BYTE_ARRAY),
reader.read(BOOLEAN));
}
@Override
public void write(@NotNull NetworkBuffer writer) {
writer.writeOptional(COMPONENT, this.motd);
writer.writeOptional(STRING, this.iconBase64);
writer.write(COMPONENT, this.motd);
writer.writeOptional(BYTE_ARRAY, this.iconBase64);
writer.write(BOOLEAN, enforcesSecureChat);
}

View File

@ -142,6 +142,7 @@ public final class Registry {
POTION_EFFECTS("potion_effects.json"),
POTION_TYPES("potions.json"),
PARTICLES("particles.json"),
DAMAGE_TYPES("damage_types.json"),
BLOCK_TAGS("tags/block_tags.json"),
ENTITY_TYPE_TAGS("tags/entity_type_tags.json"),

View File

@ -72,6 +72,7 @@ public final class Biome {
element.setFloat("scale", scale);
element.setFloat("downfall", downfall);
element.setString("category", category.name().toLowerCase(Locale.ROOT));
element.setByte("has_precipitation", (byte) 1); //todo bad fix
element.setString("precipitation", precipitation.name().toLowerCase(Locale.ROOT));
if (temperatureModifier != TemperatureModifier.NONE)
element.setString("temperature_modifier", temperatureModifier.name().toLowerCase(Locale.ROOT));

View File

@ -7,11 +7,15 @@ import java.util.concurrent.atomic.AtomicReference;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
public class ServerProcessTest {
@Test
public void init() {
// These like to fail on github actions
assumeTrue(System.getenv("GITHUB_ACTIONS") == null);
AtomicReference<ServerProcess> process = new AtomicReference<>();
assertDoesNotThrow(() -> process.set(MinecraftServer.updateProcess()));
assertDoesNotThrow(() -> process.get().start(new InetSocketAddress("localhost", 25565)));
@ -21,6 +25,9 @@ public class ServerProcessTest {
@Test
public void tick() {
// These like to fail on github actions
assumeTrue(System.getenv("GITHUB_ACTIONS") == null);
var process = MinecraftServer.updateProcess();
process.start(new InetSocketAddress("localhost", 25565));
var ticker = process.ticker();