From 6ded503a8ec564ead673fe450d3cc071b41a8fa5 Mon Sep 17 00:00:00 2001 From: Waterpicker Date: Sat, 27 Jan 2024 05:53:12 -0600 Subject: [PATCH] Fixed Entity Spawning, Added Overworld to SkyAddon. Added a new labatory dungeon chain and the needed backend. --- .../door/DimensionalDoorBlockRegistrar.java | 7 + .../block/entity/RiftBlockEntity.java | 3 +- .../client/effect/DungeonDimensionEffect.java | 127 +++++++++++++++++- .../dimdoors/pockets/PocketGenerator.java | 6 + .../dimdev/dimdoors/pockets/PocketLoader.java | 5 + .../dimdoors/pockets/modifier/Modifier.java | 2 + .../pockets/modifier/RiftDataModifier.java | 2 +- .../pockets/modifier/TemplateModifier.java | 75 +++++++++++ .../rift/targets/PublicPocketTarget.java | 26 +--- .../dimdoors/rift/targets/TemplateTarget.java | 62 +++++++++ .../dimdoors/rift/targets/VirtualTarget.java | 1 + .../targets/WrappedDestinationTarget.java | 43 ++++++ .../world/pocket/type/addon/SkyAddon.java | 82 ++++++++++- .../data/dimdoors/door/data/gold_door.json | 3 +- .../src/main/resources/dimdoors.accesswidener | 9 +- .../pockets/generators/lab/lab_01.json | 19 +++ .../pockets/generators/lab/lab_a0.json | 24 ++++ .../generators/lab/lab_experimentation.json | 26 ++++ .../pockets/generators/lab/lab_hallway.json | 19 +++ .../generators/lab/left_lab_hallway.json | 19 +++ .../pockets/generators/lab/reception.json | 24 ++++ .../generators/lab/right_lab_hallway.json | 19 +++ .../generators/lab/telecommunications.json | 19 +++ .../pockets/json/rift_data/limbo.json | 0 .../pockets/schematic/lab/lab_01.schem | Bin 0 -> 10455 bytes .../pockets/schematic/lab/lab_a0.schem | Bin 0 -> 8170 bytes .../schematic/lab/lab_experimentation.schem | Bin 0 -> 5938 bytes .../pockets/schematic/lab/lab_hallway.schem | Bin 0 -> 1330 bytes .../schematic/lab/left_lab_hallway.schem | Bin 0 -> 535 bytes .../pockets/schematic/lab/reception.schem | Bin 0 -> 2448 bytes .../schematic/lab/right_lab_hallway.schem | Bin 0 -> 562 bytes .../schematic/lab/telecommunication.schem | Bin 0 -> 3692 bytes .../schematic/lab/telecommunications.schem | Bin 0 -> 3689 bytes .../dimdoors/pockets/virtual/lab/lab_01.json | 4 + .../dimdoors/pockets/virtual/lab/lab_a0.json | 4 + .../pockets/virtual/lab/lab_entrance.json | 4 + .../virtual/lab/lab_experimentation.json | 4 + .../pockets/virtual/lab/lab_hallway.json | 4 + .../pockets/virtual/lab/left_lab_hallway.json | 4 + .../pockets/virtual/lab/reception.json | 4 + .../virtual/lab/right_lab_hallway.json | 4 + .../virtual/lab/telecommunications.json | 4 + .../util/schematic/RelativeBlockSample.java | 11 +- .../util/schematic/SchematicPlacer.java | 19 ++- .../dimdoors/datagen/LootTableProvider.java | 67 +++++++++ gradle.properties | 2 +- 46 files changed, 714 insertions(+), 43 deletions(-) create mode 100644 common/src/main/java/org/dimdev/dimdoors/pockets/modifier/TemplateModifier.java create mode 100644 common/src/main/java/org/dimdev/dimdoors/rift/targets/TemplateTarget.java create mode 100644 common/src/main/java/org/dimdev/dimdoors/rift/targets/WrappedDestinationTarget.java create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/lab_01.json create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/lab_a0.json create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/lab_experimentation.json create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/lab_hallway.json create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/left_lab_hallway.json create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/reception.json create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/right_lab_hallway.json create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/telecommunications.json create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/json/rift_data/limbo.json create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/schematic/lab/lab_01.schem create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/schematic/lab/lab_a0.schem create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/schematic/lab/lab_experimentation.schem create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/schematic/lab/lab_hallway.schem create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/schematic/lab/left_lab_hallway.schem create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/schematic/lab/reception.schem create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/schematic/lab/right_lab_hallway.schem create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/schematic/lab/telecommunication.schem create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/schematic/lab/telecommunications.schem create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_01.json create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_a0.json create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_entrance.json create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_experimentation.json create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_hallway.json create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/left_lab_hallway.json create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/reception.json create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/right_lab_hallway.json create mode 100644 common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/telecommunications.json diff --git a/common/src/main/java/org/dimdev/dimdoors/block/door/DimensionalDoorBlockRegistrar.java b/common/src/main/java/org/dimdev/dimdoors/block/door/DimensionalDoorBlockRegistrar.java index 067ef48f..fa544f5a 100644 --- a/common/src/main/java/org/dimdev/dimdoors/block/door/DimensionalDoorBlockRegistrar.java +++ b/common/src/main/java/org/dimdev/dimdoors/block/door/DimensionalDoorBlockRegistrar.java @@ -14,6 +14,7 @@ import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.DoorBlock; import net.minecraft.world.level.block.TrapDoorBlock; @@ -21,6 +22,7 @@ import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.Property; +import net.minecraft.world.level.storage.loot.LootParams; import org.dimdev.dimdoors.DimensionalDoors; import org.dimdev.dimdoors.block.DoorSoundProvider; import org.dimdev.dimdoors.block.entity.ModBlockEntityTypes; @@ -150,6 +152,11 @@ public class DimensionalDoorBlockRegistrar { throw new RuntimeException("AutoGenDimensionalDoorBlock should be instantiated as anonymous inner class overriding appendProperties!"); } + @Override + public List getDrops(BlockState state, LootParams.Builder params) { + return originalBlock.getDrops(state, params); + } + @Override public MutableComponent getName() { return Component.translatable("dimdoors.autogen_block_prefix", originalBlock.getName()); diff --git a/common/src/main/java/org/dimdev/dimdoors/block/entity/RiftBlockEntity.java b/common/src/main/java/org/dimdev/dimdoors/block/entity/RiftBlockEntity.java index dce24fdc..dc6e9125 100644 --- a/common/src/main/java/org/dimdev/dimdoors/block/entity/RiftBlockEntity.java +++ b/common/src/main/java/org/dimdev/dimdoors/block/entity/RiftBlockEntity.java @@ -193,8 +193,7 @@ public abstract class RiftBlockEntity extends BlockEntity implements Target, Ent BlockState state = this.getLevel().getBlockState(this.getBlockPos()); Block block = state.getBlock(); - if (block instanceof CoordinateTransformerBlock) { - CoordinateTransformerBlock transformer = (CoordinateTransformerBlock) block; + if (block instanceof CoordinateTransformerBlock transformer) { TransformationMatrix3d.TransformationMatrix3dBuilder transformationBuilder = transformer.transformationBuilder(state, this.getBlockPos()); TransformationMatrix3d.TransformationMatrix3dBuilder rotatorBuilder = transformer.rotatorBuilder(state, this.getBlockPos()); relativePos = transformer.transformTo(transformationBuilder, entity.position()); diff --git a/common/src/main/java/org/dimdev/dimdoors/client/effect/DungeonDimensionEffect.java b/common/src/main/java/org/dimdev/dimdoors/client/effect/DungeonDimensionEffect.java index f757cf6a..23116534 100644 --- a/common/src/main/java/org/dimdev/dimdoors/client/effect/DungeonDimensionEffect.java +++ b/common/src/main/java/org/dimdev/dimdoors/client/effect/DungeonDimensionEffect.java @@ -1,19 +1,21 @@ package org.dimdev.dimdoors.client.effect; +import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; +import com.mojang.math.Axis; import dev.architectury.injectables.annotations.ExpectPlatform; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.DimensionSpecialEffects; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.*; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; import net.minecraft.world.entity.vehicle.Minecart; import net.minecraft.world.level.Level; import net.minecraft.world.level.dimension.BuiltinDimensionTypes; +import net.minecraft.world.level.material.FogType; import net.minecraft.world.phys.Vec3; import org.dimdev.dimdoors.DimensionalDoors; import org.dimdev.dimdoors.listener.pocket.PocketListenerUtil; @@ -58,13 +60,15 @@ public class DungeonDimensionEffect extends DimensionSpecialEffects implements D if (key.equals(BuiltinDimensionTypes.END_EFFECTS)) { renderEndSky(poseStack); - } else if (DimensionSpecialEffectsMixin.getEffects().containsKey(key)) { + } else if(key.equals(BuiltinDimensionTypes.OVERWORLD_EFFECTS)) { + renderOverworld(skyAddon, poseStack, projectionMatrix, partialTick, isFoggy, setupFog); + } /*else if (DimensionSpecialEffectsMixin.getEffects().containsKey(key)) { var effects = DimensionSpecialEffectsMixin.getEffects().get(key); if (effects != null) { renderEffect(effects, level, ticks, partialTick, poseStack, camera, projectionMatrix, isFoggy, setupFog); } - } + }*/ } return true; @@ -119,6 +123,117 @@ public class DungeonDimensionEffect extends DimensionSpecialEffects implements D RenderSystem.disableBlend(); } + public void renderOverworld(SkyAddon info, PoseStack poseStack, Matrix4f projectionMatrix, float partialTick, boolean isFoggy, Runnable skyFogSetup) { + float q; + float p; + float o; + int m; + float k; + float i; + + var levelRenderer = Minecraft.getInstance().levelRenderer; + + skyFogSetup.run(); + if (isFoggy) { + return; + } + + FogRenderer.levelFogColor(); + BufferBuilder bufferBuilder = Tesselator.getInstance().getBuilder(); + RenderSystem.depthMask(false); + float g = Mth.cos(info.getTimeOfDay() * ((float)Math.PI * 2)) * 2.0f + 0.5f; + g = Mth.clamp(g, 0.0f, 1.0f); + RenderSystem.setShaderColor(0.529f * g, 0.808f * g, 0.922f * g, 1.0f); //sky color + ShaderInstance shaderInstance = RenderSystem.getShader(); + levelRenderer.skyBuffer.bind(); + levelRenderer.skyBuffer.drawWithShader(poseStack.last().pose(), projectionMatrix, shaderInstance); + VertexBuffer.unbind(); + RenderSystem.enableBlend(); + var level = Minecraft.getInstance().level; + float[] fs = getSunriseColor(info.getTimeOfDay(), partialTick); + + if (fs != null) { + RenderSystem.setShader(GameRenderer::getPositionColorShader); + RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); + poseStack.pushPose(); + poseStack.mulPose(Axis.XP.rotationDegrees(90.0f)); + i = Mth.sin(info.getSunAngle()) < 0.0f ? 180.0f : 0.0f; + poseStack.mulPose(Axis.ZP.rotationDegrees(i)); + poseStack.mulPose(Axis.ZP.rotationDegrees(90.0f)); + float j = fs[0]; + k = fs[1]; + float l = fs[2]; + Matrix4f matrix4f = poseStack.last().pose(); + bufferBuilder.begin(VertexFormat.Mode.TRIANGLE_FAN, DefaultVertexFormat.POSITION_COLOR); + bufferBuilder.vertex(matrix4f, 0.0f, 100.0f, 0.0f).color(j, k, l, fs[3]).endVertex(); + m = 16; + for (int n = 0; n <= 16; ++n) { + o = (float)n * ((float)Math.PI * 2) / 16.0f; + p = Mth.sin(o); + q = Mth.cos(o); + bufferBuilder.vertex(matrix4f, p * 120.0f, q * 120.0f, -q * 40.0f * fs[3]).color(fs[0], fs[1], fs[2], 0.0f).endVertex(); + } + BufferUploader.drawWithShader(bufferBuilder.end()); + poseStack.popPose(); + } + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + poseStack.pushPose(); +// i = 1.0f - 0; //level.getRainLevel(partialTick); TODO: Find out if we want this + RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1); + poseStack.mulPose(Axis.YP.rotationDegrees(-90.0f)); + poseStack.mulPose(Axis.XP.rotationDegrees(info.getTimeOfDay() * 360.0f)); + Matrix4f matrix4f2 = poseStack.last().pose(); + k = 30.0f; + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShaderTexture(0, LevelRenderer.SUN_LOCATION); + bufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + bufferBuilder.vertex(matrix4f2, -k, 100.0f, -k).uv(0.0f, 0.0f).endVertex(); + bufferBuilder.vertex(matrix4f2, k, 100.0f, -k).uv(1.0f, 0.0f).endVertex(); + bufferBuilder.vertex(matrix4f2, k, 100.0f, k).uv(1.0f, 1.0f).endVertex(); + bufferBuilder.vertex(matrix4f2, -k, 100.0f, k).uv(0.0f, 1.0f).endVertex(); + BufferUploader.drawWithShader(bufferBuilder.end()); + k = 20.0f; + RenderSystem.setShaderTexture(0, LevelRenderer.MOON_LOCATION); + int r = info.getMoonPhase(); + int s = r % 4; + m = r / 4 % 2; + float t = (float)(s) / 4.0f; + o = (float)(m) / 2.0f; + p = (float)(s + 1) / 4.0f; + q = (float)(m + 1) / 2.0f; + bufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + bufferBuilder.vertex(matrix4f2, -k, -100.0f, k).uv(p, q).endVertex(); + bufferBuilder.vertex(matrix4f2, k, -100.0f, k).uv(t, q).endVertex(); + bufferBuilder.vertex(matrix4f2, k, -100.0f, -k).uv(t, o).endVertex(); + bufferBuilder.vertex(matrix4f2, -k, -100.0f, -k).uv(p, o).endVertex(); + BufferUploader.drawWithShader(bufferBuilder.end()); + float u = info.getStarBrightness(); + if (u > 0.0f) { + RenderSystem.setShaderColor(u, u, u, u); + FogRenderer.setupNoFog(); + levelRenderer.starBuffer.bind(); + levelRenderer.starBuffer.drawWithShader(poseStack.last().pose(), projectionMatrix, GameRenderer.getPositionShader()); + VertexBuffer.unbind(); + skyFogSetup.run(); + } + RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); + RenderSystem.disableBlend(); + RenderSystem.defaultBlendFunc(); + poseStack.popPose(); + RenderSystem.setShaderColor(0.0f, 0.0f, 0.0f, 1.0f); + double d = Minecraft.getInstance().player.getEyePosition((float)partialTick).y - level.getLevelData().getHorizonHeight(Minecraft.getInstance().level); + if (d < 0.0) { + poseStack.pushPose(); + poseStack.translate(0.0f, 12.0f, 0.0f); + levelRenderer.darkBuffer.bind(); + levelRenderer.darkBuffer.drawWithShader(poseStack.last().pose(), projectionMatrix, shaderInstance); + VertexBuffer.unbind(); + poseStack.popPose(); + } + RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); + RenderSystem.depthMask(true); + } + @Override public boolean renderClouds(ClientLevel level, int ticks, float partialTick, PoseStack poseStack, double camX, double camY, double camZ, Matrix4f projectionMatrix) { return true; @@ -128,4 +243,6 @@ public class DungeonDimensionEffect extends DimensionSpecialEffects implements D public boolean renderSnowAndRain(ClientLevel level, int ticks, float partialTick, LightTexture lightTexture, double camX, double camY, double camZ) { return true; } + + } diff --git a/common/src/main/java/org/dimdev/dimdoors/pockets/PocketGenerator.java b/common/src/main/java/org/dimdev/dimdoors/pockets/PocketGenerator.java index 90e496dc..81321c8c 100644 --- a/common/src/main/java/org/dimdev/dimdoors/pockets/PocketGenerator.java +++ b/common/src/main/java/org/dimdev/dimdoors/pockets/PocketGenerator.java @@ -49,6 +49,12 @@ public final class PocketGenerator { return generatePocketV2(PocketLoader.getInstance().getGroup(group).getNextPocketGeneratorReference(context), context); } + public static Pocket generateFromVirtualPocket(ServerLevel world, ResourceLocation id, VirtualLocation virtualLocation, VirtualTarget linkTo, LinkProperties linkProperties) { + PocketGenerationContext context = new PocketGenerationContext(world, virtualLocation, linkTo, linkProperties); + LOGGER.info("Generating virtual target: " + id); + return generatePocketV2(PocketLoader.getInstance().getVirtual(id).getNextPocketGeneratorReference(context), context); + } + public static Pocket generatePocketV2(PocketGeneratorReference pocketGeneratorReference, PocketGenerationContext context) { return pocketGeneratorReference.prepareAndPlacePocket(context); } diff --git a/common/src/main/java/org/dimdev/dimdoors/pockets/PocketLoader.java b/common/src/main/java/org/dimdev/dimdoors/pockets/PocketLoader.java index f8a56717..82865f89 100644 --- a/common/src/main/java/org/dimdev/dimdoors/pockets/PocketLoader.java +++ b/common/src/main/java/org/dimdev/dimdoors/pockets/PocketLoader.java @@ -112,6 +112,11 @@ public class PocketLoader implements ResourceManagerReloadListener { return pocketGroups.get(Path.stringPath(group)); } + public VirtualPocket getVirtual(ResourceLocation id) { + return virtualPockets.get(Path.stringPath(id)); + } + + public static PocketLoader getInstance() { return INSTANCE; } diff --git a/common/src/main/java/org/dimdev/dimdoors/pockets/modifier/Modifier.java b/common/src/main/java/org/dimdev/dimdoors/pockets/modifier/Modifier.java index a9e3fb44..5aecee8b 100644 --- a/common/src/main/java/org/dimdev/dimdoors/pockets/modifier/Modifier.java +++ b/common/src/main/java/org/dimdev/dimdoors/pockets/modifier/Modifier.java @@ -98,6 +98,8 @@ public interface Modifier extends ReferenceSerializable { RegistrySupplier> OFFSET_MODIFIER_TYPE = register(DimensionalDoors.id(OffsetModifier.KEY), OffsetModifier::new); RegistrySupplier> ABSOLUTE_RIFT_BLOCK_ENTITY_MODIFIER_TYPE = register(DimensionalDoors.id(AbsoluteRiftBlockEntityModifier.KEY), AbsoluteRiftBlockEntityModifier::new); + RegistrySupplier> TEMPLATE_MODIFIER_TYPE = register(DimensionalDoors.id(TemplateModifier.KEY), TemplateModifier::new); + Modifier fromNbt(CompoundTag nbt, ResourceManager manager); default Modifier fromNbt(CompoundTag nbt) { diff --git a/common/src/main/java/org/dimdev/dimdoors/pockets/modifier/RiftDataModifier.java b/common/src/main/java/org/dimdev/dimdoors/pockets/modifier/RiftDataModifier.java index 2770fddf..fce50b5c 100644 --- a/common/src/main/java/org/dimdev/dimdoors/pockets/modifier/RiftDataModifier.java +++ b/common/src/main/java/org/dimdev/dimdoors/pockets/modifier/RiftDataModifier.java @@ -45,7 +45,7 @@ public class RiftDataModifier extends AbstractModifier { return IntStream.generate(buffer::get).limit(buffer.remaining()); } - private static byte[] toByteArray(int[] ints) { + public static byte[] toByteArray(int[] ints) { byte[] bytes = new byte[ints.length]; for (int i = 0; i < ints.length; i++) { bytes[i] = (byte) ints[i]; diff --git a/common/src/main/java/org/dimdev/dimdoors/pockets/modifier/TemplateModifier.java b/common/src/main/java/org/dimdev/dimdoors/pockets/modifier/TemplateModifier.java new file mode 100644 index 00000000..70d2a14d --- /dev/null +++ b/common/src/main/java/org/dimdev/dimdoors/pockets/modifier/TemplateModifier.java @@ -0,0 +1,75 @@ +package org.dimdev.dimdoors.pockets.modifier; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import org.dimdev.dimdoors.block.entity.RiftBlockEntity; +import org.dimdev.dimdoors.pockets.PocketGenerationContext; +import org.dimdev.dimdoors.rift.targets.TemplateTarget; +import org.dimdev.dimdoors.world.pocket.type.Pocket; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.IntConsumer; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import static org.dimdev.dimdoors.pockets.modifier.RiftDataModifier.stream; +import static org.dimdev.dimdoors.pockets.modifier.RiftDataModifier.toByteArray; + +public class TemplateModifier extends AbstractModifier { + public static final String KEY = "template"; + + private ResourceLocation templateId; + + private List ids; + + @Override + public Modifier fromNbt(CompoundTag nbt, ResourceManager manager) { + templateId = ResourceLocation.tryParse(nbt.getString("templateId")); + ids = stream(nbt.getByteArray("ids")).boxed().collect(Collectors.toList()); + return this; + } + + @Override + public CompoundTag toNbtInternal(CompoundTag nbt, boolean allowReference) { + super.toNbtInternal(nbt, allowReference); + + nbt.putString("templateId", templateId.toString()); + nbt.putByteArray("ids", toByteArray(ids.stream().mapToInt(Integer::intValue).toArray())); + return nbt; + } + + + @Override + public ModifierType getType() { + return ModifierType.TEMPLATE_MODIFIER_TYPE.get(); + } + + @Override + public String getKey() { + return KEY; + } + + @Override + public void apply(PocketGenerationContext parameters, RiftManager manager) { + var template = new TemplateTarget(templateId); + + manager.foreachConsume((id, rift) -> { + if(ids.contains(id)) { + rift.setDestination(template.copy()); + return true; + } else { + return false; + } + }); + } + + @Override + public void apply(PocketGenerationContext parameters, Pocket.PocketBuilder builder) { + + } +} diff --git a/common/src/main/java/org/dimdev/dimdoors/rift/targets/PublicPocketTarget.java b/common/src/main/java/org/dimdev/dimdoors/rift/targets/PublicPocketTarget.java index 66f3216a..5458fd9b 100644 --- a/common/src/main/java/org/dimdev/dimdoors/rift/targets/PublicPocketTarget.java +++ b/common/src/main/java/org/dimdev/dimdoors/rift/targets/PublicPocketTarget.java @@ -7,24 +7,14 @@ import org.dimdev.dimdoors.world.level.registry.DimensionalRegistry; import org.dimdev.dimdoors.world.pocket.VirtualLocation; import org.dimdev.dimdoors.world.pocket.type.Pocket; -public class PublicPocketTarget extends RestoringTarget { - private VirtualTarget wrappedDestination = null; +public class PublicPocketTarget extends WrappedDestinationTarget { private PublicPocketTarget(VirtualTarget wrappedDestination) { - this.wrappedDestination = wrappedDestination; + super(wrappedDestination); } public PublicPocketTarget() { - } - - @Override - protected VirtualTarget getTarget() { - return this.wrappedDestination; - } - - @Override - protected void setTarget(VirtualTarget target) { - this.wrappedDestination = target; + super(); } @Override @@ -49,16 +39,10 @@ public class PublicPocketTarget extends RestoringTarget { } public static CompoundTag toNbt(PublicPocketTarget target) { - CompoundTag nbt = new CompoundTag(); - if (target.wrappedDestination != null) - nbt.put("wrappedDestination", VirtualTarget.toNbt(target.wrappedDestination)); - return nbt; + return WrappedDestinationTarget.toNbt(target); } public static PublicPocketTarget fromNbt(CompoundTag nbt) { - PublicPocketTarget target = new PublicPocketTarget(); - if (nbt.contains("wrappedDestination")) - target.wrappedDestination = VirtualTarget.fromNbt(nbt.getCompound("wrappedDestination")); - return target; + return fromNbt(nbt, new PublicPocketTarget()); } } diff --git a/common/src/main/java/org/dimdev/dimdoors/rift/targets/TemplateTarget.java b/common/src/main/java/org/dimdev/dimdoors/rift/targets/TemplateTarget.java new file mode 100644 index 00000000..c97fa672 --- /dev/null +++ b/common/src/main/java/org/dimdev/dimdoors/rift/targets/TemplateTarget.java @@ -0,0 +1,62 @@ +package org.dimdev.dimdoors.rift.targets; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import org.dimdev.dimdoors.DimensionalDoors; +import org.dimdev.dimdoors.api.util.Location; +import org.dimdev.dimdoors.pockets.PocketGenerator; +import org.dimdev.dimdoors.rift.registry.LinkProperties; +import org.dimdev.dimdoors.world.ModDimensions; +import org.dimdev.dimdoors.world.level.registry.DimensionalRegistry; +import org.dimdev.dimdoors.world.pocket.VirtualLocation; +import org.dimdev.dimdoors.world.pocket.type.Pocket; + +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; + +public class TemplateTarget extends WrappedDestinationTarget { + private final ResourceLocation template; + + public TemplateTarget(VirtualTarget wrappedDestination, ResourceLocation template) { + super(wrappedDestination); + this.template = template; + } + + public TemplateTarget(ResourceLocation template) { + this(null, template); + } + + @Override + public Location makeLinkTarget() { + VirtualLocation riftVirtualLocation = VirtualLocation.fromLocation(this.location); + VirtualLocation newVirtualLocation; + int depth = riftVirtualLocation.getDepth() + 1; + newVirtualLocation = new VirtualLocation(riftVirtualLocation.getWorld(), riftVirtualLocation.getX(), riftVirtualLocation.getZ(), depth); + Pocket pocket = PocketGenerator.generateFromVirtualPocket(DimensionalDoors.getWorld(ModDimensions.DUNGEON), template, newVirtualLocation, new GlobalReference(this.location), null); + + return DimensionalRegistry.getRiftRegistry().getPocketEntrance(pocket); + } + + public static CompoundTag toNbt(TemplateTarget target) { + CompoundTag nbt = WrappedDestinationTarget.toNbt(target); + + nbt.putString("template", target.template.toString()); + + return nbt; + } + + @Override + public VirtualTarget copy() { + return new TemplateTarget(wrappedDestination, template); + } + public static TemplateTarget fromNbt(CompoundTag nbt) { + var id = ResourceLocation.tryParse(nbt.getString("template")); + return fromNbt(nbt, new TemplateTarget(id)); + } + + @Override + public VirtualTargetType getType() { + return VirtualTargetType.TEMPLATE.get(); + } +} diff --git a/common/src/main/java/org/dimdev/dimdoors/rift/targets/VirtualTarget.java b/common/src/main/java/org/dimdev/dimdoors/rift/targets/VirtualTarget.java index 7c4e2f83..07d51e20 100644 --- a/common/src/main/java/org/dimdev/dimdoors/rift/targets/VirtualTarget.java +++ b/common/src/main/java/org/dimdev/dimdoors/rift/targets/VirtualTarget.java @@ -86,6 +86,7 @@ public abstract class VirtualTarget implements Target { public interface VirtualTargetType { RegistrySupplier> AVAILABLE_LINK = register("dimdoors:available_link", RandomTarget::fromNbt, RandomTarget::toNbt, VirtualTarget.COLOR); RegistrySupplier> DUNGEON = register("dimdoors:dungeon", DungeonTarget::fromNbt, DungeonTarget::toNbt, VirtualTarget.COLOR); + RegistrySupplier> TEMPLATE = register("dimdoors:template", TemplateTarget::fromNbt, TemplateTarget::toNbt, VirtualTarget.COLOR); RegistrySupplier> ESCAPE = register("dimdoors:escape", EscapeTarget::fromNbt, EscapeTarget::toNbt, VirtualTarget.COLOR); RegistrySupplier> GLOBAL = register("dimdoors:global", GlobalReference::fromNbt, GlobalReference::toNbt, VirtualTarget.COLOR); RegistrySupplier> LIMBO = register("dimdoors:limbo", a -> LimboTarget.INSTANCE, a -> new CompoundTag(), VirtualTarget.COLOR); diff --git a/common/src/main/java/org/dimdev/dimdoors/rift/targets/WrappedDestinationTarget.java b/common/src/main/java/org/dimdev/dimdoors/rift/targets/WrappedDestinationTarget.java new file mode 100644 index 00000000..1f0ab4ac --- /dev/null +++ b/common/src/main/java/org/dimdev/dimdoors/rift/targets/WrappedDestinationTarget.java @@ -0,0 +1,43 @@ +package org.dimdev.dimdoors.rift.targets; + +import net.minecraft.nbt.CompoundTag; +import org.dimdev.dimdoors.api.util.Location; +import org.dimdev.dimdoors.pockets.PocketGenerator; +import org.dimdev.dimdoors.world.level.registry.DimensionalRegistry; +import org.dimdev.dimdoors.world.pocket.VirtualLocation; +import org.dimdev.dimdoors.world.pocket.type.Pocket; + +public abstract class WrappedDestinationTarget extends RestoringTarget { + protected VirtualTarget wrappedDestination = null; + + public WrappedDestinationTarget(VirtualTarget wrappedDestination) { + this.wrappedDestination = wrappedDestination; + } + + public WrappedDestinationTarget() { + } + + @Override + protected VirtualTarget getTarget() { + return this.wrappedDestination; + } + + @Override + protected void setTarget(VirtualTarget target) { + this.wrappedDestination = target; + } + + public static CompoundTag toNbt(WrappedDestinationTarget target) { + CompoundTag nbt = new CompoundTag(); + if (target.wrappedDestination != null) + nbt.put("wrappedDestination", VirtualTarget.toNbt(target.wrappedDestination)); + return nbt; + } + + + public static T fromNbt(CompoundTag nbt, T target) { + if (nbt.contains("wrappedDestination")) + target.wrappedDestination = VirtualTarget.fromNbt(nbt.getCompound("wrappedDestination")); + return target; + } +} diff --git a/common/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/SkyAddon.java b/common/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/SkyAddon.java index 84f0e2eb..2dfe46ea 100644 --- a/common/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/SkyAddon.java +++ b/common/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/SkyAddon.java @@ -6,8 +6,12 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.CubicSampler; +import net.minecraft.util.Mth; +import net.minecraft.world.level.biome.BiomeManager; import net.minecraft.world.level.dimension.BuiltinDimensionTypes; import net.minecraft.world.level.dimension.DimensionType; +import net.minecraft.world.phys.Vec3; import org.dimdev.dimdoors.DimensionalDoors; import org.dimdev.dimdoors.mixin.client.accessor.DimensionSpecialEffectsMixin; import org.dimdev.dimdoors.world.pocket.type.Pocket; @@ -17,17 +21,30 @@ public class SkyAddon implements AutoSyncedAddon { private ResourceLocation effect; + private long dayTime = 6000L; + private byte moonPhase; + public boolean setEfffect(ResourceLocation effect) { this.effect = effect; return true; } + public void setDayTime(long dayTime) { + this.dayTime = dayTime; + } + + public void setMoonPhase(byte moonPhase) { + this.moonPhase = moonPhase; + } + + @Override public PocketAddon fromNbt(CompoundTag nbt) { ResourceLocation tag = null; this.effect = !nbt.contains("effect") && nbt.contains("world") ? ResourceLocation.tryParse(nbt.getString("world")) : nbt.contains("effect") ? ResourceLocation.tryParse(nbt.getString("effect")) : null; - + this.dayTime = nbt.contains("dayTime") ? nbt.getLong("dayTime") : 12000L; + this.moonPhase = nbt.contains("moonPhase") ? nbt.getByte("moonPhase") : 0; return this; } @@ -36,6 +53,8 @@ public class SkyAddon implements AutoSyncedAddon { AutoSyncedAddon.super.toNbt(nbt); nbt.putString("effect", this.effect.toString()); + nbt.putLong("dayTime", this.dayTime); + nbt.putByte("moonPhase", this.moonPhase); return nbt; } @@ -57,15 +76,20 @@ public class SkyAddon implements AutoSyncedAddon { @Override public AutoSyncedAddon read(FriendlyByteBuf buf) { this.effect = buf.readResourceLocation(); + this.dayTime = buf.readLong(); + this.moonPhase = buf.readByte(); return this; } @Override public FriendlyByteBuf write(FriendlyByteBuf buf) { buf.writeResourceLocation(effect); + buf.writeLong(dayTime); + buf.writeByte(moonPhase); return buf; } + public interface SkyPocketBuilder> extends PocketBuilderExtension { default T dimenionType(ResourceLocation effect) { @@ -73,16 +97,34 @@ public class SkyAddon implements AutoSyncedAddon { return getSelf(); } + + default T dayTime(long dayTime) { + + this.getAddon(ID).dayTime = dayTime; + + return getSelf(); + } + + default T moonPhase(byte moonPhase) { + + this.getAddon(ID).moonPhase = moonPhase; + + return getSelf(); + } } public static class SkyBuilderAddon implements PocketBuilderAddon { private ResourceLocation effect = BuiltinDimensionTypes.OVERWORLD_EFFECTS; + private long dayTime = 12000L; + private byte moonPhase = 0; @Override public void apply(Pocket pocket) { SkyAddon addon = new SkyAddon(); addon.effect = effect; + addon.dayTime = dayTime; + addon.moonPhase = moonPhase; pocket.addAddon(addon); } @@ -93,7 +135,9 @@ public class SkyAddon implements AutoSyncedAddon { @Override public PocketBuilderAddon fromNbt(CompoundTag nbt) { - this.effect = ResourceLocation.tryParse(nbt.getString("world")); + this.effect = ResourceLocation.tryParse(nbt.getString("effect")); + this.dayTime = nbt.getLong("dayTime"); + this.moonPhase = nbt.getByte("moonPhase"); return this; } @@ -102,7 +146,9 @@ public class SkyAddon implements AutoSyncedAddon { public CompoundTag toNbt(CompoundTag nbt) { PocketBuilderAddon.super.toNbt(nbt); - nbt.putString("dimenionType", effect.toString()); + nbt.putString("effect", effect.toString()); + nbt.putLong("dayTime", dayTime); + nbt.putByte("moonPhase", moonPhase); return nbt; } @@ -124,4 +170,34 @@ public class SkyAddon implements AutoSyncedAddon { return this.getAddon(ID).setEfffect(effect); } } + + public static float timeOfDay(long dayTime) { + double d = Mth.frac((double)dayTime / 24000.0 - 0.25); + double e = 0.5 - Math.cos(d * Math.PI) / 2.0; + return (float)(d * 2.0 + e) / 3.0f; + } + + public float getSunAngle() { + float f = this.getTimeOfDay(); + return f * ((float)Math.PI * 2); + } + + public float getTimeOfDay() { + return timeOfDay(getDayTime()); + } + + private long getDayTime() { + return dayTime; + } + + public int getMoonPhase() { + return moonPhase % 8; + } + + public float getStarBrightness() { + float f = this.getTimeOfDay(); + float g = 1.0f - (Mth.cos(f * ((float)Math.PI * 2)) * 2.0f + 0.25f); + g = Mth.clamp(g, 0.0f, 1.0f); + return g * g * 0.5f; + } } diff --git a/common/src/main/resources/data/dimdoors/door/data/gold_door.json b/common/src/main/resources/data/dimdoors/door/data/gold_door.json index 409cd37e..93d88312 100644 --- a/common/src/main/resources/data/dimdoors/door/data/gold_door.json +++ b/common/src/main/resources/data/dimdoors/door/data/gold_door.json @@ -2,7 +2,8 @@ { "data": { "destination": { - "type": "dimdoors:public_pocket" + "type": "dimdoors:template", + "template": "dimdoors:lab/lab_hallway" } }, "condition": { diff --git a/common/src/main/resources/dimdoors.accesswidener b/common/src/main/resources/dimdoors.accesswidener index c426bdb1..148c9df0 100644 --- a/common/src/main/resources/dimdoors.accesswidener +++ b/common/src/main/resources/dimdoors.accesswidener @@ -43,4 +43,11 @@ accessible class net/minecraft/core/particles/SimpleParticleType accessible class net/minecraft/world/level/levelgen/structure/structures/NetherFortressPieces$NetherBridgePiece accessible class net/minecraft/world/level/levelgen/structure/structures/NetherFortressPieces$PieceWeight -accessible method net/minecraft/world/level/block/DoorBlock playSound (Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Z)V \ No newline at end of file +accessible method net/minecraft/world/level/block/DoorBlock playSound (Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Z)V + +accessible field net/minecraft/client/renderer/LevelRenderer skyBuffer Lcom/mojang/blaze3d/vertex/VertexBuffer; + +accessible field net/minecraft/client/renderer/LevelRenderer SUN_LOCATION Lnet/minecraft/resources/ResourceLocation; +accessible field net/minecraft/client/renderer/LevelRenderer MOON_LOCATION Lnet/minecraft/resources/ResourceLocation; +accessible field net/minecraft/client/renderer/LevelRenderer starBuffer Lcom/mojang/blaze3d/vertex/VertexBuffer; +accessible field net/minecraft/client/renderer/LevelRenderer darkBuffer Lcom/mojang/blaze3d/vertex/VertexBuffer; \ No newline at end of file diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/lab_01.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/lab_01.json new file mode 100644 index 00000000..682cdf03 --- /dev/null +++ b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/lab_01.json @@ -0,0 +1,19 @@ +{ + "type": "dimdoors:schematic", + "id": "lab/lab_01", + "builder": { + "type": "dimdoors:lazy_gen_pocket" + }, + "modifiers": [ + { + "type": "dimdoors:rift_data", + "ids": [1], + "rift_data": "dimdoors:rift_data/pocket_entrance" + }, + { + "type": "dimdoors:template", + "ids": [2], + "templateId": "dimdoors:lab/lab_experimentation" + } + ] +} diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/lab_a0.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/lab_a0.json new file mode 100644 index 00000000..61b55848 --- /dev/null +++ b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/lab_a0.json @@ -0,0 +1,24 @@ +{ + "type": "dimdoors:schematic", + "id": "lab/lab_a0", + "builder": { + "type": "dimdoors:lazy_gen_pocket" + }, + "modifiers": [ + { + "type": "dimdoors:rift_data", + "ids": [1], + "rift_data": "dimdoors:rift_data/pocket_entrance" + }, + { + "type": "dimdoors:rift_data", + "ids": [2, 5], + "rift_data": "dimdoors:rift_data/default_dungeon" + }, + { + "type": "dimdoors:relative", + "point_a": 3, + "point_b": 4 + } + ] +} diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/lab_experimentation.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/lab_experimentation.json new file mode 100644 index 00000000..1e849cad --- /dev/null +++ b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/lab_experimentation.json @@ -0,0 +1,26 @@ +{ + "type": "dimdoors:schematic", + "id": "lab/lab_experimentation", + "builder": { + "type": "dimdoors:lazy_gen_pocket", + "addons": [ + { + "type": "dimdoors:sky", + "effect": "minecraft:overworld", + "dayTime": 6000 + } + ] + }, + "modifiers": [ + { + "type": "dimdoors:rift_data", + "ids": [1], + "rift_data": "dimdoors:rift_data/pocket_entrance" + }, + { + "type": "dimdoors:template", + "ids": [2], + "templateId": "dimdoors:lab/lab_a0" + } + ] +} diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/lab_hallway.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/lab_hallway.json new file mode 100644 index 00000000..99f94184 --- /dev/null +++ b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/lab_hallway.json @@ -0,0 +1,19 @@ +{ + "type": "dimdoors:schematic", + "id": "lab/lab_hallway", + "builder": { + "type": "dimdoors:lazy_gen_pocket" + }, + "modifiers": [ + { + "type": "dimdoors:rift_data", + "ids": [1], + "rift_data": "dimdoors:rift_data/pocket_entrance" + }, + { + "type": "dimdoors:template", + "ids": [2], + "templateId": "dimdoors:lab/reception" + } + ] +} diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/left_lab_hallway.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/left_lab_hallway.json new file mode 100644 index 00000000..0a7c4cfe --- /dev/null +++ b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/left_lab_hallway.json @@ -0,0 +1,19 @@ +{ + "type": "dimdoors:schematic", + "id": "lab/left_lab_hallway", + "builder": { + "type": "dimdoors:lazy_gen_pocket" + }, + "modifiers": [ + { + "type": "dimdoors:rift_data", + "ids": [1], + "rift_data": "dimdoors:rift_data/pocket_entrance" + }, + { + "type": "dimdoors:template", + "ids": [2], + "templateId": "dimdoors:lab/lab_01" + } + ] +} diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/reception.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/reception.json new file mode 100644 index 00000000..6c5d3d4e --- /dev/null +++ b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/reception.json @@ -0,0 +1,24 @@ +{ + "type": "dimdoors:schematic", + "id": "lab/reception", + "builder": { + "type": "dimdoors:lazy_gen_pocket" + }, + "modifiers": [ + { + "type": "dimdoors:rift_data", + "ids": [1], + "rift_data": "dimdoors:rift_data/pocket_entrance" + }, + { + "type": "dimdoors:template", + "ids": [2], + "templateId": "dimdoors:lab/right_lab_hallway" + }, + { + "type": "dimdoors:rift_data", + "ids": [3], + "rift_data": "dimdoors:rift_data/default_dungeon" + } + ] +} diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/right_lab_hallway.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/right_lab_hallway.json new file mode 100644 index 00000000..803cb7da --- /dev/null +++ b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/right_lab_hallway.json @@ -0,0 +1,19 @@ +{ + "type": "dimdoors:schematic", + "id": "lab/right_lab_hallway", + "builder": { + "type": "dimdoors:lazy_gen_pocket" + }, + "modifiers": [ + { + "type": "dimdoors:rift_data", + "ids": [1], + "rift_data": "dimdoors:rift_data/pocket_entrance" + }, + { + "type": "dimdoors:template", + "ids": [2], + "templateId": "dimdoors:lab/left_lab_hallway" + } + ] +} diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/telecommunications.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/telecommunications.json new file mode 100644 index 00000000..ed40a929 --- /dev/null +++ b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/generators/lab/telecommunications.json @@ -0,0 +1,19 @@ +{ + "type": "dimdoors:schematic", + "id": "lab/telecommunications", + "builder": { + "type": "dimdoors:lazy_gen_pocket" + }, + "modifiers": [ + { + "type": "dimdoors:rift_data", + "ids": [1], + "rift_data": "dimdoors:rift_data/pocket_entrance" + }, + { + "type": "dimdoors:template", + "ids": [2], + "templateId": "dimdoors:lab/lab_experimentation" + } + ] +} diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/json/rift_data/limbo.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/json/rift_data/limbo.json new file mode 100644 index 00000000..e69de29b diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/schematic/lab/lab_01.schem b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/schematic/lab/lab_01.schem new file mode 100644 index 0000000000000000000000000000000000000000..81a7742c727d7c867202cf7cbf343262d69ab6c1 GIT binary patch literal 10455 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 literal 0 HcmV?d00001 diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/schematic/lab/lab_a0.schem b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/schematic/lab/lab_a0.schem new file mode 100644 index 0000000000000000000000000000000000000000..3c3848f9042e4cfa7a41461e9b50dffdd47611ac GIT binary patch literal 8170 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 OqW=TY2z?L?C;$MEL&x&~ literal 0 HcmV?d00001 diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/schematic/lab/right_lab_hallway.schem b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/schematic/lab/right_lab_hallway.schem new file mode 100644 index 0000000000000000000000000000000000000000..23fd99abba945289c742f7f57de24735225815d4 GIT binary patch literal 562 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 literal 0 HcmV?d00001 diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/schematic/lab/telecommunications.schem b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/schematic/lab/telecommunications.schem new file mode 100644 index 0000000000000000000000000000000000000000..d63008b8211c30375fe75751ccca6843c82803ea GIT binary patch literal 3689 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 literal 0 HcmV?d00001 diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_01.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_01.json new file mode 100644 index 00000000..6df444a5 --- /dev/null +++ b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_01.json @@ -0,0 +1,4 @@ +{ + "id": "lab/lab_01", + "type": "dimdoors:id" +} \ No newline at end of file diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_a0.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_a0.json new file mode 100644 index 00000000..b72e4931 --- /dev/null +++ b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_a0.json @@ -0,0 +1,4 @@ +{ + "id": "lab/lab_a0", + "type": "dimdoors:id" +} \ No newline at end of file diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_entrance.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_entrance.json new file mode 100644 index 00000000..ba08a8cb --- /dev/null +++ b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_entrance.json @@ -0,0 +1,4 @@ +{ + "id": "lab/lab_entrance", + "type": "dimdoors:id" +} \ No newline at end of file diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_experimentation.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_experimentation.json new file mode 100644 index 00000000..1f2f2619 --- /dev/null +++ b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_experimentation.json @@ -0,0 +1,4 @@ +{ + "id": "lab/lab_experimentation", + "type": "dimdoors:id" +} \ No newline at end of file diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_hallway.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_hallway.json new file mode 100644 index 00000000..b3519a18 --- /dev/null +++ b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/lab_hallway.json @@ -0,0 +1,4 @@ +{ + "id": "lab/lab_hallway", + "type": "dimdoors:id" +} \ No newline at end of file diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/left_lab_hallway.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/left_lab_hallway.json new file mode 100644 index 00000000..2df693e7 --- /dev/null +++ b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/left_lab_hallway.json @@ -0,0 +1,4 @@ +{ + "id": "lab/left_lab_hallway", + "type": "dimdoors:id" +} \ No newline at end of file diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/reception.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/reception.json new file mode 100644 index 00000000..5d0ab335 --- /dev/null +++ b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/reception.json @@ -0,0 +1,4 @@ +{ + "id": "lab/reception", + "type": "dimdoors:id" +} \ No newline at end of file diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/right_lab_hallway.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/right_lab_hallway.json new file mode 100644 index 00000000..6801bb85 --- /dev/null +++ b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/right_lab_hallway.json @@ -0,0 +1,4 @@ +{ + "id": "lab/right_lab_hallway", + "type": "dimdoors:id" +} diff --git a/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/telecommunications.json b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/telecommunications.json new file mode 100644 index 00000000..686b34f0 --- /dev/null +++ b/common/src/main/resources/resourcepacks/default/data/dimdoors/pockets/virtual/lab/telecommunications.json @@ -0,0 +1,4 @@ +{ + "id": "lab/telecommunications", + "type": "dimdoors:id" +} \ No newline at end of file diff --git a/common/src/main/schematics/org/dimdev/dimdoors/util/schematic/RelativeBlockSample.java b/common/src/main/schematics/org/dimdev/dimdoors/util/schematic/RelativeBlockSample.java index e1019d6d..f1dcf36c 100644 --- a/common/src/main/schematics/org/dimdev/dimdoors/util/schematic/RelativeBlockSample.java +++ b/common/src/main/schematics/org/dimdev/dimdoors/util/schematic/RelativeBlockSample.java @@ -84,7 +84,7 @@ public class RelativeBlockSample implements BlockGetter, LevelWriter { this.entityContainer = HashBiMap.create(); for (CompoundTag entityNbt : schematic.getEntities()) { ListTag doubles = entityNbt.getList("Pos", Tag.TAG_DOUBLE); - this.entityContainer.put(entityNbt, new Vec3(doubles.getDouble(0), doubles.getDouble(1), doubles.getDouble(2))); + this.entityContainer.put(entityNbt, new Vec3(doubles.getDouble(0), doubles.getDouble(1), doubles.getDouble(2)).subtract(Vec3.atLowerCornerOf(schematic.getOffset()))); } } @@ -217,6 +217,15 @@ public class RelativeBlockSample implements BlockGetter, LevelWriter { doubles.set(2, NbtOps.INSTANCE.createDouble(vec.z)); nbt.put("Pos", doubles); + if(nbt.contains("Id")) { + nbt.put("id", nbt.get("Id")); // boogers + nbt.remove("Id"); + } + + if(nbt.contains("UUID")) { + nbt.remove("UUID"); + } + Entity entity = EntityType.create(nbt, world.getLevel()).orElseThrow(NoSuchElementException::new); world.getServer().execute(() -> { world.addFreshEntity(entity); diff --git a/common/src/main/schematics/org/dimdev/dimdoors/util/schematic/SchematicPlacer.java b/common/src/main/schematics/org/dimdev/dimdoors/util/schematic/SchematicPlacer.java index 46159553..fb716673 100644 --- a/common/src/main/schematics/org/dimdev/dimdoors/util/schematic/SchematicPlacer.java +++ b/common/src/main/schematics/org/dimdev/dimdoors/util/schematic/SchematicPlacer.java @@ -3,10 +3,12 @@ package org.dimdev.dimdoors.util.schematic; import dev.architectury.platform.Platform; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.core.BlockPos; +import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.DoubleTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtOps; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; @@ -88,17 +90,20 @@ public final class SchematicPlacer { return new int[0][0]; } - private static void placeEntities(int originX, int originY, int originZ, Schematic schematic, WorldGenLevel world) { + private static void placeEntities(BlockPos origin, Schematic schematic, WorldGenLevel world) { List entityNbts = schematic.getEntities(); for (CompoundTag nbt : entityNbts) { ListTag nbtList = Objects.requireNonNull(nbt.getList("Pos", 6), "Entity in schematic \"" + schematic.getMetadata().name() + "\" did not have a Pos nbt list!"); - SchematicPlacer.processPos(nbtList, originX, originY, originZ, nbt); + SchematicPlacer.processPos(nbtList, origin, schematic.getOffset(), nbt); - EntityType entityType = EntityType.by(nbt).orElseThrow(AssertionError::new); + EntityType entityType = EntityType.by(fixEntityId(nbt)).orElseThrow(AssertionError::new); Entity e = entityType.create(world.getLevel()); // TODO: fail with an exception if (e != null) { e.load(nbt); + + e.getSelfAndPassengers().forEach(e1 -> System.out.println("Blep: " + e.getDisplayName().getString() + " " + world.addFreshEntity(e1))); + world.addFreshEntityWithPassengers(e); } } @@ -118,13 +123,13 @@ public final class SchematicPlacer { return nbt; } - private static void processPos(ListTag nbtList, int originX, int originY, int originZ, CompoundTag nbt) { + private static void processPos(ListTag nbtList, BlockPos origin, Vec3i offset, CompoundTag nbt) { double x = nbtList.getDouble(0); double y = nbtList.getDouble(1); double z = nbtList.getDouble(2); nbt.remove("Pos"); - nbt.put("Pos", NbtOps.INSTANCE.createList(Stream.of(DoubleTag.valueOf(x + originX), - DoubleTag.valueOf(y + originY), - DoubleTag.valueOf(z + originZ)))); + nbt.put("Pos", NbtOps.INSTANCE.createList(Stream.of(DoubleTag.valueOf(x + origin.getX() - offset.getX()), + DoubleTag.valueOf(y + origin.getY() - offset.getY()), + DoubleTag.valueOf(z + origin.getZ() - offset.getZ())))); } } diff --git a/fabric/src/main/datagen/org/dimdev/dimdoors/datagen/LootTableProvider.java b/fabric/src/main/datagen/org/dimdev/dimdoors/datagen/LootTableProvider.java index 8bcb889b..43b3e994 100644 --- a/fabric/src/main/datagen/org/dimdev/dimdoors/datagen/LootTableProvider.java +++ b/fabric/src/main/datagen/org/dimdev/dimdoors/datagen/LootTableProvider.java @@ -39,5 +39,72 @@ public class LootTableProvider extends FabricBlockLootTableProvider { this.add(ModBlocks.UNRAVELLED_FABRIC.get(), (blockx) -> BlockLootSubProvider.createSilkTouchDispatchTable(blockx, applyExplosionCondition(blockx, LootItem.lootTableItem(ModItems.FRAYED_FILAMENTS.get()).when(BonusLevelTableCondition.bonusLevelFlatChance(Enchantments.BLOCK_FORTUNE, 0.1F, 0.14285715F, 0.25F, 1.0F)).otherwise(LootItem.lootTableItem(blockx))))); this.dropSelf(ModBlocks.TESSELATING_LOOM.get()); + + this.dropSelf(ModBlocks.DRIFTWOOD_WOOD.get()); + this.dropSelf(ModBlocks.DRIFTWOOD_LOG.get()); + this.dropSelf(ModBlocks.DRIFTWOOD_PLANKS.get()); + this.dropSelf(ModBlocks.DRIFTWOOD_LEAVES.get()); + this.dropSelf(ModBlocks.DRIFTWOOD_SAPLING.get()); + this.dropSelf(ModBlocks.DRIFTWOOD_FENCE.get()); + this.dropSelf(ModBlocks.DRIFTWOOD_GATE.get()); + this.dropSelf(ModBlocks.DRIFTWOOD_BUTTON.get()); + this.dropSelf(ModBlocks.DRIFTWOOD_SLAB.get()); + this.dropSelf(ModBlocks.DRIFTWOOD_STAIRS.get()); + this.dropSelf(ModBlocks.DRIFTWOOD_DOOR.get()); + this.dropSelf(ModBlocks.DRIFTWOOD_TRAPDOOR.get()); + this.dropSelf(ModBlocks.AMALGAM_BLOCK.get()); + this.dropSelf(ModBlocks.AMALGAM_DOOR.get()); + this.dropSelf(ModBlocks.AMALGAM_TRAPDOOR.get()); + this.dropSelf(ModBlocks.RUST.get()); + this.dropSelf(ModBlocks.AMALGAM_SLAB.get()); + this.dropSelf(ModBlocks.AMALGAM_STAIRS.get()); + this.dropSelf(ModBlocks.AMALGAM_ORE.get()); + this.dropSelf(ModBlocks.CLOD_ORE.get()); + this.dropSelf(ModBlocks.CLOD_BLOCK.get()); + this.dropSelf(ModBlocks.GRAVEL_FENCE.get()); + this.dropSelf(ModBlocks.GRAVEL_BUTTON.get()); + this.dropSelf(ModBlocks.GRAVEL_SLAB.get()); + this.dropSelf(ModBlocks.GRAVEL_STAIRS.get()); + this.dropSelf(ModBlocks.GRAVEL_WALL.get()); + this.dropSelf(ModBlocks.DARK_SAND.get()); + this.dropSelf(ModBlocks.DARK_SAND_FENCE.get()); + this.dropSelf(ModBlocks.DARK_SAND_BUTTON.get()); + this.dropSelf(ModBlocks.DARK_SAND_SLAB.get()); + this.dropSelf(ModBlocks.DARK_SAND_STAIRS.get()); + this.dropSelf(ModBlocks.DARK_SAND_WALL.get()); + this.dropSelf(ModBlocks.CLAY_FENCE.get()); + this.dropSelf(ModBlocks.CLAY_GATE.get()); + this.dropSelf(ModBlocks.CLAY_BUTTON.get()); + this.dropSelf(ModBlocks.CLAY_SLAB.get()); + this.dropSelf(ModBlocks.CLAY_STAIRS.get()); + this.dropSelf(ModBlocks.CLAY_WALL.get()); + this.dropSelf(ModBlocks.MUD_FENCE.get()); + this.dropSelf(ModBlocks.MUD_GATE.get()); + this.dropSelf(ModBlocks.MUD_BUTTON.get()); + this.dropSelf(ModBlocks.MUD_SLAB.get()); + this.dropSelf(ModBlocks.MUD_STAIRS.get()); + this.dropSelf(ModBlocks.UNRAVELED_FENCE.get()); + this.dropSelf(ModBlocks.UNRAVELED_GATE.get()); + this.dropSelf(ModBlocks.UNRAVELED_BUTTON.get()); + this.dropSelf(ModBlocks.UNRAVELED_SLAB.get()); + this.dropSelf(ModBlocks.UNRAVELED_STAIRS.get()); + this.dropSelf(ModBlocks.DEEPSLATE_SLAB.get()); + this.dropSelf(ModBlocks.DEEPSLATE_STAIRS.get()); + this.dropSelf(ModBlocks.DEEPSLATE_WALL.get()); + this.dropSelf(ModBlocks.RED_SAND_SLAB.get()); + this.dropSelf(ModBlocks.RED_SAND_STAIRS.get()); + this.dropSelf(ModBlocks.RED_SAND_WALL.get()); + this.dropSelf(ModBlocks.SAND_SLAB.get()); + this.dropSelf(ModBlocks.SAND_STAIRS.get()); + this.dropSelf(ModBlocks.SAND_WALL.get()); + this.dropSelf(ModBlocks.END_STONE_SLAB.get()); + this.dropSelf(ModBlocks.END_STONE_STAIRS.get()); + this.dropSelf(ModBlocks.END_STONE_WALL.get()); + this.dropSelf(ModBlocks.NETHERRACK_FENCE.get()); + this.dropSelf(ModBlocks.NETHERRACK_SLAB.get()); + this.dropSelf(ModBlocks.NETHERRACK_STAIRS.get()); + this.dropSelf(ModBlocks.NETHERRACK_WALL.get()); + this.dropSelf(ModBlocks.UNRAVELED_SPIKE.get()); + this.dropSelf(ModBlocks.GRITTY_STONE.get()); } } diff --git a/gradle.properties b/gradle.properties index 888a682c..3cdab5c3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ minecraft_version=1.20.1 enabled_platforms=fabric,forge archives_base_name=dimdoors -mod_version=5.3.2 +mod_version=5.3.3 maven_group=org.dimdev architectury_version=9.1.12