mirror of
https://github.com/Minestom/Minestom.git
synced 2025-01-04 23:47:59 +01:00
Special case when an entity is teleported in the same chunk
This commit is contained in:
parent
460585ae9b
commit
69e8792ce0
@ -33,6 +33,7 @@ import net.minestom.server.potion.TimedPotion;
|
|||||||
import net.minestom.server.tag.Tag;
|
import net.minestom.server.tag.Tag;
|
||||||
import net.minestom.server.tag.TagHandler;
|
import net.minestom.server.tag.TagHandler;
|
||||||
import net.minestom.server.thread.ThreadProvider;
|
import net.minestom.server.thread.ThreadProvider;
|
||||||
|
import net.minestom.server.utils.async.AsyncUtils;
|
||||||
import net.minestom.server.utils.chunk.ChunkUtils;
|
import net.minestom.server.utils.chunk.ChunkUtils;
|
||||||
import net.minestom.server.utils.entity.EntityUtils;
|
import net.minestom.server.utils.entity.EntityUtils;
|
||||||
import net.minestom.server.utils.player.PlayerUtils;
|
import net.minestom.server.utils.player.PlayerUtils;
|
||||||
@ -239,21 +240,26 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler
|
|||||||
* can be null or empty to only load the chunk at {@code position}
|
* can be null or empty to only load the chunk at {@code position}
|
||||||
* @throws IllegalStateException if you try to teleport an entity before settings its instance
|
* @throws IllegalStateException if you try to teleport an entity before settings its instance
|
||||||
*/
|
*/
|
||||||
public @NotNull CompletableFuture<Void> teleport(@NotNull Pos position, @Nullable long[] chunks) {
|
public @NotNull CompletableFuture<Void> teleport(@NotNull Pos position, long @Nullable [] chunks) {
|
||||||
Check.stateCondition(instance == null, "You need to use Entity#setInstance before teleporting an entity!");
|
Check.stateCondition(instance == null, "You need to use Entity#setInstance before teleporting an entity!");
|
||||||
CompletableFuture<Void> completableFuture = new CompletableFuture<>();
|
|
||||||
final Runnable endCallback = () -> {
|
final Runnable endCallback = () -> {
|
||||||
refreshPosition(position);
|
refreshPosition(position);
|
||||||
synchronizePosition(true);
|
synchronizePosition(true);
|
||||||
completableFuture.complete(null);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if (chunks == null || chunks.length == 0) {
|
if (chunks != null && chunks.length > 0) {
|
||||||
instance.loadOptionalChunk(position).thenRun(endCallback);
|
// Chunks need to be loaded before the teleportation can happen
|
||||||
} else {
|
return ChunkUtils.optionalLoadAll(instance, chunks, null).thenRun(endCallback);
|
||||||
ChunkUtils.optionalLoadAll(instance, chunks, null).thenRun(endCallback);
|
}
|
||||||
|
final Pos currentPosition = this.position;
|
||||||
|
if (!currentPosition.sameChunk(position)) {
|
||||||
|
// Ensure that the chunk is loaded
|
||||||
|
return instance.loadOptionalChunk(position).thenRun(endCallback);
|
||||||
|
} else {
|
||||||
|
// Position is in the same chunk, keep it sync
|
||||||
|
endCallback.run();
|
||||||
|
return AsyncUtils.empty();
|
||||||
}
|
}
|
||||||
return completableFuture;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull CompletableFuture<Void> teleport(@NotNull Pos position) {
|
public @NotNull CompletableFuture<Void> teleport(@NotNull Pos position) {
|
||||||
|
@ -57,7 +57,7 @@ public final class RelativeVec {
|
|||||||
*/
|
*/
|
||||||
public @NotNull Vec from(@Nullable Entity entity) {
|
public @NotNull Vec from(@Nullable Entity entity) {
|
||||||
if (entity != null) {
|
if (entity != null) {
|
||||||
return from(entity.getPosition().add(0, entity.getEyeHeight(), 0));
|
return from(entity.getPosition());
|
||||||
} else {
|
} else {
|
||||||
return from(Pos.ZERO);
|
return from(Pos.ZERO);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user