From 092372834ec074c982b286f47db6eb007002e208 Mon Sep 17 00:00:00 2001 From: Clayton T <34910888+CommandrMoose@users.noreply.github.com> Date: Tue, 5 Mar 2024 09:16:39 +1000 Subject: [PATCH] New Ore and additional changes (#199) Co-authored-by: MagicMaan <38400400+Magicmaan@users.noreply.github.com> --- .../tardis_refined/TardisRefined.java | 3 + .../tardis_refined/client/ModelRegistry.java | 3 +- .../internal/door/RootShellDoorModel.java | 5 +- .../client/renderer/RenderHelper.java | 55 ++++ .../device/AstralManipulatorRenderer.java | 96 +++++++ .../device/ConsoleConfigurationRenderer.java | 2 +- .../door/RootShellDoorRenderer.java | 1 + .../shell/GlobalShellRenderer.java | 2 + .../block/device/AstralManipulatorBlock.java | 56 ++++ .../device/ConsoleConfigurationBlock.java | 18 -- .../common/block/door/InternalDoorBlock.java | 12 +- .../common/block/door/RootShellDoorBlock.java | 25 +- .../device/AstralManipulatorBlockEntity.java | 252 ++++++++++++++++++ .../device/ManipulatorCraftingRecipe.java | 47 ++++ .../device/ManipulatorCraftingRecipeItem.java | 34 +++ .../door/RootShellDoorBlockEntity.java | 11 + .../common/crafting/ManipulatorCrafting.java | 133 +++++++++ .../common/items/ScrewdriverItem.java | 196 ++++++++++++++ .../common/items/ScrewdriverMode.java | 18 ++ .../common/items/ZeitonIngotItem.java | 40 +++ .../tardis_refined/constants/ModMessages.java | 1 + .../registry/BlockEntityRegistry.java | 2 + .../registry/BlockRegistry.java | 13 +- .../tardis_refined/registry/ItemRegistry.java | 6 + .../registry/SoundRegistry.java | 6 + .../models/item/amethyst_screwdriver.json | 147 ++++++++++ .../tools/screwdriver/screwdriver_connect.ogg | Bin 0 -> 8451 bytes .../tools/screwdriver/screwdriver_discard.ogg | Bin 0 -> 9450 bytes .../tools/screwdriver/screwdriver_short.ogg | Bin 0 -> 9428 bytes .../textures/block/astral_manipulator.png | Bin 0 -> 415 bytes .../textures/block/console_configuration.png | Bin 825 -> 470 bytes .../textures/block/deepslate_zeiton_ore.png | Bin 0 -> 652 bytes .../textures/block/flight_detector.png | Bin 1075 -> 582 bytes .../textures/block/landing_pad.png | Bin 2139 -> 1136 bytes .../textures/block/transformer_on.png | Bin 1540 -> 1540 bytes .../textures/block/zeiton_block.png | Bin 0 -> 536 bytes .../block/zeiton_fused_copper_block.png | Bin 0 -> 606 bytes .../block/zeiton_fused_iron_block.png | Bin 0 -> 557 bytes .../textures/block/zeiton_ore.png | Bin 0 -> 596 bytes .../textures/item/amethyst_screwdriver.png | Bin 0 -> 686 bytes .../textures/item/raw_zeiton.png | Bin 0 -> 550 bytes .../textures/item/zeiton_ingot.png | Bin 0 -> 429 bytes .../structures/cave/cave_generation_one.nbt | Bin 46772 -> 89653 bytes .../fabric/TardisRefinedFabric.java | 8 + .../fabric/TardisRefinedFabricClient.java | 2 + .../common/data/BiomeModifierProvider.java | 61 +++-- .../common/data/ItemModelProvider.java | 13 + .../common/data/LangProviderEnglish.java | 12 + .../common/data/ProviderBlockTags.java | 15 +- .../data/ProviderConfiguredFeatures.java | 57 ++++ .../common/data/ProviderLootTable.java | 5 + .../common/data/ProviderPlacedFeatures.java | 62 +++++ .../common/data/RecipeProvider.java | 26 +- .../common/data/SoundProvider.java | 5 + .../common/data/TRBlockModelProvider.java | 10 + .../common/data/WorldGenProvider.java | 34 +++ .../tardis_refined/neoforge/ClientModBus.java | 2 + .../neoforge/TardisRefinedForge.java | 3 +- 58 files changed, 1428 insertions(+), 71 deletions(-) create mode 100644 common/src/main/java/whocraft/tardis_refined/client/renderer/RenderHelper.java create mode 100644 common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/device/AstralManipulatorRenderer.java create mode 100644 common/src/main/java/whocraft/tardis_refined/common/block/device/AstralManipulatorBlock.java create mode 100644 common/src/main/java/whocraft/tardis_refined/common/blockentity/device/AstralManipulatorBlockEntity.java create mode 100644 common/src/main/java/whocraft/tardis_refined/common/blockentity/device/ManipulatorCraftingRecipe.java create mode 100644 common/src/main/java/whocraft/tardis_refined/common/blockentity/device/ManipulatorCraftingRecipeItem.java create mode 100644 common/src/main/java/whocraft/tardis_refined/common/crafting/ManipulatorCrafting.java create mode 100644 common/src/main/java/whocraft/tardis_refined/common/items/ScrewdriverItem.java create mode 100644 common/src/main/java/whocraft/tardis_refined/common/items/ScrewdriverMode.java create mode 100644 common/src/main/java/whocraft/tardis_refined/common/items/ZeitonIngotItem.java create mode 100644 common/src/main/resources/assets/tardis_refined/models/item/amethyst_screwdriver.json create mode 100644 common/src/main/resources/assets/tardis_refined/sounds/tools/screwdriver/screwdriver_connect.ogg create mode 100644 common/src/main/resources/assets/tardis_refined/sounds/tools/screwdriver/screwdriver_discard.ogg create mode 100644 common/src/main/resources/assets/tardis_refined/sounds/tools/screwdriver/screwdriver_short.ogg create mode 100644 common/src/main/resources/assets/tardis_refined/textures/block/astral_manipulator.png create mode 100644 common/src/main/resources/assets/tardis_refined/textures/block/deepslate_zeiton_ore.png create mode 100644 common/src/main/resources/assets/tardis_refined/textures/block/zeiton_block.png create mode 100644 common/src/main/resources/assets/tardis_refined/textures/block/zeiton_fused_copper_block.png create mode 100644 common/src/main/resources/assets/tardis_refined/textures/block/zeiton_fused_iron_block.png create mode 100644 common/src/main/resources/assets/tardis_refined/textures/block/zeiton_ore.png create mode 100644 common/src/main/resources/assets/tardis_refined/textures/item/amethyst_screwdriver.png create mode 100644 common/src/main/resources/assets/tardis_refined/textures/item/raw_zeiton.png create mode 100644 common/src/main/resources/assets/tardis_refined/textures/item/zeiton_ingot.png create mode 100644 forge/src/main/java/whocraft/tardis_refined/common/data/ProviderConfiguredFeatures.java create mode 100644 forge/src/main/java/whocraft/tardis_refined/common/data/ProviderPlacedFeatures.java create mode 100644 forge/src/main/java/whocraft/tardis_refined/common/data/WorldGenProvider.java diff --git a/common/src/main/java/whocraft/tardis_refined/TardisRefined.java b/common/src/main/java/whocraft/tardis_refined/TardisRefined.java index 553d04e34..350cb34d5 100644 --- a/common/src/main/java/whocraft/tardis_refined/TardisRefined.java +++ b/common/src/main/java/whocraft/tardis_refined/TardisRefined.java @@ -9,6 +9,7 @@ import org.slf4j.Logger; import whocraft.tardis_refined.client.TRParticles; import whocraft.tardis_refined.common.capability.upgrades.Upgrades; +import whocraft.tardis_refined.common.crafting.ManipulatorCrafting; import whocraft.tardis_refined.common.hum.TardisHums; import whocraft.tardis_refined.common.network.TardisNetwork; import whocraft.tardis_refined.common.network.messages.sync.SyncConsolePatternsMessage; @@ -68,5 +69,7 @@ public static void init() { ConsolePatterns.registerDefaultPatterns(); ShellPatterns.registerDefaultPatterns(); TardisHums.registerDefaultHums(); + + ManipulatorCrafting.registerRecipes(); } } \ No newline at end of file diff --git a/common/src/main/java/whocraft/tardis_refined/client/ModelRegistry.java b/common/src/main/java/whocraft/tardis_refined/client/ModelRegistry.java index 2a6601682..91f973a6b 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/ModelRegistry.java +++ b/common/src/main/java/whocraft/tardis_refined/client/ModelRegistry.java @@ -77,6 +77,8 @@ public class ModelRegistry { public static ModelLayerLocation ARS_EGG; public static ModelLayerLocation BULK_HEAD_DOOR; + public static ModelLayerLocation SCREWDRIVER_CRAFT_GLOW; + public static void init() { ROOT_PLANT_STATE_ONE = register(new ModelLayerLocation(new ResourceLocation(TardisRefined.MODID, "root_plant_one"), "root_plant_one"), RootPlantStateOneModel::createBodyLayer); ROOT_PLANT_STATE_TWO = register(new ModelLayerLocation(new ResourceLocation(TardisRefined.MODID, "root_plant_two"), "root_plant_two"), RootPlantStateTwoModel::createBodyLayer); @@ -134,7 +136,6 @@ public static void init() { CASTLE_DOOR = register(new ModelLayerLocation(new ResourceLocation(TardisRefined.MODID, "castle_door"), "castle_door"), CastleShellDoorModel::createBodyLayer); - ARS_EGG = register(new ModelLayerLocation(new ResourceLocation(TardisRefined.MODID, "ars_egg"), "ars_egg"), ArsEggModel::createBodyLayer); BULK_HEAD_DOOR = register(new ModelLayerLocation(new ResourceLocation(TardisRefined.MODID, "bulk_head_door"), "bulk_head_door"), BulkHeadDoorModel::createBodyLayer); } diff --git a/common/src/main/java/whocraft/tardis_refined/client/model/blockentity/shell/internal/door/RootShellDoorModel.java b/common/src/main/java/whocraft/tardis_refined/client/model/blockentity/shell/internal/door/RootShellDoorModel.java index e9caafb8e..85b0b08d4 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/model/blockentity/shell/internal/door/RootShellDoorModel.java +++ b/common/src/main/java/whocraft/tardis_refined/client/model/blockentity/shell/internal/door/RootShellDoorModel.java @@ -11,9 +11,12 @@ public class RootShellDoorModel extends HierarchicalModel { + private final ModelPart root; private final ModelPart stage7; public RootShellDoorModel(ModelPart root) { + + this.root = root; this.stage7 = root.getChild("stage7"); } @@ -35,7 +38,7 @@ public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, i @Override public ModelPart root() { - return stage7; + return this.root; } @Override diff --git a/common/src/main/java/whocraft/tardis_refined/client/renderer/RenderHelper.java b/common/src/main/java/whocraft/tardis_refined/client/renderer/RenderHelper.java new file mode 100644 index 000000000..5a8086b1a --- /dev/null +++ b/common/src/main/java/whocraft/tardis_refined/client/renderer/RenderHelper.java @@ -0,0 +1,55 @@ +package whocraft.tardis_refined.client.renderer; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import org.joml.Matrix4f; + +public class RenderHelper { + + public static void renderFilledBox(PoseStack stack, VertexConsumer vertexConsumer, AABB box, float red, float green, float blue, float alpha, int combinedLightIn) { + Matrix4f matrix = stack.last().pose(); + vertexConsumer.vertex(matrix, (float) box.minX, (float) box.maxY, (float) box.minZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.minX, (float) box.maxY, (float) box.maxZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.maxX, (float) box.maxY, (float) box.maxZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.maxX, (float) box.maxY, (float) box.minZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + + vertexConsumer.vertex(matrix, (float) box.minX, (float) box.minY, (float) box.minZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.maxX, (float) box.minY, (float) box.minZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.maxX, (float) box.minY, (float) box.maxZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.minX, (float) box.minY, (float) box.maxZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + + vertexConsumer.vertex(matrix, (float) box.minX, (float) box.minY, (float) box.minZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.minX, (float) box.maxY, (float) box.minZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.maxX, (float) box.maxY, (float) box.minZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.maxX, (float) box.minY, (float) box.minZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + + vertexConsumer.vertex(matrix, (float) box.minX, (float) box.minY, (float) box.maxZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.maxX, (float) box.minY, (float) box.maxZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.maxX, (float) box.maxY, (float) box.maxZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.minX, (float) box.maxY, (float) box.maxZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + + vertexConsumer.vertex(matrix, (float) box.maxX, (float) box.minY, (float) box.minZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.maxX, (float) box.maxY, (float) box.minZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.maxX, (float) box.maxY, (float) box.maxZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.maxX, (float) box.minY, (float) box.maxZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + + vertexConsumer.vertex(matrix, (float) box.minX, (float) box.minY, (float) box.minZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.minX, (float) box.minY, (float) box.maxZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.minX, (float) box.maxY, (float) box.maxZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + vertexConsumer.vertex(matrix, (float) box.minX, (float) box.maxY, (float) box.minZ).color(red, green, blue, alpha).uv2(combinedLightIn).endVertex(); + } + + + + public static void drawGlowingBox(PoseStack poseStack, VertexConsumer consumer, float length, float height, float width, float red, float green, float blue, float alpha, int combinedLightIn) { + AABB box = new AABB(-length / 2F, -height / 2f, -width / 2F, length / 2F, height / 2f, width / 2F); + renderFilledBox(poseStack, consumer, box, 1F, 1F, 1F, alpha, combinedLightIn); + + for (int i = 0; i < 3; i++) { + renderFilledBox(poseStack, consumer, box.inflate(i * 0.5F * 0.0625F), red, green, blue, (1F / i / 2) * alpha, combinedLightIn); + } + } +} diff --git a/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/device/AstralManipulatorRenderer.java b/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/device/AstralManipulatorRenderer.java new file mode 100644 index 000000000..7ae23b19f --- /dev/null +++ b/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/device/AstralManipulatorRenderer.java @@ -0,0 +1,96 @@ +package whocraft.tardis_refined.client.renderer.blockentity.device; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.state.BlockState; +import org.joml.Vector3f; +import whocraft.tardis_refined.client.model.blockentity.console.ConsoleModelCollection; +import whocraft.tardis_refined.client.model.blockentity.console.ConsoleUnit; +import whocraft.tardis_refined.client.renderer.RenderHelper; +import whocraft.tardis_refined.common.block.device.ConsoleConfigurationBlock; +import whocraft.tardis_refined.common.block.door.GlobalDoorBlock; +import whocraft.tardis_refined.common.block.shell.ShellBaseBlock; +import whocraft.tardis_refined.common.blockentity.console.GlobalConsoleBlockEntity; +import whocraft.tardis_refined.common.blockentity.device.AstralManipulatorBlockEntity; +import whocraft.tardis_refined.common.blockentity.device.ConsoleConfigurationBlockEntity; + +public class AstralManipulatorRenderer implements BlockEntityRenderer, BlockEntityRendererProvider { + + public AstralManipulatorRenderer(Context context) { + } + + @Override + public BlockEntityRenderer create(Context context) { + return new AstralManipulatorRenderer(context); + } + + @Override + public void render(AstralManipulatorBlockEntity blockEntity, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, int packedOverlay) { + + var pointA = blockEntity.getPointABlockPos(); + if (pointA != null && blockEntity.shouldDisplay()) { + + var pointB = blockEntity.getPointBBlockPos(); + + float width = 1; + float height = 1; + float length = 1; + + var centerOfBoth = new Vector3f(0,0,0); + if (pointB != null) { + + float xDiff = Math.abs(pointA.getX() - pointB.getX()); + float yDiff = Math.abs(pointA.getY() - pointB.getY()); + float zDiff = Math.abs(pointA.getZ() - pointB.getZ()); + + var smallestPointX = pointA.getX() > pointB.getX() ? pointB.getX() : pointA.getX(); + var smallestPointY = pointA.getY() > pointB.getY() ? pointB.getY() : pointA.getY(); + var smallestPointZ = pointA.getZ() > pointB.getZ() ? pointB.getZ() : pointA.getZ(); + + var xCenter = smallestPointX + (xDiff * 0.5f); + var yCenter = smallestPointY + (yDiff * 0.5f); + var zCenter = smallestPointZ + (zDiff * 0.5f); + + centerOfBoth = new Vector3f(xCenter, yCenter, zCenter); + length = xDiff; + height = yDiff; + width = zDiff; + + } + + + + var centerPos = pointB != null ? centerOfBoth : new Vector3f(pointA.getX(), pointA.getY(), pointA.getZ()); + + var posAOffsetX = blockEntity.getBlockPos().getX() - centerPos.x - .5f; + + var posAOffsetY = blockEntity.getBlockPos().getY() - centerPos.y- .5f; + var posAOffsetZ = blockEntity.getBlockPos().getZ() - centerPos.z- .5f; + + float sine = (float)(Math.sin(blockEntity.getLevel().getGameTime()*10f*Math.PI/8f)*(0.25f/2f) + (0.25f/2f)) * 0.25f; + if (sine < 0.001) { + sine = 0.001f; + } + + poseStack.pushPose(); + poseStack.translate(-posAOffsetX, -posAOffsetY, -posAOffsetZ); + VertexConsumer vertexBuilder = bufferSource.getBuffer(RenderType.lightning()); + RenderHelper.drawGlowingBox(poseStack, vertexBuilder, length + 1.25f, height + 1.25f , width + 1.25f, 0.635f, 0.392f, 0.878f, 0 + sine , 0 ); + + poseStack.popPose(); + + } + + + } + + +} diff --git a/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/device/ConsoleConfigurationRenderer.java b/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/device/ConsoleConfigurationRenderer.java index 0d4684522..a52ede165 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/device/ConsoleConfigurationRenderer.java +++ b/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/device/ConsoleConfigurationRenderer.java @@ -52,7 +52,7 @@ public void render(ConsoleConfigurationBlockEntity blockEntity, float partialTic ResourceLocation theme = blockEntity.theme(); ConsoleUnit consoleModel = ConsoleModelCollection.getInstance().getConsoleModel(theme); - consoleModel.renderConsole(null, blockEntity.getLevel(), poseStack, bufferSource.getBuffer(RenderType.entityTranslucent(consoleModel.getDefaultTexture())), packedLight, OverlayTexture.NO_OVERLAY, 1f, 0.64f, 0f, 0.5f); + consoleModel.renderConsole(null, blockEntity.getLevel(), poseStack, bufferSource.getBuffer(RenderType.entityTranslucent(consoleModel.getDefaultTexture())), packedLight, OverlayTexture.NO_OVERLAY, 0.635f, 0.392f, 0.878f, 0.5f); } poseStack.popPose(); diff --git a/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/door/RootShellDoorRenderer.java b/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/door/RootShellDoorRenderer.java index 6dbcf0bb8..8bc8bf8d7 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/door/RootShellDoorRenderer.java +++ b/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/door/RootShellDoorRenderer.java @@ -27,6 +27,7 @@ public RootShellDoorRenderer(BlockEntityRendererProvider.Context context) { @Override public void render(RootShellDoorBlockEntity blockEntity, float f, PoseStack poseStack, MultiBufferSource multiBufferSource, int i, int j) { poseStack.pushPose(); + poseStack.translate(0.5F, 1.475F, 0.5F); poseStack.mulPose(Axis.ZP.rotationDegrees(180F)); diff --git a/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/shell/GlobalShellRenderer.java b/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/shell/GlobalShellRenderer.java index 274ea828e..c6a145ed7 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/shell/GlobalShellRenderer.java +++ b/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/shell/GlobalShellRenderer.java @@ -1,5 +1,6 @@ package whocraft.tardis_refined.client.renderer.blockentity.shell; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import net.minecraft.client.renderer.MultiBufferSource; @@ -8,6 +9,7 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import whocraft.tardis_refined.client.model.blockentity.shell.ShellModelCollection; diff --git a/common/src/main/java/whocraft/tardis_refined/common/block/device/AstralManipulatorBlock.java b/common/src/main/java/whocraft/tardis_refined/common/block/device/AstralManipulatorBlock.java new file mode 100644 index 000000000..8871ad5da --- /dev/null +++ b/common/src/main/java/whocraft/tardis_refined/common/block/device/AstralManipulatorBlock.java @@ -0,0 +1,56 @@ +package whocraft.tardis_refined.common.block.device; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import whocraft.tardis_refined.common.blockentity.device.AstralManipulatorBlockEntity; +import whocraft.tardis_refined.common.items.ScrewdriverItem; + + +public class AstralManipulatorBlock extends Block implements EntityBlock { + public AstralManipulatorBlock(Properties properties) { + super(properties); + } + + @Override + public InteractionResult use(BlockState blockState, Level level, BlockPos blockPos, Player player, InteractionHand interactionHand, BlockHitResult blockHitResult) { + + if (level instanceof ServerLevel && interactionHand == InteractionHand.MAIN_HAND) { + + if (level.getBlockEntity(blockPos) instanceof AstralManipulatorBlockEntity astralManipulatorBlockEntity) { + ItemStack itemStack = player.getItemInHand(interactionHand); + + if (itemStack == ItemStack.EMPTY) { + astralManipulatorBlockEntity.clearDisplay(); + return InteractionResult.CONSUME; + } else { + + if (itemStack.getItem() instanceof ScrewdriverItem) { + + astralManipulatorBlockEntity.OnRightClick(itemStack); + } + } + + } + } + + return super.use(blockState, level, blockPos, player, interactionHand, blockHitResult); + } + + @Override + public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { + return new AstralManipulatorBlockEntity(blockPos, blockState); + } +} diff --git a/common/src/main/java/whocraft/tardis_refined/common/block/device/ConsoleConfigurationBlock.java b/common/src/main/java/whocraft/tardis_refined/common/block/device/ConsoleConfigurationBlock.java index 1fac4025e..e07c46ffa 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/block/device/ConsoleConfigurationBlock.java +++ b/common/src/main/java/whocraft/tardis_refined/common/block/device/ConsoleConfigurationBlock.java @@ -100,24 +100,6 @@ public InteractionResult use(BlockState blockState, Level level, BlockPos blockP return InteractionResult.SUCCESS; } - if (player.getMainHandItem().getItem() == Items.IRON_BLOCK) { - if (!(consoleBlock.getBlock() instanceof GlobalConsoleBlock)) { // If there is no existing console block - //Spawn the console block use set its console theme using the one stored in the configurator - if (this.placeNewGlobalConsoleBlock(level, blockPos, consolePos)) { - //Use up the iron block - if (!player.isCreative()) { - player.getMainHandItem().shrink(1); - } - return InteractionResult.SUCCESS; - } - - } else { - //If we're holding an iron block but there is an existing console - this.changeConsoleTheme(level, blockPos, consolePos); - return InteractionResult.SUCCESS; - } - } - if (player.isShiftKeyDown()) { //If we are destroying the console block this.removeGlobalConsoleBlock(consolePos, level); return InteractionResult.SUCCESS; //Don't try to continue interaction which will rerun the change console function diff --git a/common/src/main/java/whocraft/tardis_refined/common/block/door/InternalDoorBlock.java b/common/src/main/java/whocraft/tardis_refined/common/block/door/InternalDoorBlock.java index cda5e4b95..0aeb21d10 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/block/door/InternalDoorBlock.java +++ b/common/src/main/java/whocraft/tardis_refined/common/block/door/InternalDoorBlock.java @@ -23,6 +23,7 @@ import org.jetbrains.annotations.Nullable; import whocraft.tardis_refined.common.blockentity.door.InternalDoorBlockEntity; import whocraft.tardis_refined.common.blockentity.door.TardisInternalDoor; +import whocraft.tardis_refined.common.capability.TardisLevelOperator; import whocraft.tardis_refined.common.util.TRTeleporter; import java.util.List; @@ -96,10 +97,15 @@ public void entityInside(BlockState blockState, Level level, BlockPos blockPos, if (!level.isClientSide()) { ServerLevel serverLevel = (ServerLevel)level; if (serverLevel.getBlockEntity(blockPos) instanceof TardisInternalDoor door) { - AABB teleportAABB = this.getCollisionShape(blockState, level, blockPos, CollisionContext.of(entity)).bounds().move(blockPos); - if (TRTeleporter.teleportIfCollided(serverLevel, blockPos, entity, teleportAABB)){ - door.onAttemptEnter(blockState, serverLevel, blockPos, entity); + + if (TardisLevelOperator.get(serverLevel).isPresent()) { + AABB teleportAABB = this.getCollisionShape(blockState, level, blockPos, CollisionContext.of(entity)).bounds().move(blockPos); + if (TRTeleporter.teleportIfCollided(serverLevel, blockPos, entity, teleportAABB)){ + door.onAttemptEnter(blockState, serverLevel, blockPos, entity); + } } + + } } } diff --git a/common/src/main/java/whocraft/tardis_refined/common/block/door/RootShellDoorBlock.java b/common/src/main/java/whocraft/tardis_refined/common/block/door/RootShellDoorBlock.java index f35ef1580..a933a00f5 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/block/door/RootShellDoorBlock.java +++ b/common/src/main/java/whocraft/tardis_refined/common/block/door/RootShellDoorBlock.java @@ -2,17 +2,23 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.Nullable; import whocraft.tardis_refined.common.blockentity.door.GlobalDoorBlockEntity; import whocraft.tardis_refined.common.blockentity.door.RootShellDoorBlockEntity; +import whocraft.tardis_refined.common.capability.TardisLevelOperator; public class RootShellDoorBlock extends GlobalDoorBlock { @@ -27,8 +33,7 @@ public RootShellDoorBlock(Properties properties) { @Nullable @Override public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { - this.setBlockEntity(new RootShellDoorBlockEntity(blockPos, blockState)); - return super.newBlockEntity(blockPos, blockState); + return new RootShellDoorBlockEntity(blockPos, blockState); } @Override @@ -48,22 +53,28 @@ public VoxelShape getCollisionShape(BlockState blockState, BlockGetter blockGett @Override public VoxelShape getShape(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, CollisionContext collisionContext) { switch(blockState.getValue(FACING)) { - case EAST: - default: - return EAST_AABB; + case SOUTH: return SOUTH_AABB ; case WEST: return WEST_AABB; case NORTH: return NORTH_AABB; + case EAST: + default: + return EAST_AABB; } } + @Override + public InteractionResult use(BlockState blockState, Level level, BlockPos blockPos, Player player, InteractionHand interactionHand, BlockHitResult blockHitResult) { + return InteractionResult.SUCCESS; + } + static { NORTH_AABB = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 3.0D); SOUTH_AABB = Block.box(0.0D, 0.0D, 13.0D, 16.0D, 16.0D, 16.0D); - WEST_AABB = Block.box(13.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D); - EAST_AABB = Block.box(0.0D, 0.0D, 0.0D, 3.0D, 16.0D, 16.0D); + EAST_AABB = Block.box(13.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D); + WEST_AABB = Block.box(0.0D, 0.0D, 0.0D, 3.0D, 16.0D, 16.0D); } } diff --git a/common/src/main/java/whocraft/tardis_refined/common/blockentity/device/AstralManipulatorBlockEntity.java b/common/src/main/java/whocraft/tardis_refined/common/blockentity/device/AstralManipulatorBlockEntity.java new file mode 100644 index 000000000..148a050bc --- /dev/null +++ b/common/src/main/java/whocraft/tardis_refined/common/blockentity/device/AstralManipulatorBlockEntity.java @@ -0,0 +1,252 @@ +package whocraft.tardis_refined.common.blockentity.device; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import org.jetbrains.annotations.Nullable; +import whocraft.tardis_refined.common.crafting.ManipulatorCrafting; +import whocraft.tardis_refined.common.items.ScrewdriverItem; +import whocraft.tardis_refined.common.items.ScrewdriverMode; +import whocraft.tardis_refined.registry.BlockEntityRegistry; +import whocraft.tardis_refined.registry.SoundRegistry; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class AstralManipulatorBlockEntity extends BlockEntity { + + // Constants + public static final String MAN_POINT_A = "man_point_a"; + public static final String MAN_POINT_B = "man_point_b"; + public static final String SHOULD_DISPLAY = "should_display"; + + + private boolean shouldDisplay = false; + private BlockPos pointABlockPos; + private BlockPos pointBBlockPos; + + public AstralManipulatorBlockEntity(BlockPos blockPos, BlockState blockState) { + super(BlockEntityRegistry.ASTRAL_MANIPULATOR.get(), blockPos, blockState); + } + + @Override + protected void saveAdditional(CompoundTag compoundTag) { + super.saveAdditional(compoundTag); + + compoundTag.putBoolean(SHOULD_DISPLAY, this.shouldDisplay); + + if (this.pointABlockPos != null) { + compoundTag.put(MAN_POINT_A, NbtUtils.writeBlockPos(this.pointABlockPos)); + } + + if (this.pointBBlockPos != null) { + compoundTag.put(MAN_POINT_B, NbtUtils.writeBlockPos(this.pointBBlockPos)); + + } + } + + public BlockPos getPointABlockPos() { + return this.pointABlockPos; + } + + public BlockPos getPointBBlockPos() { + return this.pointBBlockPos; + } + + public void setShouldDisplay(boolean display) { + this.shouldDisplay = display; + this.pointABlockPos = this.getBlockPos(); + this.pointBBlockPos = this.getBlockPos(); + sendUpdates(); + } + + public boolean shouldDisplay() { + + return shouldDisplay; + } + + public void clearDisplay() { + this.shouldDisplay = false; + this.pointABlockPos = this.getBlockPos(); + this.pointBBlockPos = this.getBlockPos(); + sendUpdates(); + } + + @Override + public void load(CompoundTag tag) { + + if (tag.contains(MAN_POINT_A)) { + this.pointABlockPos = NbtUtils.readBlockPos(tag.getCompound(MAN_POINT_A)); + } + if (tag.contains(MAN_POINT_B)) { + this.pointBBlockPos = NbtUtils.readBlockPos(tag.getCompound(MAN_POINT_B)); + } + + if (tag.contains(SHOULD_DISPLAY)) { + this.shouldDisplay = tag.getBoolean(SHOULD_DISPLAY); + } + + super.load(tag); + } + + + public void OnRightClick(ItemStack itemStack) { + if (itemStack.getItem() instanceof ScrewdriverItem screwdriverItem) { + if (!screwdriverItem.isScrewdriverMode(itemStack, ScrewdriverMode.DRAWING)) { + screwdriverItem.setScrewdriverMode(itemStack, ScrewdriverMode.DRAWING, getBlockPos(), null); + setShouldDisplay(true); + screwdriverItem.playScrewdriverSound((ServerLevel) getLevel(), getBlockPos(), SoundRegistry.SCREWDRIVER_CONNECT.get()); + + } else { + + List points = screwdriverItem.getScrewdriverPoint(itemStack); + screwdriverItem.setScrewdriverMode(itemStack, ScrewdriverMode.DISABLED, getBlockPos(), null); + + if (points.size() == 2) { + BlockPos pointA = points.get(0); + BlockPos pointB = points.get(1); + + attemptToBuild(pointA, pointB); + screwdriverItem.clearBlockPosFromScrewdriver(itemStack); + this.clearDisplay(); + } + + this.clearDisplay(); + } + } + } + + public boolean setProjectionBlockPos(BlockPos pos, boolean isPointA) { + + if (!this.shouldDisplay) { + return false; + } + + if (isPointA) { + pointABlockPos = pos; + } else { + pointBBlockPos = pos; + } + + if (checkIfDistanceIsTooGreat(pos)) { + this.clearDisplay(); + sendUpdates(); + return false; + + } + + sendUpdates(); + return true; + } + + private boolean checkIfDistanceIsTooGreat(BlockPos pos) { + var distance = pos.distManhattan(getBlockPos()); + return distance > 25; + } + + @Nullable + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + public void sendUpdates() { + level.sendBlockUpdated(this.getBlockPos(), level.getBlockState(this.getBlockPos()), level.getBlockState(this.getBlockPos()), Block.UPDATE_CLIENTS); + setChanged(); + } + + public CompoundTag getUpdateTag() { + CompoundTag tag = new CompoundTag(); + saveAdditional(tag); + return tag; + } + + + private void attemptToBuild(BlockPos pointA, BlockPos pointB) { + + var submittedBlocks = new ArrayList(); + + // Grab the absolutes for these items. + float xDiff = Math.abs(pointA.getX() - pointB.getX()); + float yDiff = Math.abs(pointA.getY() - pointB.getY()); + float zDiff = Math.abs(pointA.getZ() - pointB.getZ()); + + int smallestPointX = pointA.getX() > pointB.getX() ? pointB.getX() : pointA.getX(); + int smallestPointY = pointA.getY() > pointB.getY() ? pointB.getY() : pointA.getY(); + int smallestPointZ = pointA.getZ() > pointB.getZ() ? pointB.getZ() : pointA.getZ(); + + BlockPos minPoint = new BlockPos(smallestPointX, smallestPointY, smallestPointZ); + + for (int y = 0; y < yDiff + 1; y++) { + + for (int x = 0; x < xDiff + 1; x++) { + + for (int z = 0; z < zDiff + 1; z++) { + + var blockPosInWorld = new BlockPos(minPoint.getX() + x, minPoint.getY() + y, minPoint.getZ() + z); + + submittedBlocks.add(new ManipulatorCraftingRecipeItem(new BlockPos(x, y, z), level.getBlockState(blockPosInWorld).getBlock())); + } + } + } + + // Filter recipes by the first block, will make it a LOT easier later down the line. (when I make it) + Optional firstBlock = submittedBlocks.stream().filter(x -> x.relativeBlockPos.getX() == 0 && x.relativeBlockPos.getY() == 0 && x.relativeBlockPos.getZ() == 0).findFirst(); + if (!firstBlock.isPresent()) { + return; + } + + List possibleRecipes = new ArrayList(); + + for (ManipulatorCraftingRecipe recipe : ManipulatorCrafting.MANIPULATOR_CRAFTING_RECIPES) { + + var zeroPos = recipe.itemList.stream().filter(x -> x.relativeBlockPos.getX() == 0 && x.relativeBlockPos.getY() == 0 && x.relativeBlockPos.getZ() == 0).findFirst(); + if (zeroPos.isPresent()) { + if (zeroPos.get().block == firstBlock.get().block) { + possibleRecipes.add(recipe); + } + } + + } + + // No recipes, so no result! + if (possibleRecipes.size() == 0) { + return; + } + + for (ManipulatorCraftingRecipe recipe : possibleRecipes) { + + if (recipe.hasSameItems(submittedBlocks)) { + + // Remove the recipe blocks. + for (BlockPos blockPos : BlockPos.betweenClosed(pointA, pointB)) { + level.setBlock(blockPos, Blocks.AIR.defaultBlockState(), Block.UPDATE_ALL); + } + + List droppedItems = getLevel().getEntitiesOfClass(ItemEntity.class, new AABB(pointABlockPos, pointBBlockPos).inflate(1)); + droppedItems.forEach(Entity::discard); + + // TODO: Make this system also accept placing a structure. + ItemStack itemStack = new ItemStack(recipe.recipeOutput.asItem()); + ItemEntity item = new ItemEntity(level, getBlockPos().getX() + 0.5f, getBlockPos().getY() + 1, getBlockPos().getZ() + 0.5f, itemStack); + level.addFreshEntity(item); + + return; + } + + } + } +} diff --git a/common/src/main/java/whocraft/tardis_refined/common/blockentity/device/ManipulatorCraftingRecipe.java b/common/src/main/java/whocraft/tardis_refined/common/blockentity/device/ManipulatorCraftingRecipe.java new file mode 100644 index 000000000..5d8068404 --- /dev/null +++ b/common/src/main/java/whocraft/tardis_refined/common/blockentity/device/ManipulatorCraftingRecipe.java @@ -0,0 +1,47 @@ +package whocraft.tardis_refined.common.blockentity.device; + +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; + +import java.util.Comparator; +import java.util.List; + + +/** + * Entry item for the Astral Manipulator. + * **/ +public class ManipulatorCraftingRecipe { + // List of ingredient blocks for the recipe to work. + public List itemList; + // Output to be summoned when the recipe is confirmed. + public Item recipeOutput; + + public ManipulatorCraftingRecipe(List itemList, Item recipeOutput) { + this.itemList = itemList; + this.recipeOutput = recipeOutput; + } + + + /** + * Compares a ManipulatorCraftingRecipe to another by sorting by size, then registered block entries + * @param comparedItemList The items of the recipe to compare to. + * **/ + public boolean hasSameItems(List comparedItemList) { + + if (itemList.size() != comparedItemList.size()) { + return false; + } + + // Sort the items so the list comparison is better. + this.itemList.sort(Comparator.comparing(a -> a.relativeBlockPos)); + comparedItemList.sort(Comparator.comparing(a -> a.relativeBlockPos)); + + for (int i = 0; i < this.itemList.size(); i++) { + if (!this.itemList.get(i).IsSameAs(comparedItemList.get(i))) { + return false; + } + } + + return true; + } +} diff --git a/common/src/main/java/whocraft/tardis_refined/common/blockentity/device/ManipulatorCraftingRecipeItem.java b/common/src/main/java/whocraft/tardis_refined/common/blockentity/device/ManipulatorCraftingRecipeItem.java new file mode 100644 index 000000000..50100c88c --- /dev/null +++ b/common/src/main/java/whocraft/tardis_refined/common/blockentity/device/ManipulatorCraftingRecipeItem.java @@ -0,0 +1,34 @@ +package whocraft.tardis_refined.common.blockentity.device; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Block; + +/** + * Ingredient block for a ManipulatorCraftingRecipe. + * **/ +public class ManipulatorCraftingRecipeItem { + + // Block position relative to the closest corner to 0,0,0 in world space. + public BlockPos relativeBlockPos; + + // The block that must exist at that position. + public Block block; + + public ManipulatorCraftingRecipeItem(BlockPos pos, Block block) { + this.relativeBlockPos = pos; + this.block = block; + } + + /** + * Compares a ManipulatorCraftingRecipeItem to another. + * @param compared The recipe item to compare to. + * @return If the items are equivalent. + * **/ + public boolean IsSameAs(ManipulatorCraftingRecipeItem compared) { + if (compared.block != block) { + return false; + } + return this.relativeBlockPos.getX() == compared.relativeBlockPos.getX() && this.relativeBlockPos.getY() == compared.relativeBlockPos.getY() && this.relativeBlockPos.getZ() == compared.relativeBlockPos.getZ(); + } +} + diff --git a/common/src/main/java/whocraft/tardis_refined/common/blockentity/door/RootShellDoorBlockEntity.java b/common/src/main/java/whocraft/tardis_refined/common/blockentity/door/RootShellDoorBlockEntity.java index 3d554f53a..5ec81bccc 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/blockentity/door/RootShellDoorBlockEntity.java +++ b/common/src/main/java/whocraft/tardis_refined/common/blockentity/door/RootShellDoorBlockEntity.java @@ -1,6 +1,10 @@ package whocraft.tardis_refined.common.blockentity.door; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.TickingBlockEntity; import net.minecraft.world.level.block.state.BlockState; import whocraft.tardis_refined.registry.BlockEntityRegistry; @@ -12,8 +16,15 @@ public RootShellDoorBlockEntity(BlockPos blockPos, BlockState blockState) { super(BlockEntityRegistry.ROOT_SHELL_DOOR.get(), blockPos, blockState); } + @Override + public void onBlockPlaced() { + // Left blank to remove parent functionality. + } + + @Override public boolean isOpen() { return true; } + } diff --git a/common/src/main/java/whocraft/tardis_refined/common/crafting/ManipulatorCrafting.java b/common/src/main/java/whocraft/tardis_refined/common/crafting/ManipulatorCrafting.java new file mode 100644 index 000000000..44f573847 --- /dev/null +++ b/common/src/main/java/whocraft/tardis_refined/common/crafting/ManipulatorCrafting.java @@ -0,0 +1,133 @@ +package whocraft.tardis_refined.common.crafting; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Blocks; +import whocraft.tardis_refined.common.blockentity.device.ManipulatorCraftingRecipe; +import whocraft.tardis_refined.common.blockentity.device.ManipulatorCraftingRecipeItem; +import whocraft.tardis_refined.registry.BlockRegistry; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +// Before 50 says anything. Yes, this should be made into a codec. Will I do it? No. +public class ManipulatorCrafting { + + public static List MANIPULATOR_CRAFTING_RECIPES = new ArrayList(); + + public static void registerRecipes() { + + register(new ManipulatorCraftingRecipe( Arrays.asList( + new ManipulatorCraftingRecipeItem(new BlockPos(0, 0, 0), Blocks.SMOOTH_STONE_SLAB), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 0, 1), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 0, 2), Blocks.SMOOTH_STONE_SLAB), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 0, 0), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 0, 1), Blocks.REDSTONE_BLOCK), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 0, 2), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 0, 0), Blocks.SMOOTH_STONE_SLAB), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 0, 1), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 0, 2), Blocks.SMOOTH_STONE_SLAB), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 1, 0), Blocks.IRON_TRAPDOOR), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 1, 1), Blocks.STONE_BUTTON), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 1, 2), Blocks.IRON_TRAPDOOR), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 1, 0), Blocks.STONE_BUTTON), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 1, 1), Blocks.GLASS), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 1, 2), Blocks.STONE_BUTTON), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 1, 0), Blocks.IRON_TRAPDOOR), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 1, 1), Blocks.STONE_BUTTON), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 1, 2), Blocks.IRON_TRAPDOOR) + + ), BlockRegistry.GLOBAL_CONSOLE_BLOCK.get().asItem())); + + register(new ManipulatorCraftingRecipe( Arrays.asList( + new ManipulatorCraftingRecipeItem(new BlockPos(0, 0, 0), Blocks.STONE), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 0, 1), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 0, 2), Blocks.STONE), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 0, 0), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 0, 1), BlockRegistry.ZEITON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 0, 2), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 0, 0), Blocks.STONE), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 0, 1), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 0, 2), Blocks.STONE), + + new ManipulatorCraftingRecipeItem(new BlockPos(0, 1, 0), Blocks.STONE), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 1, 1), Blocks.GLASS_PANE), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 1, 2), Blocks.STONE), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 1, 0), Blocks.GLASS_PANE), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 1, 1), Blocks.EMERALD_BLOCK), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 1, 2), Blocks.GLASS_PANE), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 1, 0), Blocks.STONE), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 1, 1), Blocks.GLASS_PANE), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 1, 2), Blocks.STONE), + + new ManipulatorCraftingRecipeItem(new BlockPos(0, 2, 0), Blocks.STONE), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 2, 1), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 2, 2), Blocks.STONE), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 2, 0), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 2, 1), Blocks.DAYLIGHT_DETECTOR), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 2, 2), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 2, 0), Blocks.STONE), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 2, 1), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 2, 2), Blocks.STONE) + + ), BlockRegistry.TERRAFORMER_BLOCK.get().asItem())); + + register(new ManipulatorCraftingRecipe( Arrays.asList( + new ManipulatorCraftingRecipeItem(new BlockPos(0, 0, 0), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 0, 1), Blocks.AMETHYST_BLOCK), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 0, 2), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 0, 0), Blocks.AMETHYST_BLOCK), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 0, 1), Blocks.OBSERVER), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 0, 2), Blocks.AMETHYST_BLOCK), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 0, 0), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 0, 1), Blocks.AMETHYST_BLOCK), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 0, 2), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()) + + ), BlockRegistry.CONSOLE_CONFIGURATION_BLOCK.get().asItem())); + + register(new ManipulatorCraftingRecipe( Arrays.asList( + new ManipulatorCraftingRecipeItem(new BlockPos(0, 0, 0), BlockRegistry.ZEITON_FUSED_COPPER_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 0, 1), Blocks.AMETHYST_BLOCK), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 0, 2), BlockRegistry.ZEITON_FUSED_COPPER_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 0, 0), Blocks.AMETHYST_BLOCK), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 0, 1), Blocks.DAYLIGHT_DETECTOR), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 0, 2), Blocks.AMETHYST_BLOCK), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 0, 0), BlockRegistry.ZEITON_FUSED_COPPER_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 0, 1), Blocks.AMETHYST_BLOCK), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 0, 2), BlockRegistry.ZEITON_FUSED_COPPER_BLOCK.get()) + + ), BlockRegistry.FLIGHT_DETECTOR.get().asItem())); + + register(new ManipulatorCraftingRecipe( Arrays.asList( + new ManipulatorCraftingRecipeItem(new BlockPos(0, 0, 0), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 0, 1), Blocks.AMETHYST_BLOCK), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 0, 2), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 0, 0), Blocks.AMETHYST_BLOCK), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 0, 1), Blocks.TARGET), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 0, 2), Blocks.AMETHYST_BLOCK), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 0, 0), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 0, 1), Blocks.AMETHYST_BLOCK), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 0, 2), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()), + + new ManipulatorCraftingRecipeItem(new BlockPos(0, 1, 0), Blocks.CUT_COPPER_SLAB), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 1, 1), Blocks.IRON_TRAPDOOR), + new ManipulatorCraftingRecipeItem(new BlockPos(0, 1, 2), Blocks.CUT_COPPER_SLAB), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 1, 0), Blocks.IRON_TRAPDOOR), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 1, 1), Blocks.AIR), + new ManipulatorCraftingRecipeItem(new BlockPos(1, 1, 2), Blocks.IRON_TRAPDOOR), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 1, 0), Blocks.CUT_COPPER_SLAB), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 1, 1), Blocks.IRON_TRAPDOOR), + new ManipulatorCraftingRecipeItem(new BlockPos(2, 1, 2), Blocks.CUT_COPPER_SLAB) + + ), BlockRegistry.LANDING_PAD.get().asItem())); + } + + public static ManipulatorCraftingRecipe register(ManipulatorCraftingRecipe manipulatorCraftingRecipe) { + MANIPULATOR_CRAFTING_RECIPES.add(manipulatorCraftingRecipe); + ; + return manipulatorCraftingRecipe; + } + + + +} diff --git a/common/src/main/java/whocraft/tardis_refined/common/items/ScrewdriverItem.java b/common/src/main/java/whocraft/tardis_refined/common/items/ScrewdriverItem.java new file mode 100644 index 000000000..e2bf8f552 --- /dev/null +++ b/common/src/main/java/whocraft/tardis_refined/common/items/ScrewdriverItem.java @@ -0,0 +1,196 @@ +package whocraft.tardis_refined.common.items; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; +import whocraft.tardis_refined.common.blockentity.device.AstralManipulatorBlockEntity; +import whocraft.tardis_refined.constants.ModMessages; +import whocraft.tardis_refined.registry.BlockRegistry; +import whocraft.tardis_refined.registry.SoundRegistry; + +import java.util.ArrayList; +import java.util.List; + +public class ScrewdriverItem extends Item { + + // Constants + public static final String SCREWDRIVER_MODE = "screwdriver_mode"; + public static final String LINKED_MANIPULATOR_POS = "linked_manipulator_pos"; + public static final String SCREWDRIVER_POINT_A = "screwdriver_point_a"; + public static final String SCREWDRIVER_POINT_B = "screwdriver_point_b"; + public static final String SCREWDRIVER_B_WAS_LAST_UPDATED = "screwdriver_b_was_last_updated_pos"; + + public ScrewdriverItem(Properties properties) { + super(properties); + } + + @Override + public InteractionResult useOn(UseOnContext context) { + + if (context.getLevel() instanceof ServerLevel serverLevel) { + + if (context.getPlayer().isCrouching()) { + setScrewdriverMode(context.getItemInHand(), ScrewdriverMode.DISABLED, context.getClickedPos(), serverLevel); + } else { + + if (isScrewdriverMode(context.getItemInHand(), ScrewdriverMode.DRAWING) && context.getLevel().getBlockState(context.getClickedPos()).getBlock() != BlockRegistry.ASTRAL_MANIPULATOR_BLOCK.get()) { + addBlockPosToScrewdriver(serverLevel, context.getPlayer(), context.getItemInHand(), context.getClickedPos()); + } + } + } + + + return super.useOn(context); + } + + public void setScrewdriverMode(ItemStack stack, ScrewdriverMode mode, BlockPos sourceChange, @Nullable ServerLevel serverLevel) { + CompoundTag itemtag = stack.getOrCreateTag(); + + if (itemtag.contains(SCREWDRIVER_MODE)) { + ScrewdriverMode currentMode = ScrewdriverMode.valueOf(itemtag.getString(SCREWDRIVER_MODE)); + + + if (currentMode != ScrewdriverMode.DISABLED && mode == ScrewdriverMode.DISABLED) { + if (serverLevel != null) { + playScrewdriverSound(serverLevel, sourceChange, SoundRegistry.SCREWDRIVER_DISCARD.get()); + } + } + + if (currentMode == ScrewdriverMode.DRAWING && mode == ScrewdriverMode.DISABLED) { + + if (serverLevel != null) { + clearLinkedManipulator(serverLevel, stack); + } + + + } + } + + itemtag.putString(SCREWDRIVER_MODE, mode.toString()); + if (mode == ScrewdriverMode.DRAWING) { + itemtag.put(LINKED_MANIPULATOR_POS, NbtUtils.writeBlockPos(sourceChange)); + } + + stack.setTag(itemtag); + } + + public boolean isScrewdriverMode(ItemStack stack, ScrewdriverMode mode) { + CompoundTag itemtag = stack.getOrCreateTag(); + + if (itemtag.contains(SCREWDRIVER_MODE)) { + ScrewdriverMode currentMode = ScrewdriverMode.valueOf(itemtag.getString(SCREWDRIVER_MODE)); + return mode == currentMode; + } + + return false; + } + + private void addBlockPosToScrewdriver(ServerLevel serverLevel, Player player, ItemStack stack, BlockPos pos) { + CompoundTag itemtag = stack.getOrCreateTag(); + + + boolean isUpdatingA = true; + String target = SCREWDRIVER_POINT_A; + + if (itemtag.contains(SCREWDRIVER_B_WAS_LAST_UPDATED)) { + isUpdatingA = itemtag.getBoolean(SCREWDRIVER_B_WAS_LAST_UPDATED); + + if (!isUpdatingA) { + target = SCREWDRIVER_POINT_B; + } + + } + + itemtag.put(target, NbtUtils.writeBlockPos(pos)); + updatedLinkedManipulator((ServerLevel) player.level(), stack, pos, isUpdatingA); + + itemtag.putBoolean(SCREWDRIVER_B_WAS_LAST_UPDATED, !isUpdatingA); + stack.setTag(itemtag); + + playScrewdriverSound(serverLevel, player.getOnPos(), SoundRegistry.SCREWDRIVER_SHORT.get()); + } + + public void playScrewdriverSound(ServerLevel level, BlockPos pos, SoundEvent soundEvent) { + + level.playSound(null, pos.getX(), pos.getY(), pos.getZ(), soundEvent, SoundSource.PLAYERS, 1, 0.875f + level.getRandom().nextFloat() / 4); + } + + private void updatedLinkedManipulator(ServerLevel level, ItemStack stack, BlockPos pos, boolean isPointA) { + CompoundTag itemtag = stack.getOrCreateTag(); + if (itemtag.contains(LINKED_MANIPULATOR_POS)) { + BlockPos manipulator = NbtUtils.readBlockPos(itemtag.getCompound(LINKED_MANIPULATOR_POS)); + if ( level.getBlockEntity(manipulator) instanceof AstralManipulatorBlockEntity astralManipulatorBlockEntity) { + + if (!astralManipulatorBlockEntity.setProjectionBlockPos(pos, isPointA)) { + setScrewdriverMode(stack, ScrewdriverMode.DISABLED, pos, level); + } + + } + + } + } + + private void clearLinkedManipulator(ServerLevel level, ItemStack stack) { + CompoundTag itemtag = stack.getOrCreateTag(); + if (itemtag.contains(LINKED_MANIPULATOR_POS)) { + BlockPos manipulator = NbtUtils.readBlockPos(itemtag.getCompound(LINKED_MANIPULATOR_POS)); + if ( level.getBlockEntity(manipulator) instanceof AstralManipulatorBlockEntity astralManipulatorBlockEntity) { + astralManipulatorBlockEntity.clearDisplay(); + } + + itemtag.remove(LINKED_MANIPULATOR_POS); + } + } + + public void clearBlockPosFromScrewdriver(ItemStack stack) { + CompoundTag itemtag = stack.getOrCreateTag(); + if (itemtag.contains(SCREWDRIVER_POINT_A)) { + itemtag.remove(SCREWDRIVER_POINT_A); + } + + if (itemtag.contains(SCREWDRIVER_POINT_B)) { + itemtag.remove(SCREWDRIVER_POINT_B); + } + + if (itemtag.contains(LINKED_MANIPULATOR_POS)) { + itemtag.remove(LINKED_MANIPULATOR_POS); + } + + stack.setTag(itemtag); + } + + public List getScrewdriverPoint(ItemStack stack) { + CompoundTag itemtag = stack.getOrCreateTag(); + List listOfBlockPos = new ArrayList(); + + if (itemtag.contains(SCREWDRIVER_POINT_A)) { + listOfBlockPos.add(NbtUtils.readBlockPos(itemtag.getCompound(SCREWDRIVER_POINT_A))); + } + + if (itemtag.contains(SCREWDRIVER_POINT_B)) { + listOfBlockPos.add(NbtUtils.readBlockPos(itemtag.getCompound(SCREWDRIVER_POINT_B))); + } + + return listOfBlockPos; + } + + @Override + public void appendHoverText(ItemStack itemStack, @Nullable Level level, List list, TooltipFlag tooltipFlag) { + super.appendHoverText(itemStack, level, list, tooltipFlag); + + list.add(Component.translatable(ModMessages.TOOLTIP_SCREWDRIVER_DESCRIPTION)); + } +} + diff --git a/common/src/main/java/whocraft/tardis_refined/common/items/ScrewdriverMode.java b/common/src/main/java/whocraft/tardis_refined/common/items/ScrewdriverMode.java new file mode 100644 index 000000000..f866b4d80 --- /dev/null +++ b/common/src/main/java/whocraft/tardis_refined/common/items/ScrewdriverMode.java @@ -0,0 +1,18 @@ +package whocraft.tardis_refined.common.items; + +public enum ScrewdriverMode { + + // * + // Repurposed screwdriver mode - for future use. + // * // + GENERIC, + // * + // No functionality on right click + // * // + DISABLED, + // * + // Drawing for projection + // * // + DRAWING + +} diff --git a/common/src/main/java/whocraft/tardis_refined/common/items/ZeitonIngotItem.java b/common/src/main/java/whocraft/tardis_refined/common/items/ZeitonIngotItem.java new file mode 100644 index 000000000..a827691b2 --- /dev/null +++ b/common/src/main/java/whocraft/tardis_refined/common/items/ZeitonIngotItem.java @@ -0,0 +1,40 @@ +package whocraft.tardis_refined.common.items; + +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import whocraft.tardis_refined.registry.BlockRegistry; + +public class ZeitonIngotItem extends Item { + public ZeitonIngotItem(Properties properties) { + super(properties); + } + + @Override + public InteractionResult useOn(UseOnContext useOnContext) { + + Level level = useOnContext.getLevel(); + ItemStack itemInHand = useOnContext.getItemInHand(); + + if (level.getBlockState(useOnContext.getClickedPos()).getBlock() == Blocks.IRON_BLOCK) { + level.setBlockAndUpdate(useOnContext.getClickedPos(), BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get().defaultBlockState()); + itemInHand.shrink(1); + level.playSound(null, useOnContext.getClickedPos(), SoundEvents.STONE_BREAK, SoundSource.BLOCKS, 1, 1 ); + } + + if (level.getBlockState(useOnContext.getClickedPos()).getBlock() == Blocks.COPPER_BLOCK) { + level.setBlockAndUpdate(useOnContext.getClickedPos(), BlockRegistry.ZEITON_FUSED_COPPER_BLOCK.get().defaultBlockState()); + itemInHand.shrink(1); + level.playSound(null, useOnContext.getClickedPos(), SoundEvents.COPPER_BREAK, SoundSource.BLOCKS, 1, 1); + + } + + return super.useOn(useOnContext); + } +} diff --git a/common/src/main/java/whocraft/tardis_refined/constants/ModMessages.java b/common/src/main/java/whocraft/tardis_refined/constants/ModMessages.java index 966d50298..310cf3672 100644 --- a/common/src/main/java/whocraft/tardis_refined/constants/ModMessages.java +++ b/common/src/main/java/whocraft/tardis_refined/constants/ModMessages.java @@ -20,6 +20,7 @@ public class ModMessages { public static String HARDWARE_OFFLINE = message("hardware_offline"); public static String TOOLTIP_TARDIS_LIST_TITLE = tooltip("tardis_list"); + public static String TOOLTIP_SCREWDRIVER_DESCRIPTION = tooltip("screwdriver_description"); /*UI Messages*/ public static final String UI_DESKTOP_CANCEL_DESKTOP = ui("monitor.cancel_desktop"); diff --git a/common/src/main/java/whocraft/tardis_refined/registry/BlockEntityRegistry.java b/common/src/main/java/whocraft/tardis_refined/registry/BlockEntityRegistry.java index 9e2b4e924..12d5c3be1 100644 --- a/common/src/main/java/whocraft/tardis_refined/registry/BlockEntityRegistry.java +++ b/common/src/main/java/whocraft/tardis_refined/registry/BlockEntityRegistry.java @@ -4,6 +4,7 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import whocraft.tardis_refined.TardisRefined; import whocraft.tardis_refined.common.blockentity.console.GlobalConsoleBlockEntity; +import whocraft.tardis_refined.common.blockentity.device.AstralManipulatorBlockEntity; import whocraft.tardis_refined.common.blockentity.door.InternalDoorBlockEntity; import whocraft.tardis_refined.common.blockentity.door.RootShellDoorBlockEntity; import whocraft.tardis_refined.common.blockentity.device.ConsoleConfigurationBlockEntity; @@ -33,5 +34,6 @@ public class BlockEntityRegistry { public static final RegistrySupplier> BULK_HEAD_DOOR = BLOCK_ENTITY_TYPES.register("bulk_head_door", () -> BlockEntityType.Builder.of(BulkHeadDoorBlockEntity::new, BlockRegistry.BULK_HEAD_DOOR.get()).build(null)); public static final RegistrySupplier> CONSOLE_CONFIGURATION = BLOCK_ENTITY_TYPES.register("console_configuration", () -> BlockEntityType.Builder.of(ConsoleConfigurationBlockEntity::new, BlockRegistry.CONSOLE_CONFIGURATION_BLOCK.get()).build(null)); public static final RegistrySupplier> FLIGHT_DETECTOR = BLOCK_ENTITY_TYPES.register("flight_detector", () -> BlockEntityType.Builder.of(FlightDetectorBlockEntity::new, BlockRegistry.FLIGHT_DETECTOR.get()).build(null)); + public static final RegistrySupplier> ASTRAL_MANIPULATOR = BLOCK_ENTITY_TYPES.register("astral_manipulator", () -> BlockEntityType.Builder.of(AstralManipulatorBlockEntity::new, BlockRegistry.ASTRAL_MANIPULATOR_BLOCK.get()).build(null)); } diff --git a/common/src/main/java/whocraft/tardis_refined/registry/BlockRegistry.java b/common/src/main/java/whocraft/tardis_refined/registry/BlockRegistry.java index e6606e278..8adef2405 100644 --- a/common/src/main/java/whocraft/tardis_refined/registry/BlockRegistry.java +++ b/common/src/main/java/whocraft/tardis_refined/registry/BlockRegistry.java @@ -40,6 +40,7 @@ private static RegistrySupplier register(String id, Supplie } + // Shell Blocks public static final RegistrySupplier ROOT_SHELL_BLOCK = register("root_shell", () -> new RootedShellBlock(BlockBehaviour.Properties.of().noOcclusion().strength(1000, 1000).sound(SoundType.CORAL_BLOCK)), true, true); public static final RegistrySupplier GLOBAL_SHELL_BLOCK = register("tardis_shell", () -> new GlobalShellBlock(BlockBehaviour.Properties.of().noOcclusion().strength(1000, 1000).sound(SoundType.STONE)), false, false); @@ -71,20 +72,26 @@ private static RegistrySupplier register(String id, Supplie public static final RegistrySupplier TERRAFORMER_BLOCK = register("terraformer", () -> new TerraformerBlock(BlockBehaviour.Properties.of().strength(3, 3).sound(SoundType.ANVIL).noOcclusion()), true, true); public static final RegistrySupplier AIR_LOCK_GENERATION_BLOCK = register("air_lock_generator", () -> new AirLockGenerationBlock(BlockBehaviour.Properties.of().strength(3, 3).sound(SoundType.ANVIL).noOcclusion()), false, true); public static final RegistrySupplier CONSOLE_CONFIGURATION_BLOCK = register("console_configuration", () -> new ConsoleConfigurationBlock(BlockBehaviour.Properties.of().strength(3, 3).sound(SoundType.ANVIL).noOcclusion()), true, true); + public static final RegistrySupplier ASTRAL_MANIPULATOR_BLOCK = register("astral_manipulator", () -> new AstralManipulatorBlock(BlockBehaviour.Properties.of().strength(3, 3).sound(SoundType.ANVIL).noOcclusion()), true, true); + public static final RegistrySupplier LANDING_PAD = register("landing_pad", () -> new LandingPad(BlockBehaviour.Properties.of().strength(3, 3).sound(SoundType.ANVIL).noOcclusion().lightLevel((x) -> { return 12; })), true, true); - - public static final RegistrySupplier FLIGHT_DETECTOR = register("flight_detector", () -> new FlightDetectorBlock(BlockBehaviour.Properties.of().strength(3, 3).sound(SoundType.ANVIL).noOcclusion()), true, true); - // Console public static final RegistrySupplier GLOBAL_CONSOLE_BLOCK = register("tardis_console", () -> new GlobalConsoleBlock(BlockBehaviour.Properties.of().strength(1000, 1000).sound(SoundType.ANVIL).noOcclusion().lightLevel((x) -> { return 15; })), true, true); + // Blocks + public static final RegistrySupplier ZEITON_BLOCK = register("zeiton_block", () -> new Block(BlockBehaviour.Properties.copy(Blocks.IRON_BLOCK).sound(SoundType.METAL)), true, true); + public static final RegistrySupplier ZEITON_FUSED_IRON_BLOCK = register("zeiton_fused_iron_block", () -> new Block(BlockBehaviour.Properties.copy(Blocks.IRON_BLOCK).sound(SoundType.METAL)), true, true); + public static final RegistrySupplier ZEITON_FUSED_COPPER_BLOCK = register("zeiton_fused_copper_block", () -> new Block(BlockBehaviour.Properties.copy(Blocks.COPPER_BLOCK).sound(SoundType.COPPER)), true, true); + + public static final RegistrySupplier ZEITON_ORE = register("zeiton_ore", () -> new Block(BlockBehaviour.Properties.of().requiresCorrectToolForDrops().strength(3.0F, 3.0F)), true, true); + public static final RegistrySupplier ZEITON_ORE_DEEPSLATE = register("deepslate_zeiton_ore", () -> new Block(BlockBehaviour.Properties.copy(Blocks.DEEPSLATE_GOLD_ORE).requiresCorrectToolForDrops()), true, true); } diff --git a/common/src/main/java/whocraft/tardis_refined/registry/ItemRegistry.java b/common/src/main/java/whocraft/tardis_refined/registry/ItemRegistry.java index 346b6b130..4572bfa39 100644 --- a/common/src/main/java/whocraft/tardis_refined/registry/ItemRegistry.java +++ b/common/src/main/java/whocraft/tardis_refined/registry/ItemRegistry.java @@ -7,6 +7,8 @@ import whocraft.tardis_refined.TardisRefined; import whocraft.tardis_refined.common.items.DrillItem; import whocraft.tardis_refined.common.items.KeyItem; +import whocraft.tardis_refined.common.items.ScrewdriverItem; +import whocraft.tardis_refined.common.items.ZeitonIngotItem; import java.util.ArrayList; import java.util.List; @@ -22,9 +24,13 @@ public class ItemRegistry { public static final DeferredRegistry ITEMS = DeferredRegistry.create(TardisRefined.MODID, Registries.ITEM); public static final RegistrySupplier KEY = register("tardis_key", () -> new KeyItem(new Item.Properties().stacksTo(1)), true); + public static final RegistrySupplier SCREWDRIVER = register("amethyst_screwdriver", () -> new ScrewdriverItem(new Item.Properties().stacksTo(1)), true); public static final RegistrySupplier PATTERN_MANIPULATOR = register("pattern_manipulator", () -> new Item(new Item.Properties().stacksTo(1)), true); public static final RegistrySupplier DRILL = register("drill", () -> new DrillItem(new Item.Properties().stacksTo(1)), true); + public static final RegistrySupplier RAW_ZEITON = register("raw_zeiton", () -> new Item(new Item.Properties()), true); + public static final RegistrySupplier ZEITON_INGOT = register("zeiton_ingot", () -> new ZeitonIngotItem(new Item.Properties()), true); + private static RegistrySupplier register(String id, Supplier itemSupplier, boolean addToTab) { diff --git a/common/src/main/java/whocraft/tardis_refined/registry/SoundRegistry.java b/common/src/main/java/whocraft/tardis_refined/registry/SoundRegistry.java index a4dd5c7e0..8e6f1cf91 100644 --- a/common/src/main/java/whocraft/tardis_refined/registry/SoundRegistry.java +++ b/common/src/main/java/whocraft/tardis_refined/registry/SoundRegistry.java @@ -22,6 +22,12 @@ public class SoundRegistry { public static final RegistrySupplier HUM_CORAL = setUpSound("hum_coral"); public static final RegistrySupplier INTERIOR_CREAKS = setUpSound("interior_creaks"); + + // Screwdriver + public static final RegistrySupplier SCREWDRIVER_SHORT = setUpSound("screwdriver_short"); + public static final RegistrySupplier SCREWDRIVER_CONNECT = setUpSound("screwdriver_connect"); + public static final RegistrySupplier SCREWDRIVER_DISCARD = setUpSound("screwdriver_discard"); + private static RegistrySupplier setUpSound(String soundName) { SoundEvent sound = SoundEvent.createVariableRangeEvent(new ResourceLocation(TardisRefined.MODID, soundName)); return SOUNDS.register(soundName, () -> sound); diff --git a/common/src/main/resources/assets/tardis_refined/models/item/amethyst_screwdriver.json b/common/src/main/resources/assets/tardis_refined/models/item/amethyst_screwdriver.json new file mode 100644 index 000000000..61d92eb96 --- /dev/null +++ b/common/src/main/resources/assets/tardis_refined/models/item/amethyst_screwdriver.json @@ -0,0 +1,147 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "0": "tardis_refined:item/amethyst_screwdriver", + "particle": "tardis_refined:item/amethyst_screwdriver" + }, + "elements": [ + { + "from": [6.8, 6.8, 6.8], + "to": [9.2, 9.2, 9.2], + "rotation": {"angle": 0, "axis": "y", "origin": [0, -1, 0]}, + "faces": { + "north": {"uv": [1.5, 3.25, 2, 3.75], "texture": "#0"}, + "east": {"uv": [3.5, 3, 4, 3.5], "texture": "#0"}, + "south": {"uv": [3.5, 3.5, 4, 4], "texture": "#0"}, + "west": {"uv": [1.5, 3.75, 2, 4.25], "texture": "#0"}, + "up": {"uv": [4.5, 0.5, 4, 0], "texture": "#0"}, + "down": {"uv": [4.5, 0.5, 4, 1], "texture": "#0"} + } + }, + { + "from": [6.7, 9.1, 6.7], + "to": [9.3, 10.7, 9.3], + "rotation": {"angle": 0, "axis": "y", "origin": [0, -1, 0]}, + "faces": { + "north": {"uv": [4, 3.5, 4.5, 3.75], "texture": "#0"}, + "east": {"uv": [4, 3.75, 4.5, 4], "texture": "#0"}, + "south": {"uv": [4, 4, 4.5, 4.25], "texture": "#0"}, + "west": {"uv": [1.5, 4.25, 2, 4.5], "texture": "#0"}, + "up": {"uv": [4.5, 1.5, 4, 1], "texture": "#0"}, + "down": {"uv": [4.5, 1.5, 4, 2], "texture": "#0"} + } + }, + { + "from": [7.2, 14, 7.2], + "to": [8.8, 20.6, 8.8], + "rotation": {"angle": 0, "axis": "y", "origin": [0, -1, 0]}, + "faces": { + "north": {"uv": [3, 3, 3.5, 4.75], "texture": "#0"}, + "east": {"uv": [0, 3.25, 0.5, 5], "texture": "#0"}, + "south": {"uv": [0.5, 3.25, 1, 5], "texture": "#0"}, + "west": {"uv": [1, 3.25, 1.5, 5], "texture": "#0"}, + "up": {"uv": [4.5, 2.5, 4, 2], "texture": "#0"}, + "down": {"uv": [4.5, 2.5, 4, 3], "texture": "#0"} + } + }, + { + "from": [7, 1, 7], + "to": [9, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [0, -1, 0]}, + "faces": { + "north": {"uv": [0, 0, 0.5, 3.25], "texture": "#0"}, + "east": {"uv": [0.5, 0, 1, 3.25], "texture": "#0"}, + "south": {"uv": [1, 0, 1.5, 3.25], "texture": "#0"}, + "west": {"uv": [1.5, 0, 2, 3.25], "texture": "#0"}, + "up": {"uv": [4.5, 3.5, 4, 3], "texture": "#0"}, + "down": {"uv": [4, 4, 3.5, 4.5], "texture": "#0"} + } + }, + { + "from": [7.5, 0, 7.5], + "to": [8.5, 21.6, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [0, -1, 0]}, + "faces": { + "north": {"uv": [2, 3, 2.25, 8.5], "texture": "#0"}, + "east": {"uv": [2.25, 3, 2.5, 8.5], "texture": "#0"}, + "south": {"uv": [2.5, 3, 2.75, 8.5], "texture": "#0"}, + "west": {"uv": [2.75, 3, 3, 8.5], "texture": "#0"}, + "up": {"uv": [4.25, 4.5, 4, 4.25], "texture": "#0"}, + "down": {"uv": [4.5, 4.25, 4.25, 4.5], "texture": "#0"} + } + }, + { + "from": [8, 12.8, 6], + "to": [8, 17.8, 10], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 13.3, 8]}, + "faces": { + "north": {"uv": [0, 0, 0, 1.25], "texture": "#0"}, + "east": {"uv": [2, 0, 3, 1.25], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 1.25], "texture": "#0"}, + "west": {"uv": [2, 1.5, 3, 2.75], "texture": "#0"}, + "up": {"uv": [0, 1, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 1], "texture": "#0"} + } + }, + { + "from": [8, 12.8, 6], + "to": [8, 17.8, 10], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 13.3, 8]}, + "faces": { + "north": {"uv": [0, 0, 0, 1.25], "texture": "#0"}, + "east": {"uv": [3, 0, 4, 1.25], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 1.25], "texture": "#0"}, + "west": {"uv": [3, 1.5, 4, 2.75], "texture": "#0"}, + "up": {"uv": [0, 1, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 1], "texture": "#0"} + } + }, + { + "from": [7.5, 7.5, 6.75], + "to": [8.5, 8.5, 7.75], + "faces": { + "north": {"uv": [2, 0.5, 2.25, 0.75], "texture": "#0"}, + "east": {"uv": [2, 5.75, 2.25, 6], "texture": "#0"}, + "south": {"uv": [2, 5.75, 2.25, 6], "texture": "#0"}, + "west": {"uv": [2, 5.75, 2.25, 6], "texture": "#0"}, + "up": {"uv": [2, 5.75, 2.25, 6], "texture": "#0"}, + "down": {"uv": [2, 5.75, 2.25, 6], "texture": "#0"} + } + } + ], + "gui_light": "front", + "display": { + "thirdperson_righthand": { + "translation": [0, 0, 1], + "scale": [0.4, 0.4, 0.4] + }, + "thirdperson_lefthand": { + "translation": [0, 0, 1], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_righthand": { + "rotation": [-12, -13, -16], + "translation": [1.75, 0.25, 0], + "scale": [0.6, 0.6, 0.6] + }, + "firstperson_lefthand": { + "rotation": [-14, -25, -16], + "translation": [1.25, 0.25, 0], + "scale": [0.6, 0.6, 0.6] + }, + "ground": { + "rotation": [18, 82, 59], + "translation": [0, 0, -3] + }, + "gui": { + "rotation": [41, 13, -42], + "translation": [-2.25, -2.25, 0], + "scale": [0.9, 0.9, 0.9] + }, + "fixed": { + "rotation": [-3, 0, 0], + "translation": [0, -4, -1.25] + } + } +} \ No newline at end of file diff --git a/common/src/main/resources/assets/tardis_refined/sounds/tools/screwdriver/screwdriver_connect.ogg b/common/src/main/resources/assets/tardis_refined/sounds/tools/screwdriver/screwdriver_connect.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4b299cea284a0ad0a21c76607a7fac72457c4f43 GIT binary patch literal 8451 zcmaiY2Ut_x((VquN+@C|VuG|#l+c49MNkMu2?QykQUcN;6wwbbQ~{A15GhIv9Rvgf zR7B~$hbmZT(kw_(RPGLZ=bZ1Jd!PT`&&tZ$YxbI1GxN^uS^J`slPN$0{C!O_91eWd zM1~+j5PwgCowE;h3Zhf?_aiqU2ZMUZMe53bU(}UU%3{qq8mQU+|8;fI9x_q@=@!mj zH%?t7IKkbV?aU9@!}Z~EvU0Mr%CZV@2`t{h&)(U?39jqm?@aLYaL0T2BB^}Yz@HY@ zOyAT@9qa6mCqU>Ac_OvXnL_|3kcu*dw-E;uZ~y=Wfa@a2Bgu~XNHQr$;#L|-k2-3T zjZPy)x54aVQSJZg;0g{$0e}u5N-)ReE$X}Uqn%*lafEENv$0AcoH54a9h&*gmYBUq zK}~_HM?X@OiQSSO01c+8hlt?8QaigSL?jIC?g|n*5rvrq7RjRQP!_pPc$lHwr~G7N z)lWrvajGj4HG|r$GBv{(L)4hLeZ@-#n?Rp_^it;E9rJ-6aBwf$415kyZ6+%FC}cqz z0c3Tk791dgY62G$dGxDzda4BbhD0uYlQ!X29Fo^HH8aA2m!HjLfBd+=-?)E}Wm<%F zeUN2+g!M#(%}#_ZEb{NR8#K2=Z3n8uAwc#?bm~WBt}uV@2XroNcw`w3;6ODAoH
u$10NKvz1^-WTv`oeS?@jYYrzD^W+Oor2 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 LMSbbnW#In+4Eo5R literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/tardis_refined/sounds/tools/screwdriver/screwdriver_discard.ogg b/common/src/main/resources/assets/tardis_refined/sounds/tools/screwdriver/screwdriver_discard.ogg new file mode 100644 index 0000000000000000000000000000000000000000..86bae4f46e6828743029aac8b69507b92f4e7f59 GIT binary patch literal 9450 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 aZ|SI&9`0b;m=JbRi{*ge?woi{gZ~4>d{n9c literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/tardis_refined/sounds/tools/screwdriver/screwdriver_short.ogg b/common/src/main/resources/assets/tardis_refined/sounds/tools/screwdriver/screwdriver_short.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b7fdddd7908cb5c9be3f29026e3d675d0e142949 GIT binary patch literal 9428 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 literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/tardis_refined/textures/block/console_configuration.png b/common/src/main/resources/assets/tardis_refined/textures/block/console_configuration.png index 208e8fc18bb52e3d19f1d3054b5e27bbc9815128..3b25f72617e1efaaca1f8971da385725ddb1a627 100644 GIT binary patch delta 455 zcmV;&0XY7-2G#?R8Gi!+005o0f$RVP00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z000~000PdQchF<|NsC0|Nj8q zgS}Y*000SaNLh0L01m?d01m?e$8V@)0003qNkl{x6cyB_c zidrdjXJ;QcR>2Af2$80gh_YWPDRTzQTJ+$l`iYbnz5HSb#F-KhV-gONX0bU)R;_q} zD8BF}5OIMNsijmD(eR9vbM!|If{X>2K(Ufi@X?x`lj>sz)dUEJ3$D@&jv)GOKo+gO z&@bWGMrNv&P=6WH2XTR3fNa9p7#Z0W4Mw2fQz8*l`+`a|7=e+yR7Mcm`@-^_6lJ4@ z&e(@fY<4i zwzQIA0MKq35E&gC2LPO(6tqq)$%f-c8Xmykj2$#O08|Rcu9p{QSDx)eX4Pr$z4+?! zITM@Lvjbk@dzC%^z(8JM=;cbh!`fN@&K)OOuB>jQvZ*}6ft^!(m|qhsU9rGH>D<9?q$j5)#2 z3zvY~{#x4$B^ThcIW&>flL80UVJNr2X*oPy2 zhFDyl2XK3CNMu%>v>9Zj>HLJp1!=boXDf?s;Px~K*n)DQ+bzQpoX@dL%QYsb=z!Z= z<$Tduw13!^h3CIsflgFN(0pD-X=}#k7MS=f2R~UUwd!SHT|kqCxsMWpo;Kxn*ieoEwd&=d*WwGxE|A(-cMeCEX@8-dFNV?uXa}fF>eP~+nZwW8o+`>U zL0Q;-N(nm3S>S&`4`bjOB)VMOXtxYhwr00000NkvXXu0mjfG!=*2 diff --git a/common/src/main/resources/assets/tardis_refined/textures/block/deepslate_zeiton_ore.png b/common/src/main/resources/assets/tardis_refined/textures/block/deepslate_zeiton_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..5360323360d7676f41d359b85f5af26ee1a6eba7 GIT binary patch literal 652 zcmV;70(1R|P)52ISGa?YicID0}U0G^lCUp*2+ISv7k zV2m}J?Y%u2h6lY~KZ=eu&M@L+GC4p4NG8t-p)5)%rIazoIR{X)!b{Vm02(j+MxzCQ z5F3C}-BY6F<=c)!D5W*Ng9#@!)X{^?g+jJ&GR6RCE`44iogVM?`i2pcB@%w+Q&-QE z+>Cc+UK|=3eiTKKKhfRK^wXgsr4&M$Yip~O$^w9k+hm0m>KpB1`Bp1zwcdZMS)taD z^9m!6?)t9jd09idG;o7bx(TUxP%<+Ex$V*zehD|Q9EVt(^G!$qDh}Mh5<*?~vTSZv zv-qwFVEDr>A@-@Q=KM4(4ta}Z5pIVkefy7T7_s9xQ51a|-kQ2hPP*-h%4F`|%^=mW zc4KQapWbWk066?RUNU1i@LiK~E~UH-M{LUS<25^9{Pyl;eWUFLma)FR{yiTzfBr7D zVW!Z3?`!V~vD=w{03OUO0k8mM>n4%0@0xJO^0~z1%#GPQ#UD?e18^K7 zgwk?#Ag1=mcg@sLN2Be0@ynanlv0hh@6+c zn3U>v>=78!U7X!|^;yb&qgt&FwrhL`fE!p!bqTR6l?7d7KMnw_umWSu8njwUxxxxk mN;puetB=-Emd?7*IsXrx;V+^%3~Yk{0000}Nc2*w1E8Gi!+005o0f$RVP00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z001FSOjJdpWZ-r~$u2WKMNM0TlbDvMs$D(8_4@fHNP{0SZU6uP(dq$=0000BbW%=J z|NsC0|NsC0|Nj6=PXY1(000SaNLh0L01m?d01m?e$8V@)0Dk}hmq|oHR9HvtmF=#= zAPk240jS*n1)sOHn+)gNjLG@KlW4YC9!jB;h^ekHR{^U25veKX?6uD8S4S!95Y6TEPEdr0);9Ia5JOf*^S8i{_K8Fh%#_FkxQP|L-vtM$ngoI(Sve;h(o2HsXBUH| z2{LxSZDU77_H+W@D6#2q{24h|LK`Bohqx?tiVQYH)PDhJrZy!cCr1o)OK{LTrc& z?tCfeh%raUyu47ZG6fd|@AhOCaSDtnm;z%8roi}bL9Krrc8VXzoqeDH0000z;ROEKMQ3xy*9)N578zMxbrD36|`bTz1&pJmg(IF5}c@0ibM4UKQV z+VJ!{y%0D%Edy}t!3)oWT9r1l^D~Y%`$Fw~D{4?hYiMRWp1foBtTPpz_C;$AjePEedacUF z*I$k_*DwM?_VMkQo>^~@z?%~$L27H4>}HeJzij|!=Vyp-UE|&tpHFPgfM}G81tmdD z4}~K{hd4oNXgyL~UcEiiqz8NZfD!X{^;pBJRcZIwLVw|ic}|RrfVER97L=$*C)n{C zo7Nb&hXO$2FxWRn*d{^1{=s>jAXH&jhp;(uQK4p~&jB#H6Y{weSKH2q&wKh0e}CU> zKYEhVp?eSxqF$?-XTez0pqpWs6Rf-Hl)m!06XR@n`JBkd?*j1C-wAg3&Xl=Oiq}JK z+$j*?t$#trQn8@aYgIzw2=;=hciXLLS;%?u z{o_~GlDhRGBM=vuAQTS58@ljg2e&lBT z$In;4HhhP`Ap0910&fDo6mS`Kco@DM0Ns}wZg+K2NsjX+#yIiifR(kR{+art(Rti1He!K7>dZOH(;@AYtY zZwUBJW%k!x0M&|71wOlb?B}ar3%*0Z=|4FVi9{lijED2Sw3SFC5{X12kw_#Gi6TTI jkw_#Gi9{liNP77n{OI4bH%|kA00000NkvXXu0mjfkk%1x diff --git a/common/src/main/resources/assets/tardis_refined/textures/block/landing_pad.png b/common/src/main/resources/assets/tardis_refined/textures/block/landing_pad.png index f314b468aa65a75da821842b15f2ac2392a0ed23..ee47e5f5d90a7b461bbfb4ccf83cc93c6f5112f7 100644 GIT binary patch delta 1126 zcmV-s1eyEW5by|)8Gi!+008vhk@)}s00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z0004Y7elxpc zzzA$y(c+|@It~_x*hUw^bZ5*xP`YD!?uQW!{ah8C+&>H2GWQI(LV=WXsxQ!W2@DHd z!$t@&^}q$DDMA3JS8Ra|F5oM+bb-DP5a?4X@u;K<*`5Ijli}W#&9lB3`8-!6xcw4>cvl92|Qr}93JpjlNSPZ zXLOjR0G8ccjNCusT%g1v57hNvTdxE2FbwCyPXF*$BfNjveAwXABy%8QG0sBb6OQ^Ph zzDo`Stgdb@fo&BGW6D!~0ag8ugGP9_z`h%XRe>VzI26bk&xZd|3G8l05SVhhu>|(q zE})svsDGKs{Z%mf0VAd-82(IP9CQAH04JxIH9^4mf{Z%dywFih$bNd`YurT zm9So5w|S4@?AJxuK!ibt9eu?%DC&kVfunw45qGS$qO5f|J)459LyVZb$xAz{hkwsfY0Xdg2AfY4*2b4${*$ zqE|r}tYalNgob=(_nYv8!;K+aZqre}Qe7^AkT=)h1A%}y*WmIMg}k{2AGCphH(%G_ zgA#~p0~ZN-a}BCr(Wf+lCh!XcE)K;}{GHoz6u+PZzCI;;Hz^IKjRQ@f2{eHw&;*)5 s6KDcWpb0dACeQ?$Koe*JUly3>f7JDZ+QsttI{*Lx07*qoM6N<$f;1N9@c;k- delta 2137 zcmV-f2&VV&2-^^l8Gi-<006^2Vaosj2qH;DK~#90?VU|XTvrsw{}TtL3keJv1z`|$ zr9=yLSrW5}*(3xFh*bh+XM@3&n;Hm#nvGBhkx$gS(`znfAQc9>R^U(*S^#x+ws8SIs^7L?bJF}MCk9SXsAKE-!j#!YC4{GDPZFv275rnbHam>xkRy=707t0sxv@ir@Q3Zadz?>Dt6S zN#{eNLvL&m3M)1@))S}y)ol?yS?yq$fG~Q$kk94IMgc-9ox+W;(?-v~_W2P2;6vME z9PIDm#@A_+IS};Ws+cVf|AKL*8o(=qqr*t0Q@Hl|5gJL^}-w1K_~J4^SL~p zuJr+peUU$3EpTQ6AP!(DsyANga6Ei4Mq3{Nu?Rr1cbCGus)`qf&ra<(w`72gNFT4J ziCqKOMffU3{)Atj%@wE#!X;J#u#4?`MTUf%8-MGG?w+d!^?xWgs3Bq#0CiT+>vXW~ ze#JD5O^)OK5CcPAiA4ZB2WxC>zL*L1dV{0Gj0gt6m1+Jf9?(sDe-_j7;o_%>?L;>4YvcKuH6r!X>kToFMXtX*$@AC+>t? z!+&lrAPiJzPnjg51Lyj@q^|nka7$YFgG)6WCht}>DXbF5~gBj z^DCjAqbHTx!I?qtn36*0W@aNx3f0+J_}x=974cB@m=X_=21x#U(3sQ^mp%nt(u@tDHcflt9wd)efLo8%X?f?gXG%4+vme zwon5EAvOU}WBYC=gRCfK1lMDwZVGohv(x|qiA4asP6Uzoh(!R7HU}yW_ZqvGZGYDg z(1($dLJo*SND~l**i1lU_p+rH5aG~s{OzK9l2&%OwF3ZniJ!xJ$Qq<-oWP0RRnz(b z686=zeQ5K;rD_BKfDzr3`hRnIdF7Zt6GHqEdubS{E~-icNOZ5itu)EAxv|b{p9rZM z0Vvw`l1Fc)?wt}tm=NNf*aX07D1W%N`q9;O>})*~Li`bn0N4!yRlM|Gy|L*4`X?3v z=Sfw7~&VV*RVTIw(D6zbOfU% z^1=`|bqDG(L$A_h`>mcaj7nyr6o%;b*lW2}(DS{*@qaiZfzrDIWTkJwdu&~;C{CqQ z72g>^s)vNCe#4qj3EOUq34d@hCkz>T$Ls?{upnd9wTC1a2`e99X?_veJ2@;jPFUJ< zHHZ@@?BU_#DiWxg2Db}9c;(MOF5z%%2Tfh=INaJXhJy{Q^*G)=!O*L;Yi&Y7agQMY zYKT_wGSu?wKj^}vHhxoAJJ1E}z54{f-x4##9j5YdryxxnNYSU@r+>1TxX1Nmkf`XF z`Dh9;bk(1^*@4W>j?w|IzC?20TE|fU#wN#+&*gEr^*frn+Oc#mTIWw}zOeW1)2Ru# z80md$m9n`2)$Yp+odDqY2zZ+B0}!169Pgf>p|u_jt@Va4K>HspNr?jLQ9C^*pS_a< zQ0^p#747@+-WLG+Jb%C!u;)ihQe7ZYP=!Jo9tgL=z2G(yNW5eC0217h23CbaEy)I) zM-5()jA2=^T(W_6IKB^`Bv71Lb9x1v2u2hI82YPg<-5Em5Ew7W{)Z375>}dk!r>3o zD4_I%ThrWvHOPlOakKcaMQSj4t8y zAs2x2p#i#kt`;N&tp6weIXCMBHn(KT<{`p}M3O4!d3LF+my21j+DE)m^%_8ZVYI$Z zAnOBzQ#A`k+QAn_*Em%3gb+dqA%qYTI_F_7fJ8&pM^XX_AyGpUP~$KqjGTE=C?SLp zLI@#*5JCtcgb+dqA%qY@2qA_kUi02apcrR?M`SSr T10PTs-yud(4X=ic-Ic5W^hFx> delta 71 zcmZqSY2lgRZ*zC4zN>Ha=SxA?+B6v$7$oX4Er1k9NswRge+Xc>*St3pD8^af5n0T@ Sz;_sg8IR|$NZHt3$qE4Q6&tt! diff --git a/common/src/main/resources/assets/tardis_refined/textures/block/zeiton_block.png b/common/src/main/resources/assets/tardis_refined/textures/block/zeiton_block.png new file mode 100644 index 0000000000000000000000000000000000000000..75b16f5f57b3014b0e0d87fe23ab82696095d435 GIT binary patch literal 536 zcmV+z0_XjSP)KHL$IxL8^UXZp@XR~cIw}M($a7+Kw0}^HOpc%26#&vSsjl8l`v;tJ2nnNk)n9JhIo$qS0#yHfhtt1P05w*Q&NUntKzD0X%0PEd7!fOL zPXO%yiU1sbe7E}GS$}WG_Se^60=OkSwB01_y&URBI~N7%=2T@A7iFYu=UC;e~7TO^^3J@BO~N&wH*XcD=uH5*nBP!! z0l>uS%I@NlZrPlcJtBaQFE<=|WFVf4`EP%10uTT&%RIZ7{k@vwbf2f+3B&Kce`zRP ztN>u7E%1$KB*g0gXmvE!s11)MIQ{I}WGY`6jD*5I5r9A`agtnpu)di}(vIy^*q*y} z<>_kxVV|g5b~jRQlG(Q(wvq|y+#v6AVtK94?;Yw7avFdez*aJGJ~8PCm419N_V=pg z()e^{cN)h2-l^c{JFYvQUjhHDR?8&-!=nj4F;tzeGtvg&=DvAuW|_KWzqv8RQ2^Nk z6E3OS*3eymc3lZy=a$i zbu<71=pSa8BLne=6Sg`t*48XfY;;rc60++ zICQOfPxxm$b9pBDPSDcD3V%yZ7u`5K)^8q(UH6hWb#%N?*CZw222lI?Ydd+tP<5Oz s)@n;ifRQ%h;kzN*(aK0$QUU<}0%wm9^(rcoA^-pY07*qoM6N<$f?Q%9!vFvP literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/tardis_refined/textures/block/zeiton_fused_iron_block.png b/common/src/main/resources/assets/tardis_refined/textures/block/zeiton_fused_iron_block.png new file mode 100644 index 0000000000000000000000000000000000000000..d7e61cd44cbabdcd1048ae315e8866017f451e18 GIT binary patch literal 557 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 literal 46772 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 W6=Fg4NAR14XU`qG`AOu-$Nm9YLVaNX diff --git a/fabric/src/main/java/whocraft/tardis_refined/fabric/TardisRefinedFabric.java b/fabric/src/main/java/whocraft/tardis_refined/fabric/TardisRefinedFabric.java index 2a4a6a88d..2c85211c8 100644 --- a/fabric/src/main/java/whocraft/tardis_refined/fabric/TardisRefinedFabric.java +++ b/fabric/src/main/java/whocraft/tardis_refined/fabric/TardisRefinedFabric.java @@ -2,15 +2,20 @@ import fuzs.forgeconfigapiport.api.config.v3.ForgeConfigRegistry; import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.biome.v1.BiomeModifications; +import net.fabricmc.fabric.api.biome.v1.BiomeSelectors; import net.fabricmc.fabric.api.command.v2.ArgumentTypeRegistry; import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; import net.fabricmc.fabric.api.resource.ResourceManagerHelper; import net.minecraft.commands.synchronization.SingletonArgumentInfo; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.PackType; import net.minecraft.server.packs.resources.PreparableReloadListener; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.util.profiling.ProfilerFiller; +import net.minecraft.world.level.levelgen.GenerationStep; import net.neoforged.fml.config.ModConfig; import whocraft.tardis_refined.TRConfig; import whocraft.tardis_refined.TardisRefined; @@ -86,5 +91,8 @@ public void onInitialize() { TardisRefined.LOGGER.info("ImmersivePortals was not detected."); } + BiomeModifications.addFeature(BiomeSelectors.foundInOverworld(), GenerationStep.Decoration.UNDERGROUND_ORES, ResourceKey.create(Registries.PLACED_FEATURE, new ResourceLocation(TardisRefined.MODID, "ore_zeiton"))); + BiomeModifications.addFeature(BiomeSelectors.foundInOverworld(), GenerationStep.Decoration.UNDERGROUND_ORES, ResourceKey.create(Registries.PLACED_FEATURE, new ResourceLocation(TardisRefined.MODID, "ore_zeiton_small"))); + } } \ No newline at end of file diff --git a/fabric/src/main/java/whocraft/tardis_refined/fabric/TardisRefinedFabricClient.java b/fabric/src/main/java/whocraft/tardis_refined/fabric/TardisRefinedFabricClient.java index 0e700ba5f..fb265d577 100644 --- a/fabric/src/main/java/whocraft/tardis_refined/fabric/TardisRefinedFabricClient.java +++ b/fabric/src/main/java/whocraft/tardis_refined/fabric/TardisRefinedFabricClient.java @@ -13,6 +13,7 @@ import whocraft.tardis_refined.client.TRParticles; import whocraft.tardis_refined.client.renderer.blockentity.RootPlantRenderer; import whocraft.tardis_refined.client.renderer.blockentity.console.GlobalConsoleRenderer; +import whocraft.tardis_refined.client.renderer.blockentity.device.AstralManipulatorRenderer; import whocraft.tardis_refined.client.renderer.blockentity.device.ConsoleConfigurationRenderer; import whocraft.tardis_refined.client.renderer.blockentity.door.BulkHeadDoorRenderer; import whocraft.tardis_refined.client.renderer.blockentity.door.GlobalDoorRenderer; @@ -54,6 +55,7 @@ private void establishBlockEntityRenderers() { BlockEntityRendererRegistry.register(BlockEntityRegistry.BULK_HEAD_DOOR.get(), BulkHeadDoorRenderer::new); BlockEntityRendererRegistry.register(BlockEntityRegistry.CONSOLE_CONFIGURATION.get(), ConsoleConfigurationRenderer::new); + BlockEntityRendererRegistry.register(BlockEntityRegistry.ASTRAL_MANIPULATOR.get(), AstralManipulatorRenderer::new); /*Required to Render Transparency*/ for (Block block : BlockRegistry.BLOCKS.getRegistry()) { diff --git a/forge/src/main/java/whocraft/tardis_refined/common/data/BiomeModifierProvider.java b/forge/src/main/java/whocraft/tardis_refined/common/data/BiomeModifierProvider.java index fe809cc19..c80dbae3c 100644 --- a/forge/src/main/java/whocraft/tardis_refined/common/data/BiomeModifierProvider.java +++ b/forge/src/main/java/whocraft/tardis_refined/common/data/BiomeModifierProvider.java @@ -1,19 +1,29 @@ package whocraft.tardis_refined.common.data; +import com.google.common.collect.ImmutableList; +import net.minecraft.core.HolderGetter; import net.minecraft.core.HolderSet; import net.minecraft.core.RegistrySetBuilder; import net.minecraft.core.registries.Registries; import net.minecraft.data.DataGenerator; import net.minecraft.data.DataProvider; +import net.minecraft.data.worldgen.BootstapContext; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BiomeTags; +import net.minecraft.tags.BlockTags; import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.VerticalAnchor; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration; import net.minecraft.world.level.levelgen.placement.HeightRangePlacement; import net.minecraft.world.level.levelgen.placement.InSquarePlacement; import net.minecraft.world.level.levelgen.placement.PlacedFeature; import net.minecraft.world.level.levelgen.placement.RarityFilter; +import net.minecraft.world.level.levelgen.structure.templatesystem.RuleTest; +import net.minecraft.world.level.levelgen.structure.templatesystem.TagMatchTest; import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; import net.neoforged.neoforge.common.world.BiomeModifier; import net.neoforged.neoforge.common.world.BiomeModifiers; @@ -23,43 +33,44 @@ import whocraft.tardis_refined.common.world.Features; import whocraft.tardis_refined.common.world.feature.NbtTemplateFeature; import whocraft.tardis_refined.common.world.feature.config.NbtTemplateFeatureConfig; +import whocraft.tardis_refined.registry.BlockRegistry; import whocraft.tardis_refined.registry.FeatureKeys; import whocraft.tardis_refined.registry.TagKeys; import java.util.List; import java.util.Set; +import static net.minecraft.data.worldgen.features.FeatureUtils.createKey; +import static whocraft.tardis_refined.common.data.ProviderConfiguredFeatures.TARDIS_ROOT_CLUSTER_CONF_FEATURE; +import static whocraft.tardis_refined.common.data.ProviderPlacedFeatures.TARDIS_ROOT_CLUSTER_PLACED_FEATUE; + public class BiomeModifierProvider { - public static final ResourceKey TARDIS_ROOT_CLUSTER_PLACED_FEATUE = ResourceKey.create(Registries.PLACED_FEATURE, FeatureKeys.TARDIS_ROOT_CLUSTER_RL); - public static final ResourceKey> TARDIS_ROOT_CLUSTER_CONF_FEATURE = ResourceKey.create(Registries.CONFIGURED_FEATURE, FeatureKeys.TARDIS_ROOT_CLUSTER_RL); + + private static final ResourceKey ADD_TARDIS_ROOT_CLUSTER = ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, FeatureKeys.TARDIS_ROOT_CLUSTER_RL); - public static void genBiomeModifiers(GatherDataEvent e) { - final DataGenerator generator = e.getGenerator(); - final RegistrySetBuilder builder = new RegistrySetBuilder(); + private static final ResourceKey ZEITON = ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, new ResourceLocation(TardisRefined.MODID, "zeiton")); + private static final ResourceKey ZEITON_SMALL = ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, new ResourceLocation(TardisRefined.MODID, "zeiton_small")); - ResourceLocation templateLocation = new ResourceLocation(TardisRefined.MODID, "cave/tardis_root_cluster_deepslate"); - ConfiguredFeature tardisRootCluster = new ConfiguredFeature<>(Features.NBT_FEATURE.get(), new NbtTemplateFeatureConfig(templateLocation, 0)); - builder.add(Registries.CONFIGURED_FEATURE, context -> context.register(TARDIS_ROOT_CLUSTER_CONF_FEATURE, tardisRootCluster)); - builder.add(Registries.PLACED_FEATURE, context -> context.register(TARDIS_ROOT_CLUSTER_PLACED_FEATUE, new PlacedFeature - (context.lookup(Registries.CONFIGURED_FEATURE).getOrThrow(TARDIS_ROOT_CLUSTER_CONF_FEATURE), - List.of( - RarityFilter.onAverageOnceEvery(25), - InSquarePlacement.spread(), - HeightRangePlacement.uniform(VerticalAnchor.absolute(-50), VerticalAnchor.absolute(20)))) - )); - builder.add(NeoForgeRegistries.Keys.BIOME_MODIFIERS, context -> { - var tardisRoot = context.lookup(Registries.BIOME).getOrThrow(TagKeys.TARDIS_ROOT_CLUSTER); + public static void bootstrap(BootstapContext context) { + + var overworldTags = context.lookup(Registries.BIOME).getOrThrow(BiomeTags.IS_OVERWORLD); - context.register(ADD_TARDIS_ROOT_CLUSTER, new BiomeModifiers.AddFeaturesBiomeModifier( - tardisRoot, - HolderSet.direct(context.lookup(Registries.PLACED_FEATURE).getOrThrow(TARDIS_ROOT_CLUSTER_PLACED_FEATUE)), - GenerationStep.Decoration.LOCAL_MODIFICATIONS - )); - }); + HolderGetter placed = context.lookup(Registries.PLACED_FEATURE); - final DataProvider biomeModifierProvider = new DatapackBuiltinEntriesProvider(generator.getPackOutput(), e.getLookupProvider(), builder, Set.of(TardisRefined.MODID)); - generator.addProvider(e.includeServer(), biomeModifierProvider); + BiomeModifiers.AddFeaturesBiomeModifier oreModifer = new BiomeModifiers.AddFeaturesBiomeModifier(overworldTags, HolderSet.direct(placed.getOrThrow(ProviderPlacedFeatures.ORE_ZEITON)), GenerationStep.Decoration.UNDERGROUND_ORES); + BiomeModifiers.AddFeaturesBiomeModifier oreModiferSmall = new BiomeModifiers.AddFeaturesBiomeModifier(overworldTags, HolderSet.direct(placed.getOrThrow(ProviderPlacedFeatures.ORE_ZEITON_SMALL)), GenerationStep.Decoration.UNDERGROUND_ORES); + + context.register(ZEITON, oreModifer); + context.register(ZEITON_SMALL, oreModiferSmall); + + var tardisRoot = context.lookup(Registries.BIOME).getOrThrow(TagKeys.TARDIS_ROOT_CLUSTER); + + context.register(ADD_TARDIS_ROOT_CLUSTER, new BiomeModifiers.AddFeaturesBiomeModifier( + tardisRoot, + HolderSet.direct(context.lookup(Registries.PLACED_FEATURE).getOrThrow(TARDIS_ROOT_CLUSTER_PLACED_FEATUE)), + GenerationStep.Decoration.LOCAL_MODIFICATIONS + )); } } \ No newline at end of file diff --git a/forge/src/main/java/whocraft/tardis_refined/common/data/ItemModelProvider.java b/forge/src/main/java/whocraft/tardis_refined/common/data/ItemModelProvider.java index a1328ffdd..23867b4d2 100644 --- a/forge/src/main/java/whocraft/tardis_refined/common/data/ItemModelProvider.java +++ b/forge/src/main/java/whocraft/tardis_refined/common/data/ItemModelProvider.java @@ -7,6 +7,7 @@ import net.neoforged.neoforge.common.data.ExistingFileHelper; import whocraft.tardis_refined.TardisRefined; import whocraft.tardis_refined.registry.BlockRegistry; +import whocraft.tardis_refined.registry.ItemRegistry; public class ItemModelProvider extends net.neoforged.neoforge.client.model.generators.ItemModelProvider { @@ -24,6 +25,12 @@ protected void registerModels() { blockItem(BlockRegistry.FOOLS_STONE.getId()); blockItem(BlockRegistry.FLIGHT_DETECTOR.getId()); + blockItem(BlockRegistry.ASTRAL_MANIPULATOR_BLOCK.getId()); + blockItem(BlockRegistry.ZEITON_FUSED_COPPER_BLOCK.getId()); + blockItem(BlockRegistry.ZEITON_FUSED_IRON_BLOCK.getId()); + blockItem(BlockRegistry.ZEITON_ORE.getId()); + blockItem(BlockRegistry.ZEITON_ORE_DEEPSLATE.getId()); + blockItem(BlockRegistry.ZEITON_BLOCK.getId()); ResourceLocation leavesTexture = new ResourceLocation("tardis_refined:block/ars_leaves"); @@ -41,6 +48,12 @@ protected void registerModels() { basicItem(BlockRegistry.ROOT_SHELL_DOOR.getId()); basicItem(BlockRegistry.GLOBAL_DOOR_BLOCK.getId()); basicItem(BlockRegistry.GLOBAL_SHELL_BLOCK.getId()); + basicItem(ItemRegistry.ZEITON_INGOT.getId()); + basicItem(ItemRegistry.RAW_ZEITON.getId()); + + + + } diff --git a/forge/src/main/java/whocraft/tardis_refined/common/data/LangProviderEnglish.java b/forge/src/main/java/whocraft/tardis_refined/common/data/LangProviderEnglish.java index 3f97de439..a97e50f34 100644 --- a/forge/src/main/java/whocraft/tardis_refined/common/data/LangProviderEnglish.java +++ b/forge/src/main/java/whocraft/tardis_refined/common/data/LangProviderEnglish.java @@ -56,6 +56,12 @@ protected void addTranslations() { add(BlockRegistry.FOOLS_STONE.get(), "Fool's Stone"); add(BlockRegistry.FLIGHT_DETECTOR.get(), "Flight Detector"); add(BlockRegistry.GLOBAL_SHELL_BLOCK.get(), "TARDIS"); + add(BlockRegistry.ASTRAL_MANIPULATOR_BLOCK.get(), "Astral Manipulator"); + add(BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get(), "Zeiton Fused Iron Block"); + add(BlockRegistry.ZEITON_FUSED_COPPER_BLOCK.get(), "Zeiton Fused Copper Block"); + add(BlockRegistry.ZEITON_ORE.get(), "Zeiton Ore"); + add(BlockRegistry.ZEITON_ORE_DEEPSLATE.get(), "Deepslate Zeiton Ore"); + add(BlockRegistry.ZEITON_BLOCK.get(), "Block of Zeiton"); /*Items*/ add(ItemRegistry.PATTERN_MANIPULATOR.get(), "Pattern Manipulator"); @@ -63,6 +69,12 @@ protected void addTranslations() { add(ItemRegistry.DRILL.get(), "Growth Drill"); add(ModMessages.ITEM_KEYCHAIN, "Tardis Keyset"); add(ModMessages.ITEM_GROUP, "Tardis Refined"); + add(ItemRegistry.SCREWDRIVER.get(), "Amethyst Screwdriver"); + add(ModMessages.TOOLTIP_SCREWDRIVER_DESCRIPTION, "An amethyst frequency manipulator"); + add(ItemRegistry.ZEITON_INGOT.get(), "Zeiton Ingot"); + add(ItemRegistry.RAW_ZEITON.get(), "Raw Zeiton"); + + /*Entity*/ add(EntityRegistry.CONTROL_ENTITY.get(), "Generic Control"); diff --git a/forge/src/main/java/whocraft/tardis_refined/common/data/ProviderBlockTags.java b/forge/src/main/java/whocraft/tardis_refined/common/data/ProviderBlockTags.java index fcfa26231..b58acacc4 100644 --- a/forge/src/main/java/whocraft/tardis_refined/common/data/ProviderBlockTags.java +++ b/forge/src/main/java/whocraft/tardis_refined/common/data/ProviderBlockTags.java @@ -52,13 +52,26 @@ protected void addTags(HolderLookup.Provider provider) { .add(BlockRegistry.LANDING_PAD.get()) .add(BlockRegistry.FLIGHT_DETECTOR.get()) .add(BlockRegistry.TERRAFORMER_BLOCK.get()) + .add(BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()) + .add(BlockRegistry.ZEITON_FUSED_COPPER_BLOCK.get()) + .add(BlockRegistry.ZEITON_ORE_DEEPSLATE.get()) + .add(BlockRegistry.ZEITON_ORE.get()) + .add(BlockRegistry.ASTRAL_MANIPULATOR_BLOCK.get()) + .add(BlockRegistry.ZEITON_BLOCK.get()) .add(BlockRegistry.ROOT_PLANT_BLOCK.get()); tag(BlockTags.NEEDS_IRON_TOOL) .add(BlockRegistry.CONSOLE_CONFIGURATION_BLOCK.get()) .add(BlockRegistry.LANDING_PAD.get()) .add(BlockRegistry.FLIGHT_DETECTOR.get()) - .add(BlockRegistry.TERRAFORMER_BLOCK.get()); + .add(BlockRegistry.TERRAFORMER_BLOCK.get()) + .add(BlockRegistry.ZEITON_FUSED_IRON_BLOCK.get()) + .add(BlockRegistry.ZEITON_FUSED_COPPER_BLOCK.get()) + .add(BlockRegistry.ZEITON_ORE_DEEPSLATE.get()) + .add(BlockRegistry.ZEITON_ORE.get()) + .add(BlockRegistry.ASTRAL_MANIPULATOR_BLOCK.get()) + .add(BlockRegistry.ZEITON_BLOCK.get()) + .add(BlockRegistry.ASTRAL_MANIPULATOR_BLOCK.get()); } } diff --git a/forge/src/main/java/whocraft/tardis_refined/common/data/ProviderConfiguredFeatures.java b/forge/src/main/java/whocraft/tardis_refined/common/data/ProviderConfiguredFeatures.java new file mode 100644 index 000000000..ec5bf8d6b --- /dev/null +++ b/forge/src/main/java/whocraft/tardis_refined/common/data/ProviderConfiguredFeatures.java @@ -0,0 +1,57 @@ +package whocraft.tardis_refined.common.data; + +import com.google.common.collect.ImmutableList; +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration; +import net.minecraft.world.level.levelgen.structure.templatesystem.RuleTest; +import net.minecraft.world.level.levelgen.structure.templatesystem.TagMatchTest; +import whocraft.tardis_refined.TardisRefined; +import whocraft.tardis_refined.common.world.Features; +import whocraft.tardis_refined.common.world.feature.NbtTemplateFeature; +import whocraft.tardis_refined.common.world.feature.config.NbtTemplateFeatureConfig; +import whocraft.tardis_refined.registry.BlockRegistry; +import whocraft.tardis_refined.registry.FeatureKeys; + +public class ProviderConfiguredFeatures { + + public static final ResourceKey> ORE_ZEITON = createKey("ore_zeiton"); + public static final ResourceKey> ORE_ZEITON_SMALL = createKey("ore_zeiton_small"); + public static final ResourceKey> TARDIS_ROOT_CLUSTER_CONF_FEATURE = ResourceKey.create(Registries.CONFIGURED_FEATURE, FeatureKeys.TARDIS_ROOT_CLUSTER_RL); + + public static ResourceKey> createKey(String name) { + return ResourceKey.create(Registries.CONFIGURED_FEATURE, new ResourceLocation(TardisRefined.MODID, name)); + } + + public static void bootstrap(BootstapContext> context) { + + RuleTest stoneReplaceable = new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES); + RuleTest deepslateReplaceable = new TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES); + + ResourceLocation templateLocation = new ResourceLocation(TardisRefined.MODID, "cave/tardis_root_cluster_deepslate"); + ConfiguredFeature tardisRootCluster = new ConfiguredFeature<>(Features.NBT_FEATURE.get(), new NbtTemplateFeatureConfig(templateLocation, 0)); + + HolderGetter> configuredFeatures = context.lookup(Registries.CONFIGURED_FEATURE); + register(context, ORE_ZEITON, Feature.ORE, new OreConfiguration(ImmutableList.of(OreConfiguration.target(stoneReplaceable, BlockRegistry.ZEITON_ORE.get().defaultBlockState()), OreConfiguration.target(deepslateReplaceable, BlockRegistry.ZEITON_ORE_DEEPSLATE.get().defaultBlockState())), 9)); + register(context, ORE_ZEITON_SMALL, Feature.ORE, new OreConfiguration(ImmutableList.of(OreConfiguration.target(stoneReplaceable,BlockRegistry.ZEITON_ORE.get().defaultBlockState()), OreConfiguration.target(deepslateReplaceable, BlockRegistry.ZEITON_ORE_DEEPSLATE.get().defaultBlockState())), 4)); + context.register(TARDIS_ROOT_CLUSTER_CONF_FEATURE, tardisRootCluster); + } + + public static void register(BootstapContext> context, ResourceKey> key, Feature feature) { + register(context, key, feature, FeatureConfiguration.NONE); + } + + public static > void register(BootstapContext> context, ResourceKey> key, F feature, FC configuration) { + context.register(key, new ConfiguredFeature<>(feature, configuration)); + } + + +} diff --git a/forge/src/main/java/whocraft/tardis_refined/common/data/ProviderLootTable.java b/forge/src/main/java/whocraft/tardis_refined/common/data/ProviderLootTable.java index 3c5366b16..850f8df11 100644 --- a/forge/src/main/java/whocraft/tardis_refined/common/data/ProviderLootTable.java +++ b/forge/src/main/java/whocraft/tardis_refined/common/data/ProviderLootTable.java @@ -11,8 +11,10 @@ import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import org.jetbrains.annotations.NotNull; +import whocraft.tardis_refined.TardisRefined; import whocraft.tardis_refined.registry.BlockRegistry; import whocraft.tardis_refined.registry.EntityRegistry; +import whocraft.tardis_refined.registry.ItemRegistry; import java.util.ArrayList; import java.util.List; @@ -36,6 +38,9 @@ protected void generate() { for (Block block : getKnownBlocks()) { dropSelf(block); } + + this.add(BlockRegistry.ZEITON_ORE.get(), (block) -> createOreDrop(block, ItemRegistry.RAW_ZEITON.get())); + this.add(BlockRegistry.ZEITON_ORE_DEEPSLATE.get(), (block) -> createOreDrop(block, ItemRegistry.RAW_ZEITON.get())); } @Override diff --git a/forge/src/main/java/whocraft/tardis_refined/common/data/ProviderPlacedFeatures.java b/forge/src/main/java/whocraft/tardis_refined/common/data/ProviderPlacedFeatures.java new file mode 100644 index 000000000..5a1959a6d --- /dev/null +++ b/forge/src/main/java/whocraft/tardis_refined/common/data/ProviderPlacedFeatures.java @@ -0,0 +1,62 @@ +package whocraft.tardis_refined.common.data; + +import net.minecraft.core.Holder; +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.levelgen.VerticalAnchor; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.placement.*; +import whocraft.tardis_refined.TardisRefined; +import whocraft.tardis_refined.registry.FeatureKeys; + +import java.util.List; + +import static whocraft.tardis_refined.common.data.ProviderConfiguredFeatures.TARDIS_ROOT_CLUSTER_CONF_FEATURE; + +public class ProviderPlacedFeatures { + + public static final ResourceKey TARDIS_ROOT_CLUSTER_PLACED_FEATUE = ResourceKey.create(Registries.PLACED_FEATURE, FeatureKeys.TARDIS_ROOT_CLUSTER_RL); + public static final ResourceKey ORE_ZEITON = createKey("ore_zeiton"); + public static final ResourceKey ORE_ZEITON_SMALL = createKey("ore_zeiton_small"); + + + public static void bootstrap(BootstapContext context) { + HolderGetter> configuredFeatures = context.lookup(Registries.CONFIGURED_FEATURE); + + context.register(TARDIS_ROOT_CLUSTER_PLACED_FEATUE, new PlacedFeature + (context.lookup(Registries.CONFIGURED_FEATURE).getOrThrow(TARDIS_ROOT_CLUSTER_CONF_FEATURE), + List.of( + RarityFilter.onAverageOnceEvery(25), + InSquarePlacement.spread(), + HeightRangePlacement.uniform(VerticalAnchor.absolute(-50), VerticalAnchor.absolute(20)))) + ); + + + register(context, ORE_ZEITON, configuredFeatures.getOrThrow(ProviderConfiguredFeatures.ORE_ZEITON), List.copyOf(commonOrePlacement(10, HeightRangePlacement.triangle(VerticalAnchor.absolute(-24), VerticalAnchor.absolute(56))))); + register(context, ORE_ZEITON_SMALL, configuredFeatures.getOrThrow(ProviderConfiguredFeatures.ORE_ZEITON_SMALL), List.copyOf(commonOrePlacement(10, HeightRangePlacement.uniform(VerticalAnchor.bottom(), VerticalAnchor.absolute(72))))); + + } + + public static ResourceKey createKey(String name) { + return ResourceKey.create(Registries.PLACED_FEATURE, new ResourceLocation(TardisRefined.MODID, name)); + } + + private static List orePlacement(PlacementModifier plMod, PlacementModifier plMod2) { + return List.of(plMod, InSquarePlacement.spread(), plMod2, BiomeFilter.biome(), RarityFilter.onAverageOnceEvery(3)); + } + + public static List commonOrePlacement(int amt, PlacementModifier plMod) { + return orePlacement(CountPlacement.of(amt), plMod); + } + + public static void register(BootstapContext context, ResourceKey key, Holder> configuration, List modifiers) { + context.register(key, new PlacedFeature(configuration, List.copyOf(modifiers))); + } + + public static void register(BootstapContext context, ResourceKey key, Holder> configuration, PlacementModifier... modifiers) { + register(context, key, configuration, List.of(modifiers)); + } +} diff --git a/forge/src/main/java/whocraft/tardis_refined/common/data/RecipeProvider.java b/forge/src/main/java/whocraft/tardis_refined/common/data/RecipeProvider.java index f819fe41a..9cdc691c5 100644 --- a/forge/src/main/java/whocraft/tardis_refined/common/data/RecipeProvider.java +++ b/forge/src/main/java/whocraft/tardis_refined/common/data/RecipeProvider.java @@ -2,12 +2,12 @@ import net.minecraft.core.HolderLookup; import net.minecraft.data.DataGenerator; -import net.minecraft.data.recipes.RecipeCategory; -import net.minecraft.data.recipes.RecipeOutput; -import net.minecraft.data.recipes.ShapedRecipeBuilder; -import net.minecraft.data.recipes.ShapelessRecipeBuilder; +import net.minecraft.data.recipes.*; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.block.Blocks; +import whocraft.tardis_refined.TardisRefined; import whocraft.tardis_refined.registry.BlockRegistry; import whocraft.tardis_refined.registry.ItemRegistry; @@ -21,17 +21,25 @@ public RecipeProvider(DataGenerator arg, CompletableFuture lookupProvider) { + super(output, lookupProvider, BUILDER, Set.of(TardisRefined.MODID)); + } + + public static HolderLookup.Provider createLookup() { + return BUILDER.buildPatch(RegistryAccess.fromRegistryOfRegistries(BuiltInRegistries.REGISTRY), VanillaRegistries.createLookup()); + } + +} diff --git a/forge/src/main/java/whocraft/tardis_refined/neoforge/ClientModBus.java b/forge/src/main/java/whocraft/tardis_refined/neoforge/ClientModBus.java index 51ffcae38..9cae4def7 100644 --- a/forge/src/main/java/whocraft/tardis_refined/neoforge/ClientModBus.java +++ b/forge/src/main/java/whocraft/tardis_refined/neoforge/ClientModBus.java @@ -19,6 +19,7 @@ import whocraft.tardis_refined.client.neoforge.ModelRegistryImpl; import whocraft.tardis_refined.client.renderer.blockentity.RootPlantRenderer; import whocraft.tardis_refined.client.renderer.blockentity.console.GlobalConsoleRenderer; +import whocraft.tardis_refined.client.renderer.blockentity.device.AstralManipulatorRenderer; import whocraft.tardis_refined.client.renderer.blockentity.device.ConsoleConfigurationRenderer; import whocraft.tardis_refined.client.renderer.blockentity.door.BulkHeadDoorRenderer; import whocraft.tardis_refined.client.renderer.blockentity.door.GlobalDoorRenderer; @@ -68,6 +69,7 @@ public static void onClientSetup(FMLClientSetupEvent event) { BlockEntityRenderers.register(BlockEntityRegistry.ARS_EGG.get(), ArsEggRenderer::new); BlockEntityRenderers.register(BlockEntityRegistry.BULK_HEAD_DOOR.get(), BulkHeadDoorRenderer::new); BlockEntityRenderers.register(BlockEntityRegistry.CONSOLE_CONFIGURATION.get(), ConsoleConfigurationRenderer::new); + BlockEntityRenderers.register(BlockEntityRegistry.ASTRAL_MANIPULATOR.get(), AstralManipulatorRenderer::new); EntityRenderers.register(EntityRegistry.CONTROL_ENTITY.get(), ControlEntityRenderer::new); } diff --git a/forge/src/main/java/whocraft/tardis_refined/neoforge/TardisRefinedForge.java b/forge/src/main/java/whocraft/tardis_refined/neoforge/TardisRefinedForge.java index 16a20f4d0..c8b493a53 100644 --- a/forge/src/main/java/whocraft/tardis_refined/neoforge/TardisRefinedForge.java +++ b/forge/src/main/java/whocraft/tardis_refined/neoforge/TardisRefinedForge.java @@ -47,6 +47,7 @@ public void onGatherData(GatherDataEvent e) { /*Data Pack*/ generator.addProvider(e.includeServer(), new ProviderBlockTags(generator.getPackOutput(), e.getLookupProvider(), e.getExistingFileHelper())); + generator.addProvider(e.includeServer(), new WorldGenProvider(generator.getPackOutput(), e.getLookupProvider())); generator.addProvider(e.includeServer(), new ProviderLootTable(generator.getPackOutput())); generator.addProvider(e.includeServer(), new RecipeProvider(generator, e.getLookupProvider())); generator.addProvider(e.includeServer(), new ConsolePatternProvider(generator)); @@ -59,7 +60,5 @@ public void onGatherData(GatherDataEvent e) { generator.addProvider(e.includeServer(), new ProviderEntityTags(generator.getPackOutput(), e.getLookupProvider(), e.getExistingFileHelper())); - //World Gen - BiomeModifierProvider.genBiomeModifiers(e); } } \ No newline at end of file