diff --git a/build.gradle b/build.gradle index fd2fa92..be20723 100644 --- a/build.gradle +++ b/build.gradle @@ -29,10 +29,10 @@ dependencies { include "dev.onyxstudios.cardinal-components-api:cardinal-components-world:${project.cca}" include "dev.onyxstudios.cardinal-components-api:cardinal-components-entity:${project.cca}" - modImplementation include("com.github.tyap-lyap:fantasy:${project.fantasy}") -// modImplementation include("xyz.nucleoid:fantasy:${project.fantasy}") +// modImplementation include("com.github.tyap-lyap:fantasy:${project.fantasy}") + modImplementation include("xyz.nucleoid:fantasy:${project.fantasy}") modImplementation include("eu.pb4:placeholder-api:${project.placeholder_api}") - modImplementation include("xyz.nucleoid:server-translations-api:${project.server_translations_api}") + modImplementation include("fr.catcore:server-translations-api:${project.server_translations_api}") modImplementation include("me.lucko:fabric-permissions-api:0.2-SNAPSHOT") } diff --git a/gradle.properties b/gradle.properties index 41d9dba..f258ac8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,16 +8,16 @@ archives_base_name = skylands mod_version = 0.3.6 # Dependencies | Check these on https://fabricmc.net/develop -minecraft_version = 1.19.4 -yarn_mappings = 1.19.4+build.1 -fabric_loader = 0.14.17 -fabric_api = 0.76.0+1.19.4 +minecraft_version = 1.19.2 +yarn_mappings = 1.19.2+build.28 +fabric_loader = 0.14.18 +fabric_api = 0.76.0+1.19.2 # https://github.com/OnyxStudios/Cardinal-Components-API/releases -cca = 5.1.0 +cca = 5.0.2 # https://github.com/NucleoidMC/fantasy/releases -fantasy = 15b00d289f +fantasy = 0.4.7+1.19.2 # https://github.com/Patbox/TextPlaceholderAPI/releases placeholder_api = 2.0.0-rc.1+1.19.3 # https://github.com/NucleoidMC/Server-Translations/releases -server_translations_api = 2.0.0-beta.2+1.19.4-pre2 +server_translations_api = 1.4.18+1.19.2 diff --git a/src/main/java/skylands/api/SkylandsAPI.java b/src/main/java/skylands/api/SkylandsAPI.java index da3fc1d..ce310d5 100644 --- a/src/main/java/skylands/api/SkylandsAPI.java +++ b/src/main/java/skylands/api/SkylandsAPI.java @@ -3,7 +3,7 @@ import net.fabricmc.fabric.api.event.Event; import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.registry.RegistryKey; +import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.World; import skylands.SkylandsMod; import skylands.logic.Island; diff --git a/src/main/java/skylands/event/PlayerConnectEvent.java b/src/main/java/skylands/event/PlayerConnectEvent.java index 48cd80b..b5e8284 100644 --- a/src/main/java/skylands/event/PlayerConnectEvent.java +++ b/src/main/java/skylands/event/PlayerConnectEvent.java @@ -5,12 +5,11 @@ import net.minecraft.world.World; import skylands.logic.Member; import skylands.logic.Skylands; +import skylands.util.TeleportUtil; import skylands.util.Texts; import skylands.util.UpdateChecker; import skylands.util.Worlds; -import java.util.Set; - @SuppressWarnings("unused") public class PlayerConnectEvent { @@ -45,7 +44,7 @@ public static void onJoin(MinecraftServer server, ServerPlayerEntity player) { player.sendMessage(Texts.prefixed("message.skylands.ban_player.ban", map -> map.put("%owner%", island.owner.name))); player.sendMessage(Texts.prefixed("message.skylands.hub_visit")); var pos = Skylands.instance.hub.pos; - player.teleport(server.getOverworld(), pos.getX(), pos.getY(), pos.getZ(), Set.of(), 0, 0); + TeleportUtil.teleport(player, server.getOverworld(), pos.getX(), pos.getY(), pos.getZ(), 0, 0); } }); diff --git a/src/main/java/skylands/logic/Hub.java b/src/main/java/skylands/logic/Hub.java index 7baffac..6913424 100644 --- a/src/main/java/skylands/logic/Hub.java +++ b/src/main/java/skylands/logic/Hub.java @@ -2,10 +2,10 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.NbtCompound; +import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.math.Vec3d; import skylands.api.SkylandsAPI; - -import java.util.Set; +import skylands.util.TeleportUtil; public class Hub { public Vec3d pos = Skylands.config.defaultHubPos.toVec(); @@ -31,7 +31,7 @@ public void writeToNbt(NbtCompound nbt) { public void visit(PlayerEntity player) { var world = Skylands.getServer().getOverworld(); - player.teleport(world, pos.getX(), pos.getY(), pos.getZ(), Set.of(), Skylands.config.defaultHubPos.yaw, Skylands.config.defaultHubPos.pitch); + TeleportUtil.teleport((ServerPlayerEntity)player, world, pos.getX(), pos.getY(), pos.getZ(), Skylands.config.defaultHubPos.yaw, Skylands.config.defaultHubPos.pitch); SkylandsAPI.ON_HUB_VISIT.invoker().invoke(player, world); } } diff --git a/src/main/java/skylands/logic/Island.java b/src/main/java/skylands/logic/Island.java index 6df967b..127f693 100644 --- a/src/main/java/skylands/logic/Island.java +++ b/src/main/java/skylands/logic/Island.java @@ -1,14 +1,15 @@ package skylands.logic; +import com.mojang.serialization.Lifecycle; +import net.fabricmc.fabric.api.dimension.v1.FabricDimensions; import net.minecraft.block.Block; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.NbtCompound; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.entry.RegistryEntryList; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.structure.StructurePlacementData; +import net.minecraft.structure.StructureSet; import net.minecraft.structure.StructureTemplate; import net.minecraft.util.BlockMirror; import net.minecraft.util.Identifier; @@ -16,7 +17,11 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.random.RandomSeed; +import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.SimpleRegistry; import net.minecraft.world.Difficulty; +import net.minecraft.world.TeleportTarget; import net.minecraft.world.biome.BiomeKeys; import net.minecraft.world.dimension.DimensionTypes; import net.minecraft.world.gen.chunk.FlatChunkGenerator; @@ -25,6 +30,7 @@ import skylands.SkylandsMod; import skylands.api.SkylandsAPI; import skylands.util.Players; +import skylands.util.TeleportUtil; import skylands.util.Texts; import xyz.nucleoid.fantasy.Fantasy; import xyz.nucleoid.fantasy.RuntimeWorldConfig; @@ -35,6 +41,7 @@ import java.util.*; public class Island { + public static final Registry EMPTY_STRUCTURE_REGISTRY = new SimpleRegistry<>(Registry.STRUCTURE_SET_KEY, Lifecycle.stable(), (x) -> null).freeze(); MinecraftServer server = Skylands.instance.server; Skylands skylands = Skylands.instance; Fantasy fantasy = Skylands.instance.fantasy; @@ -209,9 +216,9 @@ public RuntimeWorldHandle getHandler() { } private RuntimeWorldConfig createIslandConfig() { - var biome = this.server.getRegistryManager().get(RegistryKeys.BIOME).getEntry(this.server.getRegistryManager().get(RegistryKeys.BIOME).getOrThrow(BiomeKeys.PLAINS)); - FlatChunkGeneratorConfig flat = new FlatChunkGeneratorConfig(Optional.of(RegistryEntryList.of()), biome, List.of()); - FlatChunkGenerator generator = new FlatChunkGenerator(flat); + FlatChunkGeneratorConfig flat = new FlatChunkGeneratorConfig(Optional.empty(), BuiltinRegistries.BIOME); + flat.setBiome(this.server.getRegistryManager().get(Registry.BIOME_KEY).getOrCreateEntry(BiomeKeys.PLAINS)); + FlatChunkGenerator generator = new FlatChunkGenerator(EMPTY_STRUCTURE_REGISTRY, flat); return new RuntimeWorldConfig() .setDimensionType(DimensionTypes.OVERWORLD) @@ -247,9 +254,9 @@ void copyNetherTemplate() { } private RuntimeWorldConfig createNetherConfig() { - var biome = this.server.getRegistryManager().get(RegistryKeys.BIOME).getEntry(this.server.getRegistryManager().get(RegistryKeys.BIOME).getOrThrow(BiomeKeys.NETHER_WASTES)); - FlatChunkGeneratorConfig flat = new FlatChunkGeneratorConfig(Optional.of(RegistryEntryList.of()), biome, List.of()); - FlatChunkGenerator generator = new FlatChunkGenerator(flat); + FlatChunkGeneratorConfig flat = new FlatChunkGeneratorConfig(Optional.empty(), BuiltinRegistries.BIOME); + flat.setBiome(this.server.getRegistryManager().get(Registry.BIOME_KEY).getOrCreateEntry(BiomeKeys.NETHER_WASTES)); + FlatChunkGenerator generator = new FlatChunkGenerator(EMPTY_STRUCTURE_REGISTRY, flat); return new RuntimeWorldConfig() .setDimensionType(DimensionTypes.THE_NETHER) @@ -281,7 +288,7 @@ public ServerWorld getWorld() { public void visit(PlayerEntity player, Vec3d pos, float yaw, float pitch) { ServerWorld world = this.getWorld(); - player.teleport(world, pos.getX(), pos.getY(), pos.getZ(), Set.of(), yaw, pitch); + TeleportUtil.teleport((ServerPlayerEntity)player, world, pos.getX(), pos.getY(), pos.getZ(), yaw, pitch); if(!isMember(player)) { Players.get(this.owner.name).ifPresent(owner -> { diff --git a/src/main/java/skylands/mixin/block/entity/EndGatewayBlockEntityMixin.java b/src/main/java/skylands/mixin/block/entity/EndGatewayBlockEntityMixin.java index a912473..f3a289b 100644 --- a/src/main/java/skylands/mixin/block/entity/EndGatewayBlockEntityMixin.java +++ b/src/main/java/skylands/mixin/block/entity/EndGatewayBlockEntityMixin.java @@ -1,7 +1,7 @@ package skylands.mixin.block.entity; import net.minecraft.block.entity.EndGatewayBlockEntity; -import net.minecraft.registry.RegistryKey; +import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -11,7 +11,7 @@ @Mixin(EndGatewayBlockEntity.class) public class EndGatewayBlockEntityMixin { - @Redirect(method = "tryTeleportingEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getRegistryKey()Lnet/minecraft/registry/RegistryKey;")) + @Redirect(method = "tryTeleportingEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getRegistryKey()Lnet/minecraft/util/registry/RegistryKey;")) private static RegistryKey tryTeleportingEntity_redirectRegistryKey(World instance) { return Worlds.redirect(instance.getRegistryKey()); } diff --git a/src/main/java/skylands/mixin/entity/EntityMixin.java b/src/main/java/skylands/mixin/entity/EntityMixin.java index aabcc56..fd4bbfe 100644 --- a/src/main/java/skylands/mixin/entity/EntityMixin.java +++ b/src/main/java/skylands/mixin/entity/EntityMixin.java @@ -1,8 +1,8 @@ package skylands.mixin.entity; import net.minecraft.entity.Entity; -import net.minecraft.registry.RegistryKey; import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -37,18 +37,18 @@ public RegistryKey tickPortal_modifyRegistryKey(RegistryKey instan return instance; } - @Redirect(method = "getTeleportTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ServerWorld;getRegistryKey()Lnet/minecraft/registry/RegistryKey;")) + @Redirect(method = "getTeleportTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ServerWorld;getRegistryKey()Lnet/minecraft/util/registry/RegistryKey;")) public RegistryKey getTeleportTarget_redirectRegistryKey0(ServerWorld instance) { return Worlds.redirect(instance.getRegistryKey()); } - @Redirect(method = "getTeleportTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getRegistryKey()Lnet/minecraft/registry/RegistryKey;")) + @Redirect(method = "getTeleportTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getRegistryKey()Lnet/minecraft/util/registry/RegistryKey;")) public RegistryKey getTeleportTarget_redirectRegistryKey(World instance) { return Worlds.redirect(instance.getRegistryKey()); } - @Redirect(method = "moveToWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ServerWorld;getRegistryKey()Lnet/minecraft/registry/RegistryKey;", ordinal = 0)) + @Redirect(method = "moveToWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ServerWorld;getRegistryKey()Lnet/minecraft/util/registry/RegistryKey;", ordinal = 0)) public RegistryKey moveToWorld_redirectRegistryKey(ServerWorld instance) { return Worlds.redirect(instance.getRegistryKey()); } diff --git a/src/main/java/skylands/mixin/entity/ServerPlayerEntityMixin.java b/src/main/java/skylands/mixin/entity/ServerPlayerEntityMixin.java index 0e5425d..0f4c860 100644 --- a/src/main/java/skylands/mixin/entity/ServerPlayerEntityMixin.java +++ b/src/main/java/skylands/mixin/entity/ServerPlayerEntityMixin.java @@ -1,28 +1,33 @@ package skylands.mixin.entity; import com.mojang.authlib.GameProfile; +import net.fabricmc.fabric.api.dimension.v1.FabricDimensions; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.registry.RegistryKey; +import net.minecraft.network.encryption.PlayerPublicKey; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.TeleportTarget; import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import skylands.logic.Skylands; +import skylands.util.TeleportUtil; import skylands.util.WorldProtection; import skylands.util.Worlds; -import java.util.Set; - @Mixin(ServerPlayerEntity.class) public abstract class ServerPlayerEntityMixin extends PlayerEntity { - public ServerPlayerEntityMixin(World world, BlockPos pos, float yaw, GameProfile gameProfile) { - super(world, pos, yaw, gameProfile); + + public ServerPlayerEntityMixin(World world, BlockPos pos, float yaw, GameProfile gameProfile, @Nullable PlayerPublicKey publicKey) { + super(world, pos, yaw, gameProfile, publicKey); } @Inject(method = "tick", at = @At("TAIL")) @@ -33,7 +38,7 @@ void tick(CallbackInfo ci) { if(player.getPos().getY() < world.getDimension().minY() - 10) { Worlds.getIsland(world).ifPresentOrElse(island -> { var pos = island.spawnPos; - player.teleport(island.getWorld(), pos.getX(), pos.getY(), pos.getZ(), Set.of(), 0, 0); + TeleportUtil.teleport(player, island.getWorld(), pos.getX(), pos.getY(), pos.getZ(), 0, 0); }, () -> { Skylands.instance.hub.visit(player); }); @@ -41,17 +46,17 @@ void tick(CallbackInfo ci) { } } - @Redirect(method = "moveToWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ServerWorld;getRegistryKey()Lnet/minecraft/registry/RegistryKey;")) + @Redirect(method = "moveToWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ServerWorld;getRegistryKey()Lnet/minecraft/util/registry/RegistryKey;")) public RegistryKey moveToWorld_redirectRegistryKey(ServerWorld instance) { return Worlds.redirect(instance.getRegistryKey()); } - @Redirect(method = "getTeleportTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ServerWorld;getRegistryKey()Lnet/minecraft/registry/RegistryKey;")) + @Redirect(method = "getTeleportTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ServerWorld;getRegistryKey()Lnet/minecraft/util/registry/RegistryKey;")) public RegistryKey getTeleportTarget_redirectRegistryKey(ServerWorld instance) { return Worlds.redirect(instance.getRegistryKey()); } - @Redirect(method = "worldChanged", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ServerWorld;getRegistryKey()Lnet/minecraft/registry/RegistryKey;")) + @Redirect(method = "worldChanged", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ServerWorld;getRegistryKey()Lnet/minecraft/util/registry/RegistryKey;")) public RegistryKey worldChanged_redirectRegistryKey(ServerWorld instance) { return Worlds.redirect(instance.getRegistryKey()); } diff --git a/src/main/java/skylands/mixin/world/ServerWorldMixin.java b/src/main/java/skylands/mixin/world/ServerWorldMixin.java index 45fb06c..7a18da1 100644 --- a/src/main/java/skylands/mixin/world/ServerWorldMixin.java +++ b/src/main/java/skylands/mixin/world/ServerWorldMixin.java @@ -2,17 +2,16 @@ import com.google.common.collect.ImmutableList; import net.minecraft.entity.Entity; -import net.minecraft.registry.DynamicRegistryManager; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.registry.entry.RegistryEntryList; import net.minecraft.server.MinecraftServer; import net.minecraft.server.WorldGenerationProgressListener; import net.minecraft.server.world.ServerChunkManager; import net.minecraft.server.world.ServerEntityManager; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.profiler.Profiler; +import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.RegistryEntry; +import net.minecraft.util.registry.RegistryKey; import net.minecraft.village.ZombieSiegeManager; import net.minecraft.world.MutableWorldProperties; import net.minecraft.world.StructureWorldAccess; @@ -29,6 +28,7 @@ import net.minecraft.world.spawner.PatrolSpawner; import net.minecraft.world.spawner.PhantomSpawner; import net.minecraft.world.spawner.Spawner; +import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; @@ -37,6 +37,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import skylands.SkylandsMod; +import skylands.logic.Island; import java.util.List; import java.util.Optional; @@ -50,10 +51,15 @@ public abstract class ServerWorldMixin extends World implements StructureWorldAc @Shadow @Final private ServerEntityManager entityManager; @Mutable @Shadow @Final private List spawners; - protected ServerWorldMixin(MutableWorldProperties properties, RegistryKey registryRef, DynamicRegistryManager registryManager, RegistryEntry dimensionEntry, Supplier profiler, boolean isClient, boolean debugWorld, long biomeAccess, int maxChainedNeighborUpdates) { - super(properties, registryRef, registryManager, dimensionEntry, profiler, isClient, debugWorld, biomeAccess, maxChainedNeighborUpdates); + @Shadow + @NotNull + public abstract MinecraftServer getServer(); + + protected ServerWorldMixin(MutableWorldProperties properties, RegistryKey registryRef, RegistryEntry dimension, Supplier profiler, boolean isClient, boolean debugWorld, long seed, int maxChainedNeighborUpdates) { + super(properties, registryRef, dimension, profiler, isClient, debugWorld, seed, maxChainedNeighborUpdates); } + @Inject(method = "", at = @At("TAIL")) void init(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, ServerWorldProperties properties, RegistryKey worldKey, DimensionOptions dimensionOptions, WorldGenerationProgressListener worldGenerationProgressListener, boolean debugWorld, long seed, List spawners, boolean shouldTickTime, CallbackInfo ci) { @@ -62,9 +68,9 @@ void init(MinecraftServer server, Executor workerExecutor, LevelStorage.Session } if(worldKey.equals(World.OVERWORLD) && server.getFile("hub_template").exists()) { - var biome = server.getRegistryManager().get(RegistryKeys.BIOME).getEntry(server.getRegistryManager().get(RegistryKeys.BIOME).getOrThrow(BiomeKeys.PLAINS)); - FlatChunkGeneratorConfig flat = new FlatChunkGeneratorConfig(Optional.of(RegistryEntryList.of()), biome, List.of()); - FlatChunkGenerator generator = new FlatChunkGenerator(flat); + FlatChunkGeneratorConfig flat = new FlatChunkGeneratorConfig(Optional.empty(), BuiltinRegistries.BIOME); + flat.setBiome(getServer().getRegistryManager().get(Registry.BIOME_KEY).getOrCreateEntry(BiomeKeys.PLAINS)); + FlatChunkGenerator generator = new FlatChunkGenerator(Island.EMPTY_STRUCTURE_REGISTRY, flat); chunkManager = new ServerChunkManager( this.toServerWorld(), diff --git a/src/main/java/skylands/mixin/world/protection/ButtonMixin.java b/src/main/java/skylands/mixin/world/protection/ButtonMixin.java index b03369e..45b1c9e 100644 --- a/src/main/java/skylands/mixin/world/protection/ButtonMixin.java +++ b/src/main/java/skylands/mixin/world/protection/ButtonMixin.java @@ -1,7 +1,7 @@ package skylands.mixin.world.protection; +import net.minecraft.block.AbstractButtonBlock; import net.minecraft.block.BlockState; -import net.minecraft.block.ButtonBlock; import net.minecraft.block.WallMountedBlock; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.ActionResult; @@ -16,7 +16,7 @@ import skylands.util.Texts; import skylands.util.WorldProtection; -@Mixin(ButtonBlock.class) +@Mixin(AbstractButtonBlock.class) public abstract class ButtonMixin extends WallMountedBlock { public ButtonMixin(Settings settings) { diff --git a/src/main/java/skylands/util/TeleportUtil.java b/src/main/java/skylands/util/TeleportUtil.java new file mode 100644 index 0000000..0880b07 --- /dev/null +++ b/src/main/java/skylands/util/TeleportUtil.java @@ -0,0 +1,79 @@ +package skylands.util; + +import net.fabricmc.fabric.api.dimension.v1.FabricDimensions; +import net.minecraft.entity.Entity; +import net.minecraft.network.packet.s2c.play.DifficultyS2CPacket; +import net.minecraft.network.packet.s2c.play.PlayerRespawnS2CPacket; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ChunkTicketType; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.TeleportTarget; +import net.minecraft.world.WorldProperties; +import net.minecraft.world.biome.source.BiomeAccess; + +/** + * Backport of 1.19.4's ServerPlayerEntity#teleport method + */ +public class TeleportUtil { + + public static boolean teleport(ServerPlayerEntity player, ServerWorld world, double destX, double destY, double destZ) { + return teleport(player, world, destX, destY, destZ, 0, 0); + } + + public static boolean teleport(ServerPlayerEntity player, ServerWorld world, double destX, double destY, double destZ, float yaw, float pitch) { + ChunkPos chunkPos = new ChunkPos(new BlockPos(destX, destY, destZ)); + world.getChunkManager().addTicket(ChunkTicketType.POST_TELEPORT, chunkPos, 1, player.getId()); + player.stopRiding(); + if (player.isSleeping()) { + player.wakeUp(true, true); + } + + if (world == player.world) { + FabricDimensions.teleport(player, world, new TeleportTarget(new Vec3d(destX, destY, destZ), Vec3d.ZERO, yaw, pitch)); + } else { + teleportB(player, world, destX, destY, destZ, yaw, pitch); + } + + player.setHeadYaw(yaw); + return true; + } + + static void teleportB(ServerPlayerEntity player, ServerWorld targetWorld, double x, double y, double z, float yaw, float pitch) { + player.setCameraEntity(player); + player.stopRiding(); + if (targetWorld == player.world) { + player.networkHandler.requestTeleport(x, y, z, yaw, pitch); + } else { + ServerWorld serverWorld = player.getWorld(); + WorldProperties worldProperties = targetWorld.getLevelProperties(); + player.networkHandler + .sendPacket( + new PlayerRespawnS2CPacket( + targetWorld.getDimensionKey(), + targetWorld.getRegistryKey(), + BiomeAccess.hashSeed(targetWorld.getSeed()), + player.interactionManager.getGameMode(), + player.interactionManager.getPreviousGameMode(), + targetWorld.isDebugWorld(), + targetWorld.isFlat(), + true, + player.getLastDeathPos() + ) + ); + player.networkHandler.sendPacket(new DifficultyS2CPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); + player.server.getPlayerManager().sendCommandTree(player); + serverWorld.removePlayer(player, Entity.RemovalReason.CHANGED_DIMENSION); + player.unsetRemoved(); + player.refreshPositionAndAngles(x, y, z, yaw, pitch); + player.setWorld(targetWorld); + targetWorld.onPlayerTeleport(player); + player.worldChanged(serverWorld); + player.networkHandler.requestTeleport(x, y, z, yaw, pitch); + player.server.getPlayerManager().sendWorldInfo(player, targetWorld); + player.server.getPlayerManager().sendPlayerStatus(player); + } + } +} diff --git a/src/main/java/skylands/util/Worlds.java b/src/main/java/skylands/util/Worlds.java index a8bdca0..62769a1 100644 --- a/src/main/java/skylands/util/Worlds.java +++ b/src/main/java/skylands/util/Worlds.java @@ -1,6 +1,6 @@ package skylands.util; -import net.minecraft.registry.RegistryKey; +import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.World; import skylands.SkylandsMod; import skylands.logic.Island; diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 35d86b5..9bae18f 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -39,7 +39,7 @@ "depends": { "fabricloader": "*", "fabric": "*", - "minecraft": ">=1.19.4", + "minecraft": ">=1.19", "java": ">=17" } } diff --git a/src/main/resources/skylands.accesswidener b/src/main/resources/skylands.accesswidener index 0b8698b..702bbd0 100644 --- a/src/main/resources/skylands.accesswidener +++ b/src/main/resources/skylands.accesswidener @@ -1 +1,3 @@ accessWidener v1 named +accessible method net/minecraft/entity/Entity unsetRemoved ()V +accessible method net/minecraft/server/network/ServerPlayerEntity worldChanged (Lnet/minecraft/server/world/ServerWorld;)V