From 87d9e1791919160e489d624b893338d1f0708d99 Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Sat, 1 Aug 2020 16:22:32 -0400 Subject: [PATCH] Add Energy Portal Blocks --- .../energonrelics/EnergonRelics.java | 16 ++ .../block/entity/infuser/InfuserRegistry.java | 3 + .../portal/EnergyProjectorBlockEntity.java | 73 +++++++++ .../forcefield/util/AbstractFieldBlock.java | 5 + .../block/forcefield/util/BeamBlock.java | 6 - .../block/portal/EnergizedObsidianBlock.java | 67 ++++++++ .../block/portal/EnergyBeamBlock.java | 16 ++ .../block/portal/EnergyPortalBlock.java | 145 ++++++++++++++++++ .../block/portal/EnergyProjectorBlock.java | 19 +++ .../block/portal/PortalCooldownEntity.java | 6 + .../client/EnergonRelicsClient.java | 7 +- .../energonrelics/config/HardcodedConfig.java | 3 + .../energonrelics/mixin/MixinEntity.java | 36 ++++- .../blockstates/energized_obsidian.json | 7 + .../blockstates/energy_beam.json | 7 + .../blockstates/energy_portal.json | 7 + .../blockstates/energy_projector.json | 50 ++++++ .../assets/energonrelics/lang/en_us.json | 7 +- .../models/block/energized_obsidian.json | 6 + .../models/block/energy_beam.json | 6 + .../models/block/energy_portal.json | 22 +++ .../models/block/energy_projector_off.json | 8 + .../models/block/energy_projector_on.json | 8 + .../models/item/energy_projector.json | 3 + .../models/item/veridium_orb.json | 6 + .../textures/block/energized_obsidian.png | Bin 0 -> 2744 bytes .../textures/block/energy_beam.png | Bin 0 -> 490 bytes .../textures/block/energy_portal.png | Bin 0 -> 25501 bytes .../textures/block/energy_portal.png.mcmeta | 3 + .../textures/block/energy_projector_off.png | Bin 0 -> 722 bytes .../textures/block/energy_projector_on.png | Bin 0 -> 722 bytes .../blocks/energized_obsidian.json | 19 +++ .../loot_tables/blocks/energy_projector.json | 19 +++ .../recipes/energy_projector.json | 15 ++ 34 files changed, 584 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/thebrokenrail/energonrelics/block/entity/portal/EnergyProjectorBlockEntity.java create mode 100644 src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergizedObsidianBlock.java create mode 100644 src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyBeamBlock.java create mode 100644 src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyPortalBlock.java create mode 100644 src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyProjectorBlock.java create mode 100644 src/main/java/com/thebrokenrail/energonrelics/block/portal/PortalCooldownEntity.java create mode 100644 src/main/resources/assets/energonrelics/blockstates/energized_obsidian.json create mode 100644 src/main/resources/assets/energonrelics/blockstates/energy_beam.json create mode 100644 src/main/resources/assets/energonrelics/blockstates/energy_portal.json create mode 100644 src/main/resources/assets/energonrelics/blockstates/energy_projector.json create mode 100644 src/main/resources/assets/energonrelics/models/block/energized_obsidian.json create mode 100644 src/main/resources/assets/energonrelics/models/block/energy_beam.json create mode 100644 src/main/resources/assets/energonrelics/models/block/energy_portal.json create mode 100644 src/main/resources/assets/energonrelics/models/block/energy_projector_off.json create mode 100644 src/main/resources/assets/energonrelics/models/block/energy_projector_on.json create mode 100644 src/main/resources/assets/energonrelics/models/item/energy_projector.json create mode 100644 src/main/resources/assets/energonrelics/models/item/veridium_orb.json create mode 100644 src/main/resources/assets/energonrelics/textures/block/energized_obsidian.png create mode 100644 src/main/resources/assets/energonrelics/textures/block/energy_beam.png create mode 100644 src/main/resources/assets/energonrelics/textures/block/energy_portal.png create mode 100644 src/main/resources/assets/energonrelics/textures/block/energy_portal.png.mcmeta create mode 100644 src/main/resources/assets/energonrelics/textures/block/energy_projector_off.png create mode 100644 src/main/resources/assets/energonrelics/textures/block/energy_projector_on.png create mode 100644 src/main/resources/data/energonrelics/loot_tables/blocks/energized_obsidian.json create mode 100644 src/main/resources/data/energonrelics/loot_tables/blocks/energy_projector.json create mode 100644 src/main/resources/data/energonrelics/recipes/energy_projector.json diff --git a/src/main/java/com/thebrokenrail/energonrelics/EnergonRelics.java b/src/main/java/com/thebrokenrail/energonrelics/EnergonRelics.java index 1d33fb2..599f60d 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/EnergonRelics.java +++ b/src/main/java/com/thebrokenrail/energonrelics/EnergonRelics.java @@ -15,6 +15,10 @@ import com.thebrokenrail.energonrelics.block.forcefield.beam.TractorBeamProjecto import com.thebrokenrail.energonrelics.block.forcefield.ForcefieldBlock; import com.thebrokenrail.energonrelics.block.lightning.LightningRodBlock; import com.thebrokenrail.energonrelics.block.misc.VeridiumBlockBlock; +import com.thebrokenrail.energonrelics.block.portal.EnergizedObsidianBlock; +import com.thebrokenrail.energonrelics.block.portal.EnergyBeamBlock; +import com.thebrokenrail.energonrelics.block.portal.EnergyPortalBlock; +import com.thebrokenrail.energonrelics.block.portal.EnergyProjectorBlock; import com.thebrokenrail.energonrelics.block.structure.StructureGeneratorBlock; import com.thebrokenrail.energonrelics.block.misc.ThermalGlassBlock; import com.thebrokenrail.energonrelics.block.battery.ActiveBatteryControllerBlock; @@ -116,6 +120,12 @@ public class EnergonRelics implements ModInitializer { public static final InfuserBlock INFUSER_BLOCK = new InfuserBlock(); + public static final EnergizedObsidianBlock ENERGIZED_OBSIDIAN_BLOCK = new EnergizedObsidianBlock(); + public static final EnergyBeamBlock ENERGY_BEAM_BLOCK = new EnergyBeamBlock(); + public static final EnergyPortalBlock ENERGY_PORTAL_BLOCK = new EnergyPortalBlock(); + public static final EnergyProjectorBlock ENERGY_PROJECTOR_BLOCK = new EnergyProjectorBlock(); + public static final Item VERIDIUM_ORB_ITEM = new Item(new Item.Settings().group(ITEM_GROUP)); + @Override public void onInitialize() { NETWORK_CHIP_ITEM = Registry.register(Registry.ITEM, new Identifier(NAMESPACE, "network_chip"), new NetworkChipItem()); @@ -175,6 +185,12 @@ public class EnergonRelics implements ModInitializer { HOLOGRAPHIC_SKY_BLOCK.register("holographic_sky"); INFUSER_BLOCK.register("infuser"); + + ENERGIZED_OBSIDIAN_BLOCK.register("energized_obsidian"); + ENERGY_BEAM_BLOCK.register("energy_beam"); + ENERGY_PORTAL_BLOCK.register("energy_portal"); + ENERGY_PROJECTOR_BLOCK.register("energy_projector"); + Registry.register(Registry.ITEM, new Identifier(NAMESPACE, "veridium_orb"), VERIDIUM_ORB_ITEM); } public static void playBeep(World world, BlockPos pos) { diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/infuser/InfuserRegistry.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/infuser/InfuserRegistry.java index 76db735..bb96c1d 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/entity/infuser/InfuserRegistry.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/infuser/InfuserRegistry.java @@ -1,5 +1,6 @@ package com.thebrokenrail.energonrelics.block.entity.infuser; +import com.thebrokenrail.energonrelics.EnergonRelics; import net.minecraft.item.DyeItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -58,6 +59,8 @@ public class InfuserRegistry { add(Items.GOLDEN_APPLE, new InfuserEntry(510, 0.3d, new InfuserAction[]{new InfuserAction.ItemAction(Items.ENCHANTED_GOLDEN_APPLE)}, new InfuserAction[]{new InfuserAction.ExplosionAction()})); add(Items.COAL, new InfuserEntry(340, 0.2d, new InfuserAction[]{new InfuserAction.ItemAction(Items.DIAMOND)}, new InfuserAction[]{new InfuserAction.ExplosionAction()})); + + add(EnergonRelics.VERIDIUM_INGOT_ITEM, new InfuserEntry(240, 0.25d, new InfuserAction[]{new InfuserAction.ItemAction(EnergonRelics.VERIDIUM_ORB_ITEM)}, new InfuserAction[]{new InfuserAction.ParticleAction(), new InfuserAction.ParticleAction(), new InfuserAction.ExplosionAction()})); } private static void addTransform(Item[] items, long cost, double successChance) { diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/portal/EnergyProjectorBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/portal/EnergyProjectorBlockEntity.java new file mode 100644 index 0000000..b9bab0c --- /dev/null +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/portal/EnergyProjectorBlockEntity.java @@ -0,0 +1,73 @@ +package com.thebrokenrail.energonrelics.block.entity.portal; + +import com.thebrokenrail.energonrelics.EnergonRelics; +import com.thebrokenrail.energonrelics.block.entity.forcefield.FieldProjectorBlockEntity; +import com.thebrokenrail.energonrelics.block.portal.EnergyPortalBlock; +import com.thebrokenrail.energonrelics.block.portal.EnergyProjectorBlock; +import com.thebrokenrail.energonrelics.config.HardcodedConfig; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; + +import java.util.Objects; + +public class EnergyProjectorBlockEntity extends FieldProjectorBlockEntity { + private BlockPos targetPos; + private BlockState targetState; + + public EnergyProjectorBlockEntity(BlockEntityType type) { + super(type, state -> EnergonRelics.ENERGY_BEAM_BLOCK); + } + + @Override + protected long getCost() { + return HardcodedConfig.ENERGY_PROJECTOR_ENERGY_REQUIRED; + } + + @Override + protected void setLastBlock(BlockPos newPos, BlockState newState) { + if (!Objects.equals(newPos, targetPos) || targetState != newState) { + targetPos = newPos; + targetState = newState; + } + } + + @Override + protected void energyTick() { + super.energyTick(); + + assert getWorld() != null; + + if (getCachedState().get(EnergyProjectorBlock.POWERED) && targetState != null && targetPos != null) { + boolean isObsidian; + if (targetState.getBlock() == Blocks.OBSIDIAN) { + isObsidian = true; + targetState = EnergonRelics.ENERGIZED_OBSIDIAN_BLOCK.getDefaultState(); + getWorld().setBlockState(targetPos, targetState); + } else { + isObsidian = targetState.getBlock() == EnergonRelics.ENERGIZED_OBSIDIAN_BLOCK; + } + + if (isObsidian) { + Direction facing = getCachedState().get(EnergyProjectorBlock.FACING); + + BlockPos centerPos = null; + for (Direction side : Direction.values()) { + if (EnergyPortalBlock.isValidDirection(side) && side != facing.getOpposite()) { + BlockPos newCenterPos = targetPos.offset(side, 2); + if (EnergyPortalBlock.isValidFrame(getWorld(), newCenterPos)) { + centerPos = newCenterPos; + break; + } + } + } + + if (centerPos != null) { + EnergyPortalBlock.fillFrame(getWorld(), centerPos); + } + } + } + } +} diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/forcefield/util/AbstractFieldBlock.java b/src/main/java/com/thebrokenrail/energonrelics/block/forcefield/util/AbstractFieldBlock.java index 5f92e4e..958cb79 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/forcefield/util/AbstractFieldBlock.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/forcefield/util/AbstractFieldBlock.java @@ -117,4 +117,9 @@ public abstract class AbstractFieldBlock extends SimpleBlock { public PistonBehavior getPistonBehavior(BlockState state) { return PistonBehavior.DESTROY; } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + return collidable ? super.getOutlineShape(state, world, pos, context) : VoxelShapes.empty(); + } } diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/forcefield/util/BeamBlock.java b/src/main/java/com/thebrokenrail/energonrelics/block/forcefield/util/BeamBlock.java index 039ac67..e5e4ef6 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/forcefield/util/BeamBlock.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/forcefield/util/BeamBlock.java @@ -44,10 +44,4 @@ public class BeamBlock extends AbstractFieldBlock { entity.addVelocity(pullForce.getX(), pullForce.getY(), pullForce.getZ()); } } - - @SuppressWarnings("deprecation") - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - return VoxelShapes.empty(); - } } diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergizedObsidianBlock.java b/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergizedObsidianBlock.java new file mode 100644 index 0000000..3e98000 --- /dev/null +++ b/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergizedObsidianBlock.java @@ -0,0 +1,67 @@ +package com.thebrokenrail.energonrelics.block.portal; + +import com.thebrokenrail.energonrelics.EnergonRelics; +import com.thebrokenrail.energonrelics.block.util.SimpleBlock; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.BlockView; +import net.minecraft.world.WorldAccess; + +public class EnergizedObsidianBlock extends SimpleBlock { + public EnergizedObsidianBlock() { + super(FabricBlockSettings.copy(Blocks.OBSIDIAN).emissiveLighting((state, world, pos) -> true).nonOpaque().lightLevel(state -> 10)); + } + + @Override + public boolean isTranslucent(BlockState state, BlockView world, BlockPos pos) { + return true; + } + + @Override + protected boolean registerItem() { + return false; + } + + @Override + public Item asItem() { + return Items.OBSIDIAN; + } + + private static boolean faces(WorldAccess world, BlockPos targetPos, BlockPos pos) { + BlockState state = world.getBlockState(targetPos); + if ((state.getBlock() == EnergonRelics.ENERGY_BEAM_BLOCK || state.getBlock() == EnergonRelics.ENERGY_PROJECTOR_BLOCK) && state.contains(Properties.FACING)) { + Direction facing = state.get(Properties.FACING); + for (Direction side : Direction.values()) { + if (targetPos.offset(side).equals(pos)) { + return facing == side; + } + } + } + return false; + } + + @SuppressWarnings("deprecation") + @Override + public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { + boolean valid = false; + + for (Direction dir : Direction.values()) { + if (faces(world, pos.offset(dir), pos)) { + valid = true; + break; + } + } + + if (valid) { + return super.getStateForNeighborUpdate(state, direction, newState, world, pos, posFrom); + } else { + return Blocks.OBSIDIAN.getDefaultState(); + } + } +} diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyBeamBlock.java b/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyBeamBlock.java new file mode 100644 index 0000000..a54c7b8 --- /dev/null +++ b/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyBeamBlock.java @@ -0,0 +1,16 @@ +package com.thebrokenrail.energonrelics.block.portal; + +import com.thebrokenrail.energonrelics.EnergonRelics; +import com.thebrokenrail.energonrelics.block.forcefield.util.AbstractFieldBlock; +import net.minecraft.block.BlockState; + +public class EnergyBeamBlock extends AbstractFieldBlock { + public EnergyBeamBlock() { + super(false); + } + + @Override + protected BlockState getProjectorBlockState() { + return EnergonRelics.ENERGY_PROJECTOR_BLOCK.getDefaultState(); + } +} diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyPortalBlock.java b/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyPortalBlock.java new file mode 100644 index 0000000..8eac2cb --- /dev/null +++ b/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyPortalBlock.java @@ -0,0 +1,145 @@ +package com.thebrokenrail.energonrelics.block.portal; + +import com.thebrokenrail.energonrelics.EnergonRelics; +import com.thebrokenrail.energonrelics.block.util.SimpleBlock; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.ShapeContext; +import net.minecraft.block.piston.PistonBehavior; +import net.minecraft.entity.Entity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; +import net.minecraft.world.WorldAccess; + +@SuppressWarnings("deprecation") +public class EnergyPortalBlock extends SimpleBlock { + public EnergyPortalBlock() { + super(FabricBlockSettings.copy(Blocks.NETHER_PORTAL).dropsNothing().emissiveLighting((state, world, pos) -> true).noCollision()); + } + + @Override + protected boolean registerItem() { + return false; + } + + @Override + public VoxelShape getVisualShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + return VoxelShapes.empty(); + } + + private static final VoxelShape SHAPE = createCuboidShape(0, 6, 0, 16, 10, 16); + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + return SHAPE; + } + + public static boolean isValidDirection(Direction dir) { + return dir != Direction.UP && dir != Direction.DOWN; + } + + private static boolean isObsidian(BlockState state) { + return state.getBlock() == Blocks.OBSIDIAN || state.getBlock() == EnergonRelics.ENERGIZED_OBSIDIAN_BLOCK; + } + + public static boolean isValidFrame(WorldAccess world, BlockPos centerPos) { + int validSides = 0; + for (Direction side : Direction.values()) { + if (isValidDirection(side)) { + BlockPos energizedPos = centerPos.offset(side, 2); + BlockState energizedObsidian = world.getBlockState(energizedPos); + if (energizedObsidian.getBlock() == EnergonRelics.ENERGIZED_OBSIDIAN_BLOCK) { + BlockState obsidian1 = world.getBlockState(energizedPos.offset(side.rotateYClockwise(), 1)); + BlockState obsidian2 = world.getBlockState(energizedPos.offset(side.rotateYCounterclockwise(), 1)); + if (isObsidian(obsidian1) && isObsidian(obsidian2)) { + validSides++; + } + } + } + } + return validSides == 4; + } + + private static BlockPos getCenterPos(WorldAccess world, BlockPos pos) { + BlockPos centerPos = pos; + for (Direction side : Direction.values()) { + if (isValidDirection(side)) { + if (world.getBlockState(pos.offset(side)).getBlock() != EnergonRelics.ENERGY_PORTAL_BLOCK) { + centerPos = centerPos.offset(side.getOpposite()); + } + } + } + return centerPos; + } + + private static boolean isValidCenter(WorldAccess world, BlockPos centerPos) { + boolean valid = true; + BlockPos startPos = centerPos.add(-1, 0, -1); + for (int x = 0; x < 3; x++) { + for (int z = 0; z < 3; z++) { + if (world.getBlockState(startPos.add(x, 0, z)).getBlock() != EnergonRelics.ENERGY_PORTAL_BLOCK) { + valid = false; + break; + } + } + } + return valid; + } + + public static void fillFrame(WorldAccess world, BlockPos centerPos) { + BlockPos startPos = centerPos.add(-1, 0, -1); + for (int x = 0; x < 3; x++) { + for (int z = 0; z < 3; z++) { + BlockState state = world.getBlockState(startPos.add(x, 0, z)); + if (state.getBlock() != EnergonRelics.ENERGY_PORTAL_BLOCK && !state.isAir()) { + return; + } + } + } + + for (int x = 0; x < 3; x++) { + for (int z = 0; z < 3; z++) { + world.setBlockState(startPos.add(x, 0, z), EnergonRelics.ENERGY_PORTAL_BLOCK.getDefaultState(), 3 | 16); + } + } + } + + @Override + public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) { + boolean valid; + if (isValidDirection(direction)) { + BlockPos centerPos = getCenterPos(world, pos); + boolean isValidFrame = isValidFrame(world, centerPos); + boolean isValidCenter = isValidCenter(world, centerPos); + valid = isValidCenter && isValidFrame; + } else { + valid = true; + } + + if (valid) { + return super.getStateForNeighborUpdate(state, direction, newState, world, pos, posFrom); + } else { + return Blocks.AIR.getDefaultState(); + } + } + + @Override + public PistonBehavior getPistonBehavior(BlockState state) { + return PistonBehavior.BLOCK; + } + + @Override + public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { + super.onEntityCollision(state, world, pos, entity); + + if (!world.isClient() && entity.canUsePortals() && ((PortalCooldownEntity) entity).isEnergyPortalCooldown()) { + // Teleport + ((PortalCooldownEntity) entity).resetEnergyPortalCooldown(); + } + } +} diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyProjectorBlock.java b/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyProjectorBlock.java new file mode 100644 index 0000000..fed3ac6 --- /dev/null +++ b/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyProjectorBlock.java @@ -0,0 +1,19 @@ +package com.thebrokenrail.energonrelics.block.portal; + +import com.thebrokenrail.energonrelics.block.entity.portal.EnergyProjectorBlockEntity; +import com.thebrokenrail.energonrelics.block.forcefield.util.FieldProjectorBlock; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.BlockEntityType; + +import java.util.function.Function; + +public class EnergyProjectorBlock extends FieldProjectorBlock { + public EnergyProjectorBlock() { + super(null); + } + + @Override + protected Function, BlockEntity> getFactory() { + return EnergyProjectorBlockEntity::new; + } +} diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/portal/PortalCooldownEntity.java b/src/main/java/com/thebrokenrail/energonrelics/block/portal/PortalCooldownEntity.java new file mode 100644 index 0000000..ec0bf34 --- /dev/null +++ b/src/main/java/com/thebrokenrail/energonrelics/block/portal/PortalCooldownEntity.java @@ -0,0 +1,6 @@ +package com.thebrokenrail.energonrelics.block.portal; + +public interface PortalCooldownEntity { + void resetEnergyPortalCooldown(); + boolean isEnergyPortalCooldown(); +} diff --git a/src/main/java/com/thebrokenrail/energonrelics/client/EnergonRelicsClient.java b/src/main/java/com/thebrokenrail/energonrelics/client/EnergonRelicsClient.java index 8b742a7..88c7fb5 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/client/EnergonRelicsClient.java +++ b/src/main/java/com/thebrokenrail/energonrelics/client/EnergonRelicsClient.java @@ -13,6 +13,7 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.fabricmc.fabric.api.event.player.AttackBlockCallback; +import net.minecraft.block.BlockState; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.RenderLayer; import net.minecraft.util.ActionResult; @@ -47,10 +48,14 @@ public class EnergonRelicsClient implements ClientModInitializer { BlockRenderLayerMap.INSTANCE.putBlock(EnergonRelics.REPULSOR_BEAM_BLOCK, RenderLayer.getTranslucent()); BlockRenderLayerMap.INSTANCE.putBlock(EnergonRelics.INDUSTRIAL_LASER_BLOCK, RenderLayer.getTranslucent()); + BlockRenderLayerMap.INSTANCE.putBlock(EnergonRelics.ENERGY_PORTAL_BLOCK, RenderLayer.getTranslucent()); + BlockRenderLayerMap.INSTANCE.putBlock(EnergonRelics.ENERGY_BEAM_BLOCK, RenderLayer.getTranslucent()); + AutoConfig.register(UserConfig.class, ReloadSerializer::new); AttackBlockCallback.EVENT.register((playerEntity, world, hand, blockPos, direction) -> { - if (world.getBlockState(blockPos).getBlock() instanceof AbstractFieldBlock) { + BlockState state = world.getBlockState(blockPos); + if (state.getBlock() instanceof AbstractFieldBlock || state.getBlock() == EnergonRelics.ENERGY_PORTAL_BLOCK) { return ActionResult.FAIL; } else { return ActionResult.PASS; diff --git a/src/main/java/com/thebrokenrail/energonrelics/config/HardcodedConfig.java b/src/main/java/com/thebrokenrail/energonrelics/config/HardcodedConfig.java index d16d980..c65428e 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/config/HardcodedConfig.java +++ b/src/main/java/com/thebrokenrail/energonrelics/config/HardcodedConfig.java @@ -44,4 +44,7 @@ public class HardcodedConfig { public static final long HOLOGRAPHIC_SKY_ENERGY_REQUIRED = 15; public static final int INFUSER_TIME = 2200; + + public static final long ENERGY_PROJECTOR_ENERGY_REQUIRED = 37; + public static final int ENERGY_PORTAL_COOLDOWN = 20; } \ No newline at end of file diff --git a/src/main/java/com/thebrokenrail/energonrelics/mixin/MixinEntity.java b/src/main/java/com/thebrokenrail/energonrelics/mixin/MixinEntity.java index f6bb0a2..e8e533d 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/mixin/MixinEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/mixin/MixinEntity.java @@ -1,6 +1,9 @@ package com.thebrokenrail.energonrelics.mixin; +import com.thebrokenrail.energonrelics.EnergonRelics; import com.thebrokenrail.energonrelics.block.forcefield.util.BeamBlock; +import com.thebrokenrail.energonrelics.block.portal.PortalCooldownEntity; +import com.thebrokenrail.energonrelics.config.HardcodedConfig; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.nbt.CompoundTag; @@ -14,12 +17,16 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.function.Predicate; @Mixin(Entity.class) -public abstract class MixinEntity { +public abstract class MixinEntity implements PortalCooldownEntity { + @Unique + private int energyPortalCooldown = 0; + @Shadow public abstract Box getBoundingBox(); @@ -64,12 +71,35 @@ public abstract class MixinEntity { } @Inject(at = @At("HEAD"), method = "toTag") - public void tagTagHead(CompoundTag tag, CallbackInfoReturnable info) { + public void toTagHead(CompoundTag tag, CallbackInfoReturnable info) { saving = true; + tag.putInt(EnergonRelics.NAMESPACE + ":EnergyPortalCooldown", energyPortalCooldown); } @Inject(at = @At("RETURN"), method = "toTag") - public void tagTagReturn(CompoundTag tag, CallbackInfoReturnable info) { + public void toTagReturn(CompoundTag tag, CallbackInfoReturnable info) { saving = false; } + + @Inject(at = @At("HEAD"), method = "fromTag") + public void fromTag(CompoundTag tag, CallbackInfo info) { + energyPortalCooldown = tag.getInt(EnergonRelics.NAMESPACE + ":EnergyPortalCooldown"); + } + + @Inject(at = @At("RETURN"), method = "tick") + public void tick(CallbackInfo info) { + if (!isTouching(block -> block == EnergonRelics.ENERGY_PORTAL_BLOCK) && energyPortalCooldown > 0) { + energyPortalCooldown--; + } + } + + @Override + public void resetEnergyPortalCooldown() { + energyPortalCooldown = HardcodedConfig.ENERGY_PORTAL_COOLDOWN; + } + + @Override + public boolean isEnergyPortalCooldown() { + return energyPortalCooldown > 0; + } } diff --git a/src/main/resources/assets/energonrelics/blockstates/energized_obsidian.json b/src/main/resources/assets/energonrelics/blockstates/energized_obsidian.json new file mode 100644 index 0000000..71258a3 --- /dev/null +++ b/src/main/resources/assets/energonrelics/blockstates/energized_obsidian.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "energonrelics:block/energized_obsidian" + } + } +} diff --git a/src/main/resources/assets/energonrelics/blockstates/energy_beam.json b/src/main/resources/assets/energonrelics/blockstates/energy_beam.json new file mode 100644 index 0000000..7222cdf --- /dev/null +++ b/src/main/resources/assets/energonrelics/blockstates/energy_beam.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "energonrelics:block/energy_beam" + } + } +} diff --git a/src/main/resources/assets/energonrelics/blockstates/energy_portal.json b/src/main/resources/assets/energonrelics/blockstates/energy_portal.json new file mode 100644 index 0000000..d7fd679 --- /dev/null +++ b/src/main/resources/assets/energonrelics/blockstates/energy_portal.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "energonrelics:block/energy_portal" + } + } +} diff --git a/src/main/resources/assets/energonrelics/blockstates/energy_projector.json b/src/main/resources/assets/energonrelics/blockstates/energy_projector.json new file mode 100644 index 0000000..30620b8 --- /dev/null +++ b/src/main/resources/assets/energonrelics/blockstates/energy_projector.json @@ -0,0 +1,50 @@ +{ + "variants": { + "facing=down,powered=false": { + "model": "energonrelics:block/energy_projector_off", + "x": 90 + }, + "facing=down,powered=true": { + "model": "energonrelics:block/energy_projector_on", + "x": 90 + }, + "facing=east,powered=false": { + "model": "energonrelics:block/energy_projector_off", + "y": 90 + }, + "facing=east,powered=true": { + "model": "energonrelics:block/energy_projector_on", + "y": 90 + }, + "facing=north,powered=false": { + "model": "energonrelics:block/energy_projector_off" + }, + "facing=north,powered=true": { + "model": "energonrelics:block/energy_projector_on" + }, + "facing=south,powered=false": { + "model": "energonrelics:block/energy_projector_off", + "y": 180 + }, + "facing=south,powered=true": { + "model": "energonrelics:block/energy_projector_on", + "y": 180 + }, + "facing=up,powered=false": { + "model": "energonrelics:block/energy_projector_off", + "x": 270 + }, + "facing=up,powered=true": { + "model": "energonrelics:block/energy_projector_on", + "x": 270 + }, + "facing=west,powered=false": { + "model": "energonrelics:block/energy_projector_off", + "y": 270 + }, + "facing=west,powered=true": { + "model": "energonrelics:block/energy_projector_on", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/energonrelics/lang/en_us.json b/src/main/resources/assets/energonrelics/lang/en_us.json index 3c01184..2f94873 100644 --- a/src/main/resources/assets/energonrelics/lang/en_us.json +++ b/src/main/resources/assets/energonrelics/lang/en_us.json @@ -52,5 +52,10 @@ "text.energonrelics.multimeter_separator": ", ", "category.rei.energonrelics.infuser.chance": "%s%% Chance", "category.rei.energonrelics.infuser.cost": "%s Energon", - "category.rei.energonrelics.infuser.name": "Infuser" + "category.rei.energonrelics.infuser.name": "Infuser", + "item.energonrelics.veridium_orb": "Veridium Orb", + "block.energonrelics.energy_projector": "Energy Projector", + "block.energonrelics.energy_beam": "Energy Beam", + "block.energonrelics.energy_portal": "Energy Portal", + "block.energonrelics.energized_obsidian": "Energized Obsidian" } \ No newline at end of file diff --git a/src/main/resources/assets/energonrelics/models/block/energized_obsidian.json b/src/main/resources/assets/energonrelics/models/block/energized_obsidian.json new file mode 100644 index 0000000..f15445e --- /dev/null +++ b/src/main/resources/assets/energonrelics/models/block/energized_obsidian.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "energonrelics:block/energized_obsidian" + } +} diff --git a/src/main/resources/assets/energonrelics/models/block/energy_beam.json b/src/main/resources/assets/energonrelics/models/block/energy_beam.json new file mode 100644 index 0000000..be7d724 --- /dev/null +++ b/src/main/resources/assets/energonrelics/models/block/energy_beam.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "energonrelics:block/energy_beam" + } +} diff --git a/src/main/resources/assets/energonrelics/models/block/energy_portal.json b/src/main/resources/assets/energonrelics/models/block/energy_portal.json new file mode 100644 index 0000000..696801c --- /dev/null +++ b/src/main/resources/assets/energonrelics/models/block/energy_portal.json @@ -0,0 +1,22 @@ +{ + "textures": { + "particle": "#portal", + "portal": "energonrelics:block/energy_portal" + }, + "elements": [ + { + "from": [0, 6, 0], + "to": [16, 10, 16], + "faces": { + "up": { + "uv": [0, 0, 16, 16], + "texture": "#portal" + }, + "down": { + "uv": [0, 0, 16, 16], + "texture": "#portal" + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/energonrelics/models/block/energy_projector_off.json b/src/main/resources/assets/energonrelics/models/block/energy_projector_off.json new file mode 100644 index 0000000..0e1d47f --- /dev/null +++ b/src/main/resources/assets/energonrelics/models/block/energy_projector_off.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/orientable", + "textures": { + "top": "energonrelics:block/field_projector_side", + "front": "energonrelics:block/energy_projector_off", + "side": "energonrelics:block/field_projector_side" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/energonrelics/models/block/energy_projector_on.json b/src/main/resources/assets/energonrelics/models/block/energy_projector_on.json new file mode 100644 index 0000000..743d3bd --- /dev/null +++ b/src/main/resources/assets/energonrelics/models/block/energy_projector_on.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/orientable", + "textures": { + "top": "energonrelics:block/field_projector_side", + "front": "energonrelics:block/energy_projector_on", + "side": "energonrelics:block/field_projector_side" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/energonrelics/models/item/energy_projector.json b/src/main/resources/assets/energonrelics/models/item/energy_projector.json new file mode 100644 index 0000000..b28775c --- /dev/null +++ b/src/main/resources/assets/energonrelics/models/item/energy_projector.json @@ -0,0 +1,3 @@ +{ + "parent": "energonrelics:block/energy_projector_off" +} \ No newline at end of file diff --git a/src/main/resources/assets/energonrelics/models/item/veridium_orb.json b/src/main/resources/assets/energonrelics/models/item/veridium_orb.json new file mode 100644 index 0000000..e294f0c --- /dev/null +++ b/src/main/resources/assets/energonrelics/models/item/veridium_orb.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "energonrelics:item/veridium_orb" + } +} diff --git a/src/main/resources/assets/energonrelics/textures/block/energized_obsidian.png b/src/main/resources/assets/energonrelics/textures/block/energized_obsidian.png new file mode 100644 index 0000000000000000000000000000000000000000..987334f73f40d8d5c1b02ebf3953376a544f5f88 GIT binary patch literal 2744 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/energonrelics/textures/block/energy_portal.png b/src/main/resources/assets/energonrelics/textures/block/energy_portal.png new file mode 100644 index 0000000000000000000000000000000000000000..892d35947b9a89cd367d3a957a6f75c19462437b GIT binary patch literal 25501 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 Ef<}5wr2qf` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/energonrelics/textures/block/energy_projector_on.png b/src/main/resources/assets/energonrelics/textures/block/energy_projector_on.png new file mode 100644 index 0000000000000000000000000000000000000000..a2f37ab87e44c2f04a9e9af00146bf437672ab41 GIT binary patch literal 722 zcmV;@0xkWCP)Ehyo z)FGL}m_!K?#6yw_Yvd_2F109`we|&meDjpVqsd>ViXo0HIq~{Mtw`6j)Qsq9`SMg% z?*H>NGm{gI?yewoK3UeA51cztuUXdDk!977!SM(e#iqX`IZc0vUTbRJ18{G`*=18p z?!x&N3_j=yBk?0SWZE+scs+&QIP~2>_evwH-*ryzA+{k;bPap^Fe>}qtKa#&Xa`Z( z3BUjV010qNS#tmY4`BcR4`BhQKc{H`009a~L_t(IPnA>24Z=VSG*L=GbijuO_|QY5 zd{Y2IG>|g*P(wZ`0wF3uh$0XrswDc9@GS-;5#juEvTdvsd~sQpO2c!`vP}J?gu`QxfW^z* zTxK%Wf}7msw7m*Ar)fHvkXuxl^Uxev19|!{iLW9#5vMH^ns|YMFUtss1 zZkU198BTDv3w!!J-GIObFfbO;9@gie3K1&;aJIZ46{daMToeRhBQHsk7rJ^6yb@k2 zi_X*4n>d!>8~Znbc$k4z;@4{(Q~+oHgx@_~I}_$V030SjR}*Mt_5c6?07*qoM6N<$ Ef>fhF+5i9m literal 0 HcmV?d00001 diff --git a/src/main/resources/data/energonrelics/loot_tables/blocks/energized_obsidian.json b/src/main/resources/data/energonrelics/loot_tables/blocks/energized_obsidian.json new file mode 100644 index 0000000..f886add --- /dev/null +++ b/src/main/resources/data/energonrelics/loot_tables/blocks/energized_obsidian.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:obsidian" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/energonrelics/loot_tables/blocks/energy_projector.json b/src/main/resources/data/energonrelics/loot_tables/blocks/energy_projector.json new file mode 100644 index 0000000..ce521e7 --- /dev/null +++ b/src/main/resources/data/energonrelics/loot_tables/blocks/energy_projector.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "energonrelics:energy_projector" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/energonrelics/recipes/energy_projector.json b/src/main/resources/data/energonrelics/recipes/energy_projector.json new file mode 100644 index 0000000..d853720 --- /dev/null +++ b/src/main/resources/data/energonrelics/recipes/energy_projector.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "energonrelics:forcefield_projector" + }, + { + "item": "energonrelics:veridium_orb" + } + ], + "result": { + "item": "energonrelics:energy_projector", + "count": 1 + } +} \ No newline at end of file