This commit is contained in:
paulevsGitch 2021-01-14 06:52:03 +03:00
parent 9c31454a46
commit fcce1b363b
3 changed files with 20 additions and 26 deletions

View file

@ -95,10 +95,17 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable
if (destination.getRegistryKey() == World.OVERWORLD) { if (destination.getRegistryKey() == World.OVERWORLD) {
//player.teleport(destination, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch); //player.teleport(destination, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch);
//player.updatePositionAndAngles(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch); //player.updatePositionAndAngles(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch);
player.moveToWorld(destination); //player.moveToWorld(destination);
player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); //player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5);
//player.updatePositionAndAngles(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch); //player.updatePositionAndAngles(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.yaw, player.pitch);
//player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); //player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5);
//player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5);
// The most safe way
player.moveToWorld(destination);
//player.teleport(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5);
} }
else { else {
player.moveToWorld(destination); player.moveToWorld(destination);

View file

@ -1,7 +1,5 @@
package ru.betterend.mixin.common; package ru.betterend.mixin.common;
import java.util.Map;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
@ -9,8 +7,6 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import com.google.common.collect.Maps;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
@ -22,7 +18,7 @@ import ru.betterend.interfaces.TeleportingEntity;
@Mixin(Entity.class) @Mixin(Entity.class)
public abstract class EntityMixin implements TeleportingEntity { public abstract class EntityMixin implements TeleportingEntity {
private static final Map<Entity, BlockPos> EXIT_POS = Maps.newHashMap(); private BlockPos exitPos;
@Shadow @Shadow
public float yaw; public float yaw;
@ -68,7 +64,7 @@ public abstract class EntityMixin implements TeleportingEntity {
((ServerWorld) world).resetIdleTimeout(); ((ServerWorld) world).resetIdleTimeout();
destination.resetIdleTimeout(); destination.resetIdleTimeout();
this.world.getProfiler().pop(); this.world.getProfiler().pop();
be_resetTeleport(); beResetTeleport();
info.setReturnValue(entity); info.setReturnValue(entity);
info.cancel(); info.cancel();
} }
@ -78,9 +74,8 @@ public abstract class EntityMixin implements TeleportingEntity {
@Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true) @Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true)
protected void be_getTeleportTarget(ServerWorld destination, CallbackInfoReturnable<TeleportTarget> info) { protected void be_getTeleportTarget(ServerWorld destination, CallbackInfoReturnable<TeleportTarget> info) {
if (beCanTeleport()) { if (beCanTeleport()) {
BlockPos pos = EXIT_POS.get(be_getSelf()); info.setReturnValue(new TeleportTarget(new Vec3d(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getVelocity(), yaw, pitch));
info.setReturnValue(new TeleportTarget(new Vec3d(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5), getVelocity(), yaw, pitch)); beResetTeleport();
be_resetTeleport();
info.cancel(); info.cancel();
} }
} }
@ -90,19 +85,19 @@ public abstract class EntityMixin implements TeleportingEntity {
@Override @Override
public void beSetExitPos(BlockPos pos) { public void beSetExitPos(BlockPos pos) {
EXIT_POS.put(be_getSelf(), pos.toImmutable()); exitPos = pos.toImmutable();
} }
private void be_resetTeleport() { public void beResetTeleport() {
EXIT_POS.remove(be_getSelf()); exitPos = null;
} }
@Override @Override
public boolean beCanTeleport() { public boolean beCanTeleport() {
return EXIT_POS.containsKey(be_getSelf()); return exitPos != null;
} }
private Entity be_getSelf() { public BlockPos beGetExit() {
return (Entity) (Object) this; return exitPos;
} };
} }

View file

@ -4,13 +4,10 @@ import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.TeleportTarget;
@Mixin(ServerPlayerEntity.class) @Mixin(ServerPlayerEntity.class)
public class ServerPlayerEntityMixin { public class ServerPlayerEntityMixin {
@ -20,9 +17,4 @@ public class ServerPlayerEntityMixin {
info.cancel(); info.cancel();
} }
} }
@Inject(method = "getTeleportTarget", at = @At("HEAD"), cancellable = true)
protected void be_getTeleportTarget(ServerWorld destination, CallbackInfoReturnable<TeleportTarget> info) {
info.setReturnValue(new TeleportTarget(new Vec3d(0, 100, 0), Vec3d.ZERO, 0, 0));
}
} }