Last commit before AI code, GO BACK HERE
This commit is contained in:
@@ -2,11 +2,14 @@ package dev.lazysucksat.purgatory.dimension;
|
|||||||
|
|
||||||
import com.mojang.logging.LogUtils;
|
import com.mojang.logging.LogUtils;
|
||||||
import dev.lazysucksat.purgatory.Purgatory;
|
import dev.lazysucksat.purgatory.Purgatory;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.core.Position;
|
||||||
import net.minecraft.resources.ResourceKey;
|
import net.minecraft.resources.ResourceKey;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
|
import net.minecraft.world.level.levelgen.Heightmap;
|
||||||
import net.minecraftforge.event.TickEvent;
|
import net.minecraftforge.event.TickEvent;
|
||||||
import net.minecraftforge.event.entity.living.LivingDeathEvent;
|
import net.minecraftforge.event.entity.living.LivingDeathEvent;
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
@@ -49,10 +52,25 @@ public class DimensionTeleporter {
|
|||||||
|
|
||||||
for (TeleportRequest request : toTeleport) {
|
for (TeleportRequest request : toTeleport) {
|
||||||
ServerPlayer player = request.player();
|
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()) {
|
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 {
|
} else {
|
||||||
teleportQueue.add(request);
|
teleportQueue.add(request);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<Boolean, Entity> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,10 +2,10 @@
|
|||||||
"type": "purgatory:purgatory_type",
|
"type": "purgatory:purgatory_type",
|
||||||
"generator": {
|
"generator": {
|
||||||
"type": "minecraft:noise",
|
"type": "minecraft:noise",
|
||||||
"settings": "minecraft:nether",
|
"settings": "purgatory:purgatory_noise",
|
||||||
"biome_source": {
|
"biome_source": {
|
||||||
"type": "minecraft:fixed",
|
"type": "minecraft:fixed",
|
||||||
"biome": "minecraft:plains"
|
"biome": "purgatory:purgatory"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,20 +1,19 @@
|
|||||||
{
|
{
|
||||||
"ultrawarm": true,
|
"ultrawarm": false,
|
||||||
"natural": false,
|
"natural": true,
|
||||||
"coordinate_scale": 1.0,
|
"coordinate_scale": 0.015625,
|
||||||
"has_skylight": false,
|
"has_skylight": false,
|
||||||
"has_ceiling": true,
|
"has_ceiling": false,
|
||||||
"ambient_light": 0.1,
|
"ambient_light": 0,
|
||||||
"fixed_time": 6000,
|
|
||||||
"monster_spawn_light_level": 0,
|
"monster_spawn_light_level": 0,
|
||||||
"monster_spawn_block_light_limit": 0,
|
"monster_spawn_block_light_limit": 0,
|
||||||
"piglin_safe": true,
|
"piglin_safe": false,
|
||||||
"has_raids": false,
|
"has_raids": false,
|
||||||
"bed_works": false,
|
"bed_works": false,
|
||||||
"respawn_anchor_works": true,
|
"respawn_anchor_works": false,
|
||||||
"height": 128,
|
"height": 384,
|
||||||
"min_y": 0,
|
"min_y": -64,
|
||||||
"logical_height": 128,
|
"logical_height": 384,
|
||||||
"infiniburn": "#minecraft:infiniburn_nether",
|
"infiniburn": "#minecraft:infiniburn_overworld",
|
||||||
"effects": "minecraft:the_nether"
|
"effects": "minecraft:the_end"
|
||||||
}
|
}
|
||||||
@@ -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": []
|
||||||
|
}
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user