diff --git a/src/main/java/dev/lazysucksat/purgatory/dimension/DimensionTeleporter.java b/src/main/java/dev/lazysucksat/purgatory/dimension/DimensionTeleporter.java index 6281f62..38f8b88 100644 --- a/src/main/java/dev/lazysucksat/purgatory/dimension/DimensionTeleporter.java +++ b/src/main/java/dev/lazysucksat/purgatory/dimension/DimensionTeleporter.java @@ -2,11 +2,14 @@ package dev.lazysucksat.purgatory.dimension; import com.mojang.logging.LogUtils; import dev.lazysucksat.purgatory.Purgatory; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Position; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; +import net.minecraft.world.level.levelgen.Heightmap; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -49,10 +52,25 @@ public class DimensionTeleporter { for (TeleportRequest request : toTeleport) { ServerPlayer player = request.player(); - ServerLevel level = request.targetLevel(); + ServerLevel target = request.targetLevel(); + + double currentScale = player.level().dimensionType().coordinateScale(); + double destScale = target.dimensionType().coordinateScale(); + + double scaleFactor = currentScale / destScale; + + double targetX = player.getX() * scaleFactor; + double targetZ = player.getZ() * scaleFactor; + + int blockX = (int) targetX; + int blockZ = (int) targetZ; + + BlockPos highestPos = target.getHeightmapPos(Heightmap.Types.WORLD_SURFACE, new BlockPos(blockX, 0, blockZ)); + + int highestY = highestPos.getY(); if (player.isAlive()) { - player.teleportTo(level, 0.5, 70.0, 0.5, player.getYRot(), player.getXRot()); + player.teleportTo(target, targetX, highestY, targetZ, player.getYRot(), player.getXRot()); } else { teleportQueue.add(request); } diff --git a/src/main/java/dev/lazysucksat/purgatory/dimension/PurgatoryTeleport.java b/src/main/java/dev/lazysucksat/purgatory/dimension/PurgatoryTeleport.java new file mode 100644 index 0000000..dcdcdb4 --- /dev/null +++ b/src/main/java/dev/lazysucksat/purgatory/dimension/PurgatoryTeleport.java @@ -0,0 +1,52 @@ +package dev.lazysucksat.purgatory.dimension; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraftforge.common.util.ITeleporter; + +import java.util.function.Function; + +public class PurgatoryTeleport implements ITeleporter { + + @Override + public Entity placeEntity(Entity entity, ServerLevel currentWorld, ServerLevel destWorld, float yaw, Function repositionEntity) { + if (!(entity instanceof ServerPlayer player)) { + return entity; + } + + // Calculate coordinate scale between dimensions + double currentScale = currentWorld.dimensionType().coordinateScale(); + double destScale = destWorld.dimensionType().coordinateScale(); + double scaleFactor = currentScale / destScale; + + int targetX = (int) (player.getX() * scaleFactor); + int targetZ = (int) (player.getZ() * scaleFactor); + + // Find safe ground height + BlockPos searchPos = new BlockPos(targetX, destWorld.getMinBuildHeight(), targetZ); + BlockPos safePos = destWorld.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, searchPos); + + // Ticket forces the destination chunk to compile BEFORE packet sending + destWorld.getChunkSource().addRegionTicket( + net.minecraft.server.level.TicketType.POST_TELEPORT, + new net.minecraft.world.level.ChunkPos(safePos), + 1, + player.getId() + ); + + // Execute teleport and sync dimension/position packets + player.teleportTo( + destWorld, + safePos.getX() + 0.5, + safePos.getY(), + safePos.getZ() + 0.5, + yaw, + player.getXRot() + ); + + return player; + } +} diff --git a/src/main/resources/data/purgatory/dimension/purgatory.json b/src/main/resources/data/purgatory/dimension/purgatory.json index 92f2743..e6f22f6 100644 --- a/src/main/resources/data/purgatory/dimension/purgatory.json +++ b/src/main/resources/data/purgatory/dimension/purgatory.json @@ -2,10 +2,10 @@ "type": "purgatory:purgatory_type", "generator": { "type": "minecraft:noise", - "settings": "minecraft:nether", + "settings": "purgatory:purgatory_noise", "biome_source": { "type": "minecraft:fixed", - "biome": "minecraft:plains" + "biome": "purgatory:purgatory" } } } \ No newline at end of file diff --git a/src/main/resources/data/purgatory/dimension_type/purgatory_type.json b/src/main/resources/data/purgatory/dimension_type/purgatory_type.json index fe196d8..bbf70c0 100644 --- a/src/main/resources/data/purgatory/dimension_type/purgatory_type.json +++ b/src/main/resources/data/purgatory/dimension_type/purgatory_type.json @@ -1,20 +1,19 @@ { - "ultrawarm": true, - "natural": false, - "coordinate_scale": 1.0, + "ultrawarm": false, + "natural": true, + "coordinate_scale": 0.015625, "has_skylight": false, - "has_ceiling": true, - "ambient_light": 0.1, - "fixed_time": 6000, + "has_ceiling": false, + "ambient_light": 0, "monster_spawn_light_level": 0, "monster_spawn_block_light_limit": 0, - "piglin_safe": true, + "piglin_safe": false, "has_raids": false, "bed_works": false, - "respawn_anchor_works": true, - "height": 128, - "min_y": 0, - "logical_height": 128, - "infiniburn": "#minecraft:infiniburn_nether", - "effects": "minecraft:the_nether" + "respawn_anchor_works": false, + "height": 384, + "min_y": -64, + "logical_height": 384, + "infiniburn": "#minecraft:infiniburn_overworld", + "effects": "minecraft:the_end" } \ No newline at end of file diff --git a/src/main/resources/data/purgatory/worldgen/biome/purgatory.json b/src/main/resources/data/purgatory/worldgen/biome/purgatory.json index e69de29..12e016b 100644 --- a/src/main/resources/data/purgatory/worldgen/biome/purgatory.json +++ b/src/main/resources/data/purgatory/worldgen/biome/purgatory.json @@ -0,0 +1,16 @@ +{ + "has_precipitation": false, + "temperature": 0.5, + "downfall": 0.5, + "effects": { + "sky_color": 0, + "fog_color": 1051871, + "water_color": 4159204, + "water_fog_color": 329011, + "ambient_loop_sound": "minecraft:ambient.crimson_forest.loop" + }, + "spawners": {}, + "spawn_costs": {}, + "carvers": {}, + "features": [] +} \ No newline at end of file diff --git a/src/main/resources/data/purgatory/worldgen/density_function/island_noise.json b/src/main/resources/data/purgatory/worldgen/density_function/island_noise.json deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/resources/data/purgatory/worldgen/noise_settings/purgatory_noise.json b/src/main/resources/data/purgatory/worldgen/noise_settings/purgatory_noise.json new file mode 100644 index 0000000..2621e5d --- /dev/null +++ b/src/main/resources/data/purgatory/worldgen/noise_settings/purgatory_noise.json @@ -0,0 +1,101 @@ +{ + "sea_level": -64, + "disable_mob_generation": true, + "aquifers_enabled": false, + "ore_veins_enabled": false, + "legacy_random_source": false, + "default_block": { + "Name": "minecraft:basalt", + "Properties": { + "axis": "y" + } + }, + "default_fluid": { + "Name": "minecraft:air" + }, + "noise": { + "min_y": -64, + "height": 384, + "size_horizontal": 2, + "size_vertical": 1 + }, + "noise_router": { + "barrier": 0, + "fluid_level_floodedness": 0, + "fluid_level_spread": 0, + "lava": 0, + "temperature": 0, + "vegetation": 0, + "continents": "minecraft:overworld/continents", + "erosion": "minecraft:overworld/erosion", + "depth": "minecraft:overworld/depth", + "ridges": "minecraft:overworld/ridges", + "initial_density_without_jaggedness": { + "type": "minecraft:add", + "argument1": -0.2, + "argument2": { + "type": "minecraft:mul", + "argument1": 1.5, + "argument2": "minecraft:overworld/sloped_cheese" + } + }, + "final_density": { + "type": "minecraft:squeeze", + "argument": { + "type": "minecraft:mul", + "argument1": 0.64, + "argument2": { + "type": "minecraft:interpolated", + "argument": { + "type": "minecraft:blend_density", + "argument": "minecraft:overworld/sloped_cheese" + } + } + } + }, + "vein_toggle": 0, + "vein_ridged": 0, + "vein_gap": 0 + }, + "spawn_target": [], + "surface_rule": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:above_preliminary_surface" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "noise": "minecraft:surface", + "min_threshold": -0.2, + "max_threshold": 0.2 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:bone_block", + "Properties": { + "axis": "y" + } + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:soul_soil" + } + } + ] + } + } + ] + } +} \ No newline at end of file