Initial 1.20.1

This commit is contained in:
Waterpicker 2023-10-01 20:16:48 -05:00
parent f581f48126
commit aef627af6b
46 changed files with 176 additions and 193 deletions

View file

@ -22,7 +22,10 @@ subprojects {
mavenCentral()
maven("https://maven.shedaniel.me/")
maven("https://jitpack.io")
maven("https://maven.bai.lol")
maven("https://maven.bai.lol").content {
includeGroup("lol.bai")
includeGroup("mcp.mobius.waila")
}
maven("https://cursemaven.com").content { includeGroup("curse.maven") }
maven("https://maven.enginehub.org/repo/")
maven("https://maven.parchmentmc.org")

View file

@ -11,7 +11,7 @@ dependencies {
modImplementation("net.fabricmc:fabric-loader:${project.properties["fabric_loader_version"]}")
// Remove the next line if you don't want to depend on the API
modApi("dev.architectury:architectury:${project.properties["architectury_version"]}")
modApi("me.shedaniel.cloth:cloth-config:9.0.94")
modApi("me.shedaniel.cloth:cloth-config:${rootProject.properties["cloth_config"]}")
modCompileOnlyApi("mcp.mobius.waila:wthit-api:fabric-${project.properties["wthitVersion"]}")
modApi("com.flowpowered:flow-math:1.0.3")

View file

@ -69,7 +69,7 @@ public final class TeleportUtil {
((ServerLevel) world).getChunkSource().addRegionTicket(TicketType.POST_TELEPORT, chunkPos, 1, entity.getId());
entity.stopRiding();
if (entity.level.dimension().equals(world.dimension())) {
if (entity.level().dimension().equals(world.dimension())) {
serverPlayer.connection.teleport(pos.x(), pos.y(), pos.z(), yaw, pitch);
} else {
entity = teleport(entity, (ServerLevel) world, new PortalInfo(pos, velocity, yaw, pitch));
@ -82,7 +82,7 @@ public final class TeleportUtil {
serverPlayer.awardStat(ModStats.TIMES_BEEN_TO_DUNGEON);
}
} else {
if (entity.level.dimension().equals(world.dimension())) {
if (entity.level().dimension().equals(world.dimension())) {
entity.moveTo(pos.x(), pos.y(), pos.z(), yaw, pitch);
} else {
entity = teleport(entity, (ServerLevel) world, new PortalInfo(pos, velocity, yaw, pitch));
@ -122,7 +122,7 @@ public final class TeleportUtil {
);
}
public static <E extends Entity> E teleportUntargeted(E entity, Level world) {
double actualScale = entity.level.dimensionType().coordinateScale() / world.dimensionType().coordinateScale();
double actualScale = entity.level().dimensionType().coordinateScale() / world.dimensionType().coordinateScale();
return teleport(
entity,
world,
@ -132,7 +132,7 @@ public final class TeleportUtil {
}
public static <E extends Entity> E teleportUntargeted(E entity, Level world, double y) {
double actualScale = entity.level.dimensionType().coordinateScale() / world.dimensionType().coordinateScale();
double actualScale = entity.level().dimensionType().coordinateScale() / world.dimensionType().coordinateScale();
return teleport(
entity,
world,

View file

@ -4,10 +4,9 @@ import net.minecraft.world.item.DyeColor;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.material.Material;
public class AncientFabricBlock extends Block {
public AncientFabricBlock(DyeColor color) {
super(BlockBehaviour.Properties.of(Material.STONE, color).strength(-1.0F, 3600000.0F).dropsLike(Blocks.AIR).lightLevel(state -> 15));
super(BlockBehaviour.Properties.copy(Blocks.STONE).mapColor(color).strength(-1.0F, 3600000.0F).dropsLike(Blocks.AIR).lightLevel(state -> 15));
}
}

View file

@ -7,14 +7,15 @@ import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Material;
import org.dimdev.dimdoors.DimensionalDoors;
import static net.minecraft.world.level.block.Blocks.STONE;
public class FabricBlock extends Block {
public static final TagKey<Block> BLOCK_TAG = TagKey.create(Registries.BLOCK, DimensionalDoors.id("fabric"));
FabricBlock(DyeColor color) {
super(Properties.of(Material.STONE, color).strength(1.2F).lightLevel(state -> 15));
super(Properties.copy(STONE).mapColor(color).strength(1.2F).lightLevel(state -> 15));
}
@Override

View file

@ -15,10 +15,7 @@ import net.minecraft.world.level.block.*;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.properties.BlockSetType;
import net.minecraft.world.level.block.state.properties.WoodType;
import net.minecraft.world.level.material.Material;
import net.minecraft.world.level.material.MaterialColor;
import org.dimdev.dimdoors.DimensionalDoors;
import org.dimdev.dimdoors.block.door.DimensionalDoorBlock;
import org.dimdev.dimdoors.block.door.DimensionalTrapdoorBlock;
import org.dimdev.dimdoors.fluid.ModFluids;
@ -26,7 +23,13 @@ import java.util.HashMap;
import java.util.Map;
import java.util.function.Supplier;
import static net.minecraft.world.level.block.Blocks.CLAY;
import static net.minecraft.world.level.block.Blocks.SAND;
import static net.minecraft.world.level.block.Blocks.STONE;
import static net.minecraft.world.level.block.Blocks.WATER;
import static net.minecraft.world.level.block.Blocks.*;
import static net.minecraft.world.level.block.state.BlockBehaviour.Properties.copy;
import static net.minecraft.world.level.material.MapColor.*;
import static org.dimdev.dimdoors.item.ModItems.DIMENSIONAL_DOORS;
public final class ModBlocks {
@ -37,19 +40,19 @@ public final class ModBlocks {
private static final Map<DyeColor, RegistrySupplier<Block>> ANCIENT_FABRIC_BLOCKS = new HashMap<DyeColor, RegistrySupplier<Block>>();
public static final RegistrySupplier<Block> STONE_PLAYER = registerWithoutTab("stone_player", () -> new Block(of(Material.STONE).strength(0.5F).noOcclusion()));
public static final RegistrySupplier<Block> STONE_PLAYER = registerWithoutTab("stone_player", () -> new Block(copy(STONE).strength(0.5F).noOcclusion()));
public static final RegistrySupplier<Block> GOLD_DOOR = register("gold_door", () -> new DoorBlock(of(Material.METAL, MaterialColor.GOLD).strength(5.0F).requiresCorrectToolForDrops().noCollission(), BlockSetType.IRON));
public static final RegistrySupplier<Block> GOLD_DOOR = register("gold_door", () -> new DoorBlock(copy(IRON_BLOCK).mapColor(GOLD).strength(5.0F).requiresCorrectToolForDrops().noCollission(), BlockSetType.IRON));
public static final RegistrySupplier<Block> STONE_DOOR = register("stone_door", () -> new DoorBlock(of(Material.METAL, MaterialColor.WOOD).strength(5.0F).requiresCorrectToolForDrops().noOcclusion(), BlockSetType.IRON));
public static final RegistrySupplier<Block> STONE_DOOR = register("stone_door", () -> new DoorBlock(copy(STONE).mapColor(WOOD).strength(5.0F).requiresCorrectToolForDrops().noOcclusion(), BlockSetType.IRON));
public static final RegistrySupplier<Block> QUARTZ_DOOR = register("quartz_door", () -> new DoorBlock(of(Material.STONE, MaterialColor.TERRACOTTA_WHITE).strength(5.0F).requiresCorrectToolForDrops().noOcclusion(), BlockSetType.IRON));
public static final RegistrySupplier<Block> QUARTZ_DOOR = register("quartz_door", () -> new DoorBlock(copy(STONE).mapColor(TERRACOTTA_WHITE).strength(5.0F).requiresCorrectToolForDrops().noOcclusion(), BlockSetType.IRON));
public static final RegistrySupplier<Block> OAK_DIMENSIONAL_TRAPDOOR = registerWithoutTab("wood_dimensional_trapdoor", () -> new DimensionalTrapdoorBlock(of(Blocks.OAK_TRAPDOOR).lightLevel(state -> 10), BlockSetType.OAK));
public static final RegistrySupplier<Block> DIMENSIONAL_PORTAL = registerWithoutTab("dimensional_portal", () -> new DimensionalPortalBlock(of(Material.AIR).noCollission().strength(-1.0F, 3600000.0F).noOcclusion().dropsLike(AIR).lightLevel(blockState -> 10)));
public static final RegistrySupplier<Block> DIMENSIONAL_PORTAL = registerWithoutTab("dimensional_portal", () -> new DimensionalPortalBlock(copy(AIR).noCollission().strength(-1.0F, 3600000.0F).noOcclusion().dropsLike(AIR).lightLevel(blockState -> 10)));
public static final RegistrySupplier<Block> DETACHED_RIFT = registerWithoutTab("detached_rift", () -> new DetachedRiftBlock(of(Material.AIR, MaterialColor.COLOR_BLACK).strength(-1.0F, 3600000.0F).noCollission().noOcclusion()));
public static final RegistrySupplier<Block> DETACHED_RIFT = registerWithoutTab("detached_rift", () -> new DetachedRiftBlock(copy(AIR).mapColor(COLOR_BLACK).strength(-1.0F, 3600000.0F).noCollission().noOcclusion()));
public static final RegistrySupplier<Block> WHITE_FABRIC = registerFabric(DyeColor.WHITE);
@ -115,11 +118,11 @@ public final class ModBlocks {
public static final RegistrySupplier<Block> RED_ANCIENT_FABRIC = registerAncientFabric(DyeColor.RED);
public static final RegistrySupplier<Block> BLACK_ANCIENT_FABRIC = registerAncientFabric(DyeColor.BLACK);
private static final BlockBehaviour.Properties UNRAVELLED_FABRIC_BLOCK_SETTINGS = of(Material.STONE, MaterialColor.COLOR_BLACK).randomTicks().lightLevel(state -> 15).strength(0.3F, 0.3F);
private static final BlockBehaviour.Properties UNRAVELLED_FABRIC_BLOCK_SETTINGS = copy(STONE).mapColor(COLOR_BLACK).randomTicks().lightLevel(state -> 15).strength(0.3F, 0.3F);
public static final RegistrySupplier<LiquidBlock> ETERNAL_FLUID = registerWithoutTab("eternal_fluid", () -> new EternalFluidBlock(of(Material.LAVA, MaterialColor.COLOR_RED).lightLevel(state -> 15)));
public static final RegistrySupplier<LiquidBlock> ETERNAL_FLUID = registerWithoutTab("eternal_fluid", () -> new EternalFluidBlock(copy(LAVA).mapColor(COLOR_RED).lightLevel(state -> 15)));
public static final RegistrySupplier<LiquidBlock> LEAK = registerWithoutTab("leak", () -> new ArchitecturyLiquidBlock(ModFluids.LEAK, of(WATER)));
public static final RegistrySupplier<LiquidBlock> LEAK = registerWithoutTab("leak", () -> new ArchitecturyLiquidBlock(ModFluids.LEAK, copy(WATER)));
public static final RegistrySupplier<Block> DECAYED_BLOCK = registerWithoutTab("decayed_block", () -> new UnravelledFabricBlock(UNRAVELLED_FABRIC_BLOCK_SETTINGS));
@ -131,18 +134,18 @@ public final class ModBlocks {
public static final RegistrySupplier<Block> UNRAVELLED_FABRIC = register("unravelled_fabric", () -> new UnravelledFabricBlock(UNRAVELLED_FABRIC_BLOCK_SETTINGS));
public static final RegistrySupplier<Block> MARKING_PLATE = registerWithoutTab("marking_plate", () -> new MarkingPlateBlock(of(Material.METAL, DyeColor.BLACK).noOcclusion()));
public static final RegistrySupplier<Block> MARKING_PLATE = registerWithoutTab("marking_plate", () -> new MarkingPlateBlock(copy(IRON_BLOCK).mapColor(DyeColor.BLACK).noOcclusion()));
public static final RegistrySupplier<Block> SOLID_STATIC = register("solid_static", () -> new UnravelledFabricBlock(of(Material.STONE).strength(7, 25).randomTicks().requiresCorrectToolForDrops().sound(SoundType.SAND)));
public static final RegistrySupplier<Block> SOLID_STATIC = register("solid_static", () -> new UnravelledFabricBlock(copy(STONE).strength(7, 25).randomTicks().requiresCorrectToolForDrops().sound(SoundType.SAND)));
public static final RegistrySupplier<Block> TESSELATING_LOOM = register("tesselating_loom", () -> new TesselatingLoomBlock(of(LOOM)));
public static final RegistrySupplier<Block> REALITY_SPONGE = register("reality_sponge", () -> new RealitySpongeBlock(UNRAVELLED_FABRIC_BLOCK_SETTINGS));
//Decay graph filler.
public static final RegistrySupplier<Block> DRIFTWOOD_WOOD = register("driftwood_wood", () -> new RotatedPillarBlock(of(Material.WOOD, MaterialColor.COLOR_LIGHT_GRAY).strength(2.0F).sound(SoundType.WOOD)));
public static final RegistrySupplier<Block> DRIFTWOOD_LOG = register("driftwood_log", () -> new RotatedPillarBlock(of(Material.WOOD, MaterialColor.COLOR_LIGHT_GRAY).strength(2.0F).sound(SoundType.WOOD)));
public static final RegistrySupplier<Block> DRIFTWOOD_PLANKS = register("driftwood_planks", () -> new Block(of(Material.WOOD, MaterialColor.COLOR_LIGHT_GRAY).strength(2.0F, 3.0F).sound(SoundType.WOOD)));
public static final RegistrySupplier<Block> DRIFTWOOD_WOOD = register("driftwood_wood", () -> new RotatedPillarBlock(copy(OAK_WOOD).mapColor(COLOR_LIGHT_GRAY).strength(2.0F).sound(SoundType.WOOD)));
public static final RegistrySupplier<Block> DRIFTWOOD_LOG = register("driftwood_log", () -> new RotatedPillarBlock(copy(OAK_WOOD).mapColor(COLOR_LIGHT_GRAY).strength(2.0F).sound(SoundType.WOOD)));
public static final RegistrySupplier<Block> DRIFTWOOD_PLANKS = register("driftwood_planks", () -> new Block(copy(OAK_WOOD).mapColor(COLOR_LIGHT_GRAY).strength(2.0F, 3.0F).sound(SoundType.WOOD)));
public static final RegistrySupplier<Block> DRIFTWOOD_LEAVES = register("driftwood_leaves", () -> new LeavesBlock(of(OAK_LEAVES)));
public static final RegistrySupplier<Block> DRIFTWOOD_SAPLING = register("driftwood_sapling", () -> new Block(of(OAK_SAPLING)));
public static final RegistrySupplier<Block> DRIFTWOOD_FENCE = registerFence("driftwood_fence", DRIFTWOOD_PLANKS);
@ -150,19 +153,19 @@ public final class ModBlocks {
public static final RegistrySupplier<Block> DRIFTWOOD_BUTTON = registerButton("driftwood_button", DRIFTWOOD_PLANKS);
public static final RegistrySupplier<Block> DRIFTWOOD_SLAB = registerSlab("driftwood_slab", DRIFTWOOD_PLANKS);
public static final RegistrySupplier<Block> DRIFTWOOD_STAIRS = registerStairs("driftwood_stairs", DRIFTWOOD_PLANKS);
public static final RegistrySupplier<Block> DRIFTWOOD_DOOR = register("driftwood_door", () -> new DoorBlock(of(Material.WOOD, MaterialColor.COLOR_GRAY).strength(3.0F).sound(SoundType.WOOD).noOcclusion(), BlockSetType.OAK));
public static final RegistrySupplier<Block> DRIFTWOOD_TRAPDOOR = register("driftwood_trapdoor", () -> new TrapDoorBlock(of(Material.WOOD, MaterialColor.COLOR_GRAY).strength(3.0F).sound(SoundType.WOOD).noOcclusion().isValidSpawn((state, world, pos, type) -> false), BlockSetType.OAK));
public static final RegistrySupplier<Block> DRIFTWOOD_DOOR = register("driftwood_door", () -> new DoorBlock(copy(OAK_WOOD).mapColor(COLOR_GRAY).strength(3.0F).sound(SoundType.WOOD).noOcclusion(), BlockSetType.OAK));
public static final RegistrySupplier<Block> DRIFTWOOD_TRAPDOOR = register("driftwood_trapdoor", () -> new TrapDoorBlock(copy(OAK_WOOD).mapColor(COLOR_GRAY).strength(3.0F).sound(SoundType.WOOD).noOcclusion().isValidSpawn((state, world, pos, type) -> false), BlockSetType.OAK));
public static final RegistrySupplier<Block> AMALGAM_BLOCK = register("amalgam_block", () -> new Block(of(Material.METAL, MaterialColor.COLOR_LIGHT_GRAY).requiresCorrectToolForDrops().strength(5.0F, 6.0F).sound(SoundType.METAL)));
public static final RegistrySupplier<Block> AMALGAM_DOOR = register("amalgam_door", () -> new DoorBlock(of(Material.METAL, MaterialColor.COLOR_LIGHT_GRAY).requiresCorrectToolForDrops().strength(5.0F).sound(SoundType.METAL).noOcclusion(), BlockSetType.IRON));
public static final RegistrySupplier<Block> AMALGAM_TRAPDOOR = register("amalgam_trapdoor", () -> new TrapDoorBlock(of(Material.METAL).requiresCorrectToolForDrops().strength(5.0F).sound(SoundType.METAL).isValidSpawn((state, world, pos, type) -> false), BlockSetType.IRON));
public static final RegistrySupplier<Block> RUST = register("rust", () -> new Block(of(Material.WOOD)));
public static final RegistrySupplier<Block> AMALGAM_BLOCK = register("amalgam_block", () -> new Block(copy(IRON_BLOCK).mapColor(COLOR_LIGHT_GRAY).requiresCorrectToolForDrops().strength(5.0F, 6.0F).sound(SoundType.METAL)));
public static final RegistrySupplier<Block> AMALGAM_DOOR = register("amalgam_door", () -> new DoorBlock(copy(IRON_BLOCK).mapColor(COLOR_LIGHT_GRAY).requiresCorrectToolForDrops().strength(5.0F).sound(SoundType.METAL).noOcclusion(), BlockSetType.IRON));
public static final RegistrySupplier<Block> AMALGAM_TRAPDOOR = register("amalgam_trapdoor", () -> new TrapDoorBlock(copy(IRON_BLOCK).requiresCorrectToolForDrops().strength(5.0F).sound(SoundType.METAL).isValidSpawn((state, world, pos, type) -> false), BlockSetType.IRON));
public static final RegistrySupplier<Block> RUST = register("rust", () -> new Block(copy(OAK_WOOD)));
public static final RegistrySupplier<Block> AMALGAM_SLAB = registerSlab("amalgam_slab", AMALGAM_BLOCK);
public static final RegistrySupplier<Block> AMALGAM_STAIRS = registerStairs("amalgam_stairs", AMALGAM_BLOCK);
public static final RegistrySupplier<Block> AMALGAM_ORE = register("amalgam_ore", () -> new DropExperienceBlock(of(Material.STONE).requiresCorrectToolForDrops().strength(3.0F, 3.0F)));
public static final RegistrySupplier<Block> AMALGAM_ORE = register("amalgam_ore", () -> new DropExperienceBlock(copy(STONE).requiresCorrectToolForDrops().strength(3.0F, 3.0F)));
public static final RegistrySupplier<Block> CLOD_ORE = register("clod_ore", () -> new Block(of(Material.AMETHYST)));
public static final RegistrySupplier<Block> CLOD_BLOCK = register("clod_block", () -> new Block(of(Material.AMETHYST)));
public static final RegistrySupplier<Block> CLOD_ORE = register("clod_ore", () -> new Block(copy(Blocks.AMETHYST_BLOCK)));
public static final RegistrySupplier<Block> CLOD_BLOCK = register("clod_block", () -> new Block(copy(Blocks.AMETHYST_BLOCK)));
public static final RegistrySupplier<Block> GRAVEL_FENCE = registerFence("gravel_fence", GRAVEL);
public static final RegistrySupplier<Block> GRAVEL_BUTTON = registerButton("gravel_button", GRAVEL);
@ -170,7 +173,7 @@ public final class ModBlocks {
public static final RegistrySupplier<Block> GRAVEL_STAIRS = registerStairs("gravel_stairs", GRAVEL);
public static final RegistrySupplier<Block> GRAVEL_WALL = registerWall("gravel_wall", GRAVEL);
public static final RegistrySupplier<Block> DARK_SAND = register("dark_sand", () -> new Block(of(Material.SAND, MaterialColor.COLOR_BLACK).strength(0.5F).sound(SoundType.SAND)));
public static final RegistrySupplier<Block> DARK_SAND = register("dark_sand", () -> new Block(copy(SAND).mapColor(COLOR_BLACK).strength(0.5F).sound(SoundType.SAND)));
public static final RegistrySupplier<Block> DARK_SAND_FENCE = registerFence("dark_sand_fence", DARK_SAND);
public static final RegistrySupplier<Block> DARK_SAND_BUTTON = registerButton("dark_sand_button", DARK_SAND);
public static final RegistrySupplier<Block> DARK_SAND_SLAB = registerSlab("dark_sand_slab", DARK_SAND);
@ -205,9 +208,9 @@ public final class ModBlocks {
public static final RegistrySupplier<Block> RED_SAND_STAIRS = registerStairs("red_sand_stairs", Blocks.RED_SAND);
public static final RegistrySupplier<Block> RED_SAND_WALL = registerWall("red_sand_wall", Blocks.RED_SAND);
public static final RegistrySupplier<Block> SAND_SLAB = registerSlab("sand_slab", Blocks.SAND);
public static final RegistrySupplier<Block> SAND_STAIRS = registerStairs("sand_stairs", Blocks.SAND);
public static final RegistrySupplier<Block> SAND_WALL = registerWall("sand_wall", Blocks.SAND);
public static final RegistrySupplier<Block> SAND_SLAB = registerSlab("sand_slab", SAND);
public static final RegistrySupplier<Block> SAND_STAIRS = registerStairs("sand_stairs", SAND);
public static final RegistrySupplier<Block> SAND_WALL = registerWall("sand_wall", SAND);
public static final RegistrySupplier<Block> END_STONE_SLAB = registerSlab("end_stone_slab", Blocks.END_STONE);
public static final RegistrySupplier<Block> END_STONE_STAIRS = registerStairs("end_stone_stairs", Blocks.END_STONE);
@ -313,19 +316,19 @@ public final class ModBlocks {
return register(name, () -> new WallBlock(of(block.get())));
}
private static BlockBehaviour.Properties of(Material material, MaterialColor color) {
return BlockBehaviour.Properties.of(material, color);
}
private static BlockBehaviour.Properties of(Material material) {
return BlockBehaviour.Properties.of(material);
}
private static BlockBehaviour.Properties of(Material material, DyeColor dyeColor) {
return BlockBehaviour.Properties.of(material, dyeColor);
}
// private static BlockBehaviour.Properties of(Material material, MaterialColor color) {
// return BlockBehaviour.Properties.of(material, color);
// }
//
// private static BlockBehaviour.Properties of(Material material) {
// return BlockBehaviour.Properties.of(material);
// }
//
// private static BlockBehaviour.Properties of(Material material, DyeColor dyeColor) {
// return BlockBehaviour.Properties.of(material, dyeColor);
// }
private static BlockBehaviour.Properties of(Block block) {
return BlockBehaviour.Properties.copy(block);
return copy(block);
}
}

View file

@ -27,7 +27,6 @@ import net.minecraft.world.level.block.state.properties.BlockSetType;
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf;
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.level.material.Fluids;
import net.minecraft.world.level.material.Material;
import net.minecraft.world.level.material.PushReaction;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
@ -50,9 +49,11 @@ import org.jetbrains.annotations.Nullable;
import java.util.function.Consumer;
import static net.minecraft.world.level.material.PushReaction.BLOCK;
public class DimensionalDoorBlock extends WaterLoggableDoorBlock implements RiftProvider<EntranceRiftBlockEntity>, CoordinateTransformerBlock, ExplosionConvertibleBlock, CustomBreakBlock, AfterMoveCollidableBlock {
public DimensionalDoorBlock(BlockBehaviour.Properties settings, BlockSetType blockSetType) {
super(settings, blockSetType);
super(settings.pushReaction(BLOCK), blockSetType);
}
@Override
@ -137,7 +138,7 @@ public class DimensionalDoorBlock extends WaterLoggableDoorBlock implements Rift
if (!world.isClientSide && state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world));
}
world.levelEvent(player, state.getValue(OPEN) ? this.material == Material.METAL ? 1005 : 1006 : this.material == Material.METAL ? 1011 : 1012, pos, 0);
this.playSound(player, world, pos, (Boolean)state.getValue(OPEN));
world.gameEvent(player, this.isOpen(state) ? GameEvent.BLOCK_OPEN : GameEvent.BLOCK_CLOSE, pos);
return InteractionResult.SUCCESS;
}
@ -286,11 +287,6 @@ public class DimensionalDoorBlock extends WaterLoggableDoorBlock implements Rift
return InteractionResult.SUCCESS;
}
@Override
public PushReaction getPistonPushReaction(BlockState state) {
return state.getValue(HALF) == DoubleBlockHalf.LOWER ? PushReaction.BLOCK : super.getPistonPushReaction(state);
}
@Override
public InteractionResultHolder<Pair<BlockState, Consumer<BlockEntity>>> customBreakBlock(Level world, BlockPos pos, BlockState blockState, Entity breakingEntity) {
if (blockState.getValue(HALF) != DoubleBlockHalf.LOWER) {

View file

@ -198,7 +198,7 @@ public abstract class RiftBlockEntity extends BlockEntity implements Target, Ent
}
if (target.receiveEntity(entity, relativePos, relativeAngle, relativeVelocity)) {
VirtualLocation vLoc = VirtualLocation.fromLocation(new Location((ServerLevel) entity.level, entity.blockPosition()));
VirtualLocation vLoc = VirtualLocation.fromLocation(new Location((ServerLevel) entity.level(), entity.blockPosition()));
EntityUtils.chat(entity, Component.literal("You are at x = " + vLoc.getX() + ", y = ?, z = " + vLoc.getZ() + ", w = " + vLoc.getDepth()));
return true;
}

View file

@ -24,7 +24,10 @@ import net.minecraft.world.entity.ExperienceOrb;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.player.StackedContents;
import net.minecraft.world.inventory.*;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.ContainerData;
import net.minecraft.world.inventory.RecipeHolder;
import net.minecraft.world.inventory.StackedContentsCompatible;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.AbstractCookingRecipe;
import net.minecraft.world.item.crafting.Recipe;
@ -33,7 +36,6 @@ import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
import org.dimdev.dimdoors.mixin.accessor.CraftingInventoryAccessor;
import org.dimdev.dimdoors.recipe.ModRecipeTypes;
import org.dimdev.dimdoors.recipe.TesselatingRecipe;
import org.dimdev.dimdoors.screen.TessellatingContainer;
@ -261,7 +263,7 @@ public class TesselatingLoomBlockEntity extends BlockEntity implements MenuProvi
ItemStack outstack = output;
if (outstack.isEmpty()) {
return true;
} else if (!outstack.sameItem(result)) {
} else if (!ItemStack.isSameItem(outstack, result)) {
return false;
} else {
return (outstack.getCount() + result.getCount() <= outstack.getMaxStackSize());
@ -301,7 +303,7 @@ public class TesselatingLoomBlockEntity extends BlockEntity implements MenuProvi
if (!remainingStack.isEmpty()) {
if (current.isEmpty()) {
inventory.set(i, remainingStack);
} else if (ItemStack.isSame(current, remainingStack) && ItemStack.matches(current, remainingStack)) {
} else if (ItemStack.matches(current, remainingStack)) {
current.grow(remainingStack.getCount());
} else {
drops.add(remainingStack);
@ -367,7 +369,7 @@ public class TesselatingLoomBlockEntity extends BlockEntity implements MenuProvi
}
public void awardUsedRecipesAndPopExperience(ServerPlayer player) {
List<Recipe<?>> list = this.getRecipesToAwardAndPopExperience(player.getLevel(), player.position());
List<Recipe<?>> list = this.getRecipesToAwardAndPopExperience(player.serverLevel(), player.position());
player.awardRecipes(list);
this.recipesUsed.clear();
}

View file

@ -1,13 +1,10 @@
package org.dimdev.dimdoors.client.screen;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.gui.GuiComponent;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.ImageButton;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent;
import net.minecraft.client.gui.screens.recipebook.RecipeUpdateListener;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Inventory;
@ -43,7 +40,7 @@ public class TesselatingLoomScreen extends AbstractContainerScreen<TessellatingC
}
public void render(PoseStack matrices, int mouseX, int mouseY, float delta) {
public void render(GuiGraphics matrices, int mouseX, int mouseY, float delta) {
this.renderBackground(matrices);
if (this.recipeBook.isVisible() && this.narrow) {
this.renderBg(matrices, delta, mouseX, mouseY);
@ -58,17 +55,14 @@ public class TesselatingLoomScreen extends AbstractContainerScreen<TessellatingC
this.recipeBook.renderTooltip(matrices, this.leftPos, this.topPos, mouseX, mouseY);
}
protected void renderBg(PoseStack matrices, float delta, int mouseX, int mouseY) {
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
RenderSystem.setShaderTexture(0, TEXTURE);
protected void renderBg(GuiGraphics matrices, float delta, int mouseX, int mouseY) {
int i = this.leftPos;
int j = (this.height - this.imageHeight) / 2;
GuiComponent.blit(matrices, i, j, 0, 0, this.imageWidth, this.imageWidth);
matrices.blit(TEXTURE, i, j, 0, 0, this.imageWidth, this.imageWidth);
if (this.menu.isWeaving()) {
int k = (this.menu).getBurnProgress(22);
GuiComponent.blit(matrices, i + 89, j + 34, 176, 0, k + 1, 16);
matrices.blit(TEXTURE, i + 89, j + 34, 176, 0, k + 1, 16);
}
}

View file

@ -55,7 +55,7 @@ public class DimTeleportCommand {
private static int teleport(Entity entity, ServerLevel dimension, Vec3 pos, Rotations angle) {
if(entity instanceof Player) {
DimensionalRegistry.getRiftRegistry().setOverworldRift(entity.getUUID(), new Location((ServerLevel) entity.getLevel(), entity.blockPosition()));
DimensionalRegistry.getRiftRegistry().setOverworldRift(entity.getUUID(), new Location((ServerLevel) entity.level(), entity.blockPosition()));
}
TeleportUtil.teleport(entity, dimension, pos, angle, entity.getDeltaMovement());
return Command.SINGLE_SUCCESS;

View file

@ -68,10 +68,10 @@ public class PocketCommand {
UUID playerUUID = commandSource.getPlayerOrException().getUUID();
if (logSetting.containsKey(playerUUID)) {
logSetting.remove(playerUUID);
commandSource.sendSuccess(Component.translatable("commands.pocket.log.creation.off"), false);
commandSource.sendSuccess(() -> Component.translatable("commands.pocket.log.creation.off"), false);
} else {
logSetting.put(playerUUID, commandSource);
commandSource.sendSuccess(Component.translatable("commands.pocket.log.creation.on"), false);
commandSource.sendSuccess(() -> Component.translatable("commands.pocket.log.creation.on"), false);
}
return Command.SINGLE_SUCCESS;
})
@ -82,7 +82,7 @@ public class PocketCommand {
literal("dump")
.requires(src -> src.hasPermission(4))
.executes(ctx -> {
ctx.getSource().sendSuccess(Component.literal("Dumping pocket data"), false);
ctx.getSource().sendSuccess(() -> Component.literal("Dumping pocket data"), false);
CompletableFuture.runAsync(() -> {
try {
PocketLoader.getInstance().dump();
@ -91,7 +91,7 @@ public class PocketCommand {
}
}).thenRun(() -> {
ctx.getSource().getServer().execute(() -> {
ctx.getSource().sendSuccess(Component.literal("Dumped pocket data"), false);
ctx.getSource().sendSuccess(() -> Component.literal("Dumped pocket data"), false);
});
});
return Command.SINGLE_SUCCESS;
@ -111,13 +111,13 @@ public class PocketCommand {
private static int place(ServerPlayer source, PocketTemplate template, BlockPlacementType blockPlacementType) throws CommandSyntaxException {
SchematicPlacer.place(
template.getSchematic(),
source.getLevel(),
source.serverLevel(),
source.blockPosition(),
blockPlacementType
);
String id = template.getId().toString();
source.displayClientMessage(Component.translatable("commands.pocket.placedSchem", id, "" + source.blockPosition().getX() + ", " + source.blockPosition().getY() + ", " + source.blockPosition().getZ(), source.level.dimension().location().toString()), true);
source.displayClientMessage(Component.translatable("commands.pocket.placedSchem", id, "" + source.blockPosition().getX() + ", " + source.blockPosition().getY() + ", " + source.blockPosition().getZ(), source.level().dimension().location().toString()), true);
return Command.SINGLE_SUCCESS;
}
}

View file

@ -45,7 +45,7 @@ public class WorldeditHelper {
}
taskAcceptor.accept(() -> {
WorldEdit.getInstance().getSessionManager().get(getSessionOwner(player)).setClipboard(new ClipboardHolder(clipboard));
source.sendSuccess(Component.translatable("commands.pocket.loadedSchem", template.getId()), true);
source.sendSuccess(() -> Component.translatable("commands.pocket.loadedSchem", template.getId()), true);
});
};
if (async) {

View file

@ -1,10 +1,7 @@
package org.dimdev.dimdoors.criteria;
import com.google.gson.JsonObject;
import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance;
import net.minecraft.advancements.critereon.DeserializationContext;
import net.minecraft.advancements.critereon.EntityPredicate;
import net.minecraft.advancements.critereon.SimpleCriterionTrigger;
import net.minecraft.advancements.critereon.*;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer;
import org.dimdev.dimdoors.DimensionalDoors;
@ -13,7 +10,7 @@ public class PocketSpawnPointSetCondition extends SimpleCriterionTrigger<PocketS
public static final ResourceLocation ID = DimensionalDoors.id("pocket_spawn_point_set");
@Override
protected Conditions createInstance(JsonObject jsonObject, EntityPredicate.Composite composite, DeserializationContext deserializationContext) {
protected Conditions createInstance(JsonObject jsonObject, ContextAwarePredicate composite, DeserializationContext deserializationContext) {
return new Conditions(composite);
}
@ -27,7 +24,7 @@ public class PocketSpawnPointSetCondition extends SimpleCriterionTrigger<PocketS
}
public static class Conditions extends AbstractCriterionTriggerInstance {
public Conditions(EntityPredicate.Composite playerPredicate) {
public Conditions(ContextAwarePredicate playerPredicate) {
super(ID, playerPredicate);
}
}

View file

@ -1,10 +1,7 @@
package org.dimdev.dimdoors.criteria;
import com.google.gson.JsonObject;
import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance;
import net.minecraft.advancements.critereon.DeserializationContext;
import net.minecraft.advancements.critereon.EntityPredicate;
import net.minecraft.advancements.critereon.SimpleCriterionTrigger;
import net.minecraft.advancements.critereon.*;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer;
import org.dimdev.dimdoors.DimensionalDoors;
@ -13,7 +10,7 @@ public class RiftTrackedCriterion extends SimpleCriterionTrigger<RiftTrackedCrit
public static final ResourceLocation ID = DimensionalDoors.id("rift_tracked");
@Override
protected Conditions createInstance(JsonObject obj, EntityPredicate.Composite playerPredicate, DeserializationContext predicateDeserializer) {
protected Conditions createInstance(JsonObject obj, ContextAwarePredicate playerPredicate, DeserializationContext predicateDeserializer) {
return new Conditions(playerPredicate);
}
@ -27,7 +24,7 @@ public class RiftTrackedCriterion extends SimpleCriterionTrigger<RiftTrackedCrit
}
public static class Conditions extends AbstractCriterionTriggerInstance {
public Conditions(EntityPredicate.Composite playerPredicate) {
public Conditions(ContextAwarePredicate playerPredicate) {
super(ID, playerPredicate);
}
}

View file

@ -16,7 +16,7 @@ public class TagBlockBreakCriteria extends SimpleCriterionTrigger<TagBlockBreakC
public static final ResourceLocation ID = DimensionalDoors.id("tag_block_break");
@Override
protected Conditions createInstance(JsonObject obj, EntityPredicate.Composite playerPredicate, DeserializationContext predicateDeserializer) {
protected Conditions createInstance(JsonObject obj, ContextAwarePredicate playerPredicate, DeserializationContext predicateDeserializer) {
return new Conditions(playerPredicate, TagKey.create(Registries.BLOCK, ResourceLocation.tryParse(obj.get("tag").getAsString())));
}
@ -32,7 +32,7 @@ public class TagBlockBreakCriteria extends SimpleCriterionTrigger<TagBlockBreakC
public static class Conditions extends AbstractCriterionTriggerInstance {
private final TagKey<Block> blockTag;
public Conditions(EntityPredicate.Composite playerPredicate, TagKey<Block> blockTag) {
public Conditions(ContextAwarePredicate playerPredicate, TagKey<Block> blockTag) {
super(ID, playerPredicate);
this.blockTag = Objects.requireNonNull(blockTag);
}

View file

@ -65,7 +65,7 @@ public class MonolithEntity extends Mob {
}
public boolean isDangerous() {
return DimensionalDoors.getConfig().getMonolithsConfig().monolithTeleportation && (ModDimensions.isLimboDimension(this.level) || DimensionalDoors.getConfig().getMonolithsConfig().dangerousLimboMonoliths);
return DimensionalDoors.getConfig().getMonolithsConfig().monolithTeleportation && (ModDimensions.isLimboDimension(this.level()) || DimensionalDoors.getConfig().getMonolithsConfig().dangerousLimboMonoliths);
}
@Override
@ -129,7 +129,7 @@ public class MonolithEntity extends Mob {
@Override
protected void customServerAiStep() {
// Remove this Monolith if it's not in Limbo or in a pocket dungeon
if (!(ModDimensions.isLimboDimension(this.level) || ModDimensions.isPocketDimension(this.level))) {
if (!(ModDimensions.isLimboDimension(this.level()) || ModDimensions.isPocketDimension(this.level()))) {
this.remove(RemovalReason.DISCARDED);
super.customServerAiStep();
return;
@ -151,7 +151,7 @@ public class MonolithEntity extends Mob {
return;
}
if (!this.level.isClientSide) {
if (!this.level().isClientSide) {
if (player.distanceTo(this) > 70) {
return;
}
@ -160,7 +160,7 @@ public class MonolithEntity extends Mob {
// Server side...
// Rapidly increase the aggro level if this Monolith can see the player
if (visibility) {
if (ModDimensions.isLimboDimension(this.level)) {
if (ModDimensions.isLimboDimension(this.level())) {
if (this.isDangerous()) {
aggro++;
} else {
@ -209,11 +209,11 @@ public class MonolithEntity extends Mob {
this.soundTime = 100;
}
if (aggroPercent > 0.70 && this.soundTime < 100) {
this.level.playSound(null, new BlockPos(new Vec3i((int) pos.x, (int) pos.y, (int) pos.z)), ModSoundEvents.TEARING.get(), SoundSource.HOSTILE, 1F, (float) (1 + this.getRandom().nextGaussian()));
this.level().playSound(null, new BlockPos(new Vec3i((int) pos.x, (int) pos.y, (int) pos.z)), ModSoundEvents.TEARING.get(), SoundSource.HOSTILE, 1F, (float) (1 + this.getRandom().nextGaussian()));
this.soundTime = 100 + this.getRandom().nextInt(75);
}
if (aggroPercent > 0.80 && this.soundTime < MAX_SOUND_COOLDOWN) {
this.level.playSound(null, new BlockPos(new Vec3i((int) pos.x, (int) pos.y, (int) pos.z)), ModSoundEvents.TEARING.get(), SoundSource.HOSTILE, 7, 1);
this.level().playSound(null, new BlockPos(new Vec3i((int) pos.x, (int) pos.y, (int) pos.z)), ModSoundEvents.TEARING.get(), SoundSource.HOSTILE, 7, 1);
this.soundTime = 250;
}
this.soundTime--;

View file

@ -36,7 +36,7 @@ public class MonolithAggroGoal extends Goal {
}
private Player getTarget() {
Player playerEntity = this.mob.level.getNearestPlayer(this.targetPredicate, this.mob, this.mob.getX(), this.mob.getEyeY(), this.mob.getZ());
Player playerEntity = this.mob.level().getNearestPlayer(this.targetPredicate, this.mob, this.mob.getX(), this.mob.getEyeY(), this.mob.getZ());
return playerEntity != null && this.mob.hasLineOfSight(playerEntity) && playerEntity.distanceTo(this.mob) < 50 ? playerEntity : null;
}
@ -96,7 +96,7 @@ public class MonolithAggroGoal extends Goal {
if (this.mob.getAggro() >= MAX_AGGRO && DimensionalDoors.getConfig().getMonolithsConfig().monolithTeleportation && !this.target.isCreative() && this.mob.isDangerous()) {
this.mob.setAggro(0);
this.target.teleportTo(this.target.getX(), this.target.getY() + 256, this.target.getZ());
this.target.level.playSound(null, new BlockPos(new Vec3i((int) this.target.position().x, (int) this.target.position().y, (int) this.target.position().z)), ModSoundEvents.CRACK.get(), SoundSource.HOSTILE, 13, 1);
this.target.level().playSound(null, new BlockPos(new Vec3i((int) this.target.position().x, (int) this.target.position().y, (int) this.target.position().z)), ModSoundEvents.CRACK.get(), SoundSource.HOSTILE, 13, 1);
this.target.awardStat(ModStats.TIMES_TELEPORTED_BY_MONOLITH);
ServerPacketHandler.get((ServerPlayer) this.target).sendPacket(new MonolithTeleportParticlesPacket());
}

View file

@ -8,10 +8,8 @@ import dev.architectury.registry.registries.DeferredRegister;
import dev.architectury.registry.registries.RegistrySupplier;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.world.item.ArmorItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.*;
import org.dimdev.dimdoors.DimensionalDoors;
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
import org.dimdev.dimdoors.entity.ModEntityTypes;
@ -118,7 +116,8 @@ public final class ModItems {
public static final Set<Item> DOOR_ITEMS = new HashSet<>();
public static final CreativeTabRegistry.TabSupplier DIMENSIONAL_DOORS = CreativeTabRegistry.create(id("dimensional_doors"), () -> new ItemStack(ModItems.RIFT_BLADE.get()));
public static DeferredRegister<CreativeModeTab> CREATIVE_TABS = DeferredRegister.create(DimensionalDoors.MOD_ID, Registries.CREATIVE_MODE_TAB);
public static final RegistrySupplier<CreativeModeTab> DIMENSIONAL_DOORS = CREATIVE_TABS.register("dimensional_doors", () -> CreativeTabRegistry.create(builder -> builder.icon(() -> new ItemStack(ModItems.RIFT_BLADE.get())).title(Component.literal("Dimensional Doors"))));
public static RegistrySupplier<Item> register(String name, Function<Item.Properties, Item> item) {
return register(name, () -> item.apply(new Item.Properties().arch$tab(DIMENSIONAL_DOORS)));
@ -128,6 +127,7 @@ public final class ModItems {
}
public static void init() {
CREATIVE_TABS.register();
REGISTRY.register();
}
}

View file

@ -89,7 +89,7 @@ public class RiftBladeItem extends SwordItem {
Vec3 added = entityVec.add(offsetDirection.scale(offsetDistance));
BlockPos teleportPosition = new BlockPos(new Vec3i((int) added.x, (int) added. y, (int) added.z));
while (world.getBlockState(teleportPosition).getMaterial().blocksMotion())
while (world.getBlockState(teleportPosition).blocksMotion())
teleportPosition = teleportPosition.above();
player.teleportTo(teleportPosition.getX(), teleportPosition.getY(), teleportPosition.getZ());
player.setYRot((float) (Math.random() * 2 * Math.PI));

View file

@ -16,6 +16,7 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.storage.loot.LootContext;
import net.minecraft.world.level.storage.loot.LootParams;
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
import net.minecraft.world.phys.BlockHitResult;
@ -65,8 +66,8 @@ public class RiftRemoverItem extends Item {
rift.setClosing(true);
world.playSound(null, player.blockPosition(), ModSoundEvents.RIFT_CLOSE.get(), SoundSource.BLOCKS, 0.6f, 1);
stack.hurtAndBreak(10, player, a -> a.broadcastBreakEvent(hand));
LootContext ctx = new LootContext.Builder((ServerLevel) world).withRandom(world.random).withParameter(LootContextParams.ORIGIN, Vec3.atCenterOf(((BlockHitResult) hit).getBlockPos())).withOptionalParameter(LootContextParams.THIS_ENTITY, player).create(LootContextParamSets.ALL_PARAMS);
((ServerLevel) world).getServer().getLootTables().get(REMOVED_RIFT_LOOT_TABLE).getRandomItems(ctx).forEach(stack1 -> {
LootParams ctx = new LootParams.Builder((ServerLevel) world).withParameter(LootContextParams.ORIGIN, Vec3.atCenterOf(((BlockHitResult) hit).getBlockPos())).withOptionalParameter(LootContextParams.THIS_ENTITY, player).create(LootContextParamSets.ALL_PARAMS);
((ServerLevel) world).getServer().getLootData().getLootTable(REMOVED_RIFT_LOOT_TABLE).getRandomItems(ctx).forEach(stack1 -> {
Containers.dropItemStack(world, ((BlockHitResult) hit).getBlockPos().getX(), ((BlockHitResult) hit).getBlockPos().getY(), ((BlockHitResult) hit).getBlockPos().getZ(), stack1);
});

View file

@ -16,6 +16,7 @@ import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import org.dimdev.dimdoors.DimensionalDoors;
import org.dimdev.dimdoors.api.util.Location;
import org.dimdev.dimdoors.api.util.RotatedLocation;
@ -46,6 +47,7 @@ public class RiftSignatureItem extends Item {
Level world = itemUsageContext.getLevel();
BlockPos pos = itemUsageContext.getClickedPos();
InteractionHand hand = itemUsageContext.getHand();
BlockState state = world.getBlockState(pos);
Direction side = itemUsageContext.getClickedFace();
BlockPlaceContext placementContext = new BlockPlaceContext(itemUsageContext);
@ -76,8 +78,8 @@ public class RiftSignatureItem extends Item {
world.playSound(null, player.blockPosition(), ModSoundEvents.RIFT_START.get(), SoundSource.BLOCKS, 0.6f, 1);
} else {
// Place a rift at the saved point
if (target.getBlockState().getBlock() != ModBlocks.DETACHED_RIFT) {
if (!target.getBlockState().getBlock().isPossibleToRespawnInThis()) {
if (target.getBlockState().getBlock() != ModBlocks.DETACHED_RIFT.get()) {
if (!target.getBlockState().getBlock().isPossibleToRespawnInThis(state)) {
player.displayClientMessage(Component.translatable("tools.target_became_block"), true);
clearSource(stack); // TODO: But is this fair? It's a rather hidden way of unbinding your signature!
return InteractionResult.FAIL;

View file

@ -15,7 +15,7 @@ import org.dimdev.dimdoors.network.packet.c2s.HitBlockWithItemC2SPacket;
public class AttackBlockCallbackListener implements InteractionEvent.LeftClickBlock {
@Override
public EventResult click(Player player, InteractionHand hand, BlockPos pos, Direction direction) {
var world = player.getLevel();
var world = player.level();
if (!world.isClientSide) return EventResult.pass();
Item item = player.getItemInHand(hand).getItem();

View file

@ -13,7 +13,7 @@ public class PocketAttackBlockCallbackListener implements InteractionEvent.LeftC
@Override
public EventResult click(Player player, InteractionHand hand, BlockPos pos, Direction direction) {
List<InteractionEvent.LeftClickBlock> applicableAddons;
var level = player.getLevel();
var level = player.level();
if (level.isClientSide) applicableAddons = PocketListenerUtil.applicableAddonsClient(InteractionEvent.LeftClickBlock.class, level, pos);
else applicableAddons = PocketListenerUtil.applicableAddons(InteractionEvent.LeftClickBlock.class, level, pos);

View file

@ -13,7 +13,7 @@ public class UseBlockCallbackListener implements InteractionEvent.RightClickBloc
@Override
public EventResult click(Player player, InteractionHand hand, BlockPos pos, Direction face) {
List<InteractionEvent.RightClickBlock> applicableAddons;
var world = player.getLevel();
var world = player.level();
if (world.isClientSide) applicableAddons = PocketListenerUtil.applicableAddonsClient(InteractionEvent.RightClickBlock.class, world, pos);
else applicableAddons = PocketListenerUtil.applicableAddons(InteractionEvent.RightClickBlock.class, world, pos);

View file

@ -13,7 +13,7 @@ public class UseItemCallbackListener implements InteractionEvent.RightClickItem
@Override
public CompoundEventResult<ItemStack> click(Player player, InteractionHand hand) {
List<InteractionEvent.RightClickItem> applicableAddons;
var world = player.getLevel();
var world = player.level();
if (world.isClientSide) applicableAddons = PocketListenerUtil.applicableAddonsClient(InteractionEvent.RightClickItem.class, world, player.blockPosition());
else applicableAddons = PocketListenerUtil.applicableAddons(InteractionEvent.RightClickItem.class, world, player.blockPosition());

View file

@ -30,7 +30,7 @@ public abstract class PlayerEntityMixin extends LivingEntity {
@Inject(method = "causeFallDamage", at = @At("HEAD"), cancellable = true)
public void handleLimboFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource, CallbackInfoReturnable<Boolean> cir) {
if (ModDimensions.isLimboDimension(level)) {
if (ModDimensions.isLimboDimension(level())) {
cir.setReturnValue(false);
}
}
@ -42,7 +42,7 @@ public abstract class PlayerEntityMixin extends LivingEntity {
@Unique
protected void doOnDeathStuff(DamageSource source, CallbackInfo ci) {
if (ModDimensions.isPocketDimension(this.level) || DimensionalDoors.getConfig().getLimboConfig().shouldUseLimbo(this.level.dimension())) {
if (ModDimensions.isPocketDimension(this.level()) || DimensionalDoors.getConfig().getLimboConfig().shouldUseLimbo(this.level().dimension())) {
((EntityAccessor) this).setRemovalReason(null);
this.dead = false;
this.setHealth(this.getMaxHealth());

View file

@ -31,7 +31,7 @@ public class ServerPlayNetworkHandlerMixin {
AABB box = player.getBoundingBox();
BlockPos blockPos = BlockPos.containing(box.minX + 1.0E-7D, box.minY + 1.0E-7D, box.minZ + 1.0E-7D);
BlockPos blockPos2 = BlockPos.containing(box.maxX - 1.0E-7D, box.maxY - 1.0E-7D, box.maxZ - 1.0E-7D);
if (player.level.hasChunksAt(blockPos, blockPos2)) {
if (player.level().hasChunksAt(blockPos, blockPos2)) {
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
boolean done = false;
@ -39,9 +39,9 @@ public class ServerPlayNetworkHandlerMixin {
for(int j = blockPos.getY(); j <= blockPos2.getY(); ++j) {
for(int k = blockPos.getZ(); k <= blockPos2.getZ(); ++k) {
mutable.set(i, j, k);
BlockState blockState = player.level.getBlockState(mutable);
BlockState blockState = player.level().getBlockState(mutable);
Block block = blockState.getBlock();
if (block instanceof AfterMoveCollidableBlock && ((AfterMoveCollidableBlock) block).onAfterMovePlayerCollision(blockState, player.getLevel(), mutable, player, player.position().subtract(firstGoodX, firstGoodY, firstGoodZ)).consumesAction()) {
if (block instanceof AfterMoveCollidableBlock && ((AfterMoveCollidableBlock) block).onAfterMovePlayerCollision(blockState, player.serverLevel(), mutable, player, player.position().subtract(firstGoodX, firstGoodY, firstGoodZ)).consumesAction()) {
done = true;
}
if (done) {

View file

@ -53,7 +53,7 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin {
@Inject(method = "tick", at = @At("HEAD"))
public void playerTickMixin(CallbackInfo ci) {
if (dimdoors_random.nextFloat() <= RANDOM_ACTION_CHANCE) {
if(ModDimensions.isLimboDimension(((Player)(Object)(this)).getLevel())) {
if(ModDimensions.isLimboDimension(((Player)(Object)(this)).level())) {
tryMakingLimboLikeOtherDimensions((Player)(Object)this);
}
}
@ -134,7 +134,7 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin {
public void checkDeathServer(DamageSource source, CallbackInfo ci) {
this.doOnDeathStuff(source, ci);
if (ci.isCancelled()) {
if (ModDimensions.isPocketDimension(this.level)) {
if (ModDimensions.isPocketDimension(this.level())) {
this.awardStat(ModStats.DEATHS_IN_POCKETS);
}
this.awardStat(ModStats.TIMES_SENT_TO_LIMBO);

View file

@ -1,15 +0,0 @@
package org.dimdev.dimdoors.mixin.accessor;
import net.minecraft.core.NonNullList;
import net.minecraft.world.inventory.CraftingContainer;
import net.minecraft.world.item.ItemStack;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(CraftingContainer.class)
public interface CraftingInventoryAccessor {
@Mutable
@Accessor("items")
void setInventory(NonNullList<ItemStack> inventory);
}

View file

@ -4,6 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.world.entity.player.Player;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@ -31,6 +32,6 @@ public abstract class InGameHudMixin{
// }
// }
@Inject(method = "render", at = @At("HEAD"), cancellable = true)
public void renderOverlayMixin(PoseStack matrices, float tickDelta, CallbackInfo ci) {
public void renderOverlayMixin(GuiGraphics guiGraphics, float partialTick, CallbackInfo ci) {
}
}

View file

@ -120,13 +120,13 @@ public class ServerPacketHandler implements ServerPacketListener {
getServer().execute(() -> {
Item item = getPlayer().getItemInHand(packet.getHand()).getItem();
if (item instanceof ExtendedItem) {
((ExtendedItem) item).onAttackBlock(getPlayer().level, getPlayer(), packet.getHand(), packet.getPos(), packet.getDirection());
((ExtendedItem) item).onAttackBlock(getPlayer().level(), getPlayer(), packet.getHand(), packet.getPos(), packet.getDirection());
}
});
}
@Override
public void onNetworkHandlerInitialized(NetworkHandlerInitializedC2SPacket packet) {
syncPocketAddonsIfNeeded(getPlayer().level, getPlayer().blockPosition());
syncPocketAddonsIfNeeded(getPlayer().level(), getPlayer().blockPosition());
}
}

View file

@ -57,7 +57,7 @@ public class MonolithAggroParticlesPacket {
int count = 10 * aggro / MAX_AGGRO;
for (int i = 1; i < count; ++i) {
//noinspection ConstantConditions
player.level.addParticle(ParticleTypes.PORTAL, player.getX() + (clientRandom.nextDouble() - 0.5D) * 3.0,
player.level().addParticle(ParticleTypes.PORTAL, player.getX() + (clientRandom.nextDouble() - 0.5D) * 3.0,
player.getY() + clientRandom.nextDouble() * player.getBbHeight() - 0.75D,
player.getZ() + (clientRandom.nextDouble() - 0.5D) * player.getBbWidth(),
(clientRandom.nextDouble() - 0.5D) * 2.0D, -clientRandom.nextDouble(),

View file

@ -8,6 +8,7 @@ import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.ChestBlockEntity;
import net.minecraft.world.level.storage.loot.LootContext;
import net.minecraft.world.level.storage.loot.LootParams;
import net.minecraft.world.level.storage.loot.LootTable;
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
@ -62,13 +63,13 @@ public class TemplateUtils {
LootTable table;
if (tile instanceof ChestBlockEntity) {
logger.debug("Now populating chest.");
table = world.getServer().getLootTables().get(DimensionalDoors.id("dungeon_chest"));
table = world.getServer().getLootData().getLootTable(DimensionalDoors.id("dungeon_chest"));
} else {
logger.debug("Now populating dispenser.");
table = world.getServer().getLootTables().get(DimensionalDoors.id("dispenser_projectiles"));
table = world.getServer().getLootData().getLootTable(DimensionalDoors.id("dispenser_projectiles"));
}
LootContext ctx = new LootContext.Builder(world).withRandom(world.random).withParameter(LootContextParams.ORIGIN, Vec3.atLowerCornerOf(tile.getBlockPos())).create(LootContextParamSets.CHEST);
table.fill(inventory, ctx);
LootParams ctx = new LootParams.Builder(world).withParameter(LootContextParams.ORIGIN, Vec3.atLowerCornerOf(tile.getBlockPos())).create(LootContextParamSets.CHEST);
table.fill(inventory, ctx, world.getSeed());
if (inventory.isEmpty()) {
logger.error(", however Inventory is: empty!");
}

View file

@ -135,7 +135,7 @@ public class ChunkGenerator extends PocketGenerator {
genWorldChunkGenerator.applyCarvers(protoRegion, genWorld.getSeed(), config, genWorld.getBiomeManager(), genWorld.structureManager(), protoChunk, carver);
ProtoChunk pChunk = ((ProtoChunk) protoChunk);
if (pChunk.getStatus() == ChunkStatus.SURFACE) pChunk.setStatus(ChunkStatus.CARVERS);
else pChunk.setStatus(ChunkStatus.LIQUID_CARVERS);
else pChunk.setStatus(ChunkStatus.CARVERS);
}
}
for (ChunkAccess protoChunk : protoChunks) {

View file

@ -142,7 +142,7 @@ public class SchematicGenerator extends LazyPocketGenerator{
Pocket pocket = DimensionalRegistry.getPocketDirectory(world.dimension()).newPocket(builder);
BlockPos origin = pocket.getOrigin();
LOGGER.info("Generating pocket from template " + templateID + " at location " + origin);
PocketCommand.logSetting.values().forEach(commandSource -> commandSource.sendSuccess(Component.translatable("commands.pocket.log.creation.generating", templateID, origin.getX(), origin.getY(), origin.getZ()), false));
PocketCommand.logSetting.values().forEach(commandSource -> commandSource.sendSuccess(() -> Component.translatable("commands.pocket.log.creation.generating", templateID, origin.getX(), origin.getY(), origin.getZ()), false));
if (pocket instanceof LazyGenerationPocket) {

View file

@ -41,27 +41,27 @@ public class EscapeTarget extends VirtualTarget implements EntityTarget { // TOD
@Override
public boolean receiveEntity(Entity entity, Vec3 relativePos, Rotations relativeAngle, Vec3 relativeVelocity) {
if (!ModDimensions.isPocketDimension(entity.level) && !(ModDimensions.isLimboDimension(entity.level))) {
if (!ModDimensions.isPocketDimension(entity.level()) && !(ModDimensions.isLimboDimension(entity.level()))) {
chat(entity, Component.translatable("rifts.destinations.escape.not_in_pocket_dim"));
return false;
}
if (ModDimensions.isLimboDimension(entity.level) && !this.canEscapeLimbo) {
if (ModDimensions.isLimboDimension(entity.level()) && !this.canEscapeLimbo) {
chat(entity, Component.translatable("rifts.destinations.escape.cannot_escape_limbo"));
return false;
}
if (entity.getLevel().isClientSide)
if (entity.level().isClientSide)
return false;
UUID uuid = entity.getUUID();
if (uuid != null) {
//Location destLoc = DimensionalRegistry.getRiftRegistry().getOverworldRift(uuid);
if (entity.level.getPlayerByUUID(uuid) == null) {
if (entity.level().getPlayerByUUID(uuid) == null) {
LOGGER.log(Level.ERROR, "Tried to get player for escape target from uuid, but player does not exist, uh oh");
return false;
}
LOGGER.log(Level.INFO, "sending player from limbo to their spawnpoint, good luck!");
Location destLoc;
if (((ServerPlayer) entity.level.getPlayerByUUID(uuid)).getRespawnPosition() != null) {
destLoc = new Location(((ServerPlayer) entity.level.getPlayerByUUID(uuid)).getRespawnDimension(), ((ServerPlayer) entity.level.getPlayerByUUID(uuid)).getRespawnPosition());
if (((ServerPlayer) entity.level().getPlayerByUUID(uuid)).getRespawnPosition() != null) {
destLoc = new Location(((ServerPlayer) entity.level().getPlayerByUUID(uuid)).getRespawnDimension(), ((ServerPlayer) entity.level().getPlayerByUUID(uuid)).getRespawnPosition());
} else {
destLoc = new Location(DimensionalDoors.getServer().overworld(), DimensionalDoors.getServer().overworld().getSharedSpawnPos());

View file

@ -78,7 +78,7 @@ public class TessellatingContainer extends RecipeBookMenu<Container> {
@Override
public boolean recipeMatches(Recipe<? super Container> recipe) {
return recipe.matches(recipeInv, playerInventory.player.level);
return recipe.matches(recipeInv, playerInventory.player.level());
}
@Override
@ -189,7 +189,7 @@ public class TessellatingContainer extends RecipeBookMenu<Container> {
@Override
protected void checkTakeAchievements(ItemStack stack) {
stack.onCraftedBy(this.player.level, this.player, this.removeCount);
stack.onCraftedBy(this.player.level(), this.player, this.removeCount);
if(this.player instanceof ServerPlayer serverPlayer && this.container instanceof TesselatingLoomBlockEntity container) container.awardUsedRecipesAndPopExperience(serverPlayer);
}
}

View file

@ -19,7 +19,7 @@ public class TwoPillarsGateway extends SchematicGateway {
//Check that the block is supported by an opaque block.
//This prevents us from building over a cliff, on the peak of a mountain,
//or the surface of the ocean or a frozen lake.
if (world.getBlockState(pos.offset(xc, -1, zc)).getMaterial().isSolid()) {
if (world.getBlockState(pos.offset(xc, -1, zc)).isSolid()) {
//Randomly choose whether to place bricks or not. The math is designed so that the
//chances of placing a block decrease as we get farther from the gateway's center.
int i = Math.abs(xc) + Math.abs(zc);

View file

@ -24,7 +24,6 @@
"WorldMixin",
"accessor.BlockEntityTypeAccessor",
"accessor.ChunkGeneratorAccessor",
"accessor.CraftingInventoryAccessor",
"accessor.DefaultParticleTypeAccessor",
"accessor.DirectionAccessor",
"accessor.EntityAccessor",

View file

@ -42,3 +42,5 @@ accessible class net/minecraft/core/particles/SimpleParticleType
accessible class net/minecraft/world/level/levelgen/structure/structures/NetherFortressPieces$NetherBridgePiece
accessible class net/minecraft/world/level/levelgen/structure/structures/NetherFortressPieces$PieceWeight
accessible method net/minecraft/world/level/block/DoorBlock playSound (Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Z)V

View file

@ -164,7 +164,7 @@ public class RelativeBlockSample implements BlockGetter, LevelWriter {
int sectionY = chunk.getSectionIndex(blockPos.getY());
LevelChunkSection section = sections[sectionY];
if (section == null) {
section = new LevelChunkSection(sectionY, world.registryAccess().registryOrThrow(Registries.BIOME));
section = new LevelChunkSection(world.registryAccess().registryOrThrow(Registries.BIOME));
sections[sectionY] = section;
}
if(section.getBlockState(x, y, z).isAir()) {

View file

@ -49,7 +49,7 @@ dependencies {
modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}"
// Remove the next line if you don't want to depend on the API
modApi "dev.architectury:architectury-fabric:${rootProject.architectury_version}"
modApi "me.shedaniel.cloth:cloth-config-fabric:10.1.105"
modApi "me.shedaniel.cloth:cloth-config-fabric:${rootProject.cloth_config}"
includeCompile("curse.maven:cardinal-components-base-${project.project.cardinal_components}:${project.cardinal_components_base}")
includeCompile("curse.maven:cardinal-components-item-${project.project.cardinal_components}:${project.cardinal_components_item}")
@ -66,10 +66,10 @@ dependencies {
includeCompile "com.github.Chocohead:Fabric-ASM:v2.3"
modApi "mcp.mobius.waila:wthit:fabric-${wthitVersion}"
modApi "lol.bai:badpackets:fabric-0.2.0"
modApi "com.sk89q.worldedit:worldedit-fabric-mc${rootProject.minecraft_version}:${rootProject.worldedit}"
// modApi "lol.bai:badpackets:fabric-4.2.0"
modApi "com.sk89q.worldedit:worldedit-fabric-mc${rootProject.world_edit_minecraft_version}:${rootProject.worldedit}"
modApi "mcp.mobius.waila:wthit:fabric-${wthitVersion}"
modApi "com.terraformersmc:modmenu:6.3.1"
modApi "com.terraformersmc:modmenu:7.2.2"
// modRuntimeOnly "me.shedaniel:RoughlyEnoughItems-fabric:$rei_version"
// modCompileOnly "me.shedaniel:RoughlyEnoughItems-api-fabric:$rei_version"

View file

@ -59,12 +59,12 @@ public class AdvancementTab implements Consumer<Consumer<Advancement>> {
.save(advancementConsumer, "dimdoors:dimdoors/string_theory");
Advancement holeInTheSky = Advancement.Builder.advancement()
.display(makeDisplay(ModItems.RIFT_CONFIGURATION_TOOL.get(), "hole_in_the_sky"))
.addCriterion("encounter_rift", new RiftTrackedCriterion.Conditions(EntityPredicate.Composite.ANY))
.addCriterion("encounter_rift", new RiftTrackedCriterion.Conditions(ContextAwarePredicate.ANY))
.parent(root)
.save(advancementConsumer, "dimdoors:dimdoors/hole_in_the_sky");
Advancement darkOstiology = Advancement.Builder.advancement()
.display(makeDisplay(BuiltInRegistries.BLOCK.get(new ResourceLocation("dimdoors:block_ag_dim_minecraft_oak_door")), "dark_ostiology"))
.addCriterion("place_door", PlacedBlockTrigger.TriggerInstance.placedBlock(BuiltInRegistries.BLOCK.get(new ResourceLocation("dimdoors:block_ag_dim_minecraft_oak_door"))))
.addCriterion("place_door", EnterBlockTrigger.TriggerInstance.entersBlock(BuiltInRegistries.BLOCK.get(new ResourceLocation("dimdoors:block_ag_dim_minecraft_oak_door"))))
.parent(holeInTheSky)
.save(advancementConsumer, "dimdoors:dimdoors/dark_ostiology");
Advancement.Builder.advancement()
@ -79,7 +79,7 @@ public class AdvancementTab implements Consumer<Consumer<Advancement>> {
.save(advancementConsumer, "dimdoors:dimdoors/home_away_from_home");
Advancement.Builder.advancement()
.display(makeDisplay(Blocks.RESPAWN_ANCHOR, "out_of_time"))
.addCriterion("spawn", new PocketSpawnPointSetCondition.Conditions(EntityPredicate.Composite.ANY))
.addCriterion("spawn", new PocketSpawnPointSetCondition.Conditions(ContextAwarePredicate.ANY))
.parent(darkOstiology)
.save(advancementConsumer, "dimdoors:dimdoors/out_of_time");
Advancement doorToAdventure = Advancement.Builder.advancement()

View file

@ -31,7 +31,7 @@ dependencies {
forge "net.minecraftforge:forge:${rootProject.forge_version}"
// Remove the next line if you don't want to depend on the API
modApi "dev.architectury:architectury-forge:${rootProject.architectury_version}"
modApi "me.shedaniel.cloth:cloth-config-forge:10.1.105"
modApi "me.shedaniel.cloth:cloth-config-forge:${rootProject.cloth_config}"
common(project(path: ":common", configuration: "namedElements")) { transitive false }
shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false }
@ -41,8 +41,8 @@ dependencies {
modApi "mcp.mobius.waila:wthit-api:forge-${wthitVersion}"
modApi "mcp.mobius.waila:wthit:forge-${wthitVersion}"
modApi "lol.bai:badpackets:forge-0.2.0"
modApi "com.sk89q.worldedit:worldedit-forge-mc${rootProject.minecraft_version}:${rootProject.worldedit}"
// modApi "lol.bai:badpackets:forge-0.4.2"
modApi "com.sk89q.worldedit:worldedit-forge-mc${rootProject.world_edit_minecraft_version}:${rootProject.worldedit}"
// modRuntimeOnly "me.shedaniel:RoughlyEnoughItems-forge:$rei_version"
// modCompileOnly "me.shedaniel:RoughlyEnoughItems-api-forge:$rei_version"

View file

@ -1,33 +1,33 @@
org.gradle.jvmargs=-Xmx4096M
minecraft_version=1.19.4
minecraft_version=1.20.1
enabled_platforms=fabric,forge
archives_base_name=dimdoors
mod_version=5.2.0
maven_group=org.dimdev
architectury_version=8.2.89
architectury_version=9.1.12
fabric_loader_version=0.14.22
fabric_api_version=0.86.1+1.19.4
fabric_api_version=0.89.0+1.20.1
forge_version=1.19.4-45.1.0
forge_version=1.20.1-47.2.1
parchment=2023.06.26
cardinal_components_version=5.1.0
wthitVersion=7.4.0
worldedit=7.3.0-SNAPSHOT
parchment=2023.09.03
cardinal_components=318449
cardinal_components_base=4160617
cardinal_components_item=4160621
cardinal_components_entity=4160620
cardinal_components_level=4160622
cardinal_components_world=4160624
cardinal_components_chunk=4160619
rei_version=11.0.644
cardinal_components_base=4547792
cardinal_components_item=4547796
cardinal_components_world=4547799
cardinal_components_chunk=4547794
wthitVersion=8.4.0
world_edit_minecraft_version=1.20
worldedit=7.3.0-SNAPSHOT
rei_version=12.0.665
cloth_config=11.1.106