Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-16 11:30:06 +01:00
ba71c5d6e7
Fixes GH-2943
70 Zeilen
4.0 KiB
Diff
70 Zeilen
4.0 KiB
Diff
From c4209470f28071c68b64d5bf4cc030ff1a28256c 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 4c5010936..a09282e00 100644
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
@@ -555,4 +555,9 @@ public class PaperWorldConfig {
|
|
}
|
|
log("Anti-Xray: " + (antiXray ? "enabled" : "disabled") + " / Engine Mode: " + engineMode.getDescription() + " / Chunk Edge Mode: " + chunkEdgeMode.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/EntityArrow.java b/src/main/java/net/minecraft/server/EntityArrow.java
|
|
index 634e2bd30..9c97edf9c 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityArrow.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityArrow.java
|
|
@@ -85,7 +85,7 @@ public abstract class EntityArrow extends Entity implements IProjectile {
|
|
float f7 = MathHelper.cos(f1 * 0.017453292F) * MathHelper.cos(f * 0.017453292F);
|
|
|
|
this.shoot((double) f5, (double) f6, (double) f7, f3, f4);
|
|
- this.setMot(this.getMot().add(entity.getMot().x, entity.onGround ? 0.0D : entity.getMot().y, entity.getMot().z));
|
|
+ if (!entity.world.paperConfig.disableRelativeProjectileVelocity) this.setMot(this.getMot().add(entity.getMot().x, entity.onGround ? 0.0D : entity.getMot().y, entity.getMot().z)); // Paper - allow disabling relative velocity
|
|
}
|
|
|
|
@Override
|
|
diff --git a/src/main/java/net/minecraft/server/EntityProjectile.java b/src/main/java/net/minecraft/server/EntityProjectile.java
|
|
index 6c091b680..f5c8074dc 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityProjectile.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityProjectile.java
|
|
@@ -43,7 +43,7 @@ public abstract class EntityProjectile extends Entity implements IProjectile {
|
|
this.shoot((double) f5, (double) f6, (double) f7, f3, f4);
|
|
Vec3D vec3d = entity.getMot();
|
|
|
|
- this.setMot(this.getMot().add(vec3d.x, entity.onGround ? 0.0D : vec3d.y, vec3d.z));
|
|
+ if (!entity.world.paperConfig.disableRelativeProjectileVelocity) this.setMot(this.getMot().add(vec3d.x, entity.onGround ? 0.0D : vec3d.y, vec3d.z)); // Paper - allow disabling relative velocity
|
|
}
|
|
|
|
@Override
|
|
--
|
|
2.25.0
|
|
|