54 lines
3.2 KiB
Diff
54 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 384cb363eed794551bee6b0ec11ba1be92a3d7ac..1ee2cced100626e48eb36ee14f84b9257c79a2f8 100644
|
||
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
||
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
||
|
@@ -507,4 +507,9 @@ public class PaperWorldConfig {
|
||
|
Bukkit.getLogger().warning("You have enabled permission-based Anti-Xray checking - depending on your permission plugin, this may cause performance issues");
|
||
|
}
|
||
|
}
|
||
|
+
|
||
|
+ public boolean disableRelativeProjectileVelocity;
|
||
|
+ private void disableRelativeProjectileVelocity() {
|
||
|
+ disableRelativeProjectileVelocity = getBoolean("game-mechanics.disable-relative-projectile-velocity", false);
|
||
|
+ }
|
||
|
}
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
||
|
index d385fb6eee5000951c350b6ced5669dc3dcce725..ca3d936433cd47caa4e0335e41246b1c4ce0eb99 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
||
|
@@ -129,7 +129,7 @@ public abstract class Projectile extends Entity {
|
||
|
this.shoot((double) f5, (double) f6, (double) f7, modifierZ, modifierXYZ);
|
||
|
Vec3 vec3d = user.getDeltaMovement();
|
||
|
|
||
|
- this.setDeltaMovement(this.getDeltaMovement().add(vec3d.x, user.isOnGround() ? 0.0D : vec3d.y, vec3d.z));
|
||
|
+ if (!user.level.paperConfig.disableRelativeProjectileVelocity) this.setDeltaMovement(this.getDeltaMovement().add(vec3d.x, user.isOnGround() ? 0.0D : vec3d.y, vec3d.z)); // Paper - allow disabling relative velocity
|
||
|
}
|
||
|
|
||
|
// CraftBukkit start - call projectile hit event
|