9
0
mirror of https://github.com/LeavesMC/Leaves.git synced 2026-01-04 15:41:31 +00:00

Support bot change dimension

This commit is contained in:
Lumine1909
2025-05-11 06:09:26 -04:00
parent 030b12874d
commit 5c22bd8c8d
2 changed files with 76 additions and 13 deletions

View File

@@ -188,7 +188,7 @@ index e29dd7c4759319fffea46bca17b65df412eca6f5..b1821dc6bfdda93431e2f43d5de6ecc6
}
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
index 568b6e60482c61363b6052c73fbc26a2ba19d5df..2e85dcfa644e45de14d951edc6c5bf16beb6cd10 100644
index 568b6e60482c61363b6052c73fbc26a2ba19d5df..c14ef70b9ea249688f747b44cb0039a12cb2fdaf 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
@@ -209,7 +209,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
@@ -200,6 +200,26 @@ index 568b6e60482c61363b6052c73fbc26a2ba19d5df..2e85dcfa644e45de14d951edc6c5bf16
private final PlayerAdvancements advancements;
private final ServerStatsCounter stats;
private float lastRecordedHealthAndAbsorption = Float.MIN_VALUE;
@@ -218,8 +218,8 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
private int lastRecordedArmor = Integer.MIN_VALUE;
private int lastRecordedLevel = Integer.MIN_VALUE;
private int lastRecordedExperience = Integer.MIN_VALUE;
- private float lastSentHealth = -1.0E8F;
- private int lastSentFood = -99999999;
+ protected float lastSentHealth = -1.0E8F;
+ protected int lastSentFood = -99999999;
private boolean lastFoodSaturationZero = true;
public int lastSentExp = -99999999;
private ChatVisiblity chatVisibility = ChatVisiblity.FULL;
@@ -241,7 +241,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
@Nullable
private Vec3 startingToFallPosition;
@Nullable
- private Vec3 enteredNetherPosition;
+ protected Vec3 enteredNetherPosition;
@Nullable
private Vec3 enteredLavaOnVehiclePosition;
private SectionPos lastSectionPos = SectionPos.of(0, 0, 0);
@@ -1413,6 +1413,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
this.lastSentHealth = -1.0F;
this.lastSentFood = -1;

View File

@@ -11,17 +11,24 @@ import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.StringTag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.ClientboundChangeDifficultyPacket;
import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket;
import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket;
import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket;
import net.minecraft.network.protocol.game.ClientboundRespawnPacket;
import net.minecraft.network.protocol.game.ClientboundRotateHeadPacket;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ChunkMap;
import net.minecraft.server.level.ClientInformation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerPlayerConnection;
import net.minecraft.server.players.PlayerList;
import net.minecraft.stats.ServerStatsCounter;
import net.minecraft.util.Mth;
import net.minecraft.util.profiling.Profiler;
import net.minecraft.util.profiling.ProfilerFiller;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.SimpleMenuProvider;
@@ -36,9 +43,11 @@ import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.ChestMenu;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.GameRules;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.level.portal.TeleportTransition;
import net.minecraft.world.level.storage.LevelData;
import net.minecraft.world.phys.EntityHitResult;
import org.bukkit.Bukkit;
import org.bukkit.Location;
@@ -214,26 +223,60 @@ public class ServerBot extends ServerPlayer {
}
@Override
public @Nullable ServerBot teleport(@NotNull TeleportTransition teleportTarget) {
public @Nullable ServerBot teleport(@NotNull TeleportTransition teleportTransition) {
if (this.isSleeping() || this.isRemoved()) {
return null;
}
if (teleportTarget.newLevel().dimension() != this.serverLevel().dimension()) {
return null;
} else {
if (!teleportTarget.asPassenger()) {
this.stopRiding();
}
if (!teleportTransition.asPassenger()) {
this.removeVehicle();
}
this.connection.internalTeleport(PositionMoveRotation.of(teleportTarget), teleportTarget.relatives());
ServerLevel level = teleportTransition.newLevel();
ServerLevel serverLevel = this.serverLevel();
if (level != null && level.dimension() == serverLevel.dimension()) {
this.connection.internalTeleport(PositionMoveRotation.of(teleportTransition), teleportTransition.relatives());
this.connection.resetPosition();
teleportTarget.postTeleportTransition().onTransition(this);
teleportTransition.postTeleportTransition().onTransition(this);
return this;
}
}
@Override
public void handlePortal() {
ResourceKey<net.minecraft.world.level.dimension.LevelStem> resourceKey = serverLevel.getTypeKey();
if (level != null && resourceKey == net.minecraft.world.level.dimension.LevelStem.OVERWORLD && level.getTypeKey() == net.minecraft.world.level.dimension.LevelStem.NETHER) { // CraftBukkit - empty to fall through to null to event
this.enteredNetherPosition = this.position();
}
this.isChangingDimension = true;
serverLevel.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION);
this.unsetRemoved();
this.setServerLevel(level);
this.connection.internalTeleport(PositionMoveRotation.of(teleportTransition), teleportTransition.relatives()); // CraftBukkit - use internal teleport without event
this.connection.resetPosition();
level.addDuringTeleport(this);
this.triggerDimensionChangeTriggers(serverLevel);
this.stopUsingItem();
teleportTransition.postTeleportTransition().onTransition(this);
this.isChangingDimension = false;
this.lastSentExp = -1;
this.lastSentHealth = -1.0F;
this.lastSentFood = -1;
if (org.leavesmc.leaves.LeavesConfig.modify.netherPortalFix) {
final ResourceKey<Level> fromDim = serverLevel.dimension();
final ResourceKey<Level> toDim = level().dimension();
final ResourceKey<Level> OVERWORLD = Level.OVERWORLD;
final ResourceKey<Level> THE_NETHER = Level.NETHER;
if (!((fromDim != OVERWORLD || toDim != THE_NETHER) && (fromDim != THE_NETHER || toDim != OVERWORLD))) {
BlockPos fromPortal = org.leavesmc.leaves.util.ReturnPortalManager.findPortalAt(this, fromDim, lastPos);
BlockPos toPos = this.blockPosition();
if (fromPortal != null) {
org.leavesmc.leaves.util.ReturnPortalManager.storeReturnPortal(this, toDim, toPos, fromPortal);
}
}
}
if (this.isBlocking()) {
this.stopUsingItem();
}
return this;
}
@Override