Skip to content

Commit c13e392

Browse files
committed
Fix teleportation bug, apply void air effects before tele out
1 parent 90f7169 commit c13e392

File tree

3 files changed

+38
-28
lines changed

3 files changed

+38
-28
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package dev.compactmods.machines.location;
2+
3+
import net.minecraft.server.level.ServerLevel;
4+
import net.minecraft.world.entity.Entity;
5+
import net.minecraft.world.phys.Vec3;
6+
import net.minecraftforge.common.util.ITeleporter;
7+
8+
import java.util.function.Function;
9+
10+
public record SimpleTeleporter(Vec3 pos) implements ITeleporter {
11+
12+
public static SimpleTeleporter to(Vec3 pos) {
13+
return new SimpleTeleporter(pos);
14+
}
15+
16+
@Override
17+
public Entity placeEntity(Entity entity, ServerLevel currentWorld, ServerLevel destWorld, float yaw, Function<Boolean, Entity> repositionEntity) {
18+
entity = repositionEntity.apply(false);
19+
entity.teleportTo(pos.x, pos.y, pos.z);
20+
return entity;
21+
}
22+
}

src/main/java/dev/compactmods/machines/util/PlayerUtil.java

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,16 @@
44
import dev.compactmods.machines.CompactMachines;
55
import dev.compactmods.machines.advancement.AdvancementTriggers;
66
import dev.compactmods.machines.api.core.Messages;
7+
import dev.compactmods.machines.api.room.IRoomHistory;
8+
import dev.compactmods.machines.api.room.history.IRoomHistoryItem;
79
import dev.compactmods.machines.core.Capabilities;
810
import dev.compactmods.machines.core.MissingDimensionException;
911
import dev.compactmods.machines.core.Registration;
1012
import dev.compactmods.machines.i18n.TranslationUtil;
1113
import dev.compactmods.machines.location.PreciseDimensionalPosition;
14+
import dev.compactmods.machines.location.SimpleTeleporter;
1215
import dev.compactmods.machines.machine.CompactMachineBlockEntity;
1316
import dev.compactmods.machines.room.Rooms;
14-
import dev.compactmods.machines.api.room.IRoomHistory;
15-
import dev.compactmods.machines.api.room.history.IRoomHistoryItem;
1617
import dev.compactmods.machines.room.exceptions.NonexistentRoomException;
1718
import dev.compactmods.machines.room.history.PlayerRoomHistoryItem;
1819
import net.minecraft.core.BlockPos;
@@ -23,9 +24,9 @@
2324
import net.minecraft.world.level.ChunkPos;
2425
import net.minecraft.world.level.Level;
2526
import net.minecraft.world.level.LevelAccessor;
26-
import net.minecraft.world.level.chunk.LevelChunk;
2727
import net.minecraft.world.phys.Vec3;
2828
import net.minecraftforge.common.util.LazyOptional;
29+
2930
import javax.annotation.Nonnull;
3031
import java.util.Optional;
3132
import java.util.UUID;
@@ -48,7 +49,7 @@ public static void teleportPlayerIntoMachine(Level machineLevel, Player player,
4849
throw new MissingDimensionException("Compact dimension not found; player attempted to enter machine.");
4950
}
5051

51-
if(machineLevel.getBlockEntity(machinePos) instanceof CompactMachineBlockEntity tile) {
52+
if (machineLevel.getBlockEntity(machinePos) instanceof CompactMachineBlockEntity tile) {
5253
final var targetRoom = tile.getConnectedRoom();
5354
boolean grantAdvancement = targetRoom.isEmpty();
5455

@@ -62,11 +63,12 @@ public static void teleportPlayerIntoMachine(Level machineLevel, Player player,
6263
}
6364

6465
try {
66+
final var entry = PreciseDimensionalPosition.fromPlayer(player);
67+
6568
teleportPlayerIntoRoom(serv, player, room, grantAdvancement);
6669

6770
// Mark the player as inside the machine, set external spawn, and yeet
6871
player.getCapability(Capabilities.ROOM_HISTORY).ifPresent(hist -> {
69-
var entry = PreciseDimensionalPosition.fromPlayer(player);
7072
hist.addHistory(new PlayerRoomHistoryItem(entry, tile.getLevelPosition()));
7173
});
7274
} catch (MissingDimensionException | NonexistentRoomException e) {
@@ -91,13 +93,7 @@ public static void teleportPlayerIntoRoom(MinecraftServer serv, Player player, C
9193
Vec3 sr = spawn.getRotation().orElse(new Vec3(player.xRotO, player.yRotO, 0));
9294

9395
if (player instanceof ServerPlayer servPlayer) {
94-
servPlayer.teleportTo(
95-
compactDim,
96-
sp.x,
97-
sp.y,
98-
sp.z,
99-
(float) sr.y,
100-
(float) sr.x);
96+
servPlayer.changeDimension(compactDim, SimpleTeleporter.to(sp));
10197

10298
if (grantAdvancement)
10399
AdvancementTriggers.getTriggerForMachineClaim(roomSize).trigger(servPlayer);
@@ -117,8 +113,6 @@ public static void teleportPlayerOutOfMachine(ServerLevel world, @Nonnull Server
117113
}
118114

119115
history.ifPresent(hist -> {
120-
ChunkPos currentRoomChunk = new ChunkPos(serverPlayer.blockPosition());
121-
122116
if (hist.hasHistory()) {
123117
final IRoomHistoryItem prevArea = hist.pop();
124118

@@ -130,18 +124,13 @@ public static void teleportPlayerOutOfMachine(ServerLevel world, @Nonnull Server
130124
worldPos = spawnPoint.getExactPosition();
131125
entryRot = spawnPoint.getRotation().orElse(Vec3.ZERO);
132126

133-
serverPlayer.teleportTo(level, worldPos.x(), worldPos.y(), worldPos.z(), (float) entryRot.y, (float) entryRot.x);
127+
serverPlayer.changeDimension(level, SimpleTeleporter.to(worldPos));
134128
} else {
135129
howDidYouGetThere(serverPlayer);
136130

137131
hist.clear();
138132
teleportPlayerToRespawnOrOverworld(serv, serverPlayer);
139133
}
140-
141-
final LevelChunk chunk = serv.getLevel(Registration.COMPACT_DIMENSION)
142-
.getChunk(currentRoomChunk.x, currentRoomChunk.z);
143-
144-
// TODO - Send changed players packet to other clients
145134
});
146135
}
147136

@@ -161,6 +150,6 @@ public static void teleportPlayerToRespawnOrOverworld(MinecraftServer serv, @Non
161150
if (player.getRespawnPosition() != null)
162151
worldPos = LocationUtil.blockPosToVector(player.getRespawnPosition());
163152

164-
player.teleportTo(level, worldPos.x(), worldPos.y(), worldPos.z(), 0, player.getRespawnAngle());
153+
player.changeDimension(level, SimpleTeleporter.to(worldPos));
165154
}
166155
}

src/main/java/dev/compactmods/machines/wall/MachineVoidAir.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
package dev.compactmods.machines.wall;
22

3-
import dev.compactmods.machines.CompactMachines;
3+
import dev.compactmods.machines.api.room.IRoomHistory;
44
import dev.compactmods.machines.config.ServerConfig;
5-
import dev.compactmods.machines.core.Registration;
5+
import dev.compactmods.machines.core.Capabilities;
66
import dev.compactmods.machines.util.PlayerUtil;
77
import net.minecraft.core.BlockPos;
8-
import net.minecraft.server.level.ServerLevel;
98
import net.minecraft.server.level.ServerPlayer;
109
import net.minecraft.world.damagesource.DamageSource;
1110
import net.minecraft.world.effect.MobEffectInstance;
@@ -36,13 +35,13 @@ public void entityInside(BlockState pState, Level pLevel, BlockPos pPos, Entity
3635
if (pEntity instanceof ServerPlayer player) {
3736
if (player.isCreative()) return;
3837

39-
if (player.getActiveEffectsMap().containsKey(MobEffects.BLINDNESS))
40-
PlayerUtil.teleportPlayerOutOfMachine((ServerLevel) pLevel, player);
41-
42-
4338
player.addEffect(new MobEffectInstance(MobEffects.POISON, 5 * 20));
4439
player.addEffect(new MobEffectInstance(MobEffects.BLINDNESS, 5 * 20));
4540
player.hurt(DAMAGE_SOURCE, 1);
41+
42+
PlayerUtil.howDidYouGetThere(player);
43+
player.getCapability(Capabilities.ROOM_HISTORY).ifPresent(IRoomHistory::clear);
44+
PlayerUtil.teleportPlayerToRespawnOrOverworld(player.server, player);
4645
}
4746
}
4847
}

0 commit comments

Comments
 (0)