mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-23 23:57:43 +01:00
7ae47d4eb3
Mojang fixed it in MC-63720
53 lines
3.2 KiB
Diff
53 lines
3.2 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Lucavon <lucavonlp@gmail.com>
|
|
Date: Tue, 23 Jul 2019 20:29:20 -0500
|
|
Subject: [PATCH] Configurable projectile relative velocity
|
|
|
|
This patch adds an option "disable relative projectile velocity", which, when
|
|
nabled, will cause projectiles to ignore the shooter's current velocity,
|
|
like they did in Minecraft 1.8 and prior.
|
|
If a player is falling, for example, their shooting range will be drastically
|
|
reduced, as a downwards velocity is applied to the projectile. This prevents
|
|
players from saving themselves from falling off floating islands, for example,
|
|
as a thrown ender pearl will not make it back to the island, while it would
|
|
have in 1.8.
|
|
|
|
While this could easily be done with plugins, too, there are multiple problems:
|
|
P1) If multiple plugins cancel the velocity by subtracting the shooter's velocity
|
|
from the projectile's velocity, the projectile's velocity would be different.
|
|
As there's no way to detect whether the projectile's velocity has already been
|
|
adjusted to ignore the player's velocity, plugins can't not do it if it's not
|
|
necessary.
|
|
P2) I've noticed some inconsistencies, e.g. weird velocity when shooting while
|
|
using an elytra. Checking for those inconsistencies is possible, but not as
|
|
efficient as just not applying the velocity in the first place.
|
|
P3) Solutions for 1) and especially 2) might not be future-proof, while this
|
|
server-internal fix makes this change future-proof.
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
index 90e8defde0ef84f3146c8664805d6f11b84c593d..36eff622d5638f1bd11b7b4ebe97036205ccf88b 100644
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
@@ -496,4 +496,9 @@ public class PaperWorldConfig {
|
|
}
|
|
log("Anti-Xray: " + (antiXray ? "enabled" : "disabled") + " / Engine Mode: " + engineMode.getDescription() + " / Up to " + ((maxChunkSectionIndex + 1) * 16) + " blocks / Update Radius: " + updateRadius);
|
|
}
|
|
+
|
|
+ public boolean disableRelativeProjectileVelocity;
|
|
+ private void disableRelativeProjectileVelocity() {
|
|
+ disableRelativeProjectileVelocity = getBoolean("game-mechanics.disable-relative-projectile-velocity", false);
|
|
+ }
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/IProjectile.java b/src/main/java/net/minecraft/server/IProjectile.java
|
|
index 8d26521bc414b3d34f496e966f0c918b023f4833..9f5ce64a60fe7c312399ee416b11b84213dd3bee 100644
|
|
--- a/src/main/java/net/minecraft/server/IProjectile.java
|
|
+++ b/src/main/java/net/minecraft/server/IProjectile.java
|
|
@@ -114,7 +114,7 @@ public abstract class IProjectile extends Entity {
|
|
this.shoot((double) f5, (double) f6, (double) f7, f3, f4);
|
|
Vec3D vec3d = entity.getMot();
|
|
|
|
- this.setMot(this.getMot().add(vec3d.x, entity.isOnGround() ? 0.0D : vec3d.y, vec3d.z));
|
|
+ if (!entity.world.paperConfig.disableRelativeProjectileVelocity) this.setMot(this.getMot().add(vec3d.x, entity.isOnGround() ? 0.0D : vec3d.y, vec3d.z)); // Paper - allow disabling relative velocity
|
|
}
|
|
|
|
protected void a(MovingObjectPosition movingobjectposition) {
|