mirror of
https://github.com/LeavesMC/Leaves.git
synced 2026-01-03 22:26:12 +00:00
145 lines
8.9 KiB
Diff
145 lines
8.9 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 da65f980f2145ea03341911ce75f7e61b358c9d7..7dcdc9b40c594234d87bef3e75a68ddaa58506a3 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
|
|
@@ -166,7 +166,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
|
}
|
|
// Paper end - use distance map to optimise tracker
|
|
|
|
- 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
|
|
@@ -182,7 +182,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
|
// Paper end - use distance map to optimise entity tracker
|
|
}
|
|
|
|
- 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
|
|
@@ -994,7 +994,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))
|
|
+ || (org.leavesmc.leaves.LeavesConfig.elytraAeronauticsNoChunk && player.elytraAeronauticsNoChunk); // Leaves - Elytra aeronautics
|
|
}
|
|
|
|
void updatePlayerStatus(ServerPlayer player, boolean added) {
|
|
@@ -1031,6 +1032,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
|
}
|
|
|
|
public void move(ServerPlayer player) {
|
|
+ if (player.elytraAeronauticsNoChunk) return; // Leaves - no chunk
|
|
// Paper - delay this logic for the entity tracker tick, no need to duplicate it
|
|
|
|
SectionPos sectionposition = player.getLastSectionPos();
|
|
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
index d833c9da7b5132485a450bb752bd988ee91e4cf1..f605051b11eb23e41c1f0339917a6731c1e6b2f3 100644
|
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
@@ -556,7 +556,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 bff5bdd0ea231c889fd8bab4f68b5bcbdcda2190..a13843368d161fd252a95a620463d7040fd98308 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
@@ -1156,7 +1156,13 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
|
return;
|
|
}
|
|
}
|
|
-
|
|
+ // Leaves start - elytra aeronautics
|
|
+ if (org.leavesmc.leaves.LeavesConfig.elytraAeronauticsNoChunk && this instanceof Player player) {
|
|
+ if (movementType == MoverType.PLAYER && player.isFallFlying()) {
|
|
+ org.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);
|
|
@@ -2104,6 +2110,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
|
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 7f733ed26ada22c64897c4df84af6eb680d9a02f..24bed620cb7cdb5104d3bdf8f87eb69122e8092c 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
|
|
@@ -195,6 +195,8 @@ public abstract class Player extends LivingEntity {
|
|
public boolean ignoreFallDamageFromCurrentImpulse;
|
|
public boolean affectsSpawning = true; // Paper - Affects Spawning API
|
|
public net.kyori.adventure.util.TriState flyingFallDamage = net.kyori.adventure.util.TriState.NOT_SET; // Paper - flying fall damage
|
|
+ // Paper end
|
|
+ public boolean elytraAeronauticsNoChunk = false; // Leaves - Elytra aeronautics
|
|
|
|
// CraftBukkit start
|
|
public boolean fauxSleeping;
|
|
diff --git a/src/main/java/org/leavesmc/leaves/util/ElytraAeronauticsHelper.java b/src/main/java/org/leavesmc/leaves/util/ElytraAeronauticsHelper.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..3b0e805b3ac9dc40280f9daa1302b1b358bd8083
|
|
--- /dev/null
|
|
+++ b/src/main/java/org/leavesmc/leaves/util/ElytraAeronauticsHelper.java
|
|
@@ -0,0 +1,39 @@
|
|
+package org.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 org.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);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+}
|