From 9096dbd53a28021c5e13e322dadab47be13c3ed4 Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Sat, 15 Aug 2020 23:01:24 -0400 Subject: [PATCH] 0.0.8 --- CHANGELOG.md | 5 + docs/BLOCKS.md | 12 +- gradle.properties | 2 +- .../energonrelics/EnergonRelics.java | 5 + .../api/block/SimpleBlockWithEntity.java | 39 +++ .../api/energy/tick/EnergyTicker.java | 9 + .../api/item/MultimeterExtra.java | 14 + .../block/PhaseShifterBlock.java | 115 ++++++++ .../energonrelics/block/SwitchBlock.java | 15 +- .../block/entity/SwitchBlockEntity.java | 4 +- .../entity/infuser/InfuserBlockEntity.java | 4 +- .../reactor/ReactorInputBlockEntity.java | 2 +- .../shifter/PhaseShifterBlockEntity.java | 267 ++++++++++++++++++ .../block/entity/shifter/PhasedItem.java | 34 +++ .../block/reactor/ReactorInputBlock.java | 7 +- .../client/EnergonRelicsClient.java | 7 + .../client/rei/EnergonRelicsPlugin.java | 12 + .../energonrelics/config/HardcodedConfig.java | 14 + .../energonrelics/item/MultimeterItem.java | 14 +- .../blockstates/phase_shifter.json | 16 ++ .../energonrelics/blockstates/switch.json | 4 +- .../assets/energonrelics/lang/en_us.json | 6 +- .../models/block/phase_shifter.json | 33 +++ .../models/block/phase_shifter_off_input.json | 6 + .../block/phase_shifter_off_output.json | 6 + .../models/block/phase_shifter_on_input.json | 6 + .../models/block/phase_shifter_on_output.json | 6 + .../models/item/phase_shifter.json | 3 + .../block/phase_shifter_off_input.png | Bin 0 -> 7322 bytes .../block/phase_shifter_off_output.png | Bin 0 -> 7312 bytes .../textures/block/phase_shifter_on_input.png | Bin 0 -> 2369 bytes .../block/phase_shifter_on_output.png | Bin 0 -> 7316 bytes .../textures/block/phase_shifter_tint.png | Bin 0 -> 7040 bytes .../loot_tables/blocks/phase_shifter.json | 19 ++ .../energonrelics/recipes/energon_light.json | 12 +- .../recipes/forcefield_projector.json | 6 +- .../energonrelics/recipes/phase_shifter.json | 23 ++ 37 files changed, 694 insertions(+), 33 deletions(-) create mode 100644 src/main/java/com/thebrokenrail/energonrelics/api/item/MultimeterExtra.java create mode 100644 src/main/java/com/thebrokenrail/energonrelics/block/PhaseShifterBlock.java create mode 100644 src/main/java/com/thebrokenrail/energonrelics/block/entity/shifter/PhaseShifterBlockEntity.java create mode 100644 src/main/java/com/thebrokenrail/energonrelics/block/entity/shifter/PhasedItem.java create mode 100644 src/main/resources/assets/energonrelics/blockstates/phase_shifter.json create mode 100644 src/main/resources/assets/energonrelics/models/block/phase_shifter.json create mode 100644 src/main/resources/assets/energonrelics/models/block/phase_shifter_off_input.json create mode 100644 src/main/resources/assets/energonrelics/models/block/phase_shifter_off_output.json create mode 100644 src/main/resources/assets/energonrelics/models/block/phase_shifter_on_input.json create mode 100644 src/main/resources/assets/energonrelics/models/block/phase_shifter_on_output.json create mode 100644 src/main/resources/assets/energonrelics/models/item/phase_shifter.json create mode 100644 src/main/resources/assets/energonrelics/textures/block/phase_shifter_off_input.png create mode 100644 src/main/resources/assets/energonrelics/textures/block/phase_shifter_off_output.png create mode 100644 src/main/resources/assets/energonrelics/textures/block/phase_shifter_on_input.png create mode 100644 src/main/resources/assets/energonrelics/textures/block/phase_shifter_on_output.png create mode 100644 src/main/resources/assets/energonrelics/textures/block/phase_shifter_tint.png create mode 100644 src/main/resources/data/energonrelics/loot_tables/blocks/phase_shifter.json create mode 100644 src/main/resources/data/energonrelics/recipes/phase_shifter.json diff --git a/CHANGELOG.md b/CHANGELOG.md index e459665..b70a787 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +**Beta 0.0.8** +* Add Phase Shifter Block +* Fix Bugs +* Add Circuit Board To REI + **Beta 0.0.7** * Fix Structure Generation diff --git a/docs/BLOCKS.md b/docs/BLOCKS.md index 3ac2abf..75d2047 100644 --- a/docs/BLOCKS.md +++ b/docs/BLOCKS.md @@ -92,4 +92,14 @@ ## Infuser - Uses Energy To Attempt To Convert An Item To A Different Item -- Each Item Has Multiple Outcomes And May Require Different Amount Of Energy \ No newline at end of file +- Each Item Has Multiple Outcomes And May Require Different Amount Of Energy + +## Phase Shifter +- Two Modes: Input And Output +- Mode Is Toggled By Redstone Input +- Can Be Dyed +- Input Blocks Phase Items +- The More Phased Items, The More Power An Input Requires +- The Longer An Item Is Phased, The Higher Its Range Is +- Periodically, Phased Items Are Rolled +- When Phased Items Are Rolled, There Is A 10% Chance Of Success, If It Succeeds it Will Transfer The Phased Item To An Output With Range That Is The Same Color \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 90a823a..eba8bb6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ org.gradle.jvmargs = -Xmx1G fabric_loader_version = 0.9.0+build.204 # Mod Properties - mod_version = 0.0.7 + mod_version = 0.0.8 maven_group = com.thebrokenrail # Dependencies diff --git a/src/main/java/com/thebrokenrail/energonrelics/EnergonRelics.java b/src/main/java/com/thebrokenrail/energonrelics/EnergonRelics.java index 79c784f..386d916 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/EnergonRelics.java +++ b/src/main/java/com/thebrokenrail/energonrelics/EnergonRelics.java @@ -5,6 +5,7 @@ import com.thebrokenrail.energonrelics.block.CreativeEnergySourceBlock; import com.thebrokenrail.energonrelics.block.DefensiveLaserBlock; import com.thebrokenrail.energonrelics.block.HolographicSkyBlock; import com.thebrokenrail.energonrelics.block.InfuserBlock; +import com.thebrokenrail.energonrelics.block.PhaseShifterBlock; import com.thebrokenrail.energonrelics.block.lightning.LightningRodBaseBlock; import com.thebrokenrail.energonrelics.block.forcefield.ForcefieldProjectorBlock; import com.thebrokenrail.energonrelics.block.forcefield.laser.IndustrialLaserProjectorBlock; @@ -126,6 +127,8 @@ public final class EnergonRelics implements ModInitializer { public static final EnergyProjectorBlock ENERGY_PROJECTOR_BLOCK = new EnergyProjectorBlock(); public static final Item VERIDIUM_ORB_ITEM = new Item(new Item.Settings().group(ITEM_GROUP).rarity(Rarity.UNCOMMON)); + public static final PhaseShifterBlock PHASE_SHIFTER_BLOCK = new PhaseShifterBlock(); + @Override public void onInitialize() { Registry.register(Registry.ITEM, new Identifier(NAMESPACE, "veridium_ingot"), VERIDIUM_INGOT_ITEM); @@ -190,6 +193,8 @@ public final class EnergonRelics implements ModInitializer { ENERGY_BEAM_BLOCK.register("energy_beam"); ENERGY_PORTAL_BLOCK.register("energy_portal"); ENERGY_PROJECTOR_BLOCK.register("energy_projector"); + + PHASE_SHIFTER_BLOCK.register("phase_shifter"); } public static void playBeep(World world, BlockPos pos) { diff --git a/src/main/java/com/thebrokenrail/energonrelics/api/block/SimpleBlockWithEntity.java b/src/main/java/com/thebrokenrail/energonrelics/api/block/SimpleBlockWithEntity.java index 57f176a..ea96bea 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/api/block/SimpleBlockWithEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/api/block/SimpleBlockWithEntity.java @@ -1,17 +1,25 @@ package com.thebrokenrail.energonrelics.api.block; import net.minecraft.block.BlockEntityProvider; +import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.inventory.Inventory; +import net.minecraft.screen.ScreenHandler; import net.minecraft.util.Identifier; +import net.minecraft.util.ItemScatterer; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.registry.Registry; import net.minecraft.world.BlockView; +import net.minecraft.world.World; +import org.jetbrains.annotations.ApiStatus; import java.util.function.Function; /** * Simple Block With Entity */ +@SuppressWarnings("deprecation") public abstract class SimpleBlockWithEntity extends SimpleBlock implements BlockEntityProvider { protected BlockEntityType type; @@ -35,4 +43,35 @@ public abstract class SimpleBlockWithEntity extends SimpleBlock implements Block public BlockEntity createBlockEntity(BlockView world) { return getFactory().apply(type); } + + /** + * Does This Block's Block Entity Have An Inventory + * @return Has Inventory + */ + @ApiStatus.OverrideOnly + protected boolean hasInventory() { + return false; + } + + @Override + public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { + if (state.getBlock() != newState.getBlock() && hasInventory()) { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof Inventory) { + ItemScatterer.spawn(world, pos, (Inventory) blockEntity); + world.updateComparators(pos, this); + } + } + super.onStateReplaced(state, world, pos, newState, moved); + } + + @Override + public boolean hasComparatorOutput(BlockState state) { + return hasInventory(); + } + + @Override + public int getComparatorOutput(BlockState state, World world, BlockPos pos) { + return hasInventory() ? ScreenHandler.calculateComparatorOutput(world.getBlockEntity(pos)) : 0; + } } diff --git a/src/main/java/com/thebrokenrail/energonrelics/api/energy/tick/EnergyTicker.java b/src/main/java/com/thebrokenrail/energonrelics/api/energy/tick/EnergyTicker.java index cb9c185..7768be5 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/api/energy/tick/EnergyTicker.java +++ b/src/main/java/com/thebrokenrail/energonrelics/api/energy/tick/EnergyTicker.java @@ -18,6 +18,11 @@ import java.util.Objects; public class EnergyTicker { private static final List scheduled = new ArrayList<>(); + /** + * List of All Loaded Energy Tickers + */ + public static List allLoaded = Collections.emptyList(); + /** * Schedule For Next Energy Tick * @param tickable Object To Tick @@ -56,6 +61,8 @@ public class EnergyTicker { temp2.clear(); } + allLoaded = Collections.unmodifiableList(started); + Collections.shuffle(started, world.random); for (EnergyTickable tickable : started) { world.getProfiler().push(() -> tickable.getID() + " logicTick"); @@ -68,5 +75,7 @@ public class EnergyTicker { world.getProfiler().pop(); } scheduled.clear(); + + allLoaded = Collections.emptyList(); } } diff --git a/src/main/java/com/thebrokenrail/energonrelics/api/item/MultimeterExtra.java b/src/main/java/com/thebrokenrail/energonrelics/api/item/MultimeterExtra.java new file mode 100644 index 0000000..f3b8102 --- /dev/null +++ b/src/main/java/com/thebrokenrail/energonrelics/api/item/MultimeterExtra.java @@ -0,0 +1,14 @@ +package com.thebrokenrail.energonrelics.api.item; + +import net.minecraft.text.MutableText; + +/** + * Implement To provide Extra Information In Multimeter + */ +public interface MultimeterExtra { + /** + * Get Extra Information + * @return Text + */ + MutableText getExtra(); +} diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/PhaseShifterBlock.java b/src/main/java/com/thebrokenrail/energonrelics/block/PhaseShifterBlock.java new file mode 100644 index 0000000..de42cfe --- /dev/null +++ b/src/main/java/com/thebrokenrail/energonrelics/block/PhaseShifterBlock.java @@ -0,0 +1,115 @@ +package com.thebrokenrail.energonrelics.block; + +import com.thebrokenrail.energonrelics.EnergonRelics; +import com.thebrokenrail.energonrelics.api.block.energy.EnergyBlock; +import com.thebrokenrail.energonrelics.block.entity.shifter.PhaseShifterBlockEntity; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.DyeItem; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.HopperScreenHandler; +import net.minecraft.screen.SimpleNamedScreenHandlerFactory; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +import net.minecraft.state.property.EnumProperty; +import net.minecraft.state.property.Properties; +import net.minecraft.text.TranslatableText; +import net.minecraft.util.ActionResult; +import net.minecraft.util.DyeColor; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import java.util.Random; +import java.util.function.Function; + +@SuppressWarnings("deprecation") +public class PhaseShifterBlock extends EnergyBlock { + public static final BooleanProperty POWERED = Properties.POWERED; + public static final BooleanProperty IS_OUTPUT = BooleanProperty.of("is_output"); + public static final EnumProperty COLOR = EnumProperty.of("color", DyeColor.class); + + public PhaseShifterBlock() { + super(FabricBlockSettings.copy(Blocks.IRON_BLOCK).lightLevel(state -> state.get(POWERED) ? 13 : 0).emissiveLighting((state, world, pos) -> state.get(POWERED))); + setDefaultState(getDefaultState().with(POWERED, false).with(IS_OUTPUT, false).with(COLOR, DyeColor.WHITE)); + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + super.appendProperties(builder); + builder.add(POWERED, IS_OUTPUT, COLOR); + } + + @Override + protected Function, BlockEntity> getFactory() { + return PhaseShifterBlockEntity::new; + } + + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + return getDefaultState().with(IS_OUTPUT, ctx.getWorld().isReceivingRedstonePower(ctx.getBlockPos())); + } + + @Override + public void neighborUpdate(BlockState state, World world, BlockPos pos, Block block, BlockPos fromPos, boolean notify) { + if (!world.isClient()) { + boolean bl = state.get(IS_OUTPUT); + if (bl != world.isReceivingRedstonePower(pos)) { + if (bl) { + world.getBlockTickScheduler().schedule(pos, this, 4); + } else { + world.setBlockState(pos, state.cycle(IS_OUTPUT), 2); + } + } + } + } + + @Override + public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + if (state.get(IS_OUTPUT) && !world.isReceivingRedstonePower(pos)) { + world.setBlockState(pos, state.cycle(IS_OUTPUT), 2); + } + } + + @Override + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + ItemStack stack = player.getStackInHand(hand); + BlockEntity entity = world.getBlockEntity(pos); + + if (stack.getItem() instanceof DyeItem) { + DyeColor newColor = ((DyeItem) stack.getItem()).getColor(); + if (state.get(COLOR) != newColor) { + world.setBlockState(pos, state.with(COLOR, newColor)); + if (!player.isCreative()) { + stack.decrement(1); + } + return ActionResult.SUCCESS; + } else { + return ActionResult.PASS; + } + } else { + if (entity instanceof Inventory) { + if (!world.isClient()) { + player.openHandledScreen(new SimpleNamedScreenHandlerFactory((i, inv, player2) -> new HopperScreenHandler(i, inv, (Inventory) entity), new TranslatableText("block." + EnergonRelics.NAMESPACE + ".phase_shifter"))); + } + return ActionResult.SUCCESS; + } else { + return ActionResult.FAIL; + } + } + } + + @Override + protected boolean hasInventory() { + return true; + } +} diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/SwitchBlock.java b/src/main/java/com/thebrokenrail/energonrelics/block/SwitchBlock.java index b10a79e..8448423 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/SwitchBlock.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/SwitchBlock.java @@ -22,26 +22,27 @@ import java.util.function.Function; @SuppressWarnings("deprecation") public class SwitchBlock extends EnergyBlock { public static final BooleanProperty POWERED = Properties.POWERED; + public static final BooleanProperty ACTIVE = BooleanProperty.of("active"); public SwitchBlock() { super(FabricBlockSettings.of(Material.STONE).requiresTool().strength(1.5f, 6.0f)); - setDefaultState(getDefaultState().with(POWERED, false)); + setDefaultState(getDefaultState().with(POWERED, false).with(ACTIVE, false)); } @Override public BlockState getPlacementState(ItemPlacementContext ctx) { - return getDefaultState().with(POWERED, ctx.getWorld().isReceivingRedstonePower(ctx.getBlockPos())); + return getDefaultState().with(ACTIVE, ctx.getWorld().isReceivingRedstonePower(ctx.getBlockPos())); } @Override public void neighborUpdate(BlockState state, World world, BlockPos pos, Block block, BlockPos fromPos, boolean notify) { if (!world.isClient()) { - boolean bl = state.get(POWERED); + boolean bl = state.get(ACTIVE); if (bl != world.isReceivingRedstonePower(pos)) { if (bl) { world.getBlockTickScheduler().schedule(pos, this, 4); } else { - world.setBlockState(pos, state.cycle(POWERED), 2); + world.setBlockState(pos, state.cycle(ACTIVE), 2); } } } @@ -49,14 +50,14 @@ public class SwitchBlock extends EnergyBlock { @Override public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - if (state.get(POWERED) && !world.isReceivingRedstonePower(pos)) { - world.setBlockState(pos, state.cycle(POWERED), 2); + if (state.get(ACTIVE) && !world.isReceivingRedstonePower(pos)) { + world.setBlockState(pos, state.cycle(ACTIVE), 2); } } @Override protected void appendProperties(StateManager.Builder builder) { - builder.add(POWERED); + builder.add(POWERED, ACTIVE); } @Override diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/SwitchBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/SwitchBlockEntity.java index afc6fcc..445f66a 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/entity/SwitchBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/SwitchBlockEntity.java @@ -3,6 +3,7 @@ package com.thebrokenrail.energonrelics.block.entity; import com.thebrokenrail.energonrelics.api.block.entity.core.EnergyReceiverBlockEntity; import com.thebrokenrail.energonrelics.api.energy.Action; import com.thebrokenrail.energonrelics.block.SwitchBlock; +import com.thebrokenrail.energonrelics.config.HardcodedConfig; import net.minecraft.block.entity.BlockEntityType; public class SwitchBlockEntity extends EnergyReceiverBlockEntity { @@ -12,6 +13,7 @@ public class SwitchBlockEntity extends EnergyReceiverBlockEntity { @Override protected void energyTick() { + addAction(Action.createBlockStatePropertyAction(HardcodedConfig.SWITCH_ENERGY_REQUIRED, SwitchBlock.POWERED, true, false)); } @Override @@ -31,6 +33,6 @@ public class SwitchBlockEntity extends EnergyReceiverBlockEntity { } private boolean isActive() { - return getCachedState().get(SwitchBlock.POWERED); + return getCachedState().get(SwitchBlock.ACTIVE) && getCachedState().get(SwitchBlock.POWERED); } } diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/infuser/InfuserBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/infuser/InfuserBlockEntity.java index b94e140..8941e1e 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/entity/infuser/InfuserBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/infuser/InfuserBlockEntity.java @@ -3,9 +3,9 @@ package com.thebrokenrail.energonrelics.block.entity.infuser; import com.thebrokenrail.energonrelics.EnergonRelics; import com.thebrokenrail.energonrelics.api.block.entity.core.EnergyReceiverBlockEntity; import com.thebrokenrail.energonrelics.api.energy.Action; +import com.thebrokenrail.energonrelics.api.item.MultimeterExtra; import com.thebrokenrail.energonrelics.block.InfuserBlock; import com.thebrokenrail.energonrelics.config.HardcodedConfig; -import com.thebrokenrail.energonrelics.item.MultimeterItem; import com.thebrokenrail.energonrelics.registry.infuser.data.InfuserAction; import com.thebrokenrail.energonrelics.registry.infuser.data.InfuserEntry; import com.thebrokenrail.energonrelics.registry.infuser.InfuserRegistry; @@ -20,7 +20,7 @@ import net.minecraft.util.Formatting; import java.util.Objects; -public class InfuserBlockEntity extends EnergyReceiverBlockEntity implements MultimeterItem.MultimeterExtra { +public class InfuserBlockEntity extends EnergyReceiverBlockEntity implements MultimeterExtra { public InfuserBlockEntity(BlockEntityType type) { super(type); } diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/reactor/ReactorInputBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/reactor/ReactorInputBlockEntity.java index bf0efdc..cefb555 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/entity/reactor/ReactorInputBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/reactor/ReactorInputBlockEntity.java @@ -17,7 +17,7 @@ public class ReactorInputBlockEntity extends BlockEntity implements Inventory { super(type); } - private final int INVENTORY_SIZE = 5; + public final static int INVENTORY_SIZE = 5; private final DefaultedList inv = DefaultedList.ofSize(INVENTORY_SIZE, ItemStack.EMPTY); diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/shifter/PhaseShifterBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/shifter/PhaseShifterBlockEntity.java new file mode 100644 index 0000000..e4c4898 --- /dev/null +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/shifter/PhaseShifterBlockEntity.java @@ -0,0 +1,267 @@ +package com.thebrokenrail.energonrelics.block.entity.shifter; + +import com.thebrokenrail.energonrelics.EnergonRelics; +import com.thebrokenrail.energonrelics.api.block.entity.core.EnergyReceiverBlockEntity; +import com.thebrokenrail.energonrelics.api.energy.Action; +import com.thebrokenrail.energonrelics.api.energy.tick.EnergyTickable; +import com.thebrokenrail.energonrelics.api.energy.tick.EnergyTicker; +import com.thebrokenrail.energonrelics.api.item.MultimeterExtra; +import com.thebrokenrail.energonrelics.block.PhaseShifterBlock; +import com.thebrokenrail.energonrelics.block.entity.reactor.ReactorInputBlockEntity; +import com.thebrokenrail.energonrelics.config.HardcodedConfig; +import com.thebrokenrail.energonrelics.util.WeightedList; +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.Inventories; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.text.LiteralText; +import net.minecraft.text.MutableText; +import net.minecraft.text.TranslatableText; +import net.minecraft.util.Formatting; +import net.minecraft.util.collection.DefaultedList; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class PhaseShifterBlockEntity extends EnergyReceiverBlockEntity implements Inventory, MultimeterExtra { + private final static int INVENTORY_SIZE = ReactorInputBlockEntity.INVENTORY_SIZE; + + private final DefaultedList inv = DefaultedList.ofSize(INVENTORY_SIZE, ItemStack.EMPTY); + + private int cooldown = 0; + + public PhaseShifterBlockEntity(BlockEntityType type) { + super(type); + } + + @Override + public int size() { + return inv.size(); + } + + @Override + public boolean isEmpty() { + boolean empty = false; + for (ItemStack stack : inv) { + if (stack.isEmpty()) { + empty = true; + break; + } + } + return empty; + } + + @Override + public ItemStack getStack(int slot) { + return inv.get(slot); + } + + @Override + public ItemStack removeStack(int slot, int amount) { + ItemStack stack = Inventories.splitStack(inv, slot, amount); + if (!stack.isEmpty()) { + markDirty(); + } + return stack; + } + + @Override + public ItemStack removeStack(int slot) { + return Inventories.removeStack(inv, slot); + } + + @Override + public void setStack(int slot, ItemStack stack) { + inv.set(slot, stack); + if (stack.getCount() > getMaxCountPerStack()) { + stack.setCount(getMaxCountPerStack()); + } + } + + @Override + public boolean canPlayerUse(PlayerEntity player) { + if (Objects.requireNonNull(getWorld()).getBlockEntity(getPos()) != this) { + return false; + } else { + return player.squaredDistanceTo((double) getPos().getX() + 0.5D, (double) getPos().getY() + 0.5D, (double) getPos().getZ() + 0.5D) <= 64.0D; + } + } + + @Override + public void clear() { + inv.clear(); + } + + private final List phasedItems = new ArrayList<>(); + + @Override + public void fromTag(BlockState state, CompoundTag tag) { + super.fromTag(state, tag); + inv.clear(); + Inventories.fromTag(tag, inv); + cooldown = tag.getInt("Cooldown"); + + phasedItems.clear(); + Tag list = tag.get("PhasedItems"); + if (list instanceof ListTag) { + ListTag itemsTag = (ListTag) list; + for (int i = 0; i < itemsTag.size(); i++) { + phasedItems.add(PhasedItem.fromTag(itemsTag.getCompound(i))); + } + } + } + + private int canInsert(ItemStack stack) { + if (stack.getCount() <= getMaxCountPerStack()) { + for (int slot = 0; slot < size(); slot++) { + ItemStack oldStack = getStack(slot); + if (oldStack.isItemEqual(stack)) { + int newCount = oldStack.getCount() + stack.getCount(); + if (newCount <= Math.min(oldStack.getMaxCount(), getMaxCountPerStack())) { + return slot; + } + } + } + + for (int slot = 0; slot < size(); slot++) { + ItemStack oldStack = getStack(slot); + if (oldStack.isEmpty()) { + return slot; + } + } + } + return -1; + } + + private long getCost() { + return getCachedState().get(PhaseShifterBlock.IS_OUTPUT) ? HardcodedConfig.PHASE_SHIFTER_OUTPUT_ENERGY_REQUIRED : HardcodedConfig.PHASE_SHIFTER_INPUT_ENERGY_REQUIRED_BASE + (HardcodedConfig.PHASE_SHIFTER_INPUT_ENERGY_REQUIRED_PER_ITEM * phasedItems.size()); + } + + @Override + protected void energyTick() { + assert getWorld() != null; + + addAction(Action.createBlockStatePropertyAction(getCost(), PhaseShifterBlock.POWERED, true, false)); + + boolean dirty = false; + + if (cooldown > 0) { + cooldown--; + dirty = true; + } + + if (getCachedState().get(PhaseShifterBlock.POWERED) && !getCachedState().get(PhaseShifterBlock.IS_OUTPUT)) { + List outputs = new ArrayList<>(); + for (EnergyTickable tickable : EnergyTicker.allLoaded) { + if (tickable instanceof PhaseShifterBlockEntity && ((PhaseShifterBlockEntity) tickable).getCachedState().get(PhaseShifterBlock.IS_OUTPUT) && Objects.requireNonNull(((PhaseShifterBlockEntity) tickable).getWorld()).getRegistryKey() == getWorld().getRegistryKey() && ((PhaseShifterBlockEntity) tickable).cooldown == 0 && ((PhaseShifterBlockEntity) tickable).getCachedState().get(PhaseShifterBlock.COLOR) == getCachedState().get(PhaseShifterBlock.COLOR)) { + outputs.add((PhaseShifterBlockEntity) tickable); + } + } + + if (phasedItems.size() > 0) { + dirty = true; + } + + Iterator iterator = phasedItems.iterator(); + while (iterator.hasNext()) { + PhasedItem item = iterator.next(); + + if (item.cooldown > 0) { + item.cooldown--; + } else { + Map validOutputs = new HashMap<>(); + for (PhaseShifterBlockEntity output : outputs) { + int slot = output.canInsert(item.item); + if (slot != -1 && output.getPos().isWithinDistance(getPos(), item.getRange())) { + validOutputs.put(output, slot); + } + } + + boolean success = validOutputs.size() > 0 && HardcodedConfig.PHASE_SHIFTER_SUCCESS_CHANCE >= getWorld().random.nextFloat(); + + if (success) { + WeightedList weightedList = new WeightedList<>(); + for (PhaseShifterBlockEntity output : validOutputs.keySet()) { + weightedList.add(1, output); + } + + PhaseShifterBlockEntity output = weightedList.pick(getWorld().random); + + int slot = validOutputs.get(output); + + ItemStack stack = item.item.copy(); + stack.increment(output.getStack(slot).getCount()); + + output.setStack(slot, stack); + + output.resetCooldown(); + + output.markDirty(); + + iterator.remove(); + } else { + item.roll++; + item.cooldown = HardcodedConfig.PHASE_SHIFTER_INPUT_ROLL_COOLDOWN; + } + } + } + + if (cooldown == 0) { + ItemStack next = ItemStack.EMPTY; + + for (int slot = 0; slot < size(); slot++) { + ItemStack stack = getStack(slot); + if (!stack.isEmpty()) { + next = stack.split(1); + } + } + + if (!next.isEmpty()) { + phasedItems.add(new PhasedItem(next)); + resetCooldown(); + dirty = true; + } + } + } else if (phasedItems.size() > 0) { + phasedItems.clear(); + dirty = true; + } + + if (dirty) { + markDirty(); + } + } + + private void resetCooldown() { + cooldown = getCachedState().get(PhaseShifterBlock.IS_OUTPUT) ? HardcodedConfig.PHASE_SHIFTER_OUTPUT_COOLDOWN : HardcodedConfig.PHASE_SHIFTER_INPUT_COOLDOWN; + } + + @Override + public CompoundTag toTag(CompoundTag tag) { + super.toTag(tag); + Inventories.toTag(tag, inv); + tag.putInt("Cooldown", cooldown); + + ListTag itemsTag = new ListTag(); + for (PhasedItem item : phasedItems) { + itemsTag.add(item.toTag()); + } + tag.put("PhasedItems", itemsTag); + + return tag; + } + + @Override + public MutableText getExtra() { + return getCachedState().get(PhaseShifterBlock.IS_OUTPUT) ? null : new TranslatableText("text." + EnergonRelics.NAMESPACE + ".phase_shifter_extra", new LiteralText(String.valueOf(phasedItems.size())).formatted(Formatting.WHITE)); + } +} diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/shifter/PhasedItem.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/shifter/PhasedItem.java new file mode 100644 index 0000000..372da36 --- /dev/null +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/shifter/PhasedItem.java @@ -0,0 +1,34 @@ +package com.thebrokenrail.energonrelics.block.entity.shifter; + +import com.thebrokenrail.energonrelics.config.HardcodedConfig; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundTag; + +class PhasedItem { + final ItemStack item; + int cooldown = 0; + int roll = 0; + + PhasedItem(ItemStack item) { + this.item = item; + } + + int getRange() { + return HardcodedConfig.PHASE_SHIFTER_INPUT_RANGE_BASE + (roll * HardcodedConfig.PHASE_SHIFTER_INPUT_RANGE_INCREMENT); + } + + CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); + tag.put("Item", item.toTag(new CompoundTag())); + tag.putInt("Cooldown", cooldown); + tag.putInt("Roll", roll); + return tag; + } + + static PhasedItem fromTag(CompoundTag tag) { + PhasedItem item = new PhasedItem(ItemStack.fromTag(tag.getCompound("Item"))); + item.cooldown = tag.getInt("Cooldown"); + item.roll = tag.getInt("Roll"); + return item; + } +} diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/reactor/ReactorInputBlock.java b/src/main/java/com/thebrokenrail/energonrelics/block/reactor/ReactorInputBlock.java index e283387..f569465 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/reactor/ReactorInputBlock.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/reactor/ReactorInputBlock.java @@ -22,6 +22,7 @@ import net.minecraft.world.World; import java.util.function.Function; +@SuppressWarnings("deprecation") public class ReactorInputBlock extends SimpleBlockWithEntity { public ReactorInputBlock() { super(FabricBlockSettings.of(Material.STONE, MaterialColor.YELLOW_TERRACOTTA).requiresTool().strength(1.5f, 6.0f)); @@ -33,7 +34,6 @@ public class ReactorInputBlock extends SimpleBlockWithEntity { } @Override - @SuppressWarnings("deprecation") public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { BlockEntity entity = world.getBlockEntity(pos); if (entity instanceof Inventory) { @@ -45,4 +45,9 @@ public class ReactorInputBlock extends SimpleBlockWithEntity { return ActionResult.FAIL; } } + + @Override + protected boolean hasInventory() { + return true; + } } diff --git a/src/main/java/com/thebrokenrail/energonrelics/client/EnergonRelicsClient.java b/src/main/java/com/thebrokenrail/energonrelics/client/EnergonRelicsClient.java index 44ebafd..8e188e3 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/client/EnergonRelicsClient.java +++ b/src/main/java/com/thebrokenrail/energonrelics/client/EnergonRelicsClient.java @@ -1,9 +1,11 @@ package com.thebrokenrail.energonrelics.client; import com.thebrokenrail.energonrelics.EnergonRelics; +import com.thebrokenrail.energonrelics.block.PhaseShifterBlock; import com.thebrokenrail.energonrelics.block.forcefield.util.AbstractFieldBlock; import com.thebrokenrail.energonrelics.api.block.energy.EnergyBlock; import com.thebrokenrail.energonrelics.client.config.UserConfig; +import com.thebrokenrail.energonrelics.config.HardcodedConfig; import me.sargunvohra.mcmods.autoconfig1u.AutoConfig; import me.sargunvohra.mcmods.autoconfig1u.ConfigData; import me.sargunvohra.mcmods.autoconfig1u.annotation.Config; @@ -12,6 +14,7 @@ import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; +import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; import net.fabricmc.fabric.api.event.player.AttackBlockCallback; import net.minecraft.block.BlockState; import net.minecraft.client.MinecraftClient; @@ -51,6 +54,10 @@ public final class EnergonRelicsClient implements ClientModInitializer { BlockRenderLayerMap.INSTANCE.putBlock(EnergonRelics.ENERGY_PORTAL_BLOCK, RenderLayer.getTranslucent()); BlockRenderLayerMap.INSTANCE.putBlock(EnergonRelics.ENERGY_BEAM_BLOCK, RenderLayer.getTranslucent()); + BlockRenderLayerMap.INSTANCE.putBlock(EnergonRelics.PHASE_SHIFTER_BLOCK, RenderLayer.getCutoutMipped()); + ColorProviderRegistry.BLOCK.register((state, world, pos, tintIndex) -> state.get(PhaseShifterBlock.COLOR).getFireworkColor(), EnergonRelics.PHASE_SHIFTER_BLOCK); + ColorProviderRegistry.ITEM.register((stack, tintIndex) -> tintIndex == 0 ? HardcodedConfig.PHASE_SHIFTER_DEFAULT_COLOR.getFireworkColor() : -1); + AutoConfig.register(UserConfig.class, ReloadSerializer::new); AttackBlockCallback.EVENT.register((playerEntity, world, hand, blockPos, direction) -> { diff --git a/src/main/java/com/thebrokenrail/energonrelics/client/rei/EnergonRelicsPlugin.java b/src/main/java/com/thebrokenrail/energonrelics/client/rei/EnergonRelicsPlugin.java index 15b89fe..67e15c9 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/client/rei/EnergonRelicsPlugin.java +++ b/src/main/java/com/thebrokenrail/energonrelics/client/rei/EnergonRelicsPlugin.java @@ -3,13 +3,19 @@ package com.thebrokenrail.energonrelics.client.rei; import com.thebrokenrail.energonrelics.EnergonRelics; import com.thebrokenrail.energonrelics.client.rei.infuser.InfuserCategory; import com.thebrokenrail.energonrelics.client.rei.reactor.ReactorFuelCategory; +import me.shedaniel.rei.api.BuiltinPlugin; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.RecipeHelper; import me.shedaniel.rei.api.plugins.REIPluginV0; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.text.Text; +import net.minecraft.text.TranslatableText; import net.minecraft.util.Identifier; +import java.util.ArrayList; +import java.util.List; + @Environment(EnvType.CLIENT) public final class EnergonRelicsPlugin implements REIPluginV0 { public static final Identifier INFUSING = new Identifier(EnergonRelics.NAMESPACE, "plugin/infusing"); @@ -27,6 +33,12 @@ public final class EnergonRelicsPlugin implements REIPluginV0 { recipeHelper.removeAutoCraftButton(INFUSING); recipeHelper.removeAutoCraftButton(REACTOR_FUEL); + + BuiltinPlugin.getInstance().registerInformation(EntryStack.create(EnergonRelics.CIRCUIT_BOARD_ITEM), new TranslatableText("category.rei." + EnergonRelics.NAMESPACE + ".information.structure_generation.title"), texts -> { + List newTexts = new ArrayList<>(texts); + newTexts.add(new TranslatableText("category.rei." + EnergonRelics.NAMESPACE + ".information.structure_generation.research_complex")); + return newTexts; + }); } @Override diff --git a/src/main/java/com/thebrokenrail/energonrelics/config/HardcodedConfig.java b/src/main/java/com/thebrokenrail/energonrelics/config/HardcodedConfig.java index 53bc7f7..b3a7e85 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/config/HardcodedConfig.java +++ b/src/main/java/com/thebrokenrail/energonrelics/config/HardcodedConfig.java @@ -2,6 +2,7 @@ package com.thebrokenrail.energonrelics.config; import net.minecraft.item.Item; import net.minecraft.item.Items; +import net.minecraft.util.DyeColor; /** * Hardcoded Configuration Values @@ -9,6 +10,8 @@ import net.minecraft.item.Items; public final class HardcodedConfig { public static final int POWER_RANGE = 64; + public static final long SWITCH_ENERGY_REQUIRED = 2; + public static final int ENERGON_LIGHT_ENERGY_REQUIRED = 5; public static final long SOLAR_PANEL_MAX_ENERGY_OUTPUT = 50; @@ -53,4 +56,15 @@ public final class HardcodedConfig { public static final int ENERGY_PORTAL_MULTIPLIER = 16; public static final int ENERGY_PORTAL_Y_PADDING = 4; public static final int ENERGY_PORTAL_Y_PADDING_EXTRA_TOP = 3; + + public static final long PHASE_SHIFTER_INPUT_ENERGY_REQUIRED_BASE = 112; + public static final long PHASE_SHIFTER_INPUT_ENERGY_REQUIRED_PER_ITEM = 19; + public static final int PHASE_SHIFTER_INPUT_COOLDOWN = 16; + public static final int PHASE_SHIFTER_INPUT_ROLL_COOLDOWN = 6; + public static final int PHASE_SHIFTER_INPUT_RANGE_BASE = 21; + public static final int PHASE_SHIFTER_INPUT_RANGE_INCREMENT = 9; + public static final float PHASE_SHIFTER_SUCCESS_CHANCE = 0.1f; + public static final long PHASE_SHIFTER_OUTPUT_ENERGY_REQUIRED = 28; + public static final int PHASE_SHIFTER_OUTPUT_COOLDOWN = 21; + public static final DyeColor PHASE_SHIFTER_DEFAULT_COLOR = DyeColor.WHITE; } \ No newline at end of file diff --git a/src/main/java/com/thebrokenrail/energonrelics/item/MultimeterItem.java b/src/main/java/com/thebrokenrail/energonrelics/item/MultimeterItem.java index b0d22e5..100565a 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/item/MultimeterItem.java +++ b/src/main/java/com/thebrokenrail/energonrelics/item/MultimeterItem.java @@ -3,6 +3,7 @@ package com.thebrokenrail.energonrelics.item; import com.thebrokenrail.energonrelics.EnergonRelics; import com.thebrokenrail.energonrelics.api.block.entity.core.EnergyReceiverBlockEntity; import com.thebrokenrail.energonrelics.api.block.entity.helper.EnergyGenerator; +import com.thebrokenrail.energonrelics.api.item.MultimeterExtra; import net.minecraft.block.entity.BlockEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemUsageContext; @@ -21,10 +22,6 @@ public class MultimeterItem extends Item { super(new Settings().maxCount(1).group(EnergonRelics.ITEM_GROUP)); } - public interface MultimeterExtra { - MutableText getExtra(); - } - public static MutableText format(long value) { String str; if (value >= Long.MAX_VALUE) { @@ -61,10 +58,13 @@ public class MultimeterItem extends Item { } if (entity instanceof MultimeterExtra) { if (!world.isClient() && context.getPlayer() != null) { - if (success) { - text.append(separator); + MutableText extraText = ((MultimeterExtra) entity).getExtra(); + if (extraText != null) { + if (success) { + text.append(separator); + } + text.append(extraText.formatted(Formatting.YELLOW)); } - text.append(((MultimeterExtra) entity).getExtra().formatted(Formatting.YELLOW)); } success = true; } diff --git a/src/main/resources/assets/energonrelics/blockstates/phase_shifter.json b/src/main/resources/assets/energonrelics/blockstates/phase_shifter.json new file mode 100644 index 0000000..3e929aa --- /dev/null +++ b/src/main/resources/assets/energonrelics/blockstates/phase_shifter.json @@ -0,0 +1,16 @@ +{ + "variants": { + "powered=false,is_output=false": { + "model": "energonrelics:block/phase_shifter_off_input" + }, + "powered=true,is_output=false": { + "model": "energonrelics:block/phase_shifter_on_input" + }, + "powered=false,is_output=true": { + "model": "energonrelics:block/phase_shifter_off_output" + }, + "powered=true,is_output=true": { + "model": "energonrelics:block/phase_shifter_on_output" + } + } +} diff --git a/src/main/resources/assets/energonrelics/blockstates/switch.json b/src/main/resources/assets/energonrelics/blockstates/switch.json index 15431ce..470c962 100644 --- a/src/main/resources/assets/energonrelics/blockstates/switch.json +++ b/src/main/resources/assets/energonrelics/blockstates/switch.json @@ -1,9 +1,9 @@ { "variants": { - "powered=false": { + "active=false": { "model": "energonrelics:block/switch_off" }, - "powered=true": { + "active=true": { "model": "energonrelics:block/switch_on" } } diff --git a/src/main/resources/assets/energonrelics/lang/en_us.json b/src/main/resources/assets/energonrelics/lang/en_us.json index 6a7494c..b903fe5 100644 --- a/src/main/resources/assets/energonrelics/lang/en_us.json +++ b/src/main/resources/assets/energonrelics/lang/en_us.json @@ -61,5 +61,9 @@ "category.rei.energonrelics.infusing.display_item.minecraft.tnt": "Explosion", "category.rei.energonrelics.infusing.display_item.minecraft.fire_charge": "Nothing", "category.rei.energonrelics.reactor_fuel.name": "Reactor Fuel", - "category.rei.energonrelics.reactor_fuel.multiplier": "%sx Reaction" + "category.rei.energonrelics.reactor_fuel.multiplier": "%sx Reaction", + "block.energonrelics.phase_shifter": "Phase Shifter", + "text.energonrelics.phase_shifter_extra": "Phased Items: %s", + "category.rei.energonrelics.information.structure_generation.title": "Structures", + "category.rei.energonrelics.information.structure_generation.research_complex": "Found In The Research Complex Underground Structure" } \ No newline at end of file diff --git a/src/main/resources/assets/energonrelics/models/block/phase_shifter.json b/src/main/resources/assets/energonrelics/models/block/phase_shifter.json new file mode 100644 index 0000000..8228131 --- /dev/null +++ b/src/main/resources/assets/energonrelics/models/block/phase_shifter.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:block/block", + "textures": { + "particle": "#all", + "tint": "energonrelics:block/phase_shifter_tint" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "down": {"uv": [0, 0, 16, 16], "texture": "#all", "cullface": "down"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#all", "cullface": "up"}, + "north": {"uv": [0, 0, 16, 16], "texture": "#all", "cullface": "north"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#all", "cullface": "south"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#all", "cullface": "west"}, + "east": {"uv": [0, 0, 16, 16], "texture": "#all", "cullface": "east"} + } + }, + { + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "down": {"uv": [0, 0, 16, 16], "texture": "#tint", "cullface": "down", "tintindex": 0}, + "up": {"uv": [0, 0, 16, 16], "texture": "#tint", "cullface": "up", "tintindex": 0}, + "north": {"uv": [0, 0, 16, 16], "texture": "#tint", "cullface": "north", "tintindex": 0}, + "south": {"uv": [0, 0, 16, 16], "texture": "#tint", "cullface": "south", "tintindex": 0}, + "west": {"uv": [0, 0, 16, 16], "texture": "#tint", "cullface": "west", "tintindex": 0}, + "east": {"uv": [0, 0, 16, 16], "texture": "#tint", "cullface": "east", "tintindex": 0} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/energonrelics/models/block/phase_shifter_off_input.json b/src/main/resources/assets/energonrelics/models/block/phase_shifter_off_input.json new file mode 100644 index 0000000..3e3f698 --- /dev/null +++ b/src/main/resources/assets/energonrelics/models/block/phase_shifter_off_input.json @@ -0,0 +1,6 @@ +{ + "parent": "energonrelics:block/phase_shifter", + "textures": { + "all": "energonrelics:block/phase_shifter_off_input" + } +} diff --git a/src/main/resources/assets/energonrelics/models/block/phase_shifter_off_output.json b/src/main/resources/assets/energonrelics/models/block/phase_shifter_off_output.json new file mode 100644 index 0000000..50e9696 --- /dev/null +++ b/src/main/resources/assets/energonrelics/models/block/phase_shifter_off_output.json @@ -0,0 +1,6 @@ +{ + "parent": "energonrelics:block/phase_shifter", + "textures": { + "all": "energonrelics:block/phase_shifter_off_output" + } +} diff --git a/src/main/resources/assets/energonrelics/models/block/phase_shifter_on_input.json b/src/main/resources/assets/energonrelics/models/block/phase_shifter_on_input.json new file mode 100644 index 0000000..0ddfea7 --- /dev/null +++ b/src/main/resources/assets/energonrelics/models/block/phase_shifter_on_input.json @@ -0,0 +1,6 @@ +{ + "parent": "energonrelics:block/phase_shifter", + "textures": { + "all": "energonrelics:block/phase_shifter_on_input" + } +} diff --git a/src/main/resources/assets/energonrelics/models/block/phase_shifter_on_output.json b/src/main/resources/assets/energonrelics/models/block/phase_shifter_on_output.json new file mode 100644 index 0000000..f1cb83e --- /dev/null +++ b/src/main/resources/assets/energonrelics/models/block/phase_shifter_on_output.json @@ -0,0 +1,6 @@ +{ + "parent": "energonrelics:block/phase_shifter", + "textures": { + "all": "energonrelics:block/phase_shifter_on_output" + } +} diff --git a/src/main/resources/assets/energonrelics/models/item/phase_shifter.json b/src/main/resources/assets/energonrelics/models/item/phase_shifter.json new file mode 100644 index 0000000..a97b949 --- /dev/null +++ b/src/main/resources/assets/energonrelics/models/item/phase_shifter.json @@ -0,0 +1,3 @@ +{ + "parent": "energonrelics:block/phase_shifter_off_input" +} diff --git a/src/main/resources/assets/energonrelics/textures/block/phase_shifter_off_input.png b/src/main/resources/assets/energonrelics/textures/block/phase_shifter_off_input.png new file mode 100644 index 0000000000000000000000000000000000000000..94a6589e77a8107881d9f35c8aa594da5195c91f GIT binary patch literal 7322 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 N5h0Pm@6KD1{XeM|$5a3S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/energonrelics/textures/block/phase_shifter_on_input.png b/src/main/resources/assets/energonrelics/textures/block/phase_shifter_on_input.png new file mode 100644 index 0000000000000000000000000000000000000000..958136dba90b1da4f6f2cdd46cd6417218e0779f GIT binary patch literal 2369 zcmV-H3BLA;P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1Y;((EP-{Ld+J1dtHRaagNzgB(AN4R{8BNnR=$ zmu(G;mTpN{wLgCE>Notzcv4n;aM3x9pN%$Bf)Momi`Ua=dp+kLy@aoEwI>Kej5ptZ zeVXeN#^u?tY?%B#uELz5FcmG$Qy~w_1fhO9iE+Bejh%{Oy9F16|8zCe{VsFi<;uM2 zUOBwFoxp$fIbc0dsscky)Y!1Tp5gX@?>pfRcp4V0GwdNVM|BOYkO0V6cpE_d3D6hF zOHwELTROm}G{^bC(oKvY{5WCcXYenGKMeEsh`uMRX#Wal-o4k*d%L4c)&WsBGfJz4 z&e(&6fZg)7&EfL61+u@ch%4x%3n;I;=!~nFXb7xyWvr%=+d-Dq;jv$tNn^WFy^eF_|G zkl=z3A;gd(MMe*l=%SAy#+VYR1VahB64ob-WXhavmh7_6A;+8w(x=!W#T8#di6vF4 zT+t?~tG8zJ;VHq;aUF|N8!Kin{o8 z$)I1Bv;~@iiB=3+xVCu;G+yIqT{G;aMlWhk<#Q@NYwjhc@mgf&+o!ZARqV?yFJ0+W zfo^dNdI@d?mt^ijXe%VWgmOmUW8RjLilR8WQ6m znvk-9o~JzY0JV`i?+;jzG@{Rsik{Kozn}YhV z#!t}sY)RqO=i=@}J0a^z$lcQHQqNB%yQdn`E`I+iey`l#5?;M}2~U`^8ls;@J-&}S zzWGxC13k+9}{<`}ES88Vx?EFwWK|06BG52z; zJldAmyVc76h}b7hJv($f+iiaFd4r@rvlgE-&vEf`%9#~wUd-;}PuKJ8-?_J%;;QhE z)A`*V!Ld5hO}|gDU;D;U|I1g_&x-Jw7eVKro(cV^9f4Ln0004mX+uL$Nkc;*aB^>E zX>4Tx0C=2zkv&MmKpe$iQ^is$9jqwgkfAzR5EXIMDionYsTEpvFuC*#nlvOSE{=k0 z!NHHks)LKOt`4q(Aou~|}?mh0_0Yam~RI_UwP&La)C*oo@ zw<`9$B7iXZ5yXJROnokuO2Tt|-NVP%yBN>%KKJM7Rq`eSd?N8I(+!JwgLrz=(mC%F zM_5Txh|h_~47wokBiCh@-#8Z?7Ib`7kz)Z> zsE`~#_#gc4)+|g;xJjWn(EVcDA0t4|F3_yo_V=-EH%|cnGjOG~{nZ9A^GSNWtwoQ3 z@HTL9-PYti;Bp5Te9|RDawI=Zp-=$c&*+a22jBnz0s2WqK~y-)t&_cK)j<%&f3shA?Aho&K}6`i0AQ`9l){tr34p`lF{(NeT5GAb-VjVC6H-bH!+i0^{ znUoSDg0*%WHfoS_=HlXl-aEBcoO8VVxpbWqsd41 z*N&M^r@Xy?%&U9v5fPr>Ib?@-48s6G&iRHwL5fLsgFLBP@5G;jMRdUWuCKIO9Dc|PTZ^jrFiv_Am2!R;m?F|4*DTENl=&C9o z%EMcpd+*6P|9yh0l2W3zMr)15V!`_Q`Zd5gT5E(5#y_##=vI_ZPEK&nQA$BX5D{vv ntgfyyo6W`yEbUfR{!9G^X)FRiBX0%$00000NkvXXu0mjfzDACX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/energonrelics/textures/block/phase_shifter_on_output.png b/src/main/resources/assets/energonrelics/textures/block/phase_shifter_on_output.png new file mode 100644 index 0000000000000000000000000000000000000000..19052898adf742b242cd9e782e83fddf33da1c03 GIT binary patch literal 7316 zcmd5>3s6+o8NNJ<C6=f`VtMFPt(jt_|GB#hdzR-41HH^W_nz1H zfB*OY=ZCp$NQjT|LE{m_Fg|l)XU&JFAGy7~p#Ax+4lTpDnbT*^Oi0)38792o*9B9b z_lOKwry2Y8cWVM(&QIEzuPaDR@T;1wF9?gxAG7&l==(c9-C$Xk=eek=IwbY6i$6x( z8+8$Vj`BY64hg#Np0Z`_o%jX$`KR$p&FPv$HN|cV6VGp4@S69=k3V~4>)PKvd?Grf zott>%Ha-y>cVP4Nq)8{gyn3}L=$Dy!d(U^Y-=9$O-X|YNZi-ov%+-8$bGtdKEF=6M z{%z;bp3OIN&0lTzKq(Q^TW@Z=a^z^{##6Iac_r`NHMwI=ohIq&ccU+Bwb?K1Pits; zLArjj=vvdxe_JMe6%xOeeeP^xQsl0=2}|bS_WE&4el)!lxHT+$O+=~uuYhBZ`c;H1 zJ}`gzA75>(+q3uE?56a_>e(f2i?wMh54N6|az9_&i`kZ*CuFz6tc_{1251YnMDJuS?^1Qlo&9T2s z`zElZt?KQTyU%93JztUb%;P#uDTLr5bL>mY8O9gl;H!1pt=W|h0Xdu%os>0S`ku0R4MQF z2kBGe$TrWi7$!JaOm4U&0tlB%3*!QLQM#QrR62Sb$u{d)wgK6ZZGarH4Afb@705~w z>=DB-uClE|YTE))ElZ9r=&bv?T4K<4W9v#5SSc6jBl2b+;3ZJWAb=qbVLbdbF})shL60C^oPx z3W(ElCJCezRU#+qL_y*)D`HU)B}gD6X8=7+I-SmhF^sE4o{R_*C-4T24pmq_9%(h7oT1gRA@A)cKM+r{9tyc$93so*#W0yz?p3ZhKdLCD3P zH`v$ndN>+JQL^tqy=@WXp19eJu#gW>1wjH*iX>vPyK8FK0PHCPu93XvNx}&bAyR2D z99ieh@(rcxWAJsI{oUJd3)J z?O`SS2p@$TXRB0JXjRuCQjSq)ta*$`SfNg_0D}b%B1mcuM8tmThz4CXfF~tKa-6fz zB2pq?qnb0quK+z96#HRR#=4G(eM4{Skria%8=TkMjVp|t2`iHh{`coTS&!_l^jvrB zb+XH4Yo#RPin-2OPL7CD%xM9wY3536%WPM+^t^URfJmr@1c-1PX&}eEvuZZdjJii| zz>K;(LxT+%h~Cz{Hyl9yIYYA=4o0-a{(2N6*PNlDDIj{vwcZc`b^fMx&3aF(hltT2 z%7}AdMxK$gPA)KVc7}#>0f^q{+#4RCzMY{t4G$yQX5T$0My@zR13LlHldklJ4(P$1 zq4^FSBO2G09_`Ej10$NfON?k|1_4BGrF$+hqPNn$et`ON#w8$nabLZD81=Q4p6doQ zaA*1fqNfMm>&9r{Tj`Ym^q|gk1EL2Wv^OZ%9DNxSkR$t%0&;Z5kS%M%);4 zsDJsY=O$mdp0(t%IVs-VU98EPQuZd3u>WTn>Dh@Leg%*3jQ?9s@Wic_ke1yE+yDBX z-_K|%_x1AkE>1e*!IZ?uj8f;cUTPj^oW1YTve$kweTQX3{+KJrpSpGP^~}0|j;k-4 z8&jN(BvvfqZE?#)8Z9=p6y^YMfQ>%Y6 zwjx73eDH@wjgNfa_P+V8Ja1MU?~{9OhUUq!jdR03%B=drqwS-p+bPw)yCwI6(&VZL R_;(01Cpv!CpQ2Lp{s#(%yh{K8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/energonrelics/textures/block/phase_shifter_tint.png b/src/main/resources/assets/energonrelics/textures/block/phase_shifter_tint.png new file mode 100644 index 0000000000000000000000000000000000000000..002bb834c4093dcfbddde0ea56f127ae4ddc93ef GIT binary patch literal 7040 zcmd5=32YTr6#WIl@&sCtMS*BVMMRMK@6EiKk6<&;o)QphN*H4Hd$wh@=S+KnWBQKope5D)rtsf7<_kf0s|2*7=z?^R{!(J@>xb zX67dhjc-9Z5Sz``V$i_;Bj6c@chknu-hZRSX|qM7Cim-?knDEbY+W;7%6wu-!`L?S zV($L_TzZ?a8HwvMT$z&-qVfi~GrJ7TXtnUfJwS4vF+yX~# zdj8Jd$J$=GmiOM3TaV9<7?P9J<3U$U7KET#>cBBGY_>>ieLriuu1Y}oQTw>Y? z=gZNlFQ)jCr+K5(UP<*vduJy5Yy?{pjTcoEqH4Oq9h@t0sSedao$z8{4=#sj?TQLd zyLh)A*q6qMe_l~2OfXoCH(WXb!ew{DxP~vHTWZ7ZlE;bRw@wW|kcI3AWM~xjd@fIAF5&;^&dudGFb{+pUB6<{SU>=S&m22>qX@@Qa)QR-!2Otc20 z3`XE~!filnXBw=rGhMu^I8GSKjP8IKLLbXD>xq`&BA#Af{|&Jn8#0W^scCK-!PX38 zH04B7xWRq83O5sPNRRqy~)8X9x*6V*Vr%aU)zpNh6TGFzqcoJDe?{*VYOUhN@P8kYjxV1?HWpS$#7qAGvBXD({R8R&5}8TlrpH09ECT%&IOJ z$rh{XNsPjCMuwJvp;p%tqZ*Wv;K0;BqhOuFU=-|(3>5~DyfL^} zH$as;BXg=7MzYPydqIrCaYhCX0+J`g>D3<4ojW7*tvyCEZa6*Jm;VDJnSEG{WM^ss zByW{_VKI`o%DpOpDsv_*AbD|Ry($=0wpE@h2ULA$ssNIwtKTcfsQO#wl>l_7&Xfa^ z2kx|2Bi90bsS!{h`}zV3bS98b4gNopVd@g7VrOJd^(D5NQFWaOgb`xnH-!+N zqVWrw_&le>r!V}9OxC7noq^Bj8wT}{9c2t#KQgc7yy)grjo(W?O6nceDsJiIjGge*;o@kz*zo@&jQ~Zjk27@1MePsHnj9X6>{