Pushed for haunted
This commit is contained in:
parent
f190919593
commit
eec2d93a75
31 changed files with 2390 additions and 190 deletions
|
@ -1,71 +1,63 @@
|
||||||
package org.dimdev.dimdoors.block;
|
package org.dimdev.dimdoors.block;
|
||||||
|
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.fabricmc.api.EnvType;
|
||||||
import net.minecraft.world.level.Level;
|
import net.fabricmc.api.Environment;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import net.minecraft.block.BlockRenderType;
|
|
||||||
import net.minecraft.block.BlockState;
|
|
||||||
import net.minecraft.block.BlockWithEntity;
|
|
||||||
import net.minecraft.block.HorizontalFacingBlock;
|
|
||||||
import net.minecraft.block.entity.BlockEntity;
|
|
||||||
import net.minecraft.block.entity.BlockEntityTicker;
|
|
||||||
import net.minecraft.block.entity.BlockEntityType;
|
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.core.Direction;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.server.world.ServerWorld;
|
import net.minecraft.server.world.ServerWorld;
|
||||||
import net.minecraft.state.StateManager;
|
import net.minecraft.state.StateManager;
|
||||||
import net.minecraft.state.property.DirectionProperty;
|
|
||||||
import net.minecraft.util.BlockMirror;
|
import net.minecraft.util.BlockMirror;
|
||||||
import net.minecraft.util.BlockRotation;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.util.math.Direction;
|
|
||||||
import net.minecraft.util.shape.VoxelShape;
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
import net.minecraft.util.shape.VoxelShapes;
|
import net.minecraft.util.shape.VoxelShapes;
|
||||||
import net.minecraft.world.BlockView;
|
import net.minecraft.world.BlockView;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.level.block.BaseEntityBlock;
|
import net.minecraft.world.entity.Entity;
|
||||||
|
import net.minecraft.world.level.BlockGetter;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
|
import net.minecraft.world.level.block.*;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntityTicker;
|
import net.minecraft.world.level.block.entity.BlockEntityTicker;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||||
|
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import net.minecraft.world.level.block.state.StateDefinition;
|
||||||
import net.fabricmc.api.EnvType;
|
import net.minecraft.world.level.block.state.properties.DirectionProperty;
|
||||||
import net.fabricmc.api.Environment;
|
import net.minecraft.world.phys.shapes.Shapes;
|
||||||
|
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||||
import org.dimdev.dimdoors.block.entity.DetachedRiftBlockEntity;
|
import org.dimdev.dimdoors.block.entity.DetachedRiftBlockEntity;
|
||||||
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
|
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
|
||||||
import org.dimdev.dimdoors.block.entity.ModBlockEntityTypes;
|
import org.dimdev.dimdoors.block.entity.ModBlockEntityTypes;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
// TODO: copy over all the necessary bits from DimensionalDoorBlock
|
// TODO: copy over all the necessary bits from DimensionalDoorBlock
|
||||||
public class DimensionalPortalBlock extends Block implements RiftProvider<EntranceRiftBlockEntity> {
|
public class DimensionalPortalBlock extends Block implements RiftProvider<EntranceRiftBlockEntity> {
|
||||||
public static DirectionProperty FACING = HorizontalFacingBlock.FACING;
|
public static DirectionProperty FACING = HorizontalDirectionalBlock.FACING;
|
||||||
|
|
||||||
public DimensionalPortalBlock(Settings settings) {
|
public DimensionalPortalBlock(BlockBehaviour.Properties settings) {
|
||||||
super(settings);
|
super(settings);
|
||||||
this.setDefaultState(this.stateManager.getDefaultState().with(FACING, Direction.NORTH));
|
this.registerDefaultState(this.getStateDefinition().any().setValue(FACING, Direction.NORTH));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EntranceRiftBlockEntity getRift(World world, BlockPos pos, BlockState state) {
|
public EntranceRiftBlockEntity getRift(Level world, BlockPos pos, BlockState state) {
|
||||||
return (EntranceRiftBlockEntity) world.getBlockEntity(pos);
|
return (EntranceRiftBlockEntity) world.getBlockEntity(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public BlockEntity createBlockEntity(BlockPos pos, BlockState state) {
|
public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
|
||||||
return new EntranceRiftBlockEntity(pos, state);
|
return new EntranceRiftBlockEntity(pos, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockRenderType getRenderType(BlockState state) {
|
public RenderShape getRenderShape(BlockState state) {
|
||||||
return BlockRenderType.ENTITYBLOCK_ANIMATED;
|
return RenderShape.ENTITYBLOCK_ANIMATED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) {
|
public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) {
|
||||||
if (world.isClient) {
|
if (world.isClientSide) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,7 +65,7 @@ public class DimensionalPortalBlock extends Block implements RiftProvider<Entran
|
||||||
|
|
||||||
EntranceRiftBlockEntity rift = this.getRift(world, pos, state);
|
EntranceRiftBlockEntity rift = this.getRift(world, pos, state);
|
||||||
|
|
||||||
world.setBlockState(pos, ModBlocks.DETACHED_RIFT.getDefaultState());
|
world.setBlock(pos, ModBlocks.DETACHED_RIFT.defaultBlockState());
|
||||||
((DetachedRiftBlockEntity) world.getBlockEntity(pos)).setData(rift.getData());
|
((DetachedRiftBlockEntity) world.getBlockEntity(pos)).setData(rift.getData());
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -85,21 +77,22 @@ public class DimensionalPortalBlock extends Block implements RiftProvider<Entran
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, Rotation rotation) {
|
||||||
return state.with(FACING, rotation.rotate(state.get(FACING)));
|
return state.setValue(FACING, rotation.rotate(state.getValue(FACING)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, Mirror mirror) {
|
||||||
return state.rotate(mirror.getRotation(state.get(FACING)));
|
return state.rotate(mirror.getRotation(state.getValue(FACING)));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
|
@Override
|
||||||
|
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
|
||||||
builder.add(FACING);
|
builder.add(FACING);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VoxelShape getRaycastShape(BlockState state, BlockView world, BlockPos pos) {
|
public VoxelShape getInteractionShape(BlockState state, BlockGetter world, BlockPos pos) {
|
||||||
return VoxelShapes.fullCube();
|
return Shapes.block();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Environment(EnvType.CLIENT)
|
@Environment(EnvType.CLIENT)
|
||||||
|
@ -109,15 +102,15 @@ public class DimensionalPortalBlock extends Block implements RiftProvider<Entran
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean notify) {
|
public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) {
|
||||||
if (world.isClient) return;
|
if (world.isClientSide) return;
|
||||||
((EntranceRiftBlockEntity) world.getBlockEntity(pos)).setPortalDestination((ServerWorld) world);
|
((EntranceRiftBlockEntity) world.getBlockEntity(pos)).setPortalDestination((ServerLevel) world);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public <T extends BlockEntity> BlockEntityTicker<T> getTicker(World world, BlockState state, BlockEntityType<T> type) {
|
public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level world, BlockState state, BlockEntityType<T> type) {
|
||||||
return Dummy.checkType(type, ModBlockEntityTypes.ENTRANCE_RIFT, DimensionalPortalBlock::portalTick);
|
return Dummy.checkType(type, ModBlockEntityTypes.ENTRANCE_RIFT.get(), DimensionalPortalBlock::portalTick);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void portalTick(Level world, BlockPos pos, BlockState state, EntranceRiftBlockEntity e) {
|
private static void portalTick(Level world, BlockPos pos, BlockState state, EntranceRiftBlockEntity e) {
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package org.dimdev.dimdoors.block;
|
package org.dimdev.dimdoors.block;
|
||||||
|
|
||||||
|
import dev.architectury.core.block.ArchitecturyLiquidBlock;
|
||||||
|
import dev.architectury.core.fluid.ArchitecturyFlowingFluid;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
|
@ -8,17 +10,18 @@ import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.level.block.LiquidBlock;
|
import net.minecraft.world.level.block.LiquidBlock;
|
||||||
|
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||||
import org.dimdev.dimdoors.api.rift.target.EntityTarget;
|
import org.dimdev.dimdoors.api.rift.target.EntityTarget;
|
||||||
import org.dimdev.dimdoors.api.util.math.MathUtil;
|
import org.dimdev.dimdoors.api.util.math.MathUtil;
|
||||||
import org.dimdev.dimdoors.entity.limbo.LimboExitReason;
|
import org.dimdev.dimdoors.entity.limbo.LimboExitReason;
|
||||||
import org.dimdev.dimdoors.fluid.ModFluids;
|
import org.dimdev.dimdoors.fluid.ModFluids;
|
||||||
import org.dimdev.dimdoors.rift.targets.EscapeTarget;
|
import org.dimdev.dimdoors.rift.targets.EscapeTarget;
|
||||||
|
|
||||||
public class EternalFluidBlock extends LiquidBlock {
|
public class EternalFluidBlock extends ArchitecturyFlowingFluid {
|
||||||
private static final EntityTarget TARGET = new EscapeTarget(true);
|
private static final EntityTarget TARGET = new EscapeTarget(true);
|
||||||
|
|
||||||
public EternalFluidBlock(Block.Settings settings) {
|
public EternalFluidBlock() {
|
||||||
super(ModFluids.ETERNAL_FLUID, settings);
|
super(ModFluids.ETERNAL_FLUID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,8 +1,16 @@
|
||||||
package org.dimdev.dimdoors.block;
|
package org.dimdev.dimdoors.block;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import dev.architectury.registry.registries.DeferredRegister;
|
||||||
import java.util.Map;
|
import dev.architectury.registry.registries.RegistrySupplier;
|
||||||
|
import net.fabricmc.api.EnvType;
|
||||||
|
import net.fabricmc.api.Environment;
|
||||||
|
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap;
|
||||||
|
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
||||||
|
import net.minecraft.block.*;
|
||||||
|
import net.minecraft.client.render.RenderLayer;
|
||||||
|
import net.minecraft.core.registries.Registries;
|
||||||
|
import net.minecraft.sound.BlockSoundGroup;
|
||||||
|
import net.minecraft.world.item.BlockItem;
|
||||||
import net.minecraft.world.item.DyeColor;
|
import net.minecraft.world.item.DyeColor;
|
||||||
import net.minecraft.world.level.block.*;
|
import net.minecraft.world.level.block.*;
|
||||||
import net.minecraft.world.level.block.state.BlockBehaviour;
|
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||||
|
@ -10,74 +18,44 @@ import net.minecraft.world.level.block.state.properties.BlockSetType;
|
||||||
import net.minecraft.world.level.block.state.properties.WoodType;
|
import net.minecraft.world.level.block.state.properties.WoodType;
|
||||||
import net.minecraft.world.level.material.Material;
|
import net.minecraft.world.level.material.Material;
|
||||||
import net.minecraft.world.level.material.MaterialColor;
|
import net.minecraft.world.level.material.MaterialColor;
|
||||||
|
import org.dimdev.dimdoors.DimensionalDoors;
|
||||||
|
import org.dimdev.dimdoors.block.door.DimensionalTrapdoorBlock;
|
||||||
|
import org.dimdev.dimdoors.item.ModItems;
|
||||||
import org.dimdev.matrix.Matrix;
|
import org.dimdev.matrix.Matrix;
|
||||||
import org.dimdev.matrix.Registrar;
|
import org.dimdev.matrix.Registrar;
|
||||||
import org.dimdev.matrix.RegistryEntry;
|
import org.dimdev.matrix.RegistryEntry;
|
||||||
|
|
||||||
import net.minecraft.block.AbstractBlock;
|
import java.util.HashMap;
|
||||||
import net.minecraft.block.Block;
|
import java.util.Map;
|
||||||
import net.minecraft.block.BlockSetType;
|
import java.util.function.Supplier;
|
||||||
import net.minecraft.block.Blocks;
|
|
||||||
import net.minecraft.block.ButtonBlock;
|
|
||||||
import net.minecraft.block.DoorBlock;
|
|
||||||
import net.minecraft.block.ExperienceDroppingBlock;
|
|
||||||
import net.minecraft.block.FenceBlock;
|
|
||||||
import net.minecraft.block.FenceGateBlock;
|
|
||||||
import net.minecraft.block.LeavesBlock;
|
|
||||||
import net.minecraft.block.MapColor;
|
|
||||||
import net.minecraft.block.Material;
|
|
||||||
import net.minecraft.block.PillarBlock;
|
|
||||||
import net.minecraft.block.PointedDripstoneBlock;
|
|
||||||
import net.minecraft.block.SlabBlock;
|
|
||||||
import net.minecraft.block.StairsBlock;
|
|
||||||
import net.minecraft.block.TrapdoorBlock;
|
|
||||||
//<<<<<<< HEAD
|
|
||||||
import net.minecraft.block.WoodType;
|
|
||||||
//=======
|
|
||||||
import net.minecraft.block.WallBlock;
|
|
||||||
//>>>>>>> 9ba9cc82 (Pushed current datagen stuff I forgot to push.)
|
|
||||||
import net.minecraft.client.render.RenderLayer;
|
|
||||||
import net.minecraft.registry.Registries;
|
|
||||||
import net.minecraft.sound.BlockSoundGroup;
|
|
||||||
import net.minecraft.util.DyeColor;
|
|
||||||
|
|
||||||
import net.fabricmc.api.EnvType;
|
|
||||||
import net.fabricmc.api.Environment;
|
|
||||||
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap;
|
|
||||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
|
||||||
|
|
||||||
import org.dimdev.dimdoors.block.door.DimensionalTrapdoorBlock;
|
|
||||||
|
|
||||||
import static net.minecraft.block.Blocks.CLAY;
|
|
||||||
import static net.minecraft.block.Blocks.GRAVEL;
|
|
||||||
import static net.minecraft.block.Blocks.MUD;
|
|
||||||
import static net.minecraft.block.Blocks.OAK_LEAVES;
|
import static net.minecraft.block.Blocks.OAK_LEAVES;
|
||||||
import static net.minecraft.block.Blocks.OAK_SAPLING;
|
import static net.minecraft.block.Blocks.OAK_SAPLING;
|
||||||
import static net.minecraft.block.Blocks.STONE;
|
import static net.minecraft.block.Blocks.STONE;
|
||||||
import static net.minecraft.block.Blocks.WATER;
|
import static net.minecraft.block.Blocks.WATER;
|
||||||
import static net.minecraft.world.level.block.Blocks.CLAY;
|
import static net.minecraft.world.level.block.Blocks.*;
|
||||||
import static net.minecraft.world.level.block.Blocks.GRAVEL;
|
|
||||||
import static net.minecraft.world.level.block.Blocks.MUD;
|
|
||||||
|
|
||||||
@Registrar(element = Block.class, modid = "dimdoors")
|
@Registrar(element = Block.class, modid = "dimdoors")
|
||||||
public final class ModBlocks {
|
public final class ModBlocks {
|
||||||
public static final Map<DyeColor, Block> FABRIC_BLOCKS = new HashMap<>();
|
public static final Map<DyeColor, RegistrySupplier<Block>> FABRIC_BLOCKS = new HashMap<DyeColor, RegistrySupplier<Block>>();
|
||||||
|
|
||||||
private static final Map<DyeColor, Block> ANCIENT_FABRIC_BLOCKS = new HashMap<>();
|
private static final Map<DyeColor, RegistrySupplier<Block>> ANCIENT_FABRIC_BLOCKS = new HashMap<DyeColor, RegistrySupplier<Block>>();
|
||||||
|
|
||||||
@RegistryEntry("stone_player") public static final Block STONE_PLAYER = register(new Block(FabricBlockSettings.of(Material.STONE).strength(0.5F).nonOpaque()));
|
public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(DimensionalDoors.MOD_ID, Registries.BLOCK);
|
||||||
|
|
||||||
@RegistryEntry("gold_door") public static final Block GOLD_DOOR = register(new DoorBlock(FabricBlockSettings.of(Material.METAL, MapColor.GOLD).strength(5.0F).requiresTool().nonOpaque(), BlockSetType.IRON));
|
public static final RegistrySupplier<Block> STONE_PLAYER = register("stone_player", () -> new Block(of(Material.STONE).strength(0.5F).noOcclusion()));
|
||||||
|
|
||||||
@RegistryEntry("stone_door") public static final Block STONE_DOOR = register(new DoorBlock(FabricBlockSettings.of(Material.METAL, MapColor.OAK_TAN).strength(5.0F).requiresTool().nonOpaque(), BlockSetType.IRON));
|
public static final RegistrySupplier<Block> GOLD_DOOR = register("gold_door", () -> new DoorBlock(of(Material.METAL, MaterialColor.GOLD).strength(5.0F).requiresCorrectToolForDrops().noCollission(), BlockSetType.IRON));
|
||||||
|
|
||||||
@RegistryEntry("quartz_door") public static final Block QUARTZ_DOOR = register(new DoorBlock(FabricBlockSettings.of(Material.STONE, MapColor.OFF_WHITE).strength(5.0F).requiresTool().nonOpaque(), 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));
|
||||||
|
|
||||||
@RegistryEntry("wood_dimensional_trapdoor") public static final Block OAK_DIMENSIONAL_TRAPDOOR = register(new DimensionalTrapdoorBlock(FabricBlockSettings.copyOf(Blocks.OAK_TRAPDOOR).luminance(state -> 10), BlockSetType.OAK));
|
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));
|
||||||
|
|
||||||
@RegistryEntry("dimensional_portal") public static final Block DIMENSIONAL_PORTAL = register(new DimensionalPortalBlock(FabricBlockSettings.of(Material.AIR).collidable(false).strength(-1.0F, 3600000.0F).nonOpaque().dropsNothing().luminance(blockState -> 10)));
|
public static final RegistrySupplier<Block> OAK_DIMENSIONAL_TRAPDOOR = register("wood_dimensional_trapdoor", () -> new DimensionalTrapdoorBlock(of(Blocks.OAK_TRAPDOOR).lightLevel(state -> 10), BlockSetType.OAK));
|
||||||
|
|
||||||
@RegistryEntry("detached_rift") public static final Block DETACHED_RIFT = register(new DetachedRiftBlock(FabricBlockSettings.of(Material.AIR).strength(-1.0F, 3600000.0F).noCollision().nonOpaque()));
|
public static final RegistrySupplier<Block> DIMENSIONAL_PORTAL = register("dimensional_portal", () -> new DimensionalPortalBlock(of(Material.AIR).noCollission().strength(-1.0F, 3600000.0F).noOcclusion().dropsLike(AIR).lightLevel(blockState -> 10)));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Block> DETACHED_RIFT = register("detached_rift", () -> new DetachedRiftBlock(Setti.of(Material.AIR).strength(-1.0F, 3600000.0F).noCollision().nonOpaque()));
|
||||||
|
|
||||||
@RegistryEntry("white_fabric") public static final Block WHITE_FABRIC = registerFabric(DyeColor.WHITE);
|
@RegistryEntry("white_fabric") public static final Block WHITE_FABRIC = registerFabric(DyeColor.WHITE);
|
||||||
|
|
||||||
|
@ -143,9 +121,9 @@ public final class ModBlocks {
|
||||||
@RegistryEntry("red_ancient_fabric") public static final Block RED_ANCIENT_FABRIC = registerAncientFabric(DyeColor.RED);
|
@RegistryEntry("red_ancient_fabric") public static final Block RED_ANCIENT_FABRIC = registerAncientFabric(DyeColor.RED);
|
||||||
|
|
||||||
@RegistryEntry("black_ancient_fabric") public static final Block BLACK_ANCIENT_FABRIC = registerAncientFabric(DyeColor.BLACK);
|
@RegistryEntry("black_ancient_fabric") public static final Block BLACK_ANCIENT_FABRIC = registerAncientFabric(DyeColor.BLACK);
|
||||||
private static final BlockBehaviour.Properties UNRAVELLED_FABRIC_BLOCK_SETTINGS = BlockBehaviour.Properties.of(Material.STONE, MaterialColor.COLOR_BLACK).randomTicks().lightLevel(state -> 15).strength(0.3F, 0.3F);
|
private static final BlockBehaviour.Properties UNRAVELLED_FABRIC_BLOCK_SETTINGS = of(Material.STONE, MaterialColor.COLOR_BLACK).randomTicks().lightLevel(state -> 15).strength(0.3F, 0.3F);
|
||||||
|
|
||||||
@RegistryEntry("eternal_fluid") public static final Block ETERNAL_FLUID = register(new EternalFluidBlock(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.COLOR_RED).lightLevel(state -> 15)));
|
@RegistryEntry("eternal_fluid") public static final Block ETERNAL_FLUID = register(new EternalFluidBlock(of(Material.STONE, MaterialColor.COLOR_RED).lightLevel(state -> 15)));
|
||||||
|
|
||||||
@RegistryEntry("decayed_block") public static final Block DECAYED_BLOCK = register(new UnravelledFabricBlock(UNRAVELLED_FABRIC_BLOCK_SETTINGS));
|
@RegistryEntry("decayed_block") public static final Block DECAYED_BLOCK = register(new UnravelledFabricBlock(UNRAVELLED_FABRIC_BLOCK_SETTINGS));
|
||||||
|
|
||||||
|
@ -167,29 +145,29 @@ public final class ModBlocks {
|
||||||
public static final Block REALITY_SPONGE = new RealitySpongeBlock(UNRAVELLED_FABRIC_BLOCK_SETTINGS);
|
public static final Block REALITY_SPONGE = new RealitySpongeBlock(UNRAVELLED_FABRIC_BLOCK_SETTINGS);
|
||||||
|
|
||||||
//Decay graph filler.
|
//Decay graph filler.
|
||||||
@RegistryEntry("driftwood_wood") public static final Block DRIFTWOOD_WOOD = new PillarBlock(AbstractBlock.Settings.of(Material.WOOD, MapColor.LIGHT_GRAY).strength(2.0F).sounds(BlockSoundGroup.WOOD));
|
@RegistryEntry("driftwood_wood") public static final Block DRIFTWOOD_WOOD = new PillarBlock(of(Material.WOOD, MapColor.LIGHT_GRAY).strength(2.0F).sounds(BlockSoundGroup.WOOD));
|
||||||
@RegistryEntry("driftwood_log") public static final Block DRIFTWOOD_LOG = new PillarBlock(AbstractBlock.Settings.of(Material.WOOD, MapColor.LIGHT_GRAY).strength(2.0F).sounds(BlockSoundGroup.WOOD));
|
@RegistryEntry("driftwood_log") public static final Block DRIFTWOOD_LOG = new PillarBlock(of(Material.WOOD, MapColor.LIGHT_GRAY).strength(2.0F).sounds(BlockSoundGroup.WOOD));
|
||||||
@RegistryEntry("driftwood_planks") public static final Block DRIFTWOOD_PLANKS = new Block(AbstractBlock.Settings.of(Material.WOOD, MapColor.LIGHT_GRAY).strength(2.0F, 3.0F).sounds(BlockSoundGroup.WOOD));
|
@RegistryEntry("driftwood_planks") public static final Block DRIFTWOOD_PLANKS = new Block(of(Material.WOOD, MapColor.LIGHT_GRAY).strength(2.0F, 3.0F).sounds(BlockSoundGroup.WOOD));
|
||||||
@RegistryEntry("driftwood_leaves") public static final Block DRIFTWOOD_LEAVES = new LeavesBlock(AbstractBlock.Settings.copy(OAK_LEAVES));
|
@RegistryEntry("driftwood_leaves") public static final Block DRIFTWOOD_LEAVES = new LeavesBlock(of(OAK_LEAVES));
|
||||||
@RegistryEntry("driftwood_sapling") public static final Block DRIFTWOOD_SAPLING = new Block(AbstractBlock.Settings.copy(OAK_SAPLING));
|
@RegistryEntry("driftwood_sapling") public static final Block DRIFTWOOD_SAPLING = new Block(of(OAK_SAPLING));
|
||||||
@RegistryEntry("driftwood_fence") public static final Block DRIFTWOOD_FENCE = new FenceBlock(AbstractBlock.Settings.of(Material.WOOD, DRIFTWOOD_PLANKS.getDefaultMapColor()).strength(2.0F, 3.0F).sounds(BlockSoundGroup.WOOD));
|
@RegistryEntry("driftwood_fence") public static final Block DRIFTWOOD_FENCE = new FenceBlock(of(Material.WOOD, DRIFTWOOD_PLANKS.getDefaultMapColor()).strength(2.0F, 3.0F).sounds(BlockSoundGroup.WOOD));
|
||||||
@RegistryEntry("driftwood_gate") public static final Block DRIFTWOOD_GATE = new FenceGateBlock(AbstractBlock.Settings.of(Material.WOOD, DRIFTWOOD_PLANKS.getDefaultMapColor()).strength(2.0F, 3.0F).sounds(BlockSoundGroup.WOOD), WoodType.OAK); // TODO: add driftwood wood type
|
@RegistryEntry("driftwood_gate") public static final Block DRIFTWOOD_GATE = new FenceGateBlock(of(Material.WOOD, DRIFTWOOD_PLANKS.getDefaultMapColor()).strength(2.0F, 3.0F).sounds(BlockSoundGroup.WOOD), WoodType.OAK); // TODO: add driftwood wood type
|
||||||
@RegistryEntry("driftwood_button") public static final Block DRIFTWOOD_BUTTON = new ButtonBlock(AbstractBlock.Settings.of(Material.DECORATION, MapColor.LIGHT_GRAY).noCollision().strength(0.5F), BlockSetType.OAK, 20, true);
|
@RegistryEntry("driftwood_button") public static final Block DRIFTWOOD_BUTTON = new ButtonBlock(of(Material.DECORATION, MapColor.LIGHT_GRAY).noCollision().strength(0.5F), BlockSetType.OAK, 20, true);
|
||||||
@RegistryEntry("driftwood_slab") public static final Block DRIFTWOOD_SLAB = new SlabBlock(AbstractBlock.Settings.of(Material.WOOD, MapColor.LIGHT_GRAY));
|
@RegistryEntry("driftwood_slab") public static final Block DRIFTWOOD_SLAB = new SlabBlock(of(Material.WOOD, MapColor.LIGHT_GRAY));
|
||||||
@RegistryEntry("driftwood_stairs") public static final Block DRIFTWOOD_STAIRS = new StairsBlock(DRIFTWOOD_PLANKS.getDefaultState(), AbstractBlock.Settings.of(Material.WOOD, MapColor.LIGHT_GRAY));
|
@RegistryEntry("driftwood_stairs") public static final Block DRIFTWOOD_STAIRS = new StairsBlock(DRIFTWOOD_PLANKS.getDefaultState(), of(Material.WOOD, MapColor.LIGHT_GRAY));
|
||||||
@RegistryEntry("driftwood_door") public static final Block DRIFTWOOD_DOOR = new DoorBlock(AbstractBlock.Settings.of(Material.WOOD, DRIFTWOOD_PLANKS.getDefaultMapColor()).strength(3.0F).sounds(BlockSoundGroup.WOOD).nonOpaque(), BlockSetType.OAK);
|
@RegistryEntry("driftwood_door") public static final Block DRIFTWOOD_DOOR = new DoorBlock(of(Material.WOOD, DRIFTWOOD_PLANKS.getDefaultMapColor()).strength(3.0F).sounds(BlockSoundGroup.WOOD).nonOpaque(), BlockSetType.OAK);
|
||||||
@RegistryEntry("driftwood_trapdoor") public static final Block DRIFTWOOD_TRAPDOOR = new TrapdoorBlock(AbstractBlock.Settings.of(Material.WOOD, DRIFTWOOD_PLANKS.getDefaultMapColor()).strength(3.0F).sounds(BlockSoundGroup.WOOD).nonOpaque().allowsSpawning((state, world, pos, type) -> false), BlockSetType.OAK);
|
@RegistryEntry("driftwood_trapdoor") public static final Block DRIFTWOOD_TRAPDOOR = new TrapdoorBlock(of(Material.WOOD, DRIFTWOOD_PLANKS.getDefaultMapColor()).strength(3.0F).sounds(BlockSoundGroup.WOOD).nonOpaque().allowsSpawning((state, world, pos, type) -> false), BlockSetType.OAK);
|
||||||
|
|
||||||
@RegistryEntry("amalgam_block") public static final Block AMALGAM_BLOCK = new Block(AbstractBlock.Settings.of(Material.METAL, MapColor.LIGHT_GRAY).requiresTool().strength(5.0F, 6.0F).sounds(BlockSoundGroup.METAL));
|
@RegistryEntry("amalgam_block") public static final Block AMALGAM_BLOCK = new Block(of(Material.METAL, MapColor.LIGHT_GRAY).requiresTool().strength(5.0F, 6.0F).sounds(BlockSoundGroup.METAL));
|
||||||
@RegistryEntry("amalgam_door") public static final Block AMALGAM_DOOR = new DoorBlock(AbstractBlock.Settings.of(Material.METAL, MapColor.LIGHT_GRAY).requiresTool().strength(5.0F).sounds(BlockSoundGroup.METAL).nonOpaque(), BlockSetType.IRON);
|
@RegistryEntry("amalgam_door") public static final Block AMALGAM_DOOR = new DoorBlock(of(Material.METAL, MapColor.LIGHT_GRAY).requiresTool().strength(5.0F).sounds(BlockSoundGroup.METAL).nonOpaque(), BlockSetType.IRON);
|
||||||
@RegistryEntry("amalgam_trapdoor") public static final Block AMALGAM_TRAPDOOR = new TrapdoorBlock(AbstractBlock.Settings.of(Material.METAL).requiresTool().strength(5.0F).sounds(BlockSoundGroup.METAL).nonOpaque().allowsSpawning((state, world, pos, type) -> false), BlockSetType.IRON);
|
@RegistryEntry("amalgam_trapdoor") public static final Block AMALGAM_TRAPDOOR = new TrapdoorBlock(of(Material.METAL).requiresTool().strength(5.0F).sounds(BlockSoundGroup.METAL).nonOpaque().allowsSpawning((state, world, pos, type) -> false), BlockSetType.IRON);
|
||||||
@RegistryEntry("rust") public static final Block RUST = new Block(AbstractBlock.Settings.of(Material.WOOD));
|
@RegistryEntry("rust") public static final Block RUST = new Block(of(Material.WOOD));
|
||||||
@RegistryEntry("amalgam_slab") public static final Block AMALGAM_SLAB = createSlab(AMALGAM_BLOCK);
|
@RegistryEntry("amalgam_slab") public static final Block AMALGAM_SLAB = createSlab(AMALGAM_BLOCK);
|
||||||
@RegistryEntry("amalgam_stairs") public static final Block AMALGAM_STAIRS = createStairs(AMALGAM_BLOCK);
|
@RegistryEntry("amalgam_stairs") public static final Block AMALGAM_STAIRS = createStairs(AMALGAM_BLOCK);
|
||||||
@RegistryEntry("amalgam_ore") public static final Block AMALGAM_ORE = new DropExperienceBlock(BlockBehaviour.Properties.of(Material.STONE).requiresCorrectToolForDrops().strength(3.0F, 3.0F));
|
@RegistryEntry("amalgam_ore") public static final Block AMALGAM_ORE = new DropExperienceBlock(of(Material.STONE).requiresCorrectToolForDrops().strength(3.0F, 3.0F));
|
||||||
|
|
||||||
@RegistryEntry("clod_ore") public static final Block CLOD_ORE = new Block(BlockBehaviour.Properties.of(Material.WOOD));
|
@RegistryEntry("clod_ore") public static final Block CLOD_ORE = new Block(of(Material.WOOD));
|
||||||
@RegistryEntry("clod_block") public static final Block CLOD_BLOCK = new Block(BlockBehaviour.Properties.of(Material.WOOD));
|
@RegistryEntry("clod_block") public static final Block CLOD_BLOCK = new Block(of(Material.WOOD));
|
||||||
|
|
||||||
@RegistryEntry("gravel_fence") public static final Block GRAVEL_FENCE = createFence(GRAVEL);
|
@RegistryEntry("gravel_fence") public static final Block GRAVEL_FENCE = createFence(GRAVEL);
|
||||||
@RegistryEntry("gravel_gate") public static final Block GRAVEL_GATE = createFenceGate(GRAVEL);
|
@RegistryEntry("gravel_gate") public static final Block GRAVEL_GATE = createFenceGate(GRAVEL);
|
||||||
|
@ -198,7 +176,7 @@ public final class ModBlocks {
|
||||||
@RegistryEntry("gravel_stairs") public static final Block GRAVEL_STAIRS = createStairs(GRAVEL);
|
@RegistryEntry("gravel_stairs") public static final Block GRAVEL_STAIRS = createStairs(GRAVEL);
|
||||||
@RegistryEntry("gravel_wall") public static final Block GRAVEL_WALL = createWall(GRAVEL);
|
@RegistryEntry("gravel_wall") public static final Block GRAVEL_WALL = createWall(GRAVEL);
|
||||||
|
|
||||||
@RegistryEntry("dark_sand") public static final Block DARK_SAND = new Block(AbstractBlock.Settings.of(Material.AGGREGATE, MapColor.BLACK).strength(0.5F).sounds(BlockSoundGroup.SAND));
|
@RegistryEntry("dark_sand") public static final Block DARK_SAND = new Block(of(Material.AGGREGATE, MapColor.BLACK).strength(0.5F).sounds(BlockSoundGroup.SAND));
|
||||||
@RegistryEntry("dark_sand_fence") public static final Block DARK_SAND_FENCE = createFence(DARK_SAND);
|
@RegistryEntry("dark_sand_fence") public static final Block DARK_SAND_FENCE = createFence(DARK_SAND);
|
||||||
@RegistryEntry("dark_sand_gate") public static final Block DARK_SAND_GATE = createFenceGate(DARK_SAND);
|
@RegistryEntry("dark_sand_gate") public static final Block DARK_SAND_GATE = createFenceGate(DARK_SAND);
|
||||||
@RegistryEntry("dark_sand_button") public static final Block DARK_SAND_BUTTON = createButton(DARK_SAND);
|
@RegistryEntry("dark_sand_button") public static final Block DARK_SAND_BUTTON = createButton(DARK_SAND);
|
||||||
|
@ -245,66 +223,83 @@ public final class ModBlocks {
|
||||||
@RegistryEntry("netherrack_stairs") public static final Block NETHERRACK_STAIRS = createStairs(Blocks.NETHERRACK);
|
@RegistryEntry("netherrack_stairs") public static final Block NETHERRACK_STAIRS = createStairs(Blocks.NETHERRACK);
|
||||||
@RegistryEntry("netherrack_wall") public static final Block NETHERRACK_WALL = createWall(Blocks.NETHERRACK);
|
@RegistryEntry("netherrack_wall") public static final Block NETHERRACK_WALL = createWall(Blocks.NETHERRACK);
|
||||||
|
|
||||||
@RegistryEntry("unraveled_spike") public static final Block UNRAVELED_SPIKE = new PointedDripstoneBlock(AbstractBlock.Settings.copy(UNRAVELLED_FABRIC).luminance(state -> 0)); //TODO: make this proper class later
|
@RegistryEntry("unraveled_spike") public static final Block UNRAVELED_SPIKE = new PointedDripstoneBlock(of(UNRAVELLED_FABRIC).luminance(state -> 0)); //TODO: make this proper class later
|
||||||
@RegistryEntry("gritty_stone") public static final Block GRITTY_STONE = new Block(AbstractBlock.Settings.copy(STONE));
|
@RegistryEntry("gritty_stone") public static final Block GRITTY_STONE = new Block(of(STONE));
|
||||||
@RegistryEntry("leak") public static final Block LEAK = new Block(AbstractBlock.Settings.copy(WATER));
|
@RegistryEntry("leak") public static final Block LEAK = new Block(of(WATER));
|
||||||
|
|
||||||
private static Block register(Block block) {
|
public static void init() {
|
||||||
|
BLOCKS.register();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static RegistrySupplier<Block> registerWithoutTab(String name, Supplier<Block> block) {
|
||||||
|
return BLOCKS.register(name, block);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static RegistrySupplier<Block> registerAncientFabric(DyeColor color) {
|
||||||
|
RegistrySupplier<Block> block = register(color.getSerializedName() + "_ancient_fabric", () -> new AncientFabricBlock(color));
|
||||||
|
ANCIENT_FABRIC_BLOCKS.put(color, block);
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Block registerAncientFabric(DyeColor color) {
|
private static RegistrySupplier<Block> registerFabric(DyeColor color) {
|
||||||
Block block = new AncientFabricBlock(color);
|
RegistrySupplier<Block> block = register(color.getSerializedName() + "_fabric", () -> new AncientFabricBlock(color));
|
||||||
ANCIENT_FABRIC_BLOCKS.put(color, block);
|
|
||||||
return register(block);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Block registerFabric(DyeColor color) {
|
|
||||||
Block block = new FabricBlock(color);
|
|
||||||
FABRIC_BLOCKS.put(color, block);
|
FABRIC_BLOCKS.put(color, block);
|
||||||
return register(block);
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void init() {
|
// @Environment(EnvType.CLIENT)
|
||||||
Matrix.register(ModBlocks.class, Registries.BLOCK);
|
// public static void initClient() {
|
||||||
// DoorDataReader.read();
|
// BlockRenderLayerMap.INSTANCE.putBlocks(RenderLayer.getCutout(), ModBlocks.QUARTZ_DOOR, ModBlocks.GOLD_DOOR);
|
||||||
}
|
|
||||||
|
|
||||||
@Environment(EnvType.CLIENT)
|
|
||||||
public static void initClient() {
|
|
||||||
BlockRenderLayerMap.INSTANCE.putBlocks(RenderLayer.getCutout(), ModBlocks.QUARTZ_DOOR, ModBlocks.GOLD_DOOR);
|
|
||||||
// DoorData.DOORS.forEach(door -> BlockRenderLayerMap.INSTANCE.putBlock(door, RenderLayer.getCutout()));
|
// DoorData.DOORS.forEach(door -> BlockRenderLayerMap.INSTANCE.putBlock(door, RenderLayer.getCutout()));
|
||||||
}
|
// }
|
||||||
|
|
||||||
public static Block ancientFabricFromDye(DyeColor color) {
|
public static RegistrySupplier<Block> ancientFabricFromDye(DyeColor color) {
|
||||||
return ANCIENT_FABRIC_BLOCKS.get(color);
|
return ANCIENT_FABRIC_BLOCKS.get(color);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Block fabricFromDye(DyeColor color) {
|
public static RegistrySupplier<Block> fabricFromDye(DyeColor color) {
|
||||||
return FABRIC_BLOCKS.get(color);
|
return FABRIC_BLOCKS.get(color);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Block createFence(Block block) {
|
public static RegistrySupplier<Block> register(String name, Supplier<Block> block) {
|
||||||
return new FenceBlock(BlockBehaviour.Properties.copy(block));
|
var supplier = BLOCKS.register(name, block);
|
||||||
|
ModItems.register(name, properties -> new BlockItem(block.get(), properties));
|
||||||
|
return supplier;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Block createFenceGate(Block block) {
|
public static RegistrySupplier<Block> registerFence(String name, Block block) {
|
||||||
return new FenceGateBlock(BlockBehaviour.Properties.copy(block), WoodType.OAK); // TODO: parameterize WoodType and BlockSetType
|
return register(name, () -> new FenceBlock(of(block)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Block createButton(Block block) {
|
public static RegistrySupplier<Block> registerFenceGate(String name, Block block) {
|
||||||
return new ButtonBlock(BlockBehaviour.Properties.copy(block).noCollission().strength(0.5F), BlockSetType.STONE, 20, false);
|
return register(name, () -> new FenceGateBlock(of(block), WoodType.OAK)); // TODO: parameterize WoodType and BlockSetType
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Block createSlab(Block block) {
|
public static RegistrySupplier<Block> registerButton(String name, Block block) {
|
||||||
return new SlabBlock(BlockBehaviour.Properties.copy(block));
|
return register(name, () -> new ButtonBlock(of(block).noCollission().strength(0.5F), BlockSetType.STONE, 20, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Block createStairs(Block block) {
|
public static RegistrySupplier<Block> registerSlab(String name, Block block) {
|
||||||
return new StairBlock(block.defaultBlockState(), BlockBehaviour.Properties.copy(block));
|
return register(name, () -> new SlabBlock(of(block)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Block createWall(Block block) {
|
public static RegistrySupplier<Block> registerStairs(String name, Block block) {
|
||||||
return new WallBlock(BlockBehaviour.Properties.copy(block));
|
return register(name, () -> new StairBlock(block.defaultBlockState(), of(block)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RegistrySupplier<Block> registerWall(String name, Block block) {
|
||||||
|
return register(name, () -> new WallBlock(of(block)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static BlockBehaviour.Properties of(Material material, MaterialColor color) {
|
||||||
|
return BlockBehaviour.Properties.of(material, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static BlockBehaviour.Properties of(Material material) {
|
||||||
|
return of(material);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static BlockBehaviour.Properties of(Block block) {
|
||||||
|
return BlockBehaviour.Properties.copy(block);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,68 +1,65 @@
|
||||||
package org.dimdev.dimdoors.block.door;
|
package org.dimdev.dimdoors.block.door;
|
||||||
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.world.InteractionHand;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.world.InteractionResult;
|
||||||
import net.minecraft.block.BlockSetType;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.block.TrapdoorBlock;
|
import net.minecraft.world.level.BlockGetter;
|
||||||
import net.minecraft.block.entity.BlockEntity;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.world.level.block.TrapDoorBlock;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
import net.minecraft.fluid.Fluids;
|
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||||
import net.minecraft.sound.SoundEvent;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.util.ActionResult;
|
import net.minecraft.world.level.block.state.properties.BlockSetType;
|
||||||
import net.minecraft.util.Hand;
|
import net.minecraft.world.level.material.Fluids;
|
||||||
import net.minecraft.util.hit.BlockHitResult;
|
import net.minecraft.world.phys.BlockHitResult;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.world.phys.shapes.Shapes;
|
||||||
import net.minecraft.util.shape.VoxelShape;
|
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||||
import net.minecraft.util.shape.VoxelShapes;
|
|
||||||
import net.minecraft.world.BlockView;
|
|
||||||
import net.minecraft.world.World;
|
|
||||||
|
|
||||||
import org.dimdev.dimdoors.block.RiftProvider;
|
import org.dimdev.dimdoors.block.RiftProvider;
|
||||||
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
|
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
// TODO: Make this placeable on rifts
|
// TODO: Make this placeable on rifts
|
||||||
public class DimensionalTrapdoorBlock extends TrapdoorBlock implements RiftProvider<EntranceRiftBlockEntity> {
|
public class DimensionalTrapdoorBlock extends TrapDoorBlock implements RiftProvider<EntranceRiftBlockEntity> {
|
||||||
public DimensionalTrapdoorBlock(Block.Settings settings, BlockSetType setType) {
|
public DimensionalTrapdoorBlock(BlockBehaviour.Properties settings, BlockSetType setType) {
|
||||||
super(settings, setType);
|
super(settings, setType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) {
|
public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) {
|
||||||
if (!world.isClient && state.get(TrapdoorBlock.OPEN)) {
|
if (!world.isClientSide() && state.getValue(TrapDoorBlock.OPEN)) {
|
||||||
this.getRift(world, pos, state).teleport(entity);
|
this.getRift(world, pos, state).teleport(entity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public BlockEntity createBlockEntity(BlockPos pos, BlockState state) {
|
public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
|
||||||
return new EntranceRiftBlockEntity(pos, state);
|
return new EntranceRiftBlockEntity(pos, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
|
public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
|
||||||
state = state.cycle(OPEN);
|
state = state.cycle(OPEN);
|
||||||
world.setBlockState(pos, state, 2);
|
world.setBlock(pos, state, 2);
|
||||||
|
|
||||||
if (state.get(WATERLOGGED)) {
|
if (state.getValue(WATERLOGGED)) {
|
||||||
world.scheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world));
|
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world));
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playToggleSound(player, world, pos, state.get(OPEN));
|
this.playSound(player, world, pos, state.getValue(OPEN));
|
||||||
return ActionResult.SUCCESS;
|
return InteractionResult.SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EntranceRiftBlockEntity getRift(World world, BlockPos pos, BlockState state) {
|
public EntranceRiftBlockEntity getRift(Level world, BlockPos pos, BlockState state) {
|
||||||
return (EntranceRiftBlockEntity) world.getBlockEntity(pos);
|
return (EntranceRiftBlockEntity) world.getBlockEntity(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VoxelShape getRaycastShape(BlockState state, BlockView world, BlockPos pos) {
|
public VoxelShape getInteractionShape(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos) {
|
||||||
return VoxelShapes.fullCube();
|
return Shapes.block();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,8 +4,10 @@ import java.util.function.Function;
|
||||||
|
|
||||||
import dev.architectury.core.fluid.ArchitecturyFluidAttributes;
|
import dev.architectury.core.fluid.ArchitecturyFluidAttributes;
|
||||||
import dev.architectury.core.fluid.SimpleArchitecturyFluidAttributes;
|
import dev.architectury.core.fluid.SimpleArchitecturyFluidAttributes;
|
||||||
|
import dev.architectury.registry.registries.DeferredRegister;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.texture.Sprite;
|
import net.minecraft.client.texture.Sprite;
|
||||||
|
import net.minecraft.core.registries.Registries;
|
||||||
import net.minecraft.fluid.FlowableFluid;
|
import net.minecraft.fluid.FlowableFluid;
|
||||||
import net.minecraft.fluid.Fluid;
|
import net.minecraft.fluid.Fluid;
|
||||||
import net.minecraft.fluid.FluidState;
|
import net.minecraft.fluid.FluidState;
|
||||||
|
@ -26,9 +28,12 @@ import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
|
||||||
import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener;
|
import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener;
|
||||||
|
|
||||||
import net.minecraft.world.level.material.FlowingFluid;
|
import net.minecraft.world.level.material.FlowingFluid;
|
||||||
|
import net.minecraft.world.level.material.Fluid;
|
||||||
import org.dimdev.dimdoors.DimensionalDoors;
|
import org.dimdev.dimdoors.DimensionalDoors;
|
||||||
|
|
||||||
public class ModFluids {
|
public class ModFluids {
|
||||||
|
public static final DeferredRegister<Fluid> FLUIDS = DeferredRegister.create(DimensionalDoors.MOD_ID, Registries.FLUID);
|
||||||
|
|
||||||
public static final FlowingFluid ETERNAL_FLUID = register("dimdoors:eternal_fluid", new EternalFluid.Still());
|
public static final FlowingFluid ETERNAL_FLUID = register("dimdoors:eternal_fluid", new EternalFluid.Still());
|
||||||
public static final FlowableFluid FLOWING_ETERNAL_FLUID = register("dimdoors:flowing_eternal_fluid", new EternalFluid.Flowing());
|
public static final FlowableFluid FLOWING_ETERNAL_FLUID = register("dimdoors:flowing_eternal_fluid", new EternalFluid.Flowing());
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
package org.dimdev.dimdoors.item;
|
||||||
|
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
|
import net.minecraft.util.ActionResult;
|
||||||
|
import net.minecraft.util.Hand;
|
||||||
|
import net.minecraft.util.TypedActionResult;
|
||||||
|
import net.minecraft.util.hit.EntityHitResult;
|
||||||
|
import net.minecraft.util.hit.HitResult;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.api.util.TeleportUtil;
|
||||||
|
import org.dimdev.dimdoors.block.ModBlocks;
|
||||||
|
import org.dimdev.dimdoors.sound.ModSoundEvents;
|
||||||
|
import org.dimdev.dimdoors.world.ModDimensions;
|
||||||
|
import org.dimdev.dimdoors.world.pocket.VirtualLocation;
|
||||||
|
|
||||||
|
import static org.dimdev.dimdoors.api.util.math.MathUtil.entityEulerAngle;
|
||||||
|
|
||||||
|
public class DimensionalEraserItem extends Item {
|
||||||
|
public DimensionalEraserItem(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
|
||||||
|
ItemStack stack = player.getStackInHand(hand);
|
||||||
|
|
||||||
|
HitResult hit = RaycastHelper.raycast(player, RaycastHelper.REACH_DISTANCE, 1.0F, a -> !(a instanceof PlayerEntity));
|
||||||
|
|
||||||
|
if (hit != null && hit.getType() == HitResult.Type.ENTITY) {
|
||||||
|
if(((EntityHitResult) hit).getEntity() instanceof ServerPlayerEntity) {
|
||||||
|
BlockPos teleportPos = ((EntityHitResult) hit).getEntity().getBlockPos();
|
||||||
|
while(ModDimensions.LIMBO_DIMENSION.getBlockState(VirtualLocation.getTopPos(ModDimensions.LIMBO_DIMENSION, teleportPos.getX(), teleportPos.getZ())).getBlock() == ModBlocks.ETERNAL_FLUID) {
|
||||||
|
teleportPos = teleportPos.add(1, 0, 1);
|
||||||
|
}
|
||||||
|
TeleportUtil.teleport(((EntityHitResult) hit).getEntity(), ModDimensions.LIMBO_DIMENSION, teleportPos.withY(255), entityEulerAngle(((EntityHitResult) hit).getEntity()), ((EntityHitResult) hit).getEntity().getVelocity());
|
||||||
|
}
|
||||||
|
|
||||||
|
((EntityHitResult) hit).getEntity().remove(Entity.RemovalReason.KILLED);
|
||||||
|
player.playSound(ModSoundEvents.BLOOP, 1.0f, 1.0f);
|
||||||
|
return new TypedActionResult<>(ActionResult.SUCCESS, stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TypedActionResult<>(ActionResult.FAIL, stack);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package org.dimdev.dimdoors.item;
|
||||||
|
|
||||||
|
import net.minecraft.world.item.Item;
|
||||||
|
|
||||||
|
public interface ItemExtensions {
|
||||||
|
Item.Properties dimdoors_getSettings();
|
||||||
|
|
||||||
|
static Item.Properties getSettings(Item item) {
|
||||||
|
Item.Properties settings = ((ItemExtensions) item).dimdoors_getSettings();
|
||||||
|
return ((SettingsExtensions) settings).clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SettingsExtensions extends Cloneable {
|
||||||
|
Item.Properties clone();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
package org.dimdev.dimdoors.item;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.minecraft.world.InteractionHand;
|
||||||
|
import net.minecraft.world.InteractionResultHolder;
|
||||||
|
import net.minecraft.world.entity.player.Player;
|
||||||
|
import net.minecraft.world.item.Item;
|
||||||
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
|
import net.minecraft.world.phys.HitResult;
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import net.minecraft.client.item.TooltipContext;
|
||||||
|
import net.minecraft.client.resource.language.I18n;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.text.MutableText;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableTextContent;
|
||||||
|
import net.minecraft.util.Hand;
|
||||||
|
import net.minecraft.util.TypedActionResult;
|
||||||
|
import net.minecraft.util.hit.HitResult;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import net.fabricmc.api.Environment;
|
||||||
|
|
||||||
|
import static net.fabricmc.api.EnvType.CLIENT;
|
||||||
|
|
||||||
|
public class MaskWandItem extends Item {
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger();
|
||||||
|
|
||||||
|
public static final String ID = "rift_configuration_tool";
|
||||||
|
|
||||||
|
public MaskWandItem(Properties settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InteractionResultHolder<ItemStack> use(Level world, Player player, InteractionHand hand) {
|
||||||
|
ItemStack stack = player.getItemInHand(hand);
|
||||||
|
HitResult hit = player.pick(RaycastHelper.REACH_DISTANCE, 0, false);
|
||||||
|
|
||||||
|
if (world.isClientSide()) {
|
||||||
|
return InteractionResultHolder.fail(stack);
|
||||||
|
} else {
|
||||||
|
if(hit.getType().equals(HitResult.Type.BLOCK)) {
|
||||||
|
// MaskEntity mask = ModEntityTypes.MASK.create((ServerWorld) world, null, LiteralText.EMPTY, player, ((BlockHitResult) hit).getBlockPos(), SpawnReason.SPAWNER, true, false);
|
||||||
|
// world.spawnEntity(mask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return InteractionResultHolder.success(stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Environment(CLIENT)
|
||||||
|
public void appendTooltip(ItemStack itemStack, World world, List<Text> list, TooltipContext tooltipContext) {
|
||||||
|
if (I18n.hasTranslation(this.getTranslationKey() + ".info")) {
|
||||||
|
list.add(Text.translatable(this.getTranslationKey() + ".info"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
package org.dimdev.dimdoors.item;
|
||||||
|
|
||||||
|
import net.minecraft.item.ArmorItem;
|
||||||
|
import net.minecraft.item.ArmorMaterial;
|
||||||
|
import net.minecraft.sound.SoundEvents;
|
||||||
|
import net.minecraft.sounds.SoundEvent;
|
||||||
|
import net.minecraft.sounds.SoundEvents;
|
||||||
|
import net.minecraft.util.Lazy;
|
||||||
|
import net.minecraft.util.LazyLoadedValue;
|
||||||
|
import net.minecraft.world.item.ArmorMaterial;
|
||||||
|
import net.minecraft.world.item.crafting.Ingredient;
|
||||||
|
|
||||||
|
public enum ModArmorMaterials implements ArmorMaterial {
|
||||||
|
WORLD_THREAD(5, 15, SoundEvents.ARMOR_EQUIP_LEATHER, new LazyLoadedValue<>(() -> Ingredient.of(ModItems.WORLD_THREAD.get())), "world_thread", new int[]{1, 2, 3, 1}, 0.0F, 0.0F),
|
||||||
|
GARMENT_OF_REALITY(5, 15, SoundEvents.ARMOR_EQUIP_LEATHER, new LazyLoadedValue<>(() -> Ingredient.of(ModItems.INFRANGIBLE_FIBER.get())), "garment_of_reality", new int[]{1, 2, 3, 1}, 0.0F, 0.0F); //TODO: DEFINE TRAITS
|
||||||
|
|
||||||
|
private static final int[] BASE_DURABILITY = new int[]{13, 15, 16, 11};
|
||||||
|
private final int durabilityMultiplier;
|
||||||
|
private final int enchantability;
|
||||||
|
private final SoundEvent equipSound;
|
||||||
|
private final LazyLoadedValue<Ingredient> repairIngredient;
|
||||||
|
private final String name;
|
||||||
|
private final int[] protectionAmounts;
|
||||||
|
private final float toughness;
|
||||||
|
private final float knockbackResistance;
|
||||||
|
|
||||||
|
ModArmorMaterials(int durabilityMultiplier, int enchantability, SoundEvent equipSound, LazyLoadedValue<Ingredient> repairIngredient, String name, int[] protectionAmounts, float toughness, float knockbackResistance) {
|
||||||
|
this.durabilityMultiplier = durabilityMultiplier;
|
||||||
|
this.enchantability = enchantability;
|
||||||
|
this.equipSound = equipSound;
|
||||||
|
this.repairIngredient = repairIngredient;
|
||||||
|
this.name = name;
|
||||||
|
this.protectionAmounts = protectionAmounts;
|
||||||
|
this.toughness = toughness;
|
||||||
|
this.knockbackResistance = knockbackResistance;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDurability(ArmorItem.Type type) {
|
||||||
|
return BASE_DURABILITY[type.getEquipmentSlot().getEntitySlotId()] * this.durabilityMultiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getProtection(ArmorItem.Type type) {
|
||||||
|
return this.protectionAmounts[type.getEquipmentSlot().getEntitySlotId()];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getEnchantability() {
|
||||||
|
return this.enchantability;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SoundEvent getEquipSound() {
|
||||||
|
return this.equipSound;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Ingredient getRepairIngredient() {
|
||||||
|
return this.repairIngredient.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getToughness() {
|
||||||
|
return this.toughness;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getKnockbackResistance() {
|
||||||
|
return this.knockbackResistance;
|
||||||
|
}
|
||||||
|
}
|
314
common/src/main/java/org/dimdev/dimdoors/item/ModItems.java
Normal file
314
common/src/main/java/org/dimdev/dimdoors/item/ModItems.java
Normal file
|
@ -0,0 +1,314 @@
|
||||||
|
package org.dimdev.dimdoors.item;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
import dev.architectury.registry.CreativeTabRegistry;
|
||||||
|
import dev.architectury.registry.registries.DeferredRegister;
|
||||||
|
import dev.architectury.registry.registries.RegistrySupplier;
|
||||||
|
import net.minecraft.core.registries.Registries;
|
||||||
|
import net.minecraft.world.item.*;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
|
import org.dimdev.dimdoors.DimensionalDoors;
|
||||||
|
import org.dimdev.matrix.Matrix;
|
||||||
|
import org.dimdev.matrix.Registrar;
|
||||||
|
import org.dimdev.matrix.RegistryEntry;
|
||||||
|
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.Blocks;
|
||||||
|
import net.minecraft.item.ArmorItem;
|
||||||
|
import net.minecraft.item.BlockItem;
|
||||||
|
import net.minecraft.item.BucketItem;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemGroup;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.item.Items;
|
||||||
|
import net.minecraft.item.SpawnEggItem;
|
||||||
|
import net.minecraft.registry.Registries;
|
||||||
|
import net.minecraft.registry.Registry;
|
||||||
|
|
||||||
|
import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback;
|
||||||
|
import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.block.ModBlocks;
|
||||||
|
import org.dimdev.dimdoors.entity.ModEntityTypes;
|
||||||
|
import org.dimdev.dimdoors.fluid.ModFluids;
|
||||||
|
import org.dimdev.dimdoors.item.door.DimensionalTrapdoorItem;
|
||||||
|
import org.dimdev.dimdoors.rift.targets.RandomTarget;
|
||||||
|
import org.dimdev.dimdoors.sound.ModSoundEvents;
|
||||||
|
|
||||||
|
import static org.dimdev.dimdoors.DimensionalDoors.id;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
@Registrar(element = Item.class, modid = "dimdoors")
|
||||||
|
public final class ModItems {
|
||||||
|
// DO NOT REMOVE!!!
|
||||||
|
public static final DeferredRegister<Item> REGISTRY = DeferredRegister.create(DimensionalDoors.MOD_ID, Registries.ITEM);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> STONE_PLAYER = registerWithoutTab("stone_player", ModBlocks.STONE_PLAYER);
|
||||||
|
|
||||||
|
@RegistryEntry("quartz_door") public static final Item QUARTZ_DOOR = create(ModBlocks.QUARTZ_DOOR);
|
||||||
|
|
||||||
|
@RegistryEntry("gold_door") public static final Item GOLD_DOOR = create(ModBlocks.GOLD_DOOR);
|
||||||
|
|
||||||
|
@RegistryEntry("stone_door") public static final Item STONE_DOOR = create(ModBlocks.STONE_DOOR);
|
||||||
|
|
||||||
|
@RegistryEntry("wood_dimensional_trapdoor") public static final Item OAK_DIMENSIONAL_TRAPDOOR = create(new DimensionalTrapdoorItem(
|
||||||
|
ModBlocks.OAK_DIMENSIONAL_TRAPDOOR,
|
||||||
|
new Item.Properties().stacksTo(1),
|
||||||
|
rift -> rift.setDestination(
|
||||||
|
RandomTarget.builder()
|
||||||
|
.acceptedGroups(Collections.singleton(0))
|
||||||
|
.coordFactor(1)
|
||||||
|
.negativeDepthFactor(80)
|
||||||
|
.positiveDepthFactor(Double.MAX_VALUE)
|
||||||
|
.weightMaximum(100)
|
||||||
|
.noLink(false)
|
||||||
|
.newRiftWeight(0)
|
||||||
|
.build())
|
||||||
|
));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> WORLD_THREAD = create("world_thread", () -> new Item(new Item.Properties()));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> INFRANGIBLE_FIBER = create("infrangible_fiber", () -> new Item(new Item.Properties()));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> FRAYED_FILAMENTS = create("frayed_filament", () -> new Item(new Item.Properties()));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> RIFT_CONFIGURATION_TOOL = create("rift_configuration_tool", () -> new RiftConfigurationToolItem());
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> RIFT_BLADE = create("rift_blade", () -> new RiftBladeItem(new Item.Properties().durability(100)));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> RIFT_REMOVER = create("rift_remover", () -> new RiftRemoverItem(new Item.Properties().stacksTo(1).durability(100)));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> RIFT_SIGNATURE = create("rift_signature", () -> new RiftSignatureItem(new Item.Properties().stacksTo(1).maxDamage(1)));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> STABILIZED_RIFT_SIGNATURE = create("stabilized_rift_signature", () -> new StabilizedRiftSignatureItem(new Item.Properties().stacksTo(1).maxDamage(20)));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> RIFT_STABILIZER = create("rift_stabilizer", () -> new RiftStabilizerItem(new Item.Properties().stacksTo(1).maxDamage(6)));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> RIFT_KEY = create("rift_key", () -> new RiftKeyItem(new Item.Properties().fireproof().stacksTo(1)));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> DIMENSIONAL_ERASER = create("dimensional_eraser", () -> new DimensionalEraserItem(new Item.Properties().maxDamage(100)));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> MONOLITH_SPAWNER = new "monolith_spawner", () -> SpawnEggItem(ModEntityTypes.MONOLITH, 0xffffff, 0xffffff, new Item.Properties());
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> WORLD_THREAD_HELMET = create("world_thread_helmet", () -> new ArmorItem(ArmorItem(ModArmorMaterials.WORLD_THREAD, ArmorItem.Type.HELMET, new Item.Properties()));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> WORLD_THREAD_CHESTPLATE = create("world_thread_chestplate", () -> new ArmorItem(ModArmorMaterials.WORLD_THREAD, ArmorItem.Type.CHESTPLATE, new Item.Properties()));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> WORLD_THREAD_LEGGINGS = create("world_thread_leggings", () -> new ArmorItem(ModArmorMaterials.WORLD_THREAD, ArmorItem.Type.LEGGINGS, new Item.Properties()));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> WORLD_THREAD_BOOTS = create("world_thread_boots", () -> new ArmorItem(ModArmorMaterials.WORLD_THREAD, ArmorItem.Type.BOOTS, new Item.Properties()));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> MASK_WAND = create("mask_wand", () -> new MaskWandItem(new Item.Properties().stacksTo(100)/**/));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> STABLE_FABRIC = create("stable_fabric", () -> new Item(new Item.Properties()));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> WHITE_FABRIC = create("white_fabric", () -> ModBlocks.WHITE_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> ORANGE_FABRIC = create("orange_fabric", () -> ModBlocks.ORANGE_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> MAGENTA_FABRIC = create("magenta_fabric", () -> ModBlocks.MAGENTA_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> LIGHT_BLUE_FABRIC = create("light_blue_fabric", () -> ModBlocks.LIGHT_BLUE_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> YELLOW_FABRIC = create("yellow_fabric", () -> ModBlocks.YELLOW_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> LIME_FABRIC = create("lime_fabric", () -> ModBlocks.LIME_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> PINK_FABRIC = create("pink_fabric", () -> ModBlocks.PINK_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> GRAY_FABRIC = create("gray_fabric", () -> ModBlocks.GRAY_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> LIGHT_GRAY_FABRIC = create("light_gray_fabric", () -> ModBlocks.LIGHT_GRAY_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> CYAN_FABRIC = create("cyan_fabric", () -> ModBlocks.CYAN_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> PURPLE_FABRIC = create("purple_fabric", () -> ModBlocks.PURPLE_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> BLUE_FABRIC = create("blue_fabric", () -> ModBlocks.BLUE_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> BROWN_FABRIC = create("brown_fabric", () -> ModBlocks.BROWN_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> GREEN_FABRIC = create("green_fabric", () -> ModBlocks.GREEN_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> RED_FABRIC = create("red_fabric", () -> ModBlocks.RED_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> BLACK_FABRIC = create("black_fabric", () -> ModBlocks.BLACK_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> WHITE_ANCIENT_FABRIC = create("white_ancient_fabric", () -> ModBlocks.WHITE_ANCIENT_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> ORANGE_ANCIENT_FABRIC = create("orange_ancient_fabric", () -> ModBlocks.ORANGE_ANCIENT_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> MAGENTA_ANCIENT_FABRIC = create("magenta_ancient_fabric", () -> ModBlocks.MAGENTA_ANCIENT_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> LIGHT_BLUE_ANCIENT_FABRIC = create("light_blue_ancient_fabric", () -> ModBlocks.LIGHT_BLUE_ANCIENT_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> YELLOW_ANCIENT_FABRIC = create("yellow_ancient_fabric", () -> ModBlocks.YELLOW_ANCIENT_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> LIME_ANCIENT_FABRIC = create("lime_ancient_fabric", () -> ModBlocks.LIME_ANCIENT_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> PINK_ANCIENT_FABRIC = create("pink_ancient_fabric", () -> ModBlocks.PINK_ANCIENT_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> GRAY_ANCIENT_FABRIC = create("gray_ancient_fabric", () -> ModBlocks.GRAY_ANCIENT_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> LIGHT_GRAY_ANCIENT_FABRIC = create("light_gray_ancient_fabric", () -> ModBlocks.LIGHT_GRAY_ANCIENT_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> CYAN_ANCIENT_FABRIC = create("cyan_ancient_fabric", () -> ModBlocks.CYAN_ANCIENT_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> PURPLE_ANCIENT_FABRIC = create("purple_ancient_fabric", () -> ModBlocks.PURPLE_ANCIENT_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> BLUE_ANCIENT_FABRIC = create("blue_ancient_fabric", () -> ModBlocks.BLUE_ANCIENT_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> BROWN_ANCIENT_FABRIC = create("brown_ancient_fabric", () -> ModBlocks.BROWN_ANCIENT_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> GREEN_ANCIENT_FABRIC = create("green_ancient_fabric", () -> ModBlocks.GREEN_ANCIENT_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> RED_ANCIENT_FABRIC = create("red_ancient_fabric", () -> ModBlocks.RED_ANCIENT_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> BLACK_ANCIENT_FABRIC = create("black_ancient_fabric", () -> ModBlocks.BLACK_ANCIENT_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> DECAYED_BLOCK = createWithoutItemGroup("decayed_block", () -> ModBlocks.DECAYED_BLOCK);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> UNFOLDED_BLOCK = createWithoutItemGroup("unfolded_block", () -> ModBlocks.UNFOLDED_BLOCK);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> UNWARPED_BLOCK = createWithoutItemGroup("unwarped_block", () -> ModBlocks.UNWARPED_BLOCK);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> UNRAVELLED_BLOCK = createWithoutItemGroup("unravelled_block", () -> ModBlocks.UNRAVELLED_BLOCK);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> UNRAVELLED_FABRIC = create("unravelled_fabric", () -> ModBlocks.UNRAVELLED_FABRIC);
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> CREEPY_RECORD = create("creepy_record", () -> new net.minecraft.item.MusicDiscItem(10, ModSoundEvents.CREEPY, new Item.Properties(), 317));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> WHITE_VOID_RECORD = create("white_void_record", () -> new net.minecraft.item.MusicDiscItem(10, ModSoundEvents.WHITE_VOID, new Item.Properties(), 225));
|
||||||
|
|
||||||
|
public static final RegistrySupplier<Item> MARKING_PLATE = createWithoutItemGroup("marking_plate", () -> ModBlocks.MARKING_PLATE);
|
||||||
|
|
||||||
|
// @RegistryEntry("eternal_fluid")// public static final Item ETERNAL_FLUID = create(ModBlocks.ETERNAL_FLUID);
|
||||||
|
|
||||||
|
@RegistryEntry("eternal_fluid_bucket") public static final Item ETERNAL_FLUID_BUCKET = create(new BucketItem(ModFluids.ETERNAL_FLUID, new Item.Properties().recipeRemainder(Items.BUCKET).stacksTo(1)));
|
||||||
|
|
||||||
|
@RegistryEntry("solid_static") public static final Item SOLID_STATIC = create(ModBlocks.SOLID_STATIC);
|
||||||
|
|
||||||
|
@RegistryEntry("tesselating_loom") public static final Item TESSELATING_LOOM = create(ModBlocks.TESSELATING_LOOM);
|
||||||
|
|
||||||
|
@RegistryEntry("mask_shard") public static final Item MASK_SHARD = create(new Item(new Item.Properties()/**/));
|
||||||
|
|
||||||
|
@RegistryEntry("fuzzy_fireball") public static final Item FUZZY_FIREBALL = create(new Item(new Item.Properties()));
|
||||||
|
|
||||||
|
@RegistryEntry("fabric_of_finality") public static final Item FABRIC_OF_FINALITY = create(new Item(new Item.Properties()));
|
||||||
|
|
||||||
|
@RegistryEntry("reality_sponge") public static final Item REALITY_SPONGE = create(ModBlocks.REALITY_SPONGE);
|
||||||
|
|
||||||
|
@RegistryEntry("liminal_lint") public static final Item LIMINAL_LINT = create(new Item(new Item.Properties()));
|
||||||
|
|
||||||
|
@RegistryEntry("enduring_fibers") public static final Item ENDURING_FIBERS = create(new Item(new Item.Properties()));
|
||||||
|
|
||||||
|
@RegistryEntry("rift_pearl") public static final Item RIFT_PEARL = create(new Item(new Item.Properties()));
|
||||||
|
|
||||||
|
@RegistryEntry("fabric_of_reality") public static final Item FABRIC_OF_REALITY = create(new Item(new Item.Properties()));
|
||||||
|
|
||||||
|
@RegistryEntry("amalgam_lump") public static final Item AMALGAM_LUMP = new Item(new Item.Properties());
|
||||||
|
|
||||||
|
@RegistryEntry("clod") public static final Item CLOD = new Item(new Item.Properties());
|
||||||
|
|
||||||
|
@RegistryEntry("garment_of_reality_helmet") public static final Item GARMENT_OF_REALITY_HELMET = create(new ArmorItem(ModArmorMaterials.GARMENT_OF_REALITY, ArmorItem.Type.HELMET, new Item.Properties()));
|
||||||
|
|
||||||
|
@RegistryEntry("garment_of_reality_chestplate") public static final Item GARMENT_OF_REALITY_CHESTPLATE = create(new ArmorItem(ModArmorMaterials.GARMENT_OF_REALITY, ArmorItem.Type.CHESTPLATE, new Item.Properties()));
|
||||||
|
|
||||||
|
@RegistryEntry("garment_of_reality_leggings") public static final Item GARMENT_OF_REALITY_LEGGINGS = create(new ArmorItem(ModArmorMaterials.GARMENT_OF_REALITY, ArmorItem.Type.LEGGINGS, new Item.Properties()));
|
||||||
|
|
||||||
|
@RegistryEntry("garment_of_reality_boots") public static final Item GARMENT_OF_REALITY_BOOTS = create(new ArmorItem(ModArmorMaterials.GARMENT_OF_REALITY, ArmorItem.Type.BOOTS, new Item.Properties()));
|
||||||
|
|
||||||
|
@RegistryEntry("driftwood_log") public static final Item DRIFTWOOD_LOG = create(ModBlocks.DRIFTWOOD_LOG);
|
||||||
|
@RegistryEntry("driftwood_planks") public static final Item DRIFTWOOD_PLANKS = create(ModBlocks.DRIFTWOOD_PLANKS);
|
||||||
|
@RegistryEntry("driftwood_fence") public static final Item DRIFTWOOD_FENCE = create(ModBlocks.DRIFTWOOD_FENCE);
|
||||||
|
@RegistryEntry("driftwood_gate") public static final Item DRIFTWOOD_GATE = create(ModBlocks.DRIFTWOOD_GATE);
|
||||||
|
@RegistryEntry("driftwood_button") public static final Item DRIFTWOOD_BUTTON = create(ModBlocks.DRIFTWOOD_BUTTON);
|
||||||
|
@RegistryEntry("driftwood_slab") public static final Item DRIFTWOOD_SLAB = create(ModBlocks.DRIFTWOOD_SLAB);
|
||||||
|
@RegistryEntry("driftwood_stairs") public static final Item DRIFTWOOD_STAIRS = create(ModBlocks.DRIFTWOOD_STAIRS);
|
||||||
|
@RegistryEntry("driftwood_door") public static final Item DRIFTWOOD_DOOR = create(ModBlocks.DRIFTWOOD_DOOR);
|
||||||
|
@RegistryEntry("driftwood_trapdoor") public static final Item DRIFTWOOD_TRAPDOOR = create(ModBlocks.DRIFTWOOD_TRAPDOOR);
|
||||||
|
|
||||||
|
@RegistryEntry("amalgam_block") public static final Item AMALGAM_BLOCK = create(ModBlocks.AMALGAM_BLOCK);
|
||||||
|
@RegistryEntry("amalgam_door") public static final Item AMALGAM_DOOR = create(ModBlocks.AMALGAM_DOOR);
|
||||||
|
@RegistryEntry("amalgam_trapdoor") public static final Item AMALGAM_TRAPDOOR = create(ModBlocks.AMALGAM_TRAPDOOR);
|
||||||
|
@RegistryEntry("rust") public static final Item RUST = create(ModBlocks.RUST);
|
||||||
|
@RegistryEntry("amalgam_slab") public static final Item AMALGAM_SLAB = create(ModBlocks.AMALGAM_SLAB);
|
||||||
|
@RegistryEntry("amalgam_stairs") public static final Item AMALGAM_STAIRS = create(ModBlocks.AMALGAM_STAIRS);
|
||||||
|
@RegistryEntry("amalgam_ore") public static final Item AMALGAM_ORE = create(ModBlocks.AMALGAM_ORE);
|
||||||
|
@RegistryEntry("clod_ore") public static final Item CLOD_ORE = create(ModBlocks.CLOD_ORE);
|
||||||
|
|
||||||
|
@RegistryEntry("clod_block") public static final Item CLOD_BLOCK = create(ModBlocks.CLOD_BLOCK);
|
||||||
|
@RegistryEntry("gravel_fence") public static final Item GRAVEL_FENCE = create(ModBlocks.GRAVEL_FENCE);
|
||||||
|
@RegistryEntry("gravel_gate") public static final Item GRAVEL_GATE = create(ModBlocks.GRAVEL_GATE);
|
||||||
|
@RegistryEntry("gravel_button") public static final Item GRAVEL_BUTTON = create(ModBlocks.GRAVEL_BUTTON);
|
||||||
|
@RegistryEntry("gravel_slab") public static final Item GRAVEL_SLAB = create(ModBlocks.GRAVEL_SLAB);
|
||||||
|
@RegistryEntry("gravel_stairs") public static final Item GRAVEL_STAIRS = create(ModBlocks.GRAVEL_STAIRS);
|
||||||
|
@RegistryEntry("gravel_wall") public static final Item GRAVEL_WALL = create(ModBlocks.GRAVEL_WALL);
|
||||||
|
|
||||||
|
@RegistryEntry("dark_sand") public static final Item DARK_SAND = create(ModBlocks.DARK_SAND);
|
||||||
|
@RegistryEntry("dark_sand_fence") public static final Item DARK_SAND_FENCE = create(ModBlocks.DARK_SAND_FENCE);
|
||||||
|
@RegistryEntry("dark_sand_gate") public static final Item DARK_SAND_GATE = create(ModBlocks.DARK_SAND_GATE);
|
||||||
|
@RegistryEntry("dark_sand_button") public static final Item DARK_SAND_BUTTON = create(ModBlocks.DARK_SAND_BUTTON);
|
||||||
|
@RegistryEntry("dark_sand_slab") public static final Item DARK_SAND_SLAB = create(ModBlocks.DARK_SAND_SLAB);
|
||||||
|
@RegistryEntry("dark_sand_stairs") public static final Item DARK_SAND_STAIRS = create(ModBlocks.DARK_SAND_STAIRS);
|
||||||
|
@RegistryEntry("dark_sand_wall") public static final Item DARK_SAND_WALL = create(ModBlocks.DARK_SAND_WALL);
|
||||||
|
|
||||||
|
@RegistryEntry("clay_fence") public static final Item CLAY_FENCE = create(ModBlocks.CLAY_FENCE);
|
||||||
|
@RegistryEntry("clay_gate") public static final Item CLAY_GATE = create(ModBlocks.CLAY_GATE);
|
||||||
|
@RegistryEntry("clay_button") public static final Item CLAY_BUTTON = create(ModBlocks.CLAY_BUTTON);
|
||||||
|
@RegistryEntry("clay_slab") public static final Item CLAY_SLAB = create(ModBlocks.CLAY_SLAB);
|
||||||
|
@RegistryEntry("clay_stairs") public static final Item CLAY_STAIRS = create(ModBlocks.CLAY_STAIRS);
|
||||||
|
|
||||||
|
@RegistryEntry("mud_fence") public static final Item MUD_FENCE = create(ModBlocks.MUD_FENCE);
|
||||||
|
@RegistryEntry("mud_gate") public static final Item MUD_GATE = create(ModBlocks.MUD_GATE);
|
||||||
|
@RegistryEntry("mud_button") public static final Item MUD_BUTTON = create(ModBlocks.MUD_BUTTON);
|
||||||
|
@RegistryEntry("mud_slab") public static final Item MUD_SLAB = create(ModBlocks.MUD_SLAB);
|
||||||
|
@RegistryEntry("mud_stairs") public static final Item MUD_STAIRS = create(ModBlocks.MUD_STAIRS);
|
||||||
|
|
||||||
|
@RegistryEntry("deepslate_slab") public static final Item DEEPSLATE_SLAB = create(ModBlocks.DEEPSLATE_SLAB);
|
||||||
|
@RegistryEntry("deepslate_stairs") public static final Item DEEPSLATE_STAIRS = create(ModBlocks.DEEPSLATE_STAIRS);
|
||||||
|
@RegistryEntry("deepslate_wall") public static final Item DEEPSLATE_WALL = create(ModBlocks.DEEPSLATE_WALL);
|
||||||
|
|
||||||
|
@RegistryEntry("red_sand_slab") public static final Item RED_SAND_SLAB = create(ModBlocks.RED_SAND_SLAB);
|
||||||
|
@RegistryEntry("red_sand_stairs") public static final Item RED_SAND_STAIRS = create(ModBlocks.RED_SAND_STAIRS);
|
||||||
|
@RegistryEntry("red_sand_wall") public static final Item RED_SAND_WALL = create(ModBlocks.RED_SAND_WALL);
|
||||||
|
|
||||||
|
@RegistryEntry("sand_slab") public static final Item SAND_SLAB = create(ModBlocks.SAND_SLAB);
|
||||||
|
@RegistryEntry("sand_stairs") public static final Item SAND_STAIRS = create(ModBlocks.SAND_STAIRS);
|
||||||
|
@RegistryEntry("sand_wall") public static final Item SAND_WALL = create(ModBlocks.SAND_WALL);
|
||||||
|
|
||||||
|
@RegistryEntry("end_stone_slab") public static final Item END_STONE_SLAB = create(ModBlocks.END_STONE_SLAB);
|
||||||
|
@RegistryEntry("end_stone_stairs") public static final Item END_STONE_STAIRS = create(ModBlocks.END_STONE_STAIRS);
|
||||||
|
@RegistryEntry("end_stone_wall") public static final Item END_STONE_WALL = create(ModBlocks.END_STONE_WALL);
|
||||||
|
|
||||||
|
@RegistryEntry("netherrack_fence") public static final Item NETHERRACK_FENCE = create(ModBlocks.NETHERRACK_FENCE);
|
||||||
|
@RegistryEntry("netherrack_slab") public static final Item NETHERRACK_SLAB = create(ModBlocks.NETHERRACK_SLAB);
|
||||||
|
@RegistryEntry("netherrack_stairs") public static final Item NETHERRACK_STAIRS = create(ModBlocks.NETHERRACK_STAIRS);
|
||||||
|
@RegistryEntry("netherrack_wall") public static final Item NETHERRACK_WALL = create(ModBlocks.NETHERRACK_WALL);
|
||||||
|
|
||||||
|
@RegistryEntry("unraveled_spike") public static final Item UNRAVELED_SPIKE = create(ModBlocks.UNRAVELED_SPIKE);
|
||||||
|
@RegistryEntry("unraveled_fence") public static final Item UNRAVELED_FENCE = create(ModBlocks.UNRAVELED_FENCE);
|
||||||
|
@RegistryEntry("unraveled_gate") public static final Item UNRAVELED_GATE = create(ModBlocks.UNRAVELED_GATE);
|
||||||
|
@RegistryEntry("unraveled_button") public static final Item UNRAVELED_BUTTON = create(ModBlocks.UNRAVELED_BUTTON);
|
||||||
|
@RegistryEntry("unraveled_slab") public static final Item UNRAVELED_SLAB = create(ModBlocks.UNRAVELED_SLAB);
|
||||||
|
@RegistryEntry("unraveled_stairs") public static final Item UNRAVELED_STAIRS = create(ModBlocks.UNRAVELED_STAIRS);
|
||||||
|
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 RegistrySupplier<Item> register(String name, Function<Item.Properties, Item> item) {
|
||||||
|
return register(name, () -> item.apply(new Item.Properties().arch$tab(DIMENSIONAL_DOORS)));
|
||||||
|
}
|
||||||
|
public static RegistrySupplier<Item> register(String name, Supplier<Item> item) {
|
||||||
|
return REGISTRY.register(name, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
REGISTRY.register();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
package org.dimdev.dimdoors.item;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.entity.LivingEntity;
|
||||||
|
import net.minecraft.entity.projectile.ProjectileUtil;
|
||||||
|
import net.minecraft.util.hit.BlockHitResult;
|
||||||
|
import net.minecraft.util.hit.EntityHitResult;
|
||||||
|
import net.minecraft.util.hit.HitResult;
|
||||||
|
import net.minecraft.util.math.Box;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
import net.minecraft.world.BlockView;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.block.entity.DetachedRiftBlockEntity;
|
||||||
|
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
|
||||||
|
|
||||||
|
public final class RaycastHelper {
|
||||||
|
public static final int REACH_DISTANCE = 5;
|
||||||
|
|
||||||
|
public static boolean hitsDetachedRift(HitResult hit, BlockView world) {
|
||||||
|
return hit != null && hit.getType() == HitResult.Type.BLOCK && world.getBlockEntity(((BlockHitResult) hit).getBlockPos()) instanceof DetachedRiftBlockEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean hitsRift(HitResult hit, BlockView world) {
|
||||||
|
return hit != null && hit.getType() == HitResult.Type.BLOCK && world.getBlockEntity(((BlockHitResult) hit).getBlockPos()) instanceof RiftBlockEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean hitsLivingEntity(HitResult hit) {
|
||||||
|
return hit != null && hit.getType() == HitResult.Type.ENTITY && ((EntityHitResult) hit).getEntity() instanceof LivingEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HitResult raycast(Entity entity, double maxDistance, float tickDelta, Predicate<Entity> predicate) {
|
||||||
|
Vec3d vec3d = entity.getCameraPosVec(tickDelta);
|
||||||
|
Vec3d vec3d2 = entity.getRotationVec(tickDelta);
|
||||||
|
Vec3d vec3d3 = vec3d.add(vec3d2.x * maxDistance, vec3d2.y * maxDistance, vec3d2.z * maxDistance);
|
||||||
|
Box box = entity.getBoundingBox().stretch(vec3d2.multiply(maxDistance)).expand(1.0D, 1.0D, 1.0D);
|
||||||
|
return ProjectileUtil.raycast(entity, vec3d, vec3d3, box, predicate, maxDistance);
|
||||||
|
}
|
||||||
|
}
|
118
common/src/main/java/org/dimdev/dimdoors/item/RiftBladeItem.java
Normal file
118
common/src/main/java/org/dimdev/dimdoors/item/RiftBladeItem.java
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
package org.dimdev.dimdoors.item;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import net.minecraft.client.item.TooltipContext;
|
||||||
|
import net.minecraft.entity.LivingEntity;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.item.SwordItem;
|
||||||
|
import net.minecraft.item.ToolMaterials;
|
||||||
|
import net.minecraft.text.MutableText;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableTextContent;
|
||||||
|
import net.minecraft.util.ActionResult;
|
||||||
|
import net.minecraft.util.Hand;
|
||||||
|
import net.minecraft.util.TypedActionResult;
|
||||||
|
import net.minecraft.util.hit.BlockHitResult;
|
||||||
|
import net.minecraft.util.hit.HitResult;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
import net.minecraft.util.math.Vec3i;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import net.fabricmc.api.EnvType;
|
||||||
|
import net.fabricmc.api.Environment;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.DimensionalDoors;
|
||||||
|
import org.dimdev.dimdoors.block.DimensionalPortalBlock;
|
||||||
|
import org.dimdev.dimdoors.block.ModBlocks;
|
||||||
|
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
|
||||||
|
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
|
||||||
|
import org.dimdev.dimdoors.client.ToolTipHelper;
|
||||||
|
|
||||||
|
public class RiftBladeItem extends SwordItem {
|
||||||
|
public static final String ID = "rift_blade";
|
||||||
|
|
||||||
|
public RiftBladeItem(Settings settings) {
|
||||||
|
super(ToolMaterials.IRON, 3, -2.4F, settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Environment(EnvType.CLIENT)
|
||||||
|
@Override
|
||||||
|
public void appendTooltip(ItemStack itemStack, World world, List<Text> list, TooltipContext tooltipContext) {
|
||||||
|
ToolTipHelper.processTranslation(list, this.getTranslationKey() + ".info");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasGlint(ItemStack itemStack) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canRepair(ItemStack item, ItemStack repairingItem) {
|
||||||
|
return Objects.equals(ModItems.STABLE_FABRIC, repairingItem.getItem());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
|
||||||
|
ItemStack stack = player.getStackInHand(hand);
|
||||||
|
HitResult hit = RaycastHelper.raycast(player, 16, 0.0F, LivingEntity.class::isInstance);
|
||||||
|
|
||||||
|
if (hit == null) {
|
||||||
|
hit = RaycastHelper.raycast(player, 16, 1.0F, LivingEntity.class::isInstance);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hit == null) {
|
||||||
|
hit = player.raycast(16, 1.0F, false); //TODO: make the range of the Rift Blade configurable
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hit == null) {
|
||||||
|
hit = player.raycast(16, 0, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (world.isClient) {
|
||||||
|
if (RaycastHelper.hitsLivingEntity(hit) || RaycastHelper.hitsRift(hit, world)) {
|
||||||
|
return new TypedActionResult<>(ActionResult.SUCCESS, stack);
|
||||||
|
} else {
|
||||||
|
player.sendMessage(Text.translatable(this.getTranslationKey() + ".rift_miss"), true);
|
||||||
|
RiftBlockEntity.showRiftCoreUntil = System.currentTimeMillis() + DimensionalDoors.getConfig().getGraphicsConfig().highlightRiftCoreFor;
|
||||||
|
return new TypedActionResult<>(ActionResult.FAIL, stack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RaycastHelper.hitsLivingEntity(hit)) {
|
||||||
|
double damageMultiplier = (double) stack.getDamage() / (double) stack.getMaxDamage();
|
||||||
|
// TODO: gaussian, instead or random
|
||||||
|
double offsetDistance = Math.random() * damageMultiplier * 7 + 2; //TODO: make these offset distances configurable
|
||||||
|
double offsetRotationYaw = (Math.random() - 0.5) * damageMultiplier * 360;
|
||||||
|
|
||||||
|
Vec3d playerVec = player.getPos();
|
||||||
|
Vec3d entityVec = hit.getPos();
|
||||||
|
Vec3d offsetDirection = playerVec.subtract(entityVec).normalize();
|
||||||
|
offsetDirection = offsetDirection.rotateY((float) (offsetRotationYaw * Math.PI) / 180);
|
||||||
|
|
||||||
|
Vec3d added = entityVec.add(offsetDirection.multiply(offsetDistance));
|
||||||
|
BlockPos teleportPosition = new BlockPos(new Vec3i((int) added.x, (int) added. y, (int) added.z));
|
||||||
|
while (world.getBlockState(teleportPosition).getMaterial().blocksMovement())
|
||||||
|
teleportPosition = teleportPosition.up();
|
||||||
|
player.teleport(teleportPosition.getX(), teleportPosition.getY(), teleportPosition.getZ());
|
||||||
|
player.setYaw((float) (Math.random() * 2 * Math.PI));
|
||||||
|
|
||||||
|
stack.damage(1, player, a -> a.sendToolBreakStatus(hand));
|
||||||
|
return new TypedActionResult<>(ActionResult.SUCCESS, stack);
|
||||||
|
} else if (RaycastHelper.hitsDetachedRift(hit, world)) {
|
||||||
|
BlockHitResult blockHitResult = (BlockHitResult) hit;
|
||||||
|
BlockPos pos = blockHitResult.getBlockPos();
|
||||||
|
RiftBlockEntity rift = (RiftBlockEntity) world.getBlockEntity(blockHitResult.getBlockPos());
|
||||||
|
|
||||||
|
world.setBlockState(pos, ModBlocks.DIMENSIONAL_PORTAL.getDefaultState().with(DimensionalPortalBlock.FACING, blockHitResult.getSide()));
|
||||||
|
((EntranceRiftBlockEntity) world.getBlockEntity(pos)).setData(rift.getData());
|
||||||
|
|
||||||
|
stack.damage(1, player, a -> a.sendToolBreakStatus(hand));
|
||||||
|
return new TypedActionResult<>(ActionResult.SUCCESS, stack);
|
||||||
|
}
|
||||||
|
return new TypedActionResult<>(ActionResult.FAIL, stack);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,120 @@
|
||||||
|
package org.dimdev.dimdoors.item;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import net.minecraft.block.entity.BlockEntity;
|
||||||
|
import net.minecraft.client.item.TooltipContext;
|
||||||
|
import net.minecraft.client.resource.language.I18n;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
|
import net.minecraft.text.MutableText;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableTextContent;
|
||||||
|
import net.minecraft.util.Hand;
|
||||||
|
import net.minecraft.util.TypedActionResult;
|
||||||
|
import net.minecraft.util.hit.BlockHitResult;
|
||||||
|
import net.minecraft.util.hit.HitResult;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import net.fabricmc.api.Environment;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.api.item.ExtendedItem;
|
||||||
|
import org.dimdev.dimdoors.api.util.EntityUtils;
|
||||||
|
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
|
||||||
|
import org.dimdev.dimdoors.item.component.CounterComponent;
|
||||||
|
import org.dimdev.dimdoors.network.ServerPacketHandler;
|
||||||
|
import org.dimdev.dimdoors.rift.targets.IdMarker;
|
||||||
|
|
||||||
|
import static net.fabricmc.api.EnvType.CLIENT;
|
||||||
|
|
||||||
|
public class RiftConfigurationToolItem extends Item implements ExtendedItem {
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger();
|
||||||
|
|
||||||
|
public static final String ID = "rift_configuration_tool";
|
||||||
|
|
||||||
|
RiftConfigurationToolItem() {
|
||||||
|
super(new Item.Settings().maxCount(1).maxDamage(16));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
|
||||||
|
ItemStack stack = player.getStackInHand(hand);
|
||||||
|
HitResult hit = player.raycast(RaycastHelper.REACH_DISTANCE, 0, false);
|
||||||
|
|
||||||
|
if (world.isClient) {
|
||||||
|
return TypedActionResult.fail(stack);
|
||||||
|
} else {
|
||||||
|
CounterComponent counter = CounterComponent.get(stack);
|
||||||
|
|
||||||
|
if (RaycastHelper.hitsRift(hit, world)) {
|
||||||
|
RiftBlockEntity rift = (RiftBlockEntity) world.getBlockEntity(((BlockHitResult) hit).getBlockPos());
|
||||||
|
|
||||||
|
if (rift.getDestination() instanceof IdMarker && ((IdMarker) rift.getDestination()).getId() >= 0) {
|
||||||
|
EntityUtils.chat(player, Text.of("Id: " + ((IdMarker) rift.getDestination()).getId()));
|
||||||
|
} else {
|
||||||
|
int id = counter.increment();
|
||||||
|
|
||||||
|
ServerPacketHandler.get((ServerPlayerEntity) player).sync(stack, hand);
|
||||||
|
|
||||||
|
EntityUtils.chat(player, Text.of("Rift stripped of data and set to target id: " + id));
|
||||||
|
|
||||||
|
rift.setDestination(new IdMarker(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
return TypedActionResult.success(stack);
|
||||||
|
} else {
|
||||||
|
EntityUtils.chat(player, Text.of("Current Count: " + counter.count()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TypedActionResult.success(stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TypedActionResult<Boolean> onAttackBlock(World world, PlayerEntity player, Hand hand, BlockPos pos, Direction direction) {
|
||||||
|
if (world.isClient) {
|
||||||
|
if (player.isSneaking()) {
|
||||||
|
if (CounterComponent.get(player.getStackInHand(hand)).count() != 0 || world.getBlockEntity(pos) instanceof RiftBlockEntity) {
|
||||||
|
return TypedActionResult.success(true);
|
||||||
|
}
|
||||||
|
return TypedActionResult.fail(false);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ItemStack stack = player.getStackInHand(hand);
|
||||||
|
if (player.isSneaking()) {
|
||||||
|
BlockEntity blockEntity = world.getBlockEntity(pos);
|
||||||
|
if (blockEntity instanceof RiftBlockEntity) {
|
||||||
|
RiftBlockEntity rift = (RiftBlockEntity) blockEntity;
|
||||||
|
if (!(rift.getDestination() instanceof IdMarker) || ((IdMarker) rift.getDestination()).getId() != -1) {
|
||||||
|
rift.setDestination(new IdMarker(-1));
|
||||||
|
EntityUtils.chat(player, Text.of("Rift stripped of data and set to invalid id: -1"));
|
||||||
|
return TypedActionResult.success(false);
|
||||||
|
}
|
||||||
|
} else if (CounterComponent.get(stack).count() != 0) {
|
||||||
|
CounterComponent.get(stack).reset();
|
||||||
|
|
||||||
|
ServerPacketHandler.get((ServerPlayerEntity) player).sync(stack, hand);
|
||||||
|
|
||||||
|
EntityUtils.chat(player, Text.of("Counter has been reset."));
|
||||||
|
return TypedActionResult.success(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TypedActionResult.pass(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Environment(CLIENT)
|
||||||
|
public void appendTooltip(ItemStack itemStack, World world, List<Text> list, TooltipContext tooltipContext) {
|
||||||
|
if (I18n.hasTranslation(this.getTranslationKey() + ".info")) {
|
||||||
|
list.add(Text.translatable(this.getTranslationKey() + ".info"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
145
common/src/main/java/org/dimdev/dimdoors/item/RiftKeyItem.java
Normal file
145
common/src/main/java/org/dimdev/dimdoors/item/RiftKeyItem.java
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
package org.dimdev.dimdoors.item;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.client.item.TooltipContext;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.item.ItemUsageContext;
|
||||||
|
import net.minecraft.nbt.NbtIntArray;
|
||||||
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
|
import net.minecraft.text.MutableText;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableTextContent;
|
||||||
|
import net.minecraft.util.ActionResult;
|
||||||
|
import net.minecraft.util.Uuids;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import net.fabricmc.fabric.api.util.NbtType;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.api.util.EntityUtils;
|
||||||
|
import org.dimdev.dimdoors.api.util.Location;
|
||||||
|
import org.dimdev.dimdoors.block.RiftProvider;
|
||||||
|
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
|
||||||
|
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
|
||||||
|
import org.dimdev.dimdoors.mixin.accessor.ListTagAccessor;
|
||||||
|
import org.dimdev.dimdoors.network.ServerPacketHandler;
|
||||||
|
import org.dimdev.dimdoors.rift.registry.Rift;
|
||||||
|
import org.dimdev.dimdoors.world.level.registry.DimensionalRegistry;
|
||||||
|
|
||||||
|
public class RiftKeyItem extends Item {
|
||||||
|
public RiftKeyItem(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void appendTooltip(ItemStack stack, @Nullable World world, List<Text> tooltip, TooltipContext context) {
|
||||||
|
if (isEmpty(stack)) {
|
||||||
|
tooltip.add(Text.translatable("item.dimdoors.rift_key.no_links"));
|
||||||
|
} else if (context.isAdvanced()) {
|
||||||
|
for (UUID id : getIds(stack)) {
|
||||||
|
tooltip.add(Text.of(" " + id.toString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.appendTooltip(stack, world, tooltip, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasGlint(ItemStack stack) {
|
||||||
|
return !isEmpty(stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNbtSynced() {
|
||||||
|
return super.isNbtSynced();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMaxUseTime(ItemStack stack) {
|
||||||
|
return 30;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCraft(ItemStack stack, World world, PlayerEntity player) {
|
||||||
|
stack.setNbt(this.getDefaultStack().getNbt());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack getDefaultStack() {
|
||||||
|
ItemStack stack = super.getDefaultStack();
|
||||||
|
stack.setSubNbt("Ids", ListTagAccessor.createListTag(new ArrayList<>(), (byte) NbtType.INT_ARRAY));
|
||||||
|
return stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ActionResult useOnBlock(ItemUsageContext context) {
|
||||||
|
if (context.getWorld().isClient) {
|
||||||
|
return ActionResult.CONSUME;
|
||||||
|
}
|
||||||
|
PlayerEntity player = context.getPlayer();
|
||||||
|
BlockState state = context.getWorld().getBlockState(context.getBlockPos());
|
||||||
|
if (player != null && state.getBlock() instanceof RiftProvider && player.isSneaky()) {
|
||||||
|
RiftBlockEntity riftBlockEntity = ((RiftProvider<?>) state.getBlock()).getRift(context.getWorld(), context.getBlockPos(), state);
|
||||||
|
if (riftBlockEntity.isDetached()) {
|
||||||
|
return super.useOnBlock(context);
|
||||||
|
}
|
||||||
|
EntranceRiftBlockEntity entranceRiftBlockEntity = ((EntranceRiftBlockEntity) riftBlockEntity);
|
||||||
|
Rift rift = DimensionalRegistry.getRiftRegistry().getRift(new Location(entranceRiftBlockEntity.getWorld().getRegistryKey(), entranceRiftBlockEntity.getPos()));
|
||||||
|
if (entranceRiftBlockEntity.isLocked()) {
|
||||||
|
if (tryRemove(context.getStack(), rift.getId())) {
|
||||||
|
entranceRiftBlockEntity.setLocked(false);
|
||||||
|
entranceRiftBlockEntity.markDirty();
|
||||||
|
EntityUtils.chat(player, Text.translatable("rifts.unlocked"));
|
||||||
|
ServerPacketHandler.get((ServerPlayerEntity) player).sync(context.getStack(), context.getHand());
|
||||||
|
return ActionResult.SUCCESS;
|
||||||
|
} else {
|
||||||
|
EntityUtils.chat(player, Text.translatable("rifts.cantUnlock"));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
entranceRiftBlockEntity.setLocked(true);
|
||||||
|
add(context.getStack(), rift.getId());
|
||||||
|
entranceRiftBlockEntity.markDirty();
|
||||||
|
EntityUtils.chat(player, Text.translatable("rifts.locked"));
|
||||||
|
ServerPacketHandler.get((ServerPlayerEntity) player).sync(context.getStack(), context.getHand());
|
||||||
|
return ActionResult.SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.useOnBlock(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean tryRemove(ItemStack stack, UUID id) {
|
||||||
|
NbtIntArray arrayTag = new NbtIntArray(Uuids.toIntArray(id));
|
||||||
|
return stack.getNbt().getList("Ids", NbtType.INT_ARRAY).remove(arrayTag);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void add(ItemStack stack, UUID id) {
|
||||||
|
if (!has(stack, id)) {
|
||||||
|
stack.getOrCreateNbt().getList("Ids", NbtType.INT_ARRAY).add(new NbtIntArray(Uuids.toIntArray(id)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean has(ItemStack stack, UUID id) {
|
||||||
|
return stack.getOrCreateNbt().getList("Ids", NbtType.INT_ARRAY).contains(new NbtIntArray(Uuids.toIntArray(id)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isEmpty(ItemStack stack) {
|
||||||
|
return stack.getOrCreateNbt().getList("Ids", NbtType.INT_ARRAY).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<UUID> getIds(ItemStack stack) {
|
||||||
|
return stack.getOrCreateNbt()
|
||||||
|
.getList("Ids", NbtType.INT_ARRAY)
|
||||||
|
.stream()
|
||||||
|
.map(NbtIntArray.class::cast)
|
||||||
|
.map(NbtIntArray::getIntArray)
|
||||||
|
.map(Uuids::toUuid)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
package org.dimdev.dimdoors.item;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import net.minecraft.client.item.TooltipContext;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.loot.context.LootContext;
|
||||||
|
import net.minecraft.loot.context.LootContextParameters;
|
||||||
|
import net.minecraft.loot.context.LootContextTypes;
|
||||||
|
import net.minecraft.server.world.ServerWorld;
|
||||||
|
import net.minecraft.sound.SoundCategory;
|
||||||
|
import net.minecraft.text.MutableText;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableTextContent;
|
||||||
|
import net.minecraft.util.ActionResult;
|
||||||
|
import net.minecraft.util.Hand;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
import net.minecraft.util.ItemScatterer;
|
||||||
|
import net.minecraft.util.TypedActionResult;
|
||||||
|
import net.minecraft.util.hit.BlockHitResult;
|
||||||
|
import net.minecraft.util.hit.HitResult;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import net.fabricmc.api.EnvType;
|
||||||
|
import net.fabricmc.api.Environment;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.DimensionalDoors;
|
||||||
|
import org.dimdev.dimdoors.block.entity.DetachedRiftBlockEntity;
|
||||||
|
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
|
||||||
|
import org.dimdev.dimdoors.client.ToolTipHelper;
|
||||||
|
import org.dimdev.dimdoors.sound.ModSoundEvents;
|
||||||
|
|
||||||
|
public class RiftRemoverItem extends Item {
|
||||||
|
public static final String ID = "rift_remover";
|
||||||
|
public static final Identifier REMOVED_RIFT_LOOT_TABLE = DimensionalDoors.id("removed_rift");
|
||||||
|
|
||||||
|
public RiftRemoverItem(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Environment(EnvType.CLIENT)
|
||||||
|
@Override
|
||||||
|
public void appendTooltip(ItemStack itemStack, World world, List<Text> list, TooltipContext tooltipContext) {
|
||||||
|
ToolTipHelper.processTranslation(list, this.getTranslationKey() + ".info");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
|
||||||
|
ItemStack stack = player.getStackInHand(hand);
|
||||||
|
HitResult hit = player.raycast(RaycastHelper.REACH_DISTANCE, 0, false);
|
||||||
|
|
||||||
|
if (world.isClient) {
|
||||||
|
if (!RaycastHelper.hitsDetachedRift(hit, world)) {
|
||||||
|
player.sendMessage(Text.translatable("tools.rift_miss"), true);
|
||||||
|
RiftBlockEntity.showRiftCoreUntil = System.currentTimeMillis() + DimensionalDoors.getConfig().getGraphicsConfig().highlightRiftCoreFor;
|
||||||
|
}
|
||||||
|
return new TypedActionResult<>(ActionResult.FAIL, stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RaycastHelper.hitsDetachedRift(hit, world)) {
|
||||||
|
// casting to BlockHitResult is mostly safe since RaycastHelper#hitsDetachedRift already checks hit type
|
||||||
|
DetachedRiftBlockEntity rift = (DetachedRiftBlockEntity) world.getBlockEntity(((BlockHitResult) hit).getBlockPos());
|
||||||
|
if (!Objects.requireNonNull(rift).closing) {
|
||||||
|
rift.setClosing(true);
|
||||||
|
world.playSound(null, player.getBlockPos(), ModSoundEvents.RIFT_CLOSE, SoundCategory.BLOCKS, 0.6f, 1);
|
||||||
|
stack.damage(10, player, a -> a.sendToolBreakStatus(hand));
|
||||||
|
LootContext ctx = new LootContext.Builder((ServerWorld) world).random(world.random).parameter(LootContextParameters.ORIGIN, Vec3d.ofCenter(((BlockHitResult) hit).getBlockPos())).optionalParameter(LootContextParameters.THIS_ENTITY, player).build(LootContextTypes.GENERIC);
|
||||||
|
((ServerWorld) world).getServer().getLootManager().getTable(REMOVED_RIFT_LOOT_TABLE).generateLoot(ctx).forEach(stack1 -> {
|
||||||
|
ItemScatterer.spawn(world, ((BlockHitResult) hit).getBlockPos().getX(), ((BlockHitResult) hit).getBlockPos().getY(), ((BlockHitResult) hit).getBlockPos().getZ(), stack1);
|
||||||
|
});
|
||||||
|
|
||||||
|
player.sendMessage(Text.translatable(this.getTranslationKey() + ".closing"), true);
|
||||||
|
return new TypedActionResult<>(ActionResult.SUCCESS, stack);
|
||||||
|
} else {
|
||||||
|
player.sendMessage(Text.translatable(this.getTranslationKey() + ".already_closing"), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new TypedActionResult<>(ActionResult.FAIL, stack);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,148 @@
|
||||||
|
package org.dimdev.dimdoors.item;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import net.minecraft.client.item.TooltipContext;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.item.ItemUsageContext;
|
||||||
|
import net.minecraft.nbt.NbtCompound;
|
||||||
|
import net.minecraft.server.world.ServerWorld;
|
||||||
|
import net.minecraft.sound.SoundCategory;
|
||||||
|
import net.minecraft.text.MutableText;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableTextContent;
|
||||||
|
import net.minecraft.util.ActionResult;
|
||||||
|
import net.minecraft.util.Formatting;
|
||||||
|
import net.minecraft.util.Hand;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import net.fabricmc.api.EnvType;
|
||||||
|
import net.fabricmc.api.Environment;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.DimensionalDoors;
|
||||||
|
import org.dimdev.dimdoors.api.util.Location;
|
||||||
|
import org.dimdev.dimdoors.api.util.RotatedLocation;
|
||||||
|
import org.dimdev.dimdoors.block.ModBlocks;
|
||||||
|
import org.dimdev.dimdoors.block.entity.DetachedRiftBlockEntity;
|
||||||
|
import org.dimdev.dimdoors.client.ToolTipHelper;
|
||||||
|
import org.dimdev.dimdoors.rift.targets.RiftReference;
|
||||||
|
import org.dimdev.dimdoors.sound.ModSoundEvents;
|
||||||
|
import org.dimdev.dimdoors.world.ModDimensions;
|
||||||
|
|
||||||
|
public class RiftSignatureItem extends Item {
|
||||||
|
public static final String ID = "rift_signature";
|
||||||
|
|
||||||
|
public RiftSignatureItem(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasGlint(ItemStack stack) {
|
||||||
|
return stack.getNbt() != null && stack.getNbt().contains("destination");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ActionResult useOnBlock(@NotNull ItemUsageContext itemUsageContext) {
|
||||||
|
PlayerEntity player = itemUsageContext.getPlayer();
|
||||||
|
World world = itemUsageContext.getWorld();
|
||||||
|
BlockPos pos = itemUsageContext.getBlockPos();
|
||||||
|
Hand hand = itemUsageContext.getHand();
|
||||||
|
Direction side = itemUsageContext.getSide();
|
||||||
|
|
||||||
|
ItemPlacementContext placementContext = new ItemPlacementContext(itemUsageContext);
|
||||||
|
|
||||||
|
ItemStack stack = player.getStackInHand(hand);
|
||||||
|
pos = world.getBlockState(pos).getBlock().canReplace(world.getBlockState(pos), placementContext) ? pos : pos.offset(side);
|
||||||
|
|
||||||
|
// Fail if the player can't place a block there
|
||||||
|
if (!player.canPlaceOn(pos, side.getOpposite(), stack)) {
|
||||||
|
return ActionResult.FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (world.isClient) {
|
||||||
|
return ActionResult.SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ModDimensions.isPrivatePocketDimension(world) && !DimensionalDoors.getConfig().getPocketsConfig().canUseRiftSignatureInPrivatePockets) {
|
||||||
|
player.sendMessage(Text.translatable("tools.signature_blocked").formatted(Formatting.BLACK), true);
|
||||||
|
return ActionResult.FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
RotatedLocation target = getSource(stack);
|
||||||
|
|
||||||
|
if (target == null) {
|
||||||
|
// The link signature has not been used. Store its current target as the first location.
|
||||||
|
setSource(stack, new RotatedLocation(world.getRegistryKey(), pos, player.getYaw(), 0));
|
||||||
|
player.sendMessage(Text.translatable(this.getTranslationKey() + ".stored"), true);
|
||||||
|
world.playSound(null, player.getBlockPos(), ModSoundEvents.RIFT_START, SoundCategory.BLOCKS, 0.6f, 1);
|
||||||
|
} else {
|
||||||
|
// Place a rift at the saved point
|
||||||
|
if (target.getBlockState().getBlock() != ModBlocks.DETACHED_RIFT) {
|
||||||
|
if (!target.getBlockState().getBlock().canMobSpawnInside()) {
|
||||||
|
player.sendMessage(Text.translatable("tools.target_became_block"), true);
|
||||||
|
clearSource(stack); // TODO: But is this fair? It's a rather hidden way of unbinding your signature!
|
||||||
|
return ActionResult.FAIL;
|
||||||
|
}
|
||||||
|
World sourceWorld = DimensionalDoors.getWorld(target.world);
|
||||||
|
sourceWorld.setBlockState(target.getBlockPos(), ModBlocks.DETACHED_RIFT.getDefaultState());
|
||||||
|
DetachedRiftBlockEntity rift1 = (DetachedRiftBlockEntity) target.getBlockEntity();
|
||||||
|
rift1.setDestination(RiftReference.tryMakeRelative(target, new Location((ServerWorld) world, pos)));
|
||||||
|
rift1.register();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Place a rift at the target point
|
||||||
|
world.setBlockState(pos, ModBlocks.DETACHED_RIFT.getDefaultState());
|
||||||
|
DetachedRiftBlockEntity rift2 = (DetachedRiftBlockEntity) world.getBlockEntity(pos);
|
||||||
|
rift2.setDestination(RiftReference.tryMakeRelative(new Location((ServerWorld) world, pos), target));
|
||||||
|
rift2.register();
|
||||||
|
|
||||||
|
stack.damage(1, player, a -> {
|
||||||
|
}); // TODO: calculate damage based on position?
|
||||||
|
|
||||||
|
clearSource(stack);
|
||||||
|
player.sendMessage(Text.translatable(this.getTranslationKey() + ".created"), true);
|
||||||
|
// null = send sound to the player too, we have to do this because this code is not run client-side
|
||||||
|
world.playSound(null, player.getBlockPos(), ModSoundEvents.RIFT_END, SoundCategory.BLOCKS, 0.6f, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ActionResult.SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setSource(ItemStack itemStack, RotatedLocation destination) {
|
||||||
|
if (!itemStack.hasNbt()) itemStack.setNbt(new NbtCompound());
|
||||||
|
itemStack.getNbt().put("destination", RotatedLocation.serialize(destination));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void clearSource(ItemStack itemStack) {
|
||||||
|
if (itemStack.hasNbt()) {
|
||||||
|
itemStack.getNbt().remove("destination");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RotatedLocation getSource(ItemStack itemStack) {
|
||||||
|
if (itemStack.hasNbt() && itemStack.getNbt().contains("destination")) {
|
||||||
|
return RotatedLocation.deserialize(itemStack.getNbt().getCompound("destination"));
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Environment(EnvType.CLIENT)
|
||||||
|
public void appendTooltip(ItemStack itemStack, World world, List<Text> list, TooltipContext tooltipContext) {
|
||||||
|
RotatedLocation transform = getSource(itemStack);
|
||||||
|
if (transform != null) {
|
||||||
|
list.add(Text.translatable(this.getTranslationKey() + ".bound.info0", transform.getX(), transform.getY(), transform.getZ(), transform.getWorldId().getValue()));
|
||||||
|
list.add(Text.translatable(this.getTranslationKey() + ".bound.info1", transform.getWorldId().getValue()));
|
||||||
|
} else {
|
||||||
|
ToolTipHelper.processTranslation(list, this.getTranslationKey() + ".unbound.info");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,71 @@
|
||||||
|
package org.dimdev.dimdoors.item;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.minecraft.client.item.TooltipContext;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.sound.SoundCategory;
|
||||||
|
import net.minecraft.text.MutableText;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableTextContent;
|
||||||
|
import net.minecraft.util.ActionResult;
|
||||||
|
import net.minecraft.util.Hand;
|
||||||
|
import net.minecraft.util.TypedActionResult;
|
||||||
|
import net.minecraft.util.hit.HitResult;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Vec3i;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import net.fabricmc.api.EnvType;
|
||||||
|
import net.fabricmc.api.Environment;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.DimensionalDoors;
|
||||||
|
import org.dimdev.dimdoors.block.entity.DetachedRiftBlockEntity;
|
||||||
|
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
|
||||||
|
import org.dimdev.dimdoors.sound.ModSoundEvents;
|
||||||
|
|
||||||
|
public class RiftStabilizerItem extends Item {
|
||||||
|
public RiftStabilizerItem(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
|
||||||
|
ItemStack stack = player.getStackInHand(hand);
|
||||||
|
HitResult hit = player.raycast(RaycastHelper.REACH_DISTANCE, 0, false);
|
||||||
|
|
||||||
|
if (world.isClient) {
|
||||||
|
if (RaycastHelper.hitsDetachedRift(hit, world)) {
|
||||||
|
// TODO: not necessarily success, fix this and all other similar cases to make arm swing correct
|
||||||
|
return new TypedActionResult<>(ActionResult.SUCCESS, stack);
|
||||||
|
} else {
|
||||||
|
player.sendMessage(Text.translatable("tools.rift_miss"), true);
|
||||||
|
RiftBlockEntity.showRiftCoreUntil = System.currentTimeMillis() + DimensionalDoors.getConfig().getGraphicsConfig().highlightRiftCoreFor;
|
||||||
|
return new TypedActionResult<>(ActionResult.FAIL, stack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RaycastHelper.hitsDetachedRift(hit, world)) {
|
||||||
|
DetachedRiftBlockEntity rift = (DetachedRiftBlockEntity) world.getBlockEntity(new BlockPos(new Vec3i((int) hit.getPos().x, (int) hit.getPos().y, (int) hit.getPos().z)));
|
||||||
|
if (!rift.stabilized && !rift.closing) {
|
||||||
|
rift.setStabilized(true);
|
||||||
|
world.playSound(null, player.getBlockPos(), ModSoundEvents.RIFT_CLOSE, SoundCategory.BLOCKS, 0.6f, 1); // TODO: different sound
|
||||||
|
stack.damage(1, player, a -> {
|
||||||
|
});
|
||||||
|
player.sendMessage(Text.translatable(this.getTranslationKey() + ".stabilized"), true);
|
||||||
|
return new TypedActionResult<>(ActionResult.SUCCESS, stack);
|
||||||
|
} else {
|
||||||
|
player.sendMessage(Text.translatable(this.getTranslationKey() + ".already_stabilized"), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new TypedActionResult<>(ActionResult.FAIL, stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Environment(EnvType.CLIENT)
|
||||||
|
@Override
|
||||||
|
public void appendTooltip(ItemStack itemStack, World world, List<Text> list, TooltipContext tooltipContext) {
|
||||||
|
list.add(Text.translatable(this.getTranslationKey() + ".info"));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,116 @@
|
||||||
|
package org.dimdev.dimdoors.item;
|
||||||
|
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.item.ItemUsageContext;
|
||||||
|
import net.minecraft.nbt.NbtCompound;
|
||||||
|
import net.minecraft.server.world.ServerWorld;
|
||||||
|
import net.minecraft.sound.SoundCategory;
|
||||||
|
import net.minecraft.text.MutableText;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableTextContent;
|
||||||
|
import net.minecraft.util.ActionResult;
|
||||||
|
import net.minecraft.util.Hand;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.DimensionalDoors;
|
||||||
|
import org.dimdev.dimdoors.api.util.Location;
|
||||||
|
import org.dimdev.dimdoors.api.util.RotatedLocation;
|
||||||
|
import org.dimdev.dimdoors.block.ModBlocks;
|
||||||
|
import org.dimdev.dimdoors.block.entity.DetachedRiftBlockEntity;
|
||||||
|
import org.dimdev.dimdoors.rift.targets.RiftReference;
|
||||||
|
import org.dimdev.dimdoors.sound.ModSoundEvents;
|
||||||
|
|
||||||
|
public class StabilizedRiftSignatureItem extends Item { // TODO: common superclass with rift signature
|
||||||
|
public static final String ID = "stabilized_rift_signature";
|
||||||
|
|
||||||
|
public StabilizedRiftSignatureItem(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasGlint(ItemStack stack) {
|
||||||
|
return stack.getNbt() != null && stack.getNbt().contains("destination");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ActionResult useOnBlock(ItemUsageContext itemUsageContext) {
|
||||||
|
PlayerEntity player = itemUsageContext.getPlayer();
|
||||||
|
World world = itemUsageContext.getWorld();
|
||||||
|
BlockPos pos = itemUsageContext.getBlockPos();
|
||||||
|
Hand hand = itemUsageContext.getHand();
|
||||||
|
Direction side = itemUsageContext.getSide();
|
||||||
|
|
||||||
|
ItemPlacementContext itemPlacementContext = new ItemPlacementContext(itemUsageContext);
|
||||||
|
|
||||||
|
ItemStack stack = player.getStackInHand(hand);
|
||||||
|
pos = world.getBlockState(pos).getBlock().canReplace(world.getBlockState(pos), new ItemPlacementContext(itemUsageContext)) ? pos : pos.offset(side);
|
||||||
|
// Fail if the player can't place a block there
|
||||||
|
if (!player.canPlaceOn(pos, side.getOpposite(), stack)) {
|
||||||
|
return ActionResult.FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (world.isClient) {
|
||||||
|
return ActionResult.SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
RotatedLocation target = getTarget(stack);
|
||||||
|
|
||||||
|
if (target == null) {
|
||||||
|
// The link signature has not been used. Store its current target as the first location.
|
||||||
|
setSource(stack, new RotatedLocation(world.getRegistryKey(), pos, player.getYaw(), 0));
|
||||||
|
player.sendMessage(Text.translatable(this.getTranslationKey() + ".stored"), true);
|
||||||
|
world.playSound(null, player.getBlockPos(), ModSoundEvents.RIFT_START, SoundCategory.BLOCKS, 0.6f, 1);
|
||||||
|
} else {
|
||||||
|
// Place a rift at the target point
|
||||||
|
if (target.getBlockState().getBlock() != ModBlocks.DETACHED_RIFT) {
|
||||||
|
if (!target.getBlockState().getBlock().canReplace(world.getBlockState(target.getBlockPos()), itemPlacementContext)) {
|
||||||
|
player.sendMessage(Text.translatable("tools.target_became_block"), true);
|
||||||
|
// Don't clear source, stabilized signatures always stay bound
|
||||||
|
return ActionResult.FAIL;
|
||||||
|
}
|
||||||
|
World targetWorld = DimensionalDoors.getWorld(target.world);
|
||||||
|
targetWorld.setBlockState(target.getBlockPos(), ModBlocks.DETACHED_RIFT.getDefaultState());
|
||||||
|
DetachedRiftBlockEntity rift1 = (DetachedRiftBlockEntity) target.getBlockEntity();
|
||||||
|
rift1.register();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Place a rift at the source point
|
||||||
|
world.setBlockState(pos, ModBlocks.DETACHED_RIFT.getDefaultState());
|
||||||
|
DetachedRiftBlockEntity rift2 = (DetachedRiftBlockEntity) world.getBlockEntity(pos);
|
||||||
|
rift2.setDestination(RiftReference.tryMakeRelative(new Location((ServerWorld) world, pos), target));
|
||||||
|
rift2.register();
|
||||||
|
|
||||||
|
stack.damage(1, player, playerEntity -> {
|
||||||
|
});
|
||||||
|
|
||||||
|
player.sendMessage(Text.translatable(this.getTranslationKey() + ".created"), true);
|
||||||
|
world.playSound(null, player.getBlockPos(), ModSoundEvents.RIFT_END, SoundCategory.BLOCKS, 0.6f, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ActionResult.SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setSource(ItemStack itemStack, RotatedLocation destination) {
|
||||||
|
if (!itemStack.hasNbt()) itemStack.setNbt(new NbtCompound());
|
||||||
|
itemStack.getNbt().put("destination", RotatedLocation.serialize(destination));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void clearSource(ItemStack itemStack) {
|
||||||
|
if (itemStack.hasNbt()) {
|
||||||
|
itemStack.getNbt().remove("destination");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RotatedLocation getTarget(ItemStack itemStack) {
|
||||||
|
if (itemStack.hasNbt() && itemStack.getNbt().contains("destination")) {
|
||||||
|
return RotatedLocation.deserialize(itemStack.getNbt().getCompound("destination"));
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package org.dimdev.dimdoors.item.component;
|
||||||
|
|
||||||
|
import dev.onyxstudios.cca.api.v3.item.ItemComponent;
|
||||||
|
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.DimensionalDoorsComponents;
|
||||||
|
|
||||||
|
public class CounterComponent extends ItemComponent {
|
||||||
|
|
||||||
|
public CounterComponent(ItemStack stack) {
|
||||||
|
super(stack);
|
||||||
|
if (!this.hasTag("counter"))
|
||||||
|
this.putInt("counter", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int increment() {
|
||||||
|
int counter = count();
|
||||||
|
putInt("counter", counter + 1);
|
||||||
|
return counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int count() {
|
||||||
|
return getInt("counter");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reset() {
|
||||||
|
putInt("counter", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> CounterComponent get(T provider) {
|
||||||
|
return DimensionalDoorsComponents.COUNTER_COMPONENT_KEY.get(provider);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,134 @@
|
||||||
|
package org.dimdev.dimdoors.item.door;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.client.item.TooltipContext;
|
||||||
|
import net.minecraft.item.BlockItem;
|
||||||
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.text.MutableText;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.text.TranslatableTextContent;
|
||||||
|
import net.minecraft.util.ActionResult;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import net.fabricmc.api.EnvType;
|
||||||
|
import net.fabricmc.api.Environment;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.DimensionalDoors;
|
||||||
|
import org.dimdev.dimdoors.block.ModBlocks;
|
||||||
|
import org.dimdev.dimdoors.block.RiftProvider;
|
||||||
|
import org.dimdev.dimdoors.block.entity.DetachedRiftBlockEntity;
|
||||||
|
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
|
||||||
|
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
|
||||||
|
import org.dimdev.dimdoors.client.ToolTipHelper;
|
||||||
|
|
||||||
|
public class DimensionalDoorItem extends BlockItem {
|
||||||
|
private final Consumer<? super EntranceRiftBlockEntity> setupFunction;
|
||||||
|
private boolean hasToolTip = false;
|
||||||
|
|
||||||
|
public DimensionalDoorItem(Block block, Settings settings, Consumer<? super EntranceRiftBlockEntity> setupFunction) {
|
||||||
|
this(block, settings, setupFunction, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DimensionalDoorItem(Block block, Settings settings, Consumer<? super EntranceRiftBlockEntity> setupFunction, boolean hasToolTip) {
|
||||||
|
super(block, settings);
|
||||||
|
this.setupFunction = setupFunction;
|
||||||
|
this.hasToolTip = hasToolTip;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Environment(EnvType.CLIENT)
|
||||||
|
@Override
|
||||||
|
public void appendTooltip(ItemStack itemStack, World world, List<Text> list, TooltipContext tooltipContext) {
|
||||||
|
if(hasToolTip) {
|
||||||
|
ToolTipHelper.processTranslation(list, this.getTranslationKey() + ".info");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ActionResult place(ItemPlacementContext context) {
|
||||||
|
BlockPos pos = context.getBlockPos();
|
||||||
|
|
||||||
|
if (!context.getWorld().getBlockState(pos).canReplace(context)) {
|
||||||
|
pos = pos.offset(context.getPlayerLookDirection());
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean placedOnRift = context.getWorld().getBlockState(pos).getBlock() == ModBlocks.DETACHED_RIFT;
|
||||||
|
|
||||||
|
if (!placedOnRift && !context.getPlayer().isSneaking() && isRiftNear(context.getWorld(), pos)) {
|
||||||
|
// Allowing on second right click would require cancelling client-side, which
|
||||||
|
// is impossible (see https://github.com/MinecraftForge/MinecraftForge/issues/3272)
|
||||||
|
// without sending custom packets.
|
||||||
|
|
||||||
|
if (context.getWorld().isClient) {
|
||||||
|
context.getPlayer().sendMessage(Text.translatable("rifts.entrances.rift_too_close"), true);
|
||||||
|
RiftBlockEntity.showRiftCoreUntil = System.currentTimeMillis() + DimensionalDoors.getConfig().getGraphicsConfig().highlightRiftCoreFor;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ActionResult.FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (context.getWorld().isClient) {
|
||||||
|
return super.place(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store the rift entity if there's a rift block there that may be broken
|
||||||
|
DetachedRiftBlockEntity rift = null;
|
||||||
|
if (placedOnRift) {
|
||||||
|
rift = (DetachedRiftBlockEntity) context.getWorld().getBlockEntity(pos);
|
||||||
|
rift.setUnregisterDisabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
ActionResult result = super.place(context);
|
||||||
|
if (result == ActionResult.SUCCESS || result == ActionResult.CONSUME) {
|
||||||
|
BlockState state = context.getWorld().getBlockState(pos);
|
||||||
|
if (rift == null) {
|
||||||
|
// Get the rift entity (not hard coded, works with any door size)
|
||||||
|
@SuppressWarnings("unchecked") // Guaranteed to be IRiftProvider<TileEntityEntranceRift> because of constructor
|
||||||
|
EntranceRiftBlockEntity entranceRift = ((RiftProvider<EntranceRiftBlockEntity>) state.getBlock()).getRift(context.getWorld(), pos, state);
|
||||||
|
|
||||||
|
// Configure the rift to its default functionality
|
||||||
|
this.setupRift(entranceRift);
|
||||||
|
|
||||||
|
// Register the rift in the registry
|
||||||
|
entranceRift.markDirty();
|
||||||
|
entranceRift.register();
|
||||||
|
} else {
|
||||||
|
// Copy from the old rift
|
||||||
|
EntranceRiftBlockEntity newRift = (EntranceRiftBlockEntity) context.getWorld().getBlockEntity(pos);
|
||||||
|
newRift.copyFrom(rift);
|
||||||
|
newRift.updateType();
|
||||||
|
}
|
||||||
|
} else if (rift != null) {
|
||||||
|
rift.setUnregisterDisabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isRiftNear(World world, BlockPos pos) {
|
||||||
|
for (int x = pos.getX() - 5; x < pos.getX() + 5; x++) {
|
||||||
|
for (int y = pos.getY() - 5; y < pos.getY() + 5; y++) {
|
||||||
|
for (int z = pos.getZ() - 5; z < pos.getZ() + 5; z++) {
|
||||||
|
BlockPos searchPos = new BlockPos(x, y, z);
|
||||||
|
if (world.getBlockState(searchPos).getBlock() == ModBlocks.DETACHED_RIFT) {
|
||||||
|
DetachedRiftBlockEntity rift = (DetachedRiftBlockEntity) world.getBlockEntity(searchPos);
|
||||||
|
if (Math.sqrt(pos.getSquaredDistance(searchPos)) < rift.size) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setupRift(EntranceRiftBlockEntity entranceRift) {
|
||||||
|
this.setupFunction.accept(entranceRift);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,231 @@
|
||||||
|
package org.dimdev.dimdoors.item.door;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.tuple.ImmutableTriple;
|
||||||
|
import org.apache.commons.lang3.tuple.Triple;
|
||||||
|
import org.joml.Quaternionf;
|
||||||
|
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.DoorBlock;
|
||||||
|
import net.minecraft.block.TrapdoorBlock;
|
||||||
|
import net.minecraft.client.resource.language.I18n;
|
||||||
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
|
import net.minecraft.item.BlockItem;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.item.Items;
|
||||||
|
import net.minecraft.item.TallBlockItem;
|
||||||
|
import net.minecraft.registry.Registry;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.util.ActionResult;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
|
import net.fabricmc.api.EnvType;
|
||||||
|
import net.fabricmc.api.Environment;
|
||||||
|
import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry;
|
||||||
|
import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback;
|
||||||
|
import net.fabricmc.loader.api.FabricLoader;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.DimensionalDoors;
|
||||||
|
import org.dimdev.dimdoors.api.util.function.TriFunction;
|
||||||
|
import org.dimdev.dimdoors.block.door.DimensionalDoorBlock;
|
||||||
|
import org.dimdev.dimdoors.block.door.DimensionalTrapdoorBlock;
|
||||||
|
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
|
||||||
|
import org.dimdev.dimdoors.client.UnderlaidChildItemRenderer;
|
||||||
|
import org.dimdev.dimdoors.item.ItemExtensions;
|
||||||
|
import org.dimdev.dimdoors.item.door.data.RiftDataList;
|
||||||
|
import org.dimdev.dimdoors.rift.targets.EscapeTarget;
|
||||||
|
import org.dimdev.dimdoors.rift.targets.PublicPocketTarget;
|
||||||
|
|
||||||
|
public class DimensionalDoorItemRegistrar {
|
||||||
|
public static final String PREFIX = "item_ag_dim_";
|
||||||
|
|
||||||
|
private final Registry<Item> registry;
|
||||||
|
|
||||||
|
private final Map<Block, Block> blocksAlreadyNotifiedAbout = new HashMap<>();
|
||||||
|
private final Map<Block, Triple<Identifier, Item, Function<Block, BlockItem>>> toBeMapped = new HashMap<>();
|
||||||
|
|
||||||
|
private final Map<Item, Function<ItemPlacementContext, ActionResult>> placementFunctions = new HashMap<>();
|
||||||
|
|
||||||
|
public DimensionalDoorItemRegistrar(Registry<Item> registry) {
|
||||||
|
this.registry = registry;
|
||||||
|
|
||||||
|
init();
|
||||||
|
RegistryEntryAddedCallback.event(registry).register((rawId, id, object) -> handleEntry(id, object));
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isRegistered(Item item) {
|
||||||
|
return placementFunctions.containsKey(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ActionResult place(Item item, ItemPlacementContext context) {
|
||||||
|
return placementFunctions.get(item).apply(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void init() {
|
||||||
|
new ArrayList<>(registry.getEntrySet())
|
||||||
|
.forEach(entry -> handleEntry(entry.getKey().getValue(), entry.getValue()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleEntry(Identifier identifier, Item original) {
|
||||||
|
if (DimensionalDoors.getConfig().getDoorsConfig().isAllowed(identifier)) {
|
||||||
|
if (original instanceof TallBlockItem) {
|
||||||
|
Block block = ((TallBlockItem) original).getBlock();
|
||||||
|
handleEntry(identifier, original, block, AutoGenDimensionalDoorItem::new);
|
||||||
|
} else if (original instanceof BlockItem) {
|
||||||
|
Block originalBlock = ((BlockItem) original).getBlock();
|
||||||
|
if (originalBlock instanceof DoorBlock) {
|
||||||
|
handleEntry(identifier, original, originalBlock, AutoGenDimensionalDoorItem::new);
|
||||||
|
} else {
|
||||||
|
handleEntry(identifier, original, originalBlock, AutoGenDimensionalTrapdoorItem::new);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleEntry(Identifier identifier, Item original, Block originalBlock, TriFunction<Block, Item.Settings, Item, ? extends BlockItem> constructor) {
|
||||||
|
|
||||||
|
if (!(originalBlock instanceof DimensionalDoorBlock)
|
||||||
|
&& !(originalBlock instanceof DimensionalTrapdoorBlock)
|
||||||
|
&& (originalBlock instanceof DoorBlock || originalBlock instanceof TrapdoorBlock)) {
|
||||||
|
Item.Settings settings = ItemExtensions.getSettings(original)/*.group(DoorData.PARENT_ITEMS.contains(original) || DoorData.PARENT_BLOCKS.contains(originalBlock) ? null : ModItems.DIMENSIONAL_DOORS)*/; //TODO: Redo with the new way Itemgroups work.
|
||||||
|
|
||||||
|
Function<Block, BlockItem> dimItemConstructor = (dimBlock) -> constructor.apply(dimBlock, settings, original);
|
||||||
|
|
||||||
|
if (!blocksAlreadyNotifiedAbout.containsKey(originalBlock)) {
|
||||||
|
toBeMapped.put(originalBlock, new ImmutableTriple<>(identifier, original, dimItemConstructor));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
register(identifier, original, blocksAlreadyNotifiedAbout.get(originalBlock), dimItemConstructor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void notifyBlockMapped(Block original, Block dimBlock) {
|
||||||
|
if (!toBeMapped.containsKey(original)) {
|
||||||
|
blocksAlreadyNotifiedAbout.put(original, dimBlock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Triple<Identifier, Item, Function<Block, BlockItem>> triple = toBeMapped.get(original);
|
||||||
|
register(triple.getLeft(), triple.getMiddle(), dimBlock, triple.getRight());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void register(Identifier identifier, Item original, Block block, Function<Block, BlockItem> dimItem) {
|
||||||
|
Identifier gennedId = DimensionalDoors.id(PREFIX + identifier.getNamespace() + "_" + identifier.getPath());
|
||||||
|
BlockItem item = Registry.register(registry, gennedId, dimItem.apply(block));
|
||||||
|
placementFunctions.put(original, item::place);
|
||||||
|
if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) {
|
||||||
|
registerItemRenderer(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Environment(EnvType.CLIENT)
|
||||||
|
private void registerItemRenderer(BlockItem dimItem) {
|
||||||
|
BuiltinItemRendererRegistry.INSTANCE.register(dimItem, Renderer.RENDERER);
|
||||||
|
}
|
||||||
|
|
||||||
|
// extract renderer to inner interface so it can be removed in server environment via annotation
|
||||||
|
@Environment(EnvType.CLIENT)
|
||||||
|
private interface Renderer {
|
||||||
|
UnderlaidChildItemRenderer RENDERER = new UnderlaidChildItemRenderer(Items.ENDER_PEARL);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class AutoGenDimensionalDoorItem extends DimensionalDoorItem implements ChildItem {
|
||||||
|
private final Item originalItem;
|
||||||
|
|
||||||
|
public AutoGenDimensionalDoorItem(Block block, Settings settings, Item originalItem) {
|
||||||
|
super(block, settings, null);
|
||||||
|
this.originalItem = originalItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setupRift(EntranceRiftBlockEntity entranceRift) {
|
||||||
|
RiftDataList data = DoorRiftDataLoader.getInstance().getRiftData(originalItem);
|
||||||
|
if (data != null) {
|
||||||
|
RiftDataList.OptRiftData riftData = data.getRiftData(entranceRift);
|
||||||
|
entranceRift.setDestination(riftData.getDestination());
|
||||||
|
riftData.getProperties().ifPresent(entranceRift::setProperties);
|
||||||
|
} else {
|
||||||
|
entranceRift.setDestination(new PublicPocketTarget());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Text getName(ItemStack stack) {
|
||||||
|
return Text.translatable("dimdoors.autogen_item_prefix", I18n.translate(originalItem.getTranslationKey()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Text getName() {
|
||||||
|
return Text.translatable("dimdoors.autogen_item_prefix", I18n.translate(originalItem.getTranslationKey()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Item getOriginalItem() {
|
||||||
|
return originalItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Environment(EnvType.CLIENT)
|
||||||
|
@Override
|
||||||
|
public void transform(MatrixStack matrices) {
|
||||||
|
matrices.scale(0.769f, 0.769f, 1);
|
||||||
|
matrices.translate(-0.06, 0.125, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class AutoGenDimensionalTrapdoorItem extends DimensionalTrapdoorItem implements ChildItem {
|
||||||
|
private final Item originalItem;
|
||||||
|
|
||||||
|
public AutoGenDimensionalTrapdoorItem(Block block, Settings settings, Item originalItem) {
|
||||||
|
super(block, settings, null);
|
||||||
|
this.originalItem = originalItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setupRift(EntranceRiftBlockEntity entranceRift) {
|
||||||
|
RiftDataList data = DoorRiftDataLoader.getInstance().getRiftData(originalItem);
|
||||||
|
if (data != null) {
|
||||||
|
RiftDataList.OptRiftData riftData = data.getRiftData(entranceRift);
|
||||||
|
entranceRift.setDestination(riftData.getDestination());
|
||||||
|
riftData.getProperties().ifPresent(entranceRift::setProperties);
|
||||||
|
} else {
|
||||||
|
entranceRift.setDestination(new EscapeTarget(true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Text getName(ItemStack stack) {
|
||||||
|
return Text.translatable("dimdoors.autogen_item_prefix", I18n.translate(originalItem.getTranslationKey()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Text getName() {
|
||||||
|
return Text.translatable("dimdoors.autogen_item_prefix", I18n.translate(originalItem.getTranslationKey()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Item getOriginalItem() {
|
||||||
|
return originalItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Environment(EnvType.CLIENT)
|
||||||
|
@Override
|
||||||
|
public void transform(MatrixStack matrices) {
|
||||||
|
matrices.scale(0.55f, 0.55f, 0.6f);
|
||||||
|
matrices.translate(0.05, -0.05, 0.41);
|
||||||
|
matrices.multiply(new Quaternionf().rotateXYZ(90, 0, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface ChildItem {
|
||||||
|
Item getOriginalItem();
|
||||||
|
|
||||||
|
default void transform(MatrixStack matrices) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
package org.dimdev.dimdoors.item.door;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.item.BlockItem;
|
||||||
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
|
import net.minecraft.util.ActionResult;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.block.RiftProvider;
|
||||||
|
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
|
||||||
|
|
||||||
|
public class DimensionalTrapdoorItem extends BlockItem {
|
||||||
|
private final Consumer<? super EntranceRiftBlockEntity> setupFunction;
|
||||||
|
|
||||||
|
public DimensionalTrapdoorItem(Block block, Settings settings, Consumer<? super EntranceRiftBlockEntity> setupFunction) {
|
||||||
|
super(block, settings);
|
||||||
|
this.setupFunction = setupFunction;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ActionResult place(ItemPlacementContext context) {
|
||||||
|
World world = context.getWorld();
|
||||||
|
BlockPos pos = context.getBlockPos();
|
||||||
|
|
||||||
|
if (world.isClient) {
|
||||||
|
return super.place(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean replaceable = world.getBlockState(pos).canReplace(context); // Check this before calling super, since that changes the block
|
||||||
|
ActionResult result = super.place(context);
|
||||||
|
|
||||||
|
if (result == ActionResult.SUCCESS) {
|
||||||
|
if (!replaceable) {
|
||||||
|
pos = pos.offset(context.getPlayerLookDirection());
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockState state = world.getBlockState(pos);
|
||||||
|
// Get the rift entity (not hard coded, works with any door size)
|
||||||
|
EntranceRiftBlockEntity entranceRift = ((RiftProvider<EntranceRiftBlockEntity>) state.getBlock()).getRift(world, pos, state);
|
||||||
|
|
||||||
|
// Configure the rift to its default functionality
|
||||||
|
this.setupRift(entranceRift);
|
||||||
|
|
||||||
|
// Register the rift in the registry
|
||||||
|
entranceRift.markDirty();
|
||||||
|
entranceRift.register();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setupRift(EntranceRiftBlockEntity entranceRift) {
|
||||||
|
this.setupFunction.accept(entranceRift);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
package org.dimdev.dimdoors.item.door;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import com.google.gson.JsonArray;
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.registry.Registries;
|
||||||
|
import net.minecraft.resource.Resource;
|
||||||
|
import net.minecraft.resource.ResourceManager;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
|
import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.DimensionalDoors;
|
||||||
|
import org.dimdev.dimdoors.item.door.data.RiftDataList;
|
||||||
|
|
||||||
|
// TODO: make it async?
|
||||||
|
public final class DoorRiftDataLoader implements SimpleSynchronousResourceReloadListener {
|
||||||
|
private static final DoorRiftDataLoader INSTANCE = new DoorRiftDataLoader();
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger("DoorRiftDataLoader");
|
||||||
|
private static final Gson GSON = new GsonBuilder().create();
|
||||||
|
private final Map<Item, RiftDataList> itemRiftData = new HashMap<>();
|
||||||
|
|
||||||
|
public static DoorRiftDataLoader getInstance() {
|
||||||
|
return INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
private DoorRiftDataLoader() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public RiftDataList getRiftData(Item item) {
|
||||||
|
return itemRiftData.get(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Identifier getFabricId() {
|
||||||
|
return DimensionalDoors.id("door_rift_data");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reload(ResourceManager manager) {
|
||||||
|
itemRiftData.clear();
|
||||||
|
Map<Identifier, Resource> resources = manager.findResources("door/data", id -> id.getPath().endsWith(".json"));
|
||||||
|
resources.forEach((id, resource) -> {
|
||||||
|
String name = id.getPath().substring(id.getPath().lastIndexOf('/') + 1, id.getPath().lastIndexOf('.'));
|
||||||
|
Identifier itemId = new Identifier(id.getNamespace(), name);
|
||||||
|
if (!Registries.ITEM.containsId(itemId)) {
|
||||||
|
LOGGER.error("Could not find item " + itemId + " for door data " + id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Item item = Registries.ITEM.get(itemId);
|
||||||
|
try {
|
||||||
|
JsonArray json = GSON.fromJson(resource.getReader(), JsonArray.class);
|
||||||
|
RiftDataList dataList = RiftDataList.fromJson(json);
|
||||||
|
itemRiftData.put(item, dataList);
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOGGER.error("Could not read door data " + id, e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,88 @@
|
||||||
|
package org.dimdev.dimdoors.item.door.data;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import com.google.gson.JsonArray;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import com.mojang.serialization.JsonOps;
|
||||||
|
|
||||||
|
import net.minecraft.nbt.NbtCompound;
|
||||||
|
import net.minecraft.nbt.NbtOps;
|
||||||
|
import net.minecraft.util.Pair;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.item.door.data.condition.Condition;
|
||||||
|
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
|
||||||
|
import org.dimdev.dimdoors.rift.registry.LinkProperties;
|
||||||
|
import org.dimdev.dimdoors.rift.targets.VirtualTarget;
|
||||||
|
|
||||||
|
public class RiftDataList {
|
||||||
|
private final LinkedList<Pair<OptRiftData, Condition>> riftDataConditions;
|
||||||
|
|
||||||
|
public static RiftDataList fromJson(JsonArray jsonArray) {
|
||||||
|
LinkedList<Pair<JsonObject, Condition>> riftDataConditions = new LinkedList<>();
|
||||||
|
for (JsonElement json : jsonArray) {
|
||||||
|
JsonObject jsonObject = json.getAsJsonObject();
|
||||||
|
//OptRiftData riftData = OptRiftData.fromJson(jsonObject.getAsJsonObject("data"));
|
||||||
|
JsonObject unbakedRiftData = jsonObject.getAsJsonObject("data");
|
||||||
|
Condition condition = Condition.fromJson(jsonObject.getAsJsonObject("condition"));
|
||||||
|
riftDataConditions.add(new Pair<>(unbakedRiftData, condition));
|
||||||
|
}
|
||||||
|
return new RiftDataList(riftDataConditions);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RiftDataList(LinkedList<Pair<JsonObject, Condition>> riftDataConditions) {
|
||||||
|
this.riftDataConditions = riftDataConditions.stream().map(pair -> new Pair<>(OptRiftData.fromJson(pair.getLeft()), pair.getRight())).collect(Collectors.toCollection(LinkedList::new));
|
||||||
|
}
|
||||||
|
|
||||||
|
public OptRiftData getRiftData(EntranceRiftBlockEntity rift) {
|
||||||
|
return riftDataConditions.stream().filter(pair -> pair.getRight().matches(rift)).findFirst().orElseThrow(() -> new RuntimeException("Could not find any matching rift data")).getLeft();
|
||||||
|
}
|
||||||
|
|
||||||
|
public JsonArray toJson() {
|
||||||
|
JsonArray jsonArray = new JsonArray();
|
||||||
|
for (Map.Entry<OptRiftData, Condition> entry : this.riftDataConditions.stream().collect(Collectors.toMap(Pair::getLeft, Pair::getRight)).entrySet()) {
|
||||||
|
JsonObject unbakedRiftData = entry.getKey().toJson(new JsonObject());
|
||||||
|
Condition condition = entry.getValue();
|
||||||
|
JsonObject jsonInner = new JsonObject();
|
||||||
|
jsonInner.add("data", unbakedRiftData);
|
||||||
|
jsonInner.add("condition", condition.toJson(new JsonObject()));
|
||||||
|
jsonArray.add(jsonInner);
|
||||||
|
}
|
||||||
|
return jsonArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
|
||||||
|
public static class OptRiftData {
|
||||||
|
private final VirtualTarget destination;
|
||||||
|
private final Optional<LinkProperties> linkProperties;
|
||||||
|
|
||||||
|
public static OptRiftData fromJson(JsonObject json) {
|
||||||
|
VirtualTarget destination = Optional.of(json.get("destination")).map(JsonElement::getAsJsonObject).map(j -> JsonOps.INSTANCE.convertTo(NbtOps.INSTANCE, j)).map(NbtCompound.class::cast).map(VirtualTarget::fromNbt).get();
|
||||||
|
Optional<LinkProperties> linkProperties = Optional.ofNullable(json.get("properties")).map(JsonElement::getAsJsonObject).map(j -> JsonOps.INSTANCE.convertTo(NbtOps.INSTANCE, j)).map(NbtCompound.class::cast).map(LinkProperties::fromNbt);
|
||||||
|
return new OptRiftData(destination, linkProperties);
|
||||||
|
}
|
||||||
|
|
||||||
|
public OptRiftData(VirtualTarget destination, Optional<LinkProperties> linkProperties) {
|
||||||
|
this.destination = destination;
|
||||||
|
this.linkProperties = linkProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
public JsonObject toJson(JsonObject json) {
|
||||||
|
Optional.of(this.destination).ifPresent(s -> json.add("destination", NbtOps.INSTANCE.convertTo(JsonOps.INSTANCE, VirtualTarget.toNbt(s))));
|
||||||
|
this.linkProperties.ifPresent(s -> json.add("properties", NbtOps.INSTANCE.convertTo(JsonOps.INSTANCE, LinkProperties.toNbt(s))));
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<LinkProperties> getProperties() {
|
||||||
|
return linkProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
public VirtualTarget getDestination() {
|
||||||
|
return destination;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package org.dimdev.dimdoors.item.door.data.condition;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.StreamSupport;
|
||||||
|
|
||||||
|
import com.google.gson.JsonArray;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
|
||||||
|
|
||||||
|
public class AllCondition extends MultipleCondition {
|
||||||
|
public AllCondition(List<Condition> conditions) {
|
||||||
|
super(conditions);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AllCondition fromJson(JsonObject json) {
|
||||||
|
JsonArray conditions = json.getAsJsonArray("conditions");
|
||||||
|
return new AllCondition(StreamSupport.stream(conditions.spliterator(), false).map(JsonElement::getAsJsonObject).map(Condition::fromJson).collect(Collectors.toList()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConditionType<?> getType() {
|
||||||
|
return ConditionType.ALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean matches(EntranceRiftBlockEntity rift) {
|
||||||
|
return this.conditions.stream().allMatch(c -> c.matches(rift));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package org.dimdev.dimdoors.item.door.data.condition;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
|
||||||
|
|
||||||
|
public enum AlwaysTrueCondition implements Condition {
|
||||||
|
INSTANCE;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean matches(EntranceRiftBlockEntity rift) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toJsonInner(JsonObject json) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConditionType<?> getType() {
|
||||||
|
return ConditionType.ALWAYS_TRUE;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package org.dimdev.dimdoors.item.door.data.condition;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.StreamSupport;
|
||||||
|
|
||||||
|
import com.google.gson.JsonArray;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
|
||||||
|
|
||||||
|
public class AnyCondition extends MultipleCondition {
|
||||||
|
public AnyCondition(List<Condition> conditions) {
|
||||||
|
super(conditions);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AnyCondition fromJson(JsonObject json) {
|
||||||
|
JsonArray conditions = json.getAsJsonArray("conditions");
|
||||||
|
return new AnyCondition(StreamSupport.stream(conditions.spliterator(), false).map(JsonElement::getAsJsonObject).map(Condition::fromJson).collect(Collectors.toList()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConditionType<?> getType() {
|
||||||
|
return ConditionType.ANY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean matches(EntranceRiftBlockEntity rift) {
|
||||||
|
return this.conditions.stream().anyMatch(c -> c.matches(rift));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
package org.dimdev.dimdoors.item.door.data.condition;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import com.mojang.serialization.Lifecycle;
|
||||||
|
|
||||||
|
import net.minecraft.registry.Registry;
|
||||||
|
import net.minecraft.registry.RegistryKey;
|
||||||
|
import net.minecraft.registry.SimpleRegistry;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
|
import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.DimensionalDoors;
|
||||||
|
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
|
||||||
|
|
||||||
|
public interface Condition {
|
||||||
|
Registry<ConditionType<?>> REGISTRY = FabricRegistryBuilder.<ConditionType<?>, SimpleRegistry<ConditionType<?>>>from(new SimpleRegistry<>(RegistryKey.ofRegistry(DimensionalDoors.id("rift_data_condition")), Lifecycle.stable(), false)).buildAndRegister();
|
||||||
|
|
||||||
|
boolean matches(EntranceRiftBlockEntity rift);
|
||||||
|
|
||||||
|
default JsonObject toJson(JsonObject json) {
|
||||||
|
json.addProperty("type", getType().getId());
|
||||||
|
this.toJsonInner(json);
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
void toJsonInner(JsonObject json);
|
||||||
|
|
||||||
|
ConditionType<?> getType();
|
||||||
|
|
||||||
|
static Condition fromJson(JsonObject json) {
|
||||||
|
Identifier type = new Identifier(json.getAsJsonPrimitive("type").getAsString());
|
||||||
|
return Objects.requireNonNull(REGISTRY.get(type)).fromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ConditionType<T extends Condition> {
|
||||||
|
ConditionType<AlwaysTrueCondition> ALWAYS_TRUE = register("always_true", j -> AlwaysTrueCondition.INSTANCE);
|
||||||
|
ConditionType<AllCondition> ALL = register("all", AllCondition::fromJson);
|
||||||
|
ConditionType<AnyCondition> ANY = register("any", AnyCondition::fromJson);
|
||||||
|
ConditionType<InverseCondition> INVERSE = register("inverse", InverseCondition::fromJson);
|
||||||
|
ConditionType<WorldMatchCondition> WORLD_MATCH = register("world_match", WorldMatchCondition::fromJson);
|
||||||
|
|
||||||
|
T fromJson(JsonObject json);
|
||||||
|
|
||||||
|
default String getId() {
|
||||||
|
return String.valueOf(REGISTRY.getId(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void register() {
|
||||||
|
DimensionalDoors.apiSubscribers.forEach(d -> d.registerConditionTypes(REGISTRY));
|
||||||
|
}
|
||||||
|
|
||||||
|
static <T extends Condition> ConditionType<T> register(String name, Function<JsonObject, T> fromJson) {
|
||||||
|
return Registry.register(REGISTRY, DimensionalDoors.id(name), json -> fromJson.apply(json));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package org.dimdev.dimdoors.item.door.data.condition;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
|
||||||
|
|
||||||
|
public record InverseCondition(Condition condition) implements Condition {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toJsonInner(JsonObject json) {
|
||||||
|
json.add("condition", condition.toJson(new JsonObject()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConditionType<?> getType() {
|
||||||
|
return ConditionType.INVERSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static InverseCondition fromJson(JsonObject json) {
|
||||||
|
return new InverseCondition(Condition.fromJson(json.getAsJsonObject("condition")));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean matches(EntranceRiftBlockEntity rift) {
|
||||||
|
return !this.condition.matches(rift);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
package org.dimdev.dimdoors.item.door.data.condition;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.google.gson.JsonArray;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
|
||||||
|
public abstract class MultipleCondition implements Condition {
|
||||||
|
protected final List<Condition> conditions;
|
||||||
|
|
||||||
|
protected MultipleCondition(List<Condition> conditions) {
|
||||||
|
this.conditions = conditions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toJsonInner(JsonObject json) {
|
||||||
|
JsonArray conditionsJson = new JsonArray();
|
||||||
|
conditions.forEach(c -> conditionsJson.add(c.toJson( new JsonObject())));
|
||||||
|
json.add("conditions", conditionsJson);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
package org.dimdev.dimdoors.item.door.data.condition;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
|
||||||
|
import net.minecraft.registry.RegistryKey;
|
||||||
|
import net.minecraft.registry.RegistryKeys;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
|
||||||
|
|
||||||
|
public record WorldMatchCondition(RegistryKey<World> world) implements Condition {
|
||||||
|
public static WorldMatchCondition fromJson(JsonObject json) {
|
||||||
|
RegistryKey<World> key = RegistryKey.of(RegistryKeys.WORLD, new Identifier(json.getAsJsonPrimitive("world").getAsString()));
|
||||||
|
return new WorldMatchCondition(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean matches(EntranceRiftBlockEntity rift) {
|
||||||
|
//noinspection ConstantConditions
|
||||||
|
return rift.getWorld().getRegistryKey() == this.world;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toJsonInner(JsonObject json) {
|
||||||
|
json.addProperty("world", world.getValue().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConditionType<?> getType() {
|
||||||
|
return ConditionType.WORLD_MATCH;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue