diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d2373f..5252767 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +**Beta 0.1.6** +* Improve Energy Teleporter Reliability + **Beta 0.1.5** * Fix Energy Teleporter Y Issues Again diff --git a/gradle.properties b/gradle.properties index bb34eb3..1a021d4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ org.gradle.jvmargs = -Xmx1G fabric_loader_version = 0.9.0+build.204 # Mod Properties - mod_version = 0.1.5 + mod_version = 0.1.6 maven_group = com.thebrokenrail # Dependencies diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyPortalBlock.java b/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyPortalBlock.java index c0418c6..daf09c3 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyPortalBlock.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyPortalBlock.java @@ -140,11 +140,13 @@ public class EnergyPortalBlock extends SimpleBlock { public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { super.onEntityCollision(state, world, pos, entity); - if (!world.isClient() && !entity.hasVehicle() && entity.canUsePortals() && VoxelShapes.matchesAnywhere(VoxelShapes.cuboid(entity.getBoundingBox().offset(-pos.getX(), -pos.getY(), -pos.getZ())), state.getOutlineShape(world, pos), BooleanBiFunction.AND)) { + World entityWorld = entity.getEntityWorld(); + + if (entityWorld == world && !entityWorld.isClient() && !entity.hasVehicle() && entity.canUsePortals() && VoxelShapes.matchesAnywhere(VoxelShapes.cuboid(entity.getBoundingBox().offset(-pos.getX(), -pos.getY(), -pos.getZ())), state.getOutlineShape(entityWorld, pos), BooleanBiFunction.AND)) { boolean cooling = ((PortalCooldownEntity) entity).isEnergyPortalCooldown(); ((PortalCooldownEntity) entity).resetEnergyPortalCooldown(); if (!cooling) { - EnergyTeleporter.teleport((ServerWorld) world, entity.getPos(), pos, entity); + EnergyTeleporter.teleport((ServerWorld) entityWorld, entity.getPos(), pos, entity); } } } diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyTeleporter.java b/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyTeleporter.java index 1eb350e..49fc7b4 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyTeleporter.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/portal/EnergyTeleporter.java @@ -2,6 +2,7 @@ package com.thebrokenrail.energonrelics.block.portal; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.thebrokenrail.energonrelics.config.HardcodedConfig; +import com.thebrokenrail.energonrelics.mixin.ServerPlayerEntityAccessor; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -19,13 +20,19 @@ import net.minecraft.world.Heightmap; import net.minecraft.world.World; import java.util.EnumSet; -import java.util.UUID; class EnergyTeleporter { private static void teleport(Entity entity, ServerWorld to, Vec3d pos) { + if (entity instanceof ServerPlayerEntity) { + ((ServerPlayerEntityAccessor) entity).setInTeleportationState(true); + } try { TeleportCommand.teleport(null, entity, to, pos.getX(), pos.getY(), pos.getZ(), EnumSet.noneOf(PlayerPositionLookS2CPacket.Flag.class), entity.yaw, entity.pitch, null); - } catch (CommandSyntaxException ignored) { + } catch (CommandSyntaxException e) { + throw new RuntimeException(e); + } + if (entity instanceof ServerPlayerEntity) { + ((ServerPlayerEntity) entity).networkHandler.syncWithPlayerPosition(); } } @@ -33,8 +40,6 @@ class EnergyTeleporter { BlockPos center = EnergyPortalBlock.getCenterPos(world, blockPos); Vec3d offset = pos.subtract(Vec3d.ofBottomCenter(center)); - UUID uuid = entity.getUuid(); - RegistryKey worldKey = world.getRegistryKey(); if (worldKey == World.OVERWORLD) { teleportWithMultiplier(world, entity, center, offset, World.NETHER, 1d / HardcodedConfig.ENERGY_PORTAL_MULTIPLIER); @@ -45,15 +50,12 @@ class EnergyTeleporter { } if (entity instanceof ServerPlayerEntity) { - ServerPlayerEntity player = world.getServer().getPlayerManager().getPlayer(uuid); - if (player != null) { - player.playSound(SoundEvents.BLOCK_PORTAL_TRAVEL, SoundCategory.PLAYERS, 0.25f, world.random.nextFloat() * 0.4f + 0.8f); - } + ((ServerPlayerEntity) entity).playSound(SoundEvents.BLOCK_PORTAL_TRAVEL, SoundCategory.PLAYERS, 0.25f, world.random.nextFloat() * 0.4f + 0.8f); } } private static int convertY(int y, int oldHeight, int newHeight) { - int newY = (int) (((float) y / (float) oldHeight) * (float) newHeight); + int newY = (int) (((float) newHeight / (float) oldHeight) * (float) y); int bottomY = HardcodedConfig.ENERGY_PORTAL_Y_PADDING; int topY = newHeight - (bottomY + HardcodedConfig.ENERGY_PORTAL_Y_PADDING_EXTRA_TOP); diff --git a/src/main/java/com/thebrokenrail/energonrelics/mixin/ServerPlayerEntityAccessor.java b/src/main/java/com/thebrokenrail/energonrelics/mixin/ServerPlayerEntityAccessor.java new file mode 100644 index 0000000..7433268 --- /dev/null +++ b/src/main/java/com/thebrokenrail/energonrelics/mixin/ServerPlayerEntityAccessor.java @@ -0,0 +1,11 @@ +package com.thebrokenrail.energonrelics.mixin; + +import net.minecraft.server.network.ServerPlayerEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ServerPlayerEntity.class) +public interface ServerPlayerEntityAccessor { + @Accessor + void setInTeleportationState(boolean inTeleportationState); +} diff --git a/src/main/resources/energonrelics.mixins.json b/src/main/resources/energonrelics.mixins.json index 509788d..fb53b06 100644 --- a/src/main/resources/energonrelics.mixins.json +++ b/src/main/resources/energonrelics.mixins.json @@ -15,7 +15,8 @@ "MixinEntity", "MixinLivingEntity", "MixinMinecraftServer", - "MixinWorld" + "MixinWorld", + "ServerPlayerEntityAccessor" ], "injectors": { "defaultRequire": 1