Files
Purpur/patches/server/0031-Controllable-Minecarts.patch
William Blake Galbreath c0c212bf48 Updated Upstream (Paper)
Upstream has released updates that appears to apply and compile correctly

Paper Changes:
b75eeca0 Boost light task priority to ensure it doesnt hold up chunk loads
3d2bc848 Ensure VillagerTrades doesn't load async - fixes #3495
e470f1ef Add more information to Timing Reports
f4a47db6 Improve Thread Pool usage to allow single threads for single cpu servers
a4fe910f Fix sounds when using worldedit regen command
70ad51a8 Updated Upstream (Bukkit/CraftBukkit)
d7cfa4fa Improve legacy format serialization more
2020-06-05 21:42:48 -05:00

162 lines
7.7 KiB
Diff

From 22464945049dd22fcd1a5ccf19c4985e6f8d011b Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sat, 29 Jun 2019 02:32:40 -0500
Subject: [PATCH] Controllable Minecarts
---
.../java/net/minecraft/server/Entity.java | 1 +
.../server/EntityMinecartAbstract.java | 38 +++++++++++++++++++
.../net/minecraft/server/ItemMinecart.java | 8 ++--
.../net/pl3x/purpur/PurpurWorldConfig.java | 32 ++++++++++++++++
4 files changed, 76 insertions(+), 3 deletions(-)
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
index 197953e19f..5d39d86f0f 100644
--- a/src/main/java/net/minecraft/server/Entity.java
+++ b/src/main/java/net/minecraft/server/Entity.java
@@ -1346,6 +1346,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
this.inLava = true;
}
+ public boolean isInLava() { return aH(); } // Purpur - OBFHELPER
public boolean aH() {
return this.inLava;
}
diff --git a/src/main/java/net/minecraft/server/EntityMinecartAbstract.java b/src/main/java/net/minecraft/server/EntityMinecartAbstract.java
index 665bbe07fa..1f3e5bd288 100644
--- a/src/main/java/net/minecraft/server/EntityMinecartAbstract.java
+++ b/src/main/java/net/minecraft/server/EntityMinecartAbstract.java
@@ -357,12 +357,50 @@ public abstract class EntityMinecartAbstract extends Entity {
public void a(int i, int j, int k, boolean flag) {}
+ // Purpur start
+ public double getControllableSpeed() {
+ BlockPosition position = new BlockPosition(this);
+ Block block = world.getType(position).getBlock();
+ if (!block.material.isSolid()) {
+ block = world.getType(position.shift(EnumDirection.DOWN)).getBlock();
+ }
+ Double speed = world.purpurConfig.controllableMinecartsBlockSpeeds.get(block);
+ if (speed == null) {
+ speed = world.purpurConfig.controllableMinecartsBaseSpeed;
+ }
+ return speed;
+ }
+ // Purpur end
+
protected void i() {
double d0 = this.getMaxSpeed();
Vec3D vec3d = this.getMot();
this.setMot(MathHelper.a(vec3d.x, -d0, d0), vec3d.y, MathHelper.a(vec3d.z, -d0, d0));
if (this.onGround) {
+ // Purpur start
+ if (world.purpurConfig.controllableMinecarts && !isInWater() && !isInLava() && !passengers.isEmpty()) {
+ Entity passenger = passengers.get(0);
+ if (passenger instanceof EntityHuman) {
+ EntityHuman entityhuman = (EntityHuman) passenger;
+ if (entityhuman.jumping) {
+ Vec3D mot = getMot();
+ setMot(mot.x, world.purpurConfig.controllableMinecartsHopBoost, mot.z);
+ }
+ if (entityhuman.getForward() != 0.0F) {
+ Vector dir = entityhuman.getBukkitEntity().getEyeLocation().getDirection().normalize().multiply(getControllableSpeed());
+ if (entityhuman.getForward() < 0.0) {
+ dir.multiply(-0.5);
+ }
+ setMot(new Vec3D(dir.getX(), getMot().y, dir.getZ()));
+ setStepHeight(world.purpurConfig.controllableMinecartsStepHeight);
+ } else {
+ setStepHeight(0.0F);
+ }
+ this.yaw = passenger.yaw - 90;
+ }
+ }
+ // Purpur end
// CraftBukkit start - replace magic numbers with our variables
this.setMot(new Vec3D(this.getMot().x * this.derailedX, this.getMot().y * this.derailedY, this.getMot().z * this.derailedZ));
// CraftBukkit end
diff --git a/src/main/java/net/minecraft/server/ItemMinecart.java b/src/main/java/net/minecraft/server/ItemMinecart.java
index b73e317fbb..e1337a9c04 100644
--- a/src/main/java/net/minecraft/server/ItemMinecart.java
+++ b/src/main/java/net/minecraft/server/ItemMinecart.java
@@ -103,8 +103,10 @@ public class ItemMinecart extends Item {
IBlockData iblockdata = world.getType(blockposition);
if (!iblockdata.a(TagsBlock.RAILS)) {
- return EnumInteractionResult.FAIL;
- } else {
+ // Purpur start - place minecarts anywhere
+ if (!world.purpurConfig.controllableMinecartsPlaceAnywhere) return EnumInteractionResult.FAIL;
+ if (iblockdata.getMaterial().isSolid()) blockposition = blockposition.shift(itemactioncontext.getClickedFace());
+ } //else { // Purpur end - place minecarts anywhere
ItemStack itemstack = itemactioncontext.getItemStack();
if (!world.isClientSide) {
@@ -131,6 +133,6 @@ public class ItemMinecart extends Item {
itemstack.subtract(1);
return EnumInteractionResult.SUCCESS;
- }
+ //} // Purpur - place minecarts anywhere
}
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index e2bda806ec..f8992136a7 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -1,10 +1,16 @@
package net.pl3x.purpur;
import com.destroystokyo.paper.PaperWorldConfig;
+import net.minecraft.server.Block;
+import net.minecraft.server.Blocks;
+import net.minecraft.server.IRegistry;
+import net.minecraft.server.MinecraftKey;
import org.bukkit.configuration.ConfigurationSection;
import org.spigotmc.SpigotWorldConfig;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import static net.pl3x.purpur.PurpurConfig.log;
@@ -75,6 +81,32 @@ public class PurpurWorldConfig {
signRightClickEdit = getBoolean("blocks.sign.right-click-edit", signRightClickEdit);
}
+ public boolean controllableMinecarts = false;
+ public boolean controllableMinecartsPlaceAnywhere = false;
+ public float controllableMinecartsStepHeight = 1.0F;
+ public double controllableMinecartsHopBoost = 0.5D;
+ public double controllableMinecartsBaseSpeed = 0.1D;
+ public Map<Block, Double> controllableMinecartsBlockSpeeds = new HashMap<>();
+ private void gameplayMechanicsSettings() {
+ controllableMinecarts = getBoolean("gameplay-mechanics.controllable-minecarts.enabled", controllableMinecarts);
+ controllableMinecartsPlaceAnywhere = getBoolean("gameplay-mechanics.controllable-minecarts.place-anywhere", controllableMinecartsPlaceAnywhere);
+ controllableMinecartsStepHeight = (float) getDouble("gameplay-mechanics.controllable-minecarts.step-height", controllableMinecartsStepHeight);
+ controllableMinecartsHopBoost = getDouble("gameplay-mechanics.controllable-minecarts.hop-boost", controllableMinecartsHopBoost);
+ controllableMinecartsBaseSpeed = getDouble("gameplay-mechanics.controllable-minecarts.base-speed", controllableMinecartsBaseSpeed);
+ ConfigurationSection section = getConfigurationSection("gameplay-mechanics.controllable-minecarts.block-speed");
+ if (section != null) {
+ for (String key : section.getKeys(false)) {
+ Block block = IRegistry.BLOCK.get(new MinecraftKey(key));
+ if (block != Blocks.AIR) {
+ controllableMinecartsBlockSpeeds.put(block, section.getDouble(key, controllableMinecartsBaseSpeed));
+ }
+ }
+ } else {
+ set("gameplay-mechanics.controllable-minecarts.block-speed.grass-block", 0.3D);
+ set("gameplay-mechanics.controllable-minecarts.block-speed.stone", 0.5D);
+ }
+ }
+
public boolean batRidable = false;
public boolean batRidableInWater = false;
public boolean batRequireShiftToMount = true;
--
2.24.0