mirror of
https://github.com/LeavesMC/Leaves.git
synced 2025-12-19 14:59:32 +00:00
--------- Co-authored-by: Lumine1909 <133463833+Lumine1909@users.noreply.github.com> Co-authored-by: violetc <58360096+s-yh-china@users.noreply.github.com> Co-authored-by: Helvetica Volubi <88063803+Suisuroru@users.noreply.github.com>
161 lines
11 KiB
Diff
161 lines
11 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/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java
|
|
index 1993907c606b231b879a7279d3880876f5307b1c..85c957c547b8a90157308dccbcfb961caa0b9201 100644
|
|
--- a/net/minecraft/server/level/ChunkMap.java
|
|
+++ b/net/minecraft/server/level/ChunkMap.java
|
|
@@ -862,7 +862,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.modify.elytraAeronautics.enableNoChunkLoad && player.elytraAeronauticsNoChunk); // Leaves - Elytra aeronautics
|
|
}
|
|
|
|
void updatePlayerStatus(ServerPlayer player, boolean track) {
|
|
@@ -896,6 +897,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
|
}
|
|
|
|
public void move(ServerPlayer player) {
|
|
+ if (player.elytraAeronauticsNoChunk) return; // Leaves - no chunk
|
|
// Paper - optimise entity tracker
|
|
|
|
SectionPos lastSectionPos = player.getLastSectionPos();
|
|
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
|
|
index b4000881962db5fe9c6de38f406647d95a395ec3..b4edd659a77139c1771b0714eaa35b6810d96d78 100644
|
|
--- a/net/minecraft/server/level/ServerLevel.java
|
|
+++ b/net/minecraft/server/level/ServerLevel.java
|
|
@@ -868,6 +868,9 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
|
}
|
|
);
|
|
profilerFiller.popPush("blockEntities");
|
|
+ if (org.leavesmc.leaves.LeavesConfig.modify.elytraAeronautics.enableNoChunkLoad) {
|
|
+ org.leavesmc.leaves.util.ElytraAeronauticsHelper.tick(this);
|
|
+ }
|
|
this.tickBlockEntities();
|
|
profilerFiller.pop();
|
|
}
|
|
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
index ea9e98313c25e7ce94b011f5bc74a4318145c6f6..8d3151a6cc4d3a53601d41abce9d61323ce86a8c 100644
|
|
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
@@ -591,7 +591,7 @@ public class ServerGamePacketListenerImpl
|
|
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
|
|
!serverLevel.areChunksLoadedForMove(this.player.getBoundingBox().expandTowards(new Vec3(toX, toY, toZ).subtract(this.player.position()))) ||
|
|
!serverLevel.areChunksLoadedForMove(rootVehicle.getBoundingBox().expandTowards(new Vec3(toX, toY, toZ).subtract(rootVehicle.position())))
|
|
)) {
|
|
@@ -1603,6 +1603,7 @@ public class ServerGamePacketListenerImpl
|
|
allowMovement = !this.hasNewCollision(serverLevel, this.player, boundingBox, newBox);
|
|
} // else: no collision at all detected, why do we care?
|
|
}
|
|
+ allowMovement = allowMovement || player.elytraAeronauticsNoChunk; // Leaves - Elytra aeronautics
|
|
// Paper end - optimise out extra getCubes
|
|
if (!allowMovement) {
|
|
io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.CLIPPED_INTO_BLOCK,
|
|
diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
|
|
index 0129274ab88a151600f4fdde92dae73bec352fb2..37f6e22d9f8f0fffede79b1d273d65a69f8d675c 100644
|
|
--- a/net/minecraft/world/entity/Entity.java
|
|
+++ b/net/minecraft/world/entity/Entity.java
|
|
@@ -1127,7 +1127,13 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name
|
|
return;
|
|
}
|
|
}
|
|
-
|
|
+ // Leaves start - elytra aeronautics
|
|
+ if (org.leavesmc.leaves.LeavesConfig.modify.elytraAeronautics.enableNoChunkLoad && this instanceof Player player) {
|
|
+ if (type == MoverType.PLAYER && player.isFallFlying()) {
|
|
+ org.leavesmc.leaves.util.ElytraAeronauticsHelper.flightBehaviour(player, movement);
|
|
+ }
|
|
+ }
|
|
+ // Leaves end - elytra aeronautics
|
|
ProfilerFiller profilerFiller = Profiler.get();
|
|
profilerFiller.push("move");
|
|
if (this.stuckSpeedMultiplier.lengthSqr() > 1.0E-7) {
|
|
@@ -2193,6 +2199,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name
|
|
this.yo = y;
|
|
this.zo = d1;
|
|
this.setPos(d, y, d1);
|
|
+ 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/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
|
|
index 759c320fc331704efe5df10d3f1f33aa87262290..545e9c5f46dd4f8e016ed0a93f2049d1b687dd3c 100644
|
|
--- a/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -3368,6 +3368,11 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
|
this.fallFlyTicks++;
|
|
} else {
|
|
this.fallFlyTicks = 0;
|
|
+ // Leaves start - Elytra aeronautics
|
|
+ if (this instanceof ServerPlayer player) {
|
|
+ org.leavesmc.leaves.util.ElytraAeronauticsHelper.handleCruiseDeactivate(player);
|
|
+ }
|
|
+ // Leaves end - Elytra aeronautics
|
|
}
|
|
|
|
if (this.isSleeping()) {
|
|
diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java
|
|
index 7b0fdecf7ca4a5b6dd910369d6546a909926dff2..4e7e8b8f4004cab2cf5af0dafe81e72df78f7258 100644
|
|
--- a/net/minecraft/world/entity/player/Player.java
|
|
+++ b/net/minecraft/world/entity/player/Player.java
|
|
@@ -181,6 +181,7 @@ public abstract class Player extends Avatar implements ContainerUser {
|
|
private int currentImpulseContextResetGraceTime = 0;
|
|
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
|
|
+ public boolean elytraAeronauticsNoChunk = false; // Leaves - Elytra aeronautics
|
|
|
|
// CraftBukkit start
|
|
public boolean fauxSleeping;
|
|
diff --git a/net/minecraft/world/entity/projectile/FireworkRocketEntity.java b/net/minecraft/world/entity/projectile/FireworkRocketEntity.java
|
|
index 145ed3c5f5823c7505767b6d7f4f4d16cc863948..e2662b4574366dd734f5e68db3bf5505ff4e4767 100644
|
|
--- a/net/minecraft/world/entity/projectile/FireworkRocketEntity.java
|
|
+++ b/net/minecraft/world/entity/projectile/FireworkRocketEntity.java
|
|
@@ -325,7 +325,7 @@ public class FireworkRocketEntity extends Projectile implements ItemSupplier {
|
|
this.spawningEntity = input.read("SpawningEntity", net.minecraft.core.UUIDUtil.CODEC).orElse(null); // Paper
|
|
}
|
|
|
|
- private List<FireworkExplosion> getExplosions() {
|
|
+ public List<FireworkExplosion> getExplosions() { // Leaves private -> public
|
|
ItemStack itemStack = this.entityData.get(DATA_ID_FIREWORKS_ITEM);
|
|
Fireworks fireworks = itemStack.get(DataComponents.FIREWORKS);
|
|
return fireworks != null ? fireworks.explosions() : List.of();
|
|
diff --git a/net/minecraft/world/item/FireworkRocketItem.java b/net/minecraft/world/item/FireworkRocketItem.java
|
|
index f86b0579e707ecfa5c2074ea22bbe383b5e11841..0e4335bb2469a4698b303b598ec773b5c7cc73ce 100644
|
|
--- a/net/minecraft/world/item/FireworkRocketItem.java
|
|
+++ b/net/minecraft/world/item/FireworkRocketItem.java
|
|
@@ -64,6 +64,24 @@ public class FireworkRocketItem extends Item implements ProjectileItem {
|
|
if (player.isFallFlying()) {
|
|
ItemStack itemInHand = player.getItemInHand(hand);
|
|
if (level instanceof ServerLevel serverLevel) {
|
|
+ // Leaves start - Elytra aeronautics
|
|
+ if (player instanceof net.minecraft.server.level.ServerPlayer sp && sp.elytraAeronauticsNoChunk) {
|
|
+ final FireworkRocketEntity firework = new FireworkRocketEntity(level, itemInHand, player);
|
|
+ firework.spawningEntity = player.getUUID();
|
|
+ com.destroystokyo.paper.event.player.PlayerElytraBoostEvent event = new com.destroystokyo.paper.event.player.PlayerElytraBoostEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemInHand), (org.bukkit.entity.Firework) firework.getBukkitEntity(), org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand));
|
|
+ if (event.callEvent() && org.leavesmc.leaves.util.ElytraAeronauticsHelper.proxySpawnAndTick(firework)) {
|
|
+ player.awardStat(Stats.ITEM_USED.get(this));
|
|
+ if (event.shouldConsume() && !player.hasInfiniteMaterials()) {
|
|
+ itemInHand.shrink(1);
|
|
+ } else {
|
|
+ player.containerMenu.sendAllDataToRemote();
|
|
+ }
|
|
+ } else {
|
|
+ player.containerMenu.sendAllDataToRemote();
|
|
+ }
|
|
+ return InteractionResult.SUCCESS;
|
|
+ }
|
|
+ // Leaves end - Elytra aeronautics
|
|
// Paper start - PlayerElytraBoostEvent
|
|
final Projectile.Delayed<FireworkRocketEntity> delayed = Projectile.spawnProjectileDelayed(new FireworkRocketEntity(level, itemInHand, player), serverLevel, itemInHand, f -> f.spawningEntity = player.getUUID()); // Paper - firework api - assign spawning entity uuid
|
|
com.destroystokyo.paper.event.player.PlayerElytraBoostEvent event = new com.destroystokyo.paper.event.player.PlayerElytraBoostEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemInHand), (org.bukkit.entity.Firework) delayed.projectile().getBukkitEntity(), org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand));
|