diff --git a/src/main/java/org/betterx/betterend/interfaces/TeleportingEntity.java b/src/main/java/org/betterx/betterend/interfaces/TeleportingEntity.java deleted file mode 100644 index d5c38f97..00000000 --- a/src/main/java/org/betterx/betterend/interfaces/TeleportingEntity.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.betterx.betterend.interfaces; - -import net.minecraft.core.BlockPos; - -public interface TeleportingEntity { - void be_setExitPos(BlockPos pos); - - void be_resetExitPos(); - - boolean be_canTeleport(); -} diff --git a/src/main/java/org/betterx/betterend/mixin/common/EntityMixin.java b/src/main/java/org/betterx/betterend/mixin/common/EntityMixin.java deleted file mode 100644 index 21261527..00000000 --- a/src/main/java/org/betterx/betterend/mixin/common/EntityMixin.java +++ /dev/null @@ -1,111 +0,0 @@ -package org.betterx.betterend.mixin.common; - -import org.betterx.betterend.interfaces.TeleportingEntity; - -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.portal.PortalInfo; -import net.minecraft.world.phys.Vec3; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(Entity.class) -public abstract class EntityMixin implements TeleportingEntity { - @Shadow - private float yRot; - @Shadow - private float xRot; - - @Shadow - public Level level; - - @Final - @Shadow - public abstract void unRide(); - - @Shadow - public abstract Vec3 getDeltaMovement(); - - @Shadow - public abstract EntityType getType(); - - @Shadow - protected abstract PortalInfo findDimensionEntryPoint(ServerLevel destination); - - @Shadow - protected abstract void removeAfterChangingDimensions(); - - @Shadow - public abstract boolean isRemoved(); - - private BlockPos exitPos; - - @Inject(method = "changeDimension", at = @At("HEAD"), cancellable = true) - public void be_changeDimension(ServerLevel destination, CallbackInfoReturnable info) { - if (!isRemoved() && be_canTeleport() && level instanceof ServerLevel) { - unRide(); - level.getProfiler().push("changeDimension"); - level.getProfiler().push("reposition"); - PortalInfo teleportTarget = findDimensionEntryPoint(destination); - if (teleportTarget != null) { - level.getProfiler().popPush("reloading"); - Entity entity = getType().create(destination); - if (entity != null) { - entity.restoreFrom(Entity.class.cast(this)); - entity.moveTo( - teleportTarget.pos.x, - teleportTarget.pos.y, - teleportTarget.pos.z, - teleportTarget.yRot, - entity.getXRot() - ); - entity.setDeltaMovement(teleportTarget.speed); - destination.addDuringTeleport(entity); - } - - this.removeAfterChangingDimensions(); - level.getProfiler().pop(); - ((ServerLevel) level).resetEmptyTime(); - destination.resetEmptyTime(); - level.getProfiler().pop(); - be_resetExitPos(); - info.setReturnValue(entity); - } - } - } - - @Inject(method = "findDimensionEntryPoint", at = @At("HEAD"), cancellable = true) - protected void be_findDimensionEntryPoint(ServerLevel destination, CallbackInfoReturnable info) { - if (be_canTeleport()) { - info.setReturnValue(new PortalInfo( - new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), - getDeltaMovement(), - yRot, - xRot - )); - } - } - - @Override - public void be_setExitPos(BlockPos pos) { - this.exitPos = pos.immutable(); - } - - @Override - public void be_resetExitPos() { - this.exitPos = null; - } - - @Override - public boolean be_canTeleport() { - return this.exitPos != null; - } -} diff --git a/src/main/java/org/betterx/betterend/mixin/common/ServerLevelMixin.java b/src/main/java/org/betterx/betterend/mixin/common/ServerLevelMixin.java index cbdbdc55..908ecd6b 100644 --- a/src/main/java/org/betterx/betterend/mixin/common/ServerLevelMixin.java +++ b/src/main/java/org/betterx/betterend/mixin/common/ServerLevelMixin.java @@ -39,7 +39,6 @@ import java.util.function.Supplier; @Mixin(ServerLevel.class) public abstract class ServerLevelMixin extends Level { - private final static List> BE_TEST_DIMENSIONS = List.of( BuiltinDimensionTypes.OVERWORLD, BuiltinDimensionTypes.OVERWORLD_CAVES, diff --git a/src/main/java/org/betterx/betterend/mixin/common/ServerPlayerMixin.java b/src/main/java/org/betterx/betterend/mixin/common/ServerPlayerMixin.java index b95f0a4b..bacaa60a 100644 --- a/src/main/java/org/betterx/betterend/mixin/common/ServerPlayerMixin.java +++ b/src/main/java/org/betterx/betterend/mixin/common/ServerPlayerMixin.java @@ -1,27 +1,16 @@ package org.betterx.betterend.mixin.common; -import org.betterx.betterend.interfaces.TeleportingEntity; import org.betterx.betterend.world.generator.GeneratorOptions; import com.mojang.authlib.GameProfile; import net.minecraft.core.BlockPos; -import net.minecraft.network.protocol.game.*; -import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.level.ServerPlayerGameMode; -import net.minecraft.server.network.ServerGamePacketListenerImpl; -import net.minecraft.server.players.PlayerList; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.minecraft.world.level.biome.BiomeManager; import net.minecraft.world.level.portal.PortalInfo; -import net.minecraft.world.level.storage.LevelData; import net.minecraft.world.phys.Vec3; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -29,35 +18,12 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.Optional; - @Mixin(ServerPlayer.class) -public abstract class ServerPlayerMixin extends Player implements TeleportingEntity { - @Shadow - public ServerGamePacketListenerImpl connection; - @Final - @Shadow - public ServerPlayerGameMode gameMode; - @Final - @Shadow - public MinecraftServer server; - @Shadow - private boolean isChangingDimension; - @Shadow - private float lastSentHealth; - @Shadow - private int lastSentFood; - @Shadow - private int lastSentExp; - - private BlockPos exitPos; - private int be_teleportDelay = 0; - +public abstract class ServerPlayerMixin extends Player { public ServerPlayerMixin(Level level, BlockPos blockPos, float f, GameProfile gameProfile) { super(level, blockPos, f, gameProfile); } - - + @Inject(method = "createEndPlatform", at = @At("HEAD"), cancellable = true) private void be_createEndSpawnPlatform(ServerLevel world, BlockPos centerPos, CallbackInfo info) { if (!GeneratorOptions.generateObsidianPlatform()) { @@ -67,114 +33,15 @@ public abstract class ServerPlayerMixin extends Player implements TeleportingEnt @Inject(method = "findDimensionEntryPoint", at = @At("HEAD"), cancellable = true) protected void be_getTeleportTarget(ServerLevel destination, CallbackInfoReturnable info) { - if (be_canTeleport()) { - info.setReturnValue(new PortalInfo( - new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), - getDeltaMovement(), - getYRot(), - getXRot() - )); - } else if (GeneratorOptions.changeSpawn() && destination.dimension() == Level.END) { + if (GeneratorOptions.changeSpawn() && destination.dimension() == Level.END) { BlockPos spawn = GeneratorOptions.getSpawn(); Vec3 pos = new Vec3(spawn.getX() + 0.5, spawn.getY(), spawn.getZ() + 0.5); info.setReturnValue(new PortalInfo(pos, Vec3.ZERO, 90.0F, 0.0F)); } } - @Inject(method = "changeDimension", at = @At("HEAD"), cancellable = true) - public void be_changeDimension(ServerLevel destination, CallbackInfoReturnable info) { - if (be_canTeleport() && level() instanceof ServerLevel) { - isChangingDimension = true; - ServerLevel serverWorld = serverLevel(); - LevelData worldProperties = destination.getLevelData(); - ServerPlayer player = ServerPlayer.class.cast(this); - - connection.send(new ClientboundRespawnPacket( - destination.dimensionTypeId(), - destination.dimension(), - BiomeManager.obfuscateSeed(destination.getSeed()), - gameMode.getGameModeForPlayer(), - gameMode.getPreviousGameModeForPlayer(), - destination.isDebug(), - destination.isFlat(), - (byte) 1, - Optional.empty(), - getPortalCooldown() - )); - connection.send(new ClientboundChangeDifficultyPacket( - worldProperties.getDifficulty(), - worldProperties.isDifficultyLocked() - )); - PlayerList playerManager = server.getPlayerList(); - playerManager.sendPlayerPermissionLevel(player); - serverWorld.removePlayerImmediately(player, RemovalReason.CHANGED_DIMENSION); - unsetRemoved(); - PortalInfo teleportTarget = findDimensionEntryPoint(destination); - if (teleportTarget != null) { - serverWorld.getProfiler().push("moving"); - serverWorld.getProfiler().pop(); - serverWorld.getProfiler().push("placing"); - this.setLevel(destination); - destination.addDuringPortalTeleport(player); - setRot(teleportTarget.yRot, teleportTarget.xRot); - moveTo(teleportTarget.pos.x, teleportTarget.pos.y, teleportTarget.pos.z); - serverWorld.getProfiler().pop(); - triggerDimensionChangeTriggers(serverWorld); - gameMode.setLevel(destination); - connection.send(new ClientboundPlayerAbilitiesPacket(getAbilities())); - playerManager.sendLevelInfo(player, destination); - playerManager.sendAllPlayerInfo(player); - - for (MobEffectInstance statusEffectInstance : getActiveEffects()) { - connection.send(new ClientboundUpdateMobEffectPacket(getId(), statusEffectInstance)); - } - - connection.send(new ClientboundLevelEventPacket(1032, BlockPos.ZERO, 0, false)); - lastSentExp = -1; - lastSentHealth = -1.0F; - lastSentFood = -1; - } - be_teleportDelay = 100; - be_resetExitPos(); - info.setReturnValue(player); - } - } - - @Inject(method = "tick", at = @At("TAIL")) - public void be_decreaseCooldawn(CallbackInfo info) { - if (be_teleportDelay > 0) be_teleportDelay--; - } - - @Override - public int getDimensionChangingDelay() { - if (be_teleportDelay > 0) { - return be_teleportDelay; - } - return super.getDimensionChangingDelay(); - } - - @Shadow - abstract void triggerDimensionChangeTriggers(ServerLevel origin); - @Shadow @Override protected abstract PortalInfo findDimensionEntryPoint(ServerLevel destination); - @Shadow - public abstract ServerLevel serverLevel(); - - @Override - public void be_setExitPos(BlockPos pos) { - this.exitPos = pos.immutable(); - } - - @Override - public void be_resetExitPos() { - this.exitPos = null; - } - - @Override - public boolean be_canTeleport() { - return this.exitPos != null; - } } diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index fe4fd534..b8cb7274 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -14,7 +14,6 @@ "EnderManMixin", "EndPodiumFeatureMixin", "EndSpikeMixin", - "EntityMixin", "LevelMixin", "LivingEntityMixin", "NoiseBasedChunkGeneratorAccessor",