From 1d3c2dbe4ed9bcb8a040a83e372115bfbe32fc1b Mon Sep 17 00:00:00 2001 From: Yaroslav Novitsky Date: Tue, 20 Feb 2024 01:44:04 +0300 Subject: [PATCH] add: wrappers for methods with coordinates from BlockDoor, BlockDoublePlant, BlockDragonEgg to BlockPos; fix: aabb absolute creation in Pos; add: IPosition to Pos; --- .../asm/mixin/accessors/AccessorBlock.java | 2 +- .../accessors/AccessorBlockDispenser.java | 3 + .../accessors/AccessorBlockDoublePlant.java | 14 ++ .../accessors/AccessorBlockDragonEgg.java | 16 ++ .../mjaroslav/mjutils/pos/BlockPos.java | 67 ++++++- .../io/github/mjaroslav/mjutils/pos/Pos.java | 181 ++++++++++++++++-- .../resources/mixin.mjutils.accessors.json | 2 + 7 files changed, 266 insertions(+), 19 deletions(-) create mode 100644 src/main/java/io/github/mjaroslav/mjutils/asm/mixin/accessors/AccessorBlockDoublePlant.java create mode 100644 src/main/java/io/github/mjaroslav/mjutils/asm/mixin/accessors/AccessorBlockDragonEgg.java diff --git a/src/main/java/io/github/mjaroslav/mjutils/asm/mixin/accessors/AccessorBlock.java b/src/main/java/io/github/mjaroslav/mjutils/asm/mixin/accessors/AccessorBlock.java index 6e0a910..df62e48 100644 --- a/src/main/java/io/github/mjaroslav/mjutils/asm/mixin/accessors/AccessorBlock.java +++ b/src/main/java/io/github/mjaroslav/mjutils/asm/mixin/accessors/AccessorBlock.java @@ -10,5 +10,5 @@ @Mixin(Block.class) public interface AccessorBlock { @Invoker("dropBlockAsItem") - void invokeDropBlockAsItem(@NotNull World world, int x, int y, int z, @NotNull ItemStack stack); + void dropBlockAsItem(@NotNull World world, int x, int y, int z, @NotNull ItemStack stack); } diff --git a/src/main/java/io/github/mjaroslav/mjutils/asm/mixin/accessors/AccessorBlockDispenser.java b/src/main/java/io/github/mjaroslav/mjutils/asm/mixin/accessors/AccessorBlockDispenser.java index ae32f8b..b21fbfc 100644 --- a/src/main/java/io/github/mjaroslav/mjutils/asm/mixin/accessors/AccessorBlockDispenser.java +++ b/src/main/java/io/github/mjaroslav/mjutils/asm/mixin/accessors/AccessorBlockDispenser.java @@ -8,6 +8,9 @@ @Mixin(BlockDispenser.class) public interface AccessorBlockDispenser { + @Invoker("func_149938_m") + void rotateBlockToFreeSide(@NotNull World world, int x, int y, int z); + @Invoker("func_149941_e") void updateAndPlayEffects(@NotNull World world, int x, int y, int z); } diff --git a/src/main/java/io/github/mjaroslav/mjutils/asm/mixin/accessors/AccessorBlockDoublePlant.java b/src/main/java/io/github/mjaroslav/mjutils/asm/mixin/accessors/AccessorBlockDoublePlant.java new file mode 100644 index 0000000..030e791 --- /dev/null +++ b/src/main/java/io/github/mjaroslav/mjutils/asm/mixin/accessors/AccessorBlockDoublePlant.java @@ -0,0 +1,14 @@ +package io.github.mjaroslav.mjutils.asm.mixin.accessors; + +import net.minecraft.block.BlockDoublePlant; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(BlockDoublePlant.class) +public interface AccessorBlockDoublePlant { + @Invoker("func_149886_b") + boolean dropBlockAndAddStat(@NotNull World world, int x, int y, int z, int meta, @NotNull EntityPlayer harvester); +} diff --git a/src/main/java/io/github/mjaroslav/mjutils/asm/mixin/accessors/AccessorBlockDragonEgg.java b/src/main/java/io/github/mjaroslav/mjutils/asm/mixin/accessors/AccessorBlockDragonEgg.java new file mode 100644 index 0000000..08c2e3a --- /dev/null +++ b/src/main/java/io/github/mjaroslav/mjutils/asm/mixin/accessors/AccessorBlockDragonEgg.java @@ -0,0 +1,16 @@ +package io.github.mjaroslav.mjutils.asm.mixin.accessors; + +import net.minecraft.block.BlockDragonEgg; +import net.minecraft.world.World; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(BlockDragonEgg.class) +public interface AccessorBlockDragonEgg { + @Invoker("func_150018_e") + void checkAndFall(@NotNull World world, int x, int y, int z); + + @Invoker("func_150019_m") + void moveRandomly(@NotNull World world, int x, int y, int z); +} diff --git a/src/main/java/io/github/mjaroslav/mjutils/pos/BlockPos.java b/src/main/java/io/github/mjaroslav/mjutils/pos/BlockPos.java index 0a708f2..bb44b3e 100644 --- a/src/main/java/io/github/mjaroslav/mjutils/pos/BlockPos.java +++ b/src/main/java/io/github/mjaroslav/mjutils/pos/BlockPos.java @@ -155,7 +155,7 @@ public void dropBlockAsItemWithChance(@NotNull Block owner, @NotNull World world public void dropBlockAsItem(@NotNull Block owner, @NotNull World world, @NotNull Triplet pos, @NotNull ItemStack stack) { - ((AccessorBlock) owner).invokeDropBlockAsItem(world, pos.getX().intValue(), pos.getY().intValue(), + ((AccessorBlock) owner).dropBlockAsItem(world, pos.getX().intValue(), pos.getY().intValue(), pos.getZ().intValue(), stack); } @@ -791,6 +791,13 @@ public boolean getWeakChanges(@NotNull Block owner, @NotNull IBlockAccess world, //region BlockDispenser //-------------------------- + public void dispenser$rotateBlockToFreeSide(@NotNull BlockDispenser owner, @NotNull World world, + @NotNull Triplet pos) { + ((AccessorBlockDispenser) owner).rotateBlockToFreeSide(world, pos.getX().intValue(), pos.getY().intValue(), + pos.getZ().intValue()); + } + public void dispenser$updateAndPlayEffects(@NotNull BlockDispenser owner, @NotNull World world, @NotNull Triplet pos) { @@ -800,6 +807,64 @@ public boolean getWeakChanges(@NotNull Block owner, @NotNull IBlockAccess world, //-------------------------- //endregion + //region BlockDoor + //-------------------------- + public final int DOOR$MASK_DIRECTION = 0b00011; + public final int DOOR$MASK_OPEN = 0b000100; + public final int DOOR$MASK_UPPER_BLOCK = 0b01000; + public final int DOOR$MASK_HINGE = 0b10000; + + public int door$getRotation(@NotNull BlockDoor owner, @NotNull IBlockAccess world, + @NotNull Triplet pos) { + return owner.func_150013_e(world, pos.getX().intValue(), pos.getY().intValue(), pos.getZ().intValue()); + } + + public boolean door$isOpen(@NotNull BlockDoor owner, @NotNull IBlockAccess world, + @NotNull Triplet pos) { + return owner.func_150015_f(world, pos.getX().intValue(), pos.getY().intValue(), pos.getZ().intValue()); + } + + public void door$setOpen(@NotNull BlockDoor owner, @NotNull World world, + @NotNull Triplet pos, + boolean open) { + owner.func_150014_a(world, pos.getX().intValue(), pos.getY().intValue(), pos.getZ().intValue(), open); + } + + public int door$getBits(@NotNull BlockDoor owner, @NotNull IBlockAccess world, + @NotNull Triplet pos) { + return owner.func_150012_g(world, pos.getX().intValue(), pos.getY().intValue(), pos.getZ().intValue()); + } + //-------------------------- + //endregion + + //region BlockDoublePlant + //-------------------------- + public boolean doublePlant$dropBlockAndAddStat(@NotNull BlockDoublePlant owner, @NotNull World world, + @NotNull Triplet pos, int meta, + @NotNull EntityPlayer harvester) { + return ((AccessorBlockDoublePlant) owner).dropBlockAndAddStat(world, pos.getX().intValue(), + pos.getY().intValue(), pos.getZ().intValue(), meta, harvester); + } + //-------------------------- + //endregion + + //region BlockDragonEgg + //-------------------------- + public void checkAndFall(@NotNull BlockDragonEgg owner, @NotNull World world, + @NotNull Triplet pos) { + ((AccessorBlockDragonEgg) owner).checkAndFall(world, pos.getX().intValue(), pos.getY().intValue(), + pos.getZ().intValue()); + } + + public void moveRandomly(@NotNull BlockDragonEgg owner, @NotNull World world, + @NotNull Triplet pos) { + ((AccessorBlockDragonEgg) owner).moveRandomly(world, pos.getX().intValue(), pos.getY().intValue(), + pos.getZ().intValue()); + } + //-------------------------- + //endregion + //region IGrowable //-------------------------- public boolean growable$canGrowthByBoneMeal(@NotNull IGrowable owner, @NotNull World world, diff --git a/src/main/java/io/github/mjaroslav/mjutils/pos/Pos.java b/src/main/java/io/github/mjaroslav/mjutils/pos/Pos.java index a5349fb..a737a2f 100644 --- a/src/main/java/io/github/mjaroslav/mjutils/pos/Pos.java +++ b/src/main/java/io/github/mjaroslav/mjutils/pos/Pos.java @@ -4,6 +4,8 @@ import io.github.mjaroslav.sharedjava.tuple.Triplet; import io.github.mjaroslav.sharedjava.tuple.triplet.DTriplet; import lombok.val; +import net.minecraft.dispenser.IPosition; +import net.minecraft.dispenser.PositionImpl; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.MathHelper; @@ -192,6 +194,10 @@ public void setZ(@Nullable Double z) { //region Addition //------------------------------------ + public @NotNull Pos add(@NotNull IPosition position) { + return add(position.getX(), position.getY(), position.getZ()); + } + public @NotNull Pos add(@NotNull ChunkPosition position) { return add(position.chunkPosX, position.chunkPosY, position.chunkPosZ); } @@ -233,6 +239,10 @@ public void setZ(@Nullable Double z) { //region Subtraction //------------------------------------ + public @NotNull Pos sub(@NotNull IPosition position) { + return sub(position.getX(), position.getY(), position.getZ()); + } + public @NotNull Pos sub(@NotNull ChunkPosition position) { return sub(position.chunkPosX, position.chunkPosY, position.chunkPosZ); } @@ -274,6 +284,10 @@ public void setZ(@Nullable Double z) { //region Multiple //------------------------------------ + public @NotNull Pos mul(@NotNull IPosition position) { + return mul(position.getX(), position.getY(), position.getZ()); + } + public @NotNull Pos mul(@NotNull ChunkPosition position) { return mul(position.chunkPosX, position.chunkPosY, position.chunkPosZ); } @@ -312,6 +326,10 @@ public void setZ(@Nullable Double z) { //region Division //------------------------------------ + public @NotNull Pos div(@NotNull IPosition position) { + return div(position.getX(), position.getY(), position.getZ()); + } + public @NotNull Pos div(@NotNull ChunkPosition position) { return div(position.chunkPosX, position.chunkPosY, position.chunkPosZ); } @@ -382,6 +400,10 @@ public double lengthQrt() { //region Distance //------------------------------------ + public double distance(@NotNull IPosition position) { + return distance(position.getX(), position.getY(), position.getZ()); + } + public double distance(@NotNull ChunkPosition position) { return distance(position.chunkPosX, position.chunkPosY, position.chunkPosZ); } @@ -414,6 +436,10 @@ public double distance(double x, double y, double z) { //region Square distance //------------------------------------ + public double distanceQrt(@NotNull IPosition position) { + return distanceQrt(position.getX(), position.getY(), position.getZ()); + } + public double distanceQrt(@NotNull ChunkPosition position) { return distanceQrt(position.chunkPosX, position.chunkPosY, position.chunkPosZ); } @@ -446,6 +472,10 @@ public double distanceQrt(@NotNull Pos pos) { //region Scalar //------------------------------------ + public double scalar(@NotNull IPosition position) { + return scalar(position.getX(), position.getY(), position.getZ()); + } + public double scalar(@NotNull ChunkCoordinates coordinates) { return scalar(coordinates.posX, coordinates.posY, coordinates.posZ); } @@ -478,6 +508,10 @@ public double scalar(double x, double y, double z) { //region Cross //------------------------------------ + public @NotNull Pos cross(@NotNull IPosition position) { + return cross(position.getX(), position.getY(), position.getZ()); + } + public @NotNull Pos cross(@NotNull ChunkCoordinates coordinates) { return cross(coordinates.posX, coordinates.posY, coordinates.posZ); } @@ -584,6 +618,18 @@ public long lZ() { //region x, y, z floored conversions //------------------------------------ + public double fDX() { + return MathHelper.floor_double_long(getX()); + } + + public double fDY() { + return MathHelper.floor_double_long(getY()); + } + + public double fDZ() { + return MathHelper.floor_double_long(getZ()); + } + public int fIX() { return MathHelper.floor_double(getX()); } @@ -636,6 +682,11 @@ public long fLZ() { //region Type conversions //------------------------------------ + @Contract(" -> new") + public @NotNull IPosition asPosition() { + return new PositionImpl(getX(), getY(), getZ()); + } + @Contract(" -> new") public @NotNull ChunkPosition asChunkPosition() { return new ChunkPosition(iX(), iY(), iZ()); @@ -692,6 +743,11 @@ public long fLZ() { //region Type floored conversions //------------------------------------ + @Contract(" -> new") + public @NotNull IPosition asFlooredPosition() { + return new PositionImpl(fDX(), fDY(), fDZ()); + } + @Contract(" -> new") public @NotNull ChunkPosition asFlooredChunkPosition() { return new ChunkPosition(fIX(), fIY(), fIZ()); @@ -748,6 +804,11 @@ public short[] asFlooredShortArray() { //region Relative AABB creation //------------------------------------ + @Contract("_ -> new") + public @NotNull AxisAlignedBB createAABB(@NotNull IPosition position) { + return createAABB(position.getX(), position.getY(), position.getZ()); + } + @Contract("_ -> new") public @NotNull AxisAlignedBB createAABB(@NotNull ChunkPosition position) { return createAABB(position.chunkPosX, position.chunkPosY, position.chunkPosZ); @@ -793,29 +854,34 @@ public short[] asFlooredShortArray() { //region Absolute AABB creation //------------------------------------ + @Contract("_ -> new") + public @NotNull AxisAlignedBB createAABBAbsolute(@NotNull IPosition position) { + return createAABBAbsolute(position.getX(), position.getY(), position.getZ()); + } + @Contract("_ -> new") public @NotNull AxisAlignedBB createAABBAbsolute(@NotNull ChunkPosition position) { - return createAABB(position.chunkPosX, position.chunkPosY, position.chunkPosZ); + return createAABBAbsolute(position.chunkPosX, position.chunkPosY, position.chunkPosZ); } @Contract("_ -> new") public @NotNull AxisAlignedBB createAABBAbsolute(@NotNull Vec3 vec) { - return createAABB(vec.xCoord, vec.yCoord, vec.zCoord); + return createAABBAbsolute(vec.xCoord, vec.yCoord, vec.zCoord); } @Contract("_ -> new") public @NotNull AxisAlignedBB createAABBAbsolute(@NotNull ChunkCoordinates coordinates) { - return createAABB(coordinates.posX, coordinates.posY, coordinates.posZ); + return createAABBAbsolute(coordinates.posX, coordinates.posY, coordinates.posZ); } @Contract("_ -> new") public @NotNull AxisAlignedBB createAABBAbsolute(@NotNull ForgeDirection direction) { - return createAABB(direction.offsetX, direction.offsetY, direction.offsetZ); + return createAABBAbsolute(direction.offsetX, direction.offsetY, direction.offsetZ); } @Contract("_ -> new") public @NotNull AxisAlignedBB createAABBAbsolute(@NotNull Pos pos) { - return createAABB(pos.getX(), pos.getY(), pos.getZ()); + return createAABBAbsolute(pos.getX(), pos.getY(), pos.getZ()); } @Contract("_ -> new") @@ -835,6 +901,11 @@ public short[] asFlooredShortArray() { //region Box iterates //------------------------------------ + @Contract("_ -> new") + public @NotNull Iterable iterateBox(@NotNull IPosition position) { + return iterateBox((int) position.getX(), (int) position.getY(), (int) position.getZ()); + } + @Contract("_ -> new") public @NotNull Iterable iterateBox(@NotNull ChunkPosition position) { return iterateBox(position.chunkPosX, position.chunkPosY, position.chunkPosZ); @@ -898,6 +969,11 @@ protected Mutable computeNext() { //region Box streams //------------------------------------ + @Contract("_ -> new") + public @NotNull Stream streamBox(@NotNull IPosition position) { + return streamBox((int) position.getX(), (int) position.getY(), (int) position.getZ()); + } + @Contract("_ -> new") public @NotNull Stream streamBox(@NotNull ChunkPosition position) { return streamBox(position.chunkPosX, position.chunkPosY, position.chunkPosZ); @@ -949,25 +1025,65 @@ protected Mutable computeNext() { //------------------------------------ //endregion - //region Object utility - //------------------------------------ - @Contract(" -> new") - public @NotNull Stream stream() { - return Stream.of(this); + //region For each in box + //-------------------------- + public void forEachBox(@NotNull IPosition oppositeCornerPosition, @NotNull Consumer action) { + forEachBox((int) oppositeCornerPosition.getX(), (int) oppositeCornerPosition.getY(), + (int) oppositeCornerPosition.getZ(), action); + } + + public void forEachBox(@NotNull Pos oppositeCornerPos, @NotNull Consumer action) { + forEachBox(oppositeCornerPos.iX(), oppositeCornerPos.iY(), oppositeCornerPos.iZ(), action); } - public void forEachBox(@NotNull Pos oppositeCorner, @NotNull Consumer action) { + public void forEachBox(@NotNull ChunkCoordinates oppositeCornerCoordinates, @NotNull Consumer action) { + forEachBox(oppositeCornerCoordinates.posX, oppositeCornerCoordinates.posY, oppositeCornerCoordinates.posZ, + action); + } + + public void forEachBox(@NotNull ChunkPosition oppositeCornerPosition, @NotNull Consumer action) { + forEachBox(oppositeCornerPosition.chunkPosX, oppositeCornerPosition.chunkPosY, oppositeCornerPosition.chunkPosZ, + action); + } + + public void forEachBox(@NotNull ForgeDirection oppositeCornerDirection, @NotNull Consumer action) { + forEachBox(oppositeCornerDirection.offsetX, oppositeCornerDirection.offsetY, oppositeCornerDirection.offsetZ, + action); + } + + public void forEachBox(@NotNull Vec3 oppositeCornerVec, @NotNull Consumer action) { + forEachBox((int) oppositeCornerVec.xCoord, (int) oppositeCornerVec.yCoord, (int) oppositeCornerVec.zCoord, + action); + } + + public void forEachBox(@NotNull Triplet oppositeCornerTriplet, + @NotNull Consumer action) { + forEachBox(oppositeCornerTriplet.getX().intValue(), oppositeCornerTriplet.getY().intValue(), + oppositeCornerTriplet.getZ().intValue(), action); + } + + public void forEachBox(int oppositeCornerX, int oppositeCornerY, int oppositeCornerZ, + @NotNull Consumer action) { val temp = new Mutable(); - val stopX = Math.max(iX(), oppositeCorner.iX()) + 1; - val stopY = Math.max(iY(), oppositeCorner.iY()) + 1; - val stopZ = Math.max(iZ(), oppositeCorner.iZ()) + 1; - for (var x = Math.min(iX(), oppositeCorner.iX()); x < stopX; x++) - for (var y = Math.min(iY(), oppositeCorner.iY()); y < stopY; y++) - for (var z = Math.min(iZ(), oppositeCorner.iZ()); z < stopZ; z++) { + val stopX = Math.max(iX(), oppositeCornerX) + 1; + val stopY = Math.max(iY(), oppositeCornerY) + 1; + val stopZ = Math.max(iZ(), oppositeCornerZ) + 1; + for (var x = Math.min(iX(), oppositeCornerX); x < stopX; x++) + for (var y = Math.min(iY(), oppositeCornerY); y < stopY; y++) + for (var z = Math.min(iZ(), oppositeCornerZ); z < stopZ; z++) { temp.set(x, y, z); action.accept(temp); } } + //-------------------------- + //endregion + + //region Object utility + //------------------------------------ + @Contract(" -> new") + public @NotNull Stream stream() { + return Stream.of(this); + } public boolean isInsideOfBox(@NotNull AxisAlignedBB aabb) { return getX() > aabb.minX && getX() < aabb.maxX && getY() > aabb.minY && getY() < aabb.maxY @@ -991,6 +1107,10 @@ public int compareTo(@NotNull Object o) { x = pos.getX(); y = pos.getY(); z = pos.getZ(); + } else if (o instanceof IPosition position) { + x = position.getX(); + y = position.getY(); + z = position.getZ(); } else if (o instanceof ChunkCoordinates coordinates) { x = coordinates.posX; y = coordinates.posY; @@ -1019,6 +1139,8 @@ public boolean equals(@Nullable Object o) { else if (o == this) return true; else if (o instanceof Pos pos) return getX().equals(pos.getX()) && getY().equals(pos.getY()) && getZ().equals(pos.getZ()); + else if (o instanceof IPosition position) + return getX() == position.getX() && getY() == position.getY() && getZ() == position.getZ(); else if (o instanceof ChunkCoordinates coordinates) return iX() == coordinates.posX && iY() == coordinates.posY && iZ() == coordinates.posZ; else if (o instanceof ChunkPosition position) @@ -1044,6 +1166,11 @@ public String toString() { return new Mutable(); } + @Contract("_ -> new") + public static @NotNull Pos mutableOf(@NotNull IPosition position) { + return mutableOf(position.getX(), position.getY(), position.getZ()); + } + @Contract("_ -> new") public static @NotNull Pos mutableOf(@NotNull Pos pos) { return mutableOf(pos.getX(), pos.getY(), pos.getZ()); @@ -1079,6 +1206,11 @@ public String toString() { return new Mutable(x, y, z); } + @Contract("_ -> new") + public static @NotNull Pos mutableOfFloor(@NotNull IPosition position) { + return mutableOfFloor(position.getX(), position.getY(), position.getZ()); + } + @Contract("_ -> new") public static @NotNull Pos mutableOfFloor(@NotNull Pos pos) { return mutableOfFloor(pos.getX(), pos.getY(), pos.getZ()); @@ -1108,6 +1240,11 @@ public String toString() { return of(pos.getX(), pos.getY(), pos.getZ()); } + @Contract("_ -> new") + public static @NotNull Pos of(@NotNull IPosition position) { + return of(position.getX(), position.getY(), position.getZ()); + } + @Contract("_ -> new") public static @NotNull Pos of(@NotNull ChunkPosition position) { return of(position.chunkPosX, position.chunkPosY, position.chunkPosZ); @@ -1143,6 +1280,11 @@ public String toString() { return ofFloor(pos.getX(), pos.getY(), pos.getZ()); } + @Contract("_ -> new") + public static @NotNull Pos ofFloor(@NotNull IPosition position) { + return ofFloor(position.getX(), position.getY(), position.getZ()); + } + @Contract("_ -> new") public static @NotNull Pos ofFloor(@NotNull Vec3 vec3) { return ofFloor(vec3.xCoord, vec3.yCoord, vec3.zCoord); @@ -1182,6 +1324,11 @@ protected Mutable(double x, double y, double z) { return this; } + @Contract("_ -> this") + public @NotNull Mutable set(@NotNull IPosition position) { + return set(position.getX(), position.getY(), position.getZ()); + } + @Contract("_ -> this") public @NotNull Mutable set(@NotNull Vec3 vec) { return set(vec.xCoord, vec.yCoord, vec.zCoord); diff --git a/src/main/resources/mixin.mjutils.accessors.json b/src/main/resources/mixin.mjutils.accessors.json index 480fcca..4f066ba 100644 --- a/src/main/resources/mixin.mjutils.accessors.json +++ b/src/main/resources/mixin.mjutils.accessors.json @@ -17,6 +17,8 @@ "AccessorBlockChest", "AccessorBlockCrops", "AccessorBlockDispenser", + "AccessorBlockDoublePlant", + "AccessorBlockDragonEgg", "AccessorEntityPigZombie", "AccessorEnumHolder", "AccessorExplosion",