9
0
mirror of https://github.com/LeavesMC/Leaves.git synced 2026-01-06 15:51:33 +00:00
Files
LeavesMC/patches/server/0072-Elytra-aeronautics-no-chunk-load.patch
2023-09-28 18:12:42 +08:00

144 lines
9.0 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: violetc <58360096+s-yh-china@users.noreply.github.com>
Date: Sun, 2 Jul 2023 09:25:00 +0800
Subject: [PATCH] Elytra aeronautics no chunk load
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
index ed2e0774d5b14d4926b3214ebf3795d7555327e3..0434bf9b8d3b064c8426d51f9969686a188f0eaa 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
@@ -133,7 +133,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
// Paper start - distance maps
private final com.destroystokyo.paper.util.misc.PooledLinkedHashSets<ServerPlayer> pooledLinkedPlayerHashSets = new com.destroystokyo.paper.util.misc.PooledLinkedHashSets<>();
- void addPlayerToDistanceMaps(ServerPlayer player) {
+ public void addPlayerToDistanceMaps(ServerPlayer player) { // Leaves - package -> public
int chunkX = io.papermc.paper.util.MCUtil.getChunkCoordinate(player.getX());
int chunkZ = io.papermc.paper.util.MCUtil.getChunkCoordinate(player.getZ());
// Note: players need to be explicitly added to distance maps before they can be updated
@@ -141,7 +141,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
this.level.playerChunkLoader.addPlayer(player); // Paper - replace chunk loader
}
- void removePlayerFromDistanceMaps(ServerPlayer player) {
+ public void removePlayerFromDistanceMaps(ServerPlayer player) { // Leaves - package -> public
int chunkX = io.papermc.paper.util.MCUtil.getChunkCoordinate(player.getX());
int chunkZ = io.papermc.paper.util.MCUtil.getChunkCoordinate(player.getZ());
// Note: players need to be explicitly added to distance maps before they can be updated
@@ -897,7 +897,8 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
}
private boolean skipPlayer(ServerPlayer player) {
- return player.isSpectator() && !this.level.getGameRules().getBoolean(GameRules.RULE_SPECTATORSGENERATECHUNKS);
+ return (player.isSpectator() && !this.level.getGameRules().getBoolean(GameRules.RULE_SPECTATORSGENERATECHUNKS))
+ || (top.leavesmc.leaves.LeavesConfig.elytraAeronauticsNoChunk && player.elytraAeronauticsNoChunk); // Leaves - Elytra aeronautics
}
void updatePlayerStatus(ServerPlayer player, boolean added) {
@@ -934,6 +935,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
}
public void move(ServerPlayer player) {
+ if (player.elytraAeronauticsNoChunk) return; // Leaves - no chunk
ObjectIterator objectiterator = this.entityMap.values().iterator();
while (objectiterator.hasNext()) {
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
index f5f80646848c47d047e97d1ef2a8000d0eaa4fc0..c4eb2ae57967f0a16ef215c43255c8f8e13424eb 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -531,7 +531,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
speed *= 2f; // TODO: Get the speed of the vehicle instead of the player
// Paper start - Prevent moving into unloaded chunks
- if (this.player.level().paperConfig().chunks.preventMovingIntoUnloadedChunks && (
+ if (this.player.level().paperConfig().chunks.preventMovingIntoUnloadedChunks && !player.elytraAeronauticsNoChunk && ( // Leaves - no chunk load
!worldserver.areChunksLoadedForMove(this.player.getBoundingBox().expandTowards(new Vec3(toX, toY, toZ).subtract(this.player.position()))) ||
!worldserver.areChunksLoadedForMove(entity.getBoundingBox().expandTowards(new Vec3(toX, toY, toZ).subtract(entity.position())))
)) {
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
index 4b1a08fa9a9d34c40b4fee601495528ea1c5095d..46dce902751fddc2966cb804e7b0b354e04bfad5 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -1031,7 +1031,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
return;
}
}
-
+ // Leaves start - elytra aeronautics
+ if (top.leavesmc.leaves.LeavesConfig.elytraAeronauticsNoChunk && this instanceof Player player) {
+ if (movementType == MoverType.PLAYER && player.isFallFlying()) {
+ top.leavesmc.leaves.util.ElytraAeronauticsHelper.flightBehaviour(player, movement);
+ }
+ }
+ // Leaves end - elytra aeronautics
this.level().getProfiler().push("move");
if (this.stuckSpeedMultiplier.lengthSqr() > 1.0E-7D) {
movement = movement.multiply(this.stuckSpeedMultiplier);
@@ -1970,6 +1976,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
this.yo = y;
this.zo = d4;
this.setPos(d3, y, d4);
+ if (this instanceof Player player && player.elytraAeronauticsNoChunk) return; // Leaves - elytra aeronautics
if (this.valid) this.level.getChunk((int) Math.floor(this.getX()) >> 4, (int) Math.floor(this.getZ()) >> 4); // CraftBukkit
}
diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
index 4aa241f2ef7f27e9c9cf5ea3bbb1c4b389ce887c..88e0901b7e46e59569555d8ce00f48817073ee35 100644
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
@@ -188,6 +188,7 @@ public abstract class Player extends LivingEntity {
public boolean affectsSpawning = true;
public net.kyori.adventure.util.TriState flyingFallDamage = net.kyori.adventure.util.TriState.NOT_SET;
// Paper end
+ public boolean elytraAeronauticsNoChunk = false; // Leaves - Elytra aeronautics
// CraftBukkit start
public boolean fauxSleeping;
diff --git a/src/main/java/top/leavesmc/leaves/util/ElytraAeronauticsHelper.java b/src/main/java/top/leavesmc/leaves/util/ElytraAeronauticsHelper.java
new file mode 100644
index 0000000000000000000000000000000000000000..fc25e2f960a2936e656541c0fe13745e62451179
--- /dev/null
+++ b/src/main/java/top/leavesmc/leaves/util/ElytraAeronauticsHelper.java
@@ -0,0 +1,39 @@
+package top.leavesmc.leaves.util;
+
+import net.minecraft.core.SectionPos;
+import net.minecraft.network.chat.Component;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.entity.player.Player;
+import net.minecraft.world.phys.Vec3;
+import top.leavesmc.leaves.LeavesConfig;
+
+public class ElytraAeronauticsHelper {
+
+ public static void flightBehaviour(Player player, Vec3 velocity) {
+ if (LeavesConfig.elytraAeronauticsNoChunk) {
+ if ((LeavesConfig.elytraAeronauticsNoChunkSpeed <= 0.0D || velocity.horizontalDistanceSqr() >= LeavesConfig.elytraAeronauticsNoChunkSpeed)
+ && (LeavesConfig.elytraAeronauticsNoChunkHeight <= 0.0D || player.getY() >= LeavesConfig.elytraAeronauticsNoChunkHeight)) {
+ if (!player.elytraAeronauticsNoChunk) {
+ player.elytraAeronauticsNoChunk = true;
+ ServerPlayer serverPlayer = (ServerPlayer) player;
+ if (LeavesConfig.elytraAeronauticsNoChunkMes) {
+ serverPlayer.sendSystemMessage(Component.literal(LeavesConfig.elytraAeronauticsNoChunkStartMes), true);
+ }
+ ((ServerLevel) serverPlayer.level()).chunkSource.chunkMap.removePlayerFromDistanceMaps(serverPlayer);
+ ((ServerLevel) serverPlayer.level()).chunkSource.chunkMap.getDistanceManager().removePlayer(serverPlayer.getLastSectionPos(), serverPlayer);
+ }
+ } else {
+ if (player.elytraAeronauticsNoChunk) {
+ player.elytraAeronauticsNoChunk = false;
+ ServerPlayer serverPlayer = (ServerPlayer) player;
+ if (LeavesConfig.elytraAeronauticsNoChunkMes) {
+ serverPlayer.sendSystemMessage(Component.literal(LeavesConfig.elytraAeronauticsNoChunkEndMes), true);
+ }
+ ((ServerLevel) serverPlayer.level()).chunkSource.chunkMap.addPlayerToDistanceMaps(serverPlayer);
+ ((ServerLevel) serverPlayer.level()).chunkSource.chunkMap.getDistanceManager().addPlayer(SectionPos.of(serverPlayer), serverPlayer);
+ }
+ }
+ }
+ }
+}