Files
Purpur/patches/server/0050-Controllable-Minecarts.patch
jmp c7b279fe1b Updated Upstream (Paper & Tuinity)
Upstream has released updates that appear to apply and compile correctly

Paper Changes:
05af2837c [CI-SKIP] Improved the annotation test output
586966949 abstract custom set tags, add entity tags
c7667378e Added PlayerLoomPatternSelectEvent
00972e80d Reimplement GS4QueryEvent
544c5c278 Re-add coral block tags (#4987)
7d56c8deb Added PlayerLecternPageChangeEvent
c7cdf255b Add BlockFailedDispenseEvent
c8a8d6fbe Added world settings for mobs picking up loot
91eda5bd3 Added ServerResourcesReloadedEvent
be81b4f5c Add a Enchantable MaterialTag
975d18703 Add doors to material tags
d075e748e colorful itemdump
f3ba3dee0 Added WorldGameRuleChangeEvent
086d20118 Guardian beam workaround
b63c890ec Support spawning item stacks
d7d74c552 added height config for bamboo
7878e3bc2 Use setAmount for Recipe Amount
50e70697b Add EntityLoadCrossbowEvent
f344e092c Add Anti-Xray bypass permission
9fd31e675 fix for nerfed slime mobs splitting
4a7962cd1 Zombie API - breaking doors
5650a41f5 Fix interact event not being called in adventure
2c9ed4335 Add PlayerFlowerPotManipulateEvent
1f32290b6 [Auto] Updated Upstream (CraftBukkit)
d87694a20 Redact Velocity forwarding secret properly (#4980)
24a0b0206 [Auto] Updated Upstream (CraftBukkit)
7681042ef [Auto] Updated Upstream (Bukkit/CraftBukkit)
7dea3dba6 [Auto] Updated Upstream (CraftBukkit)
4b3792920 JavaDoc fixes
f13b4727e Allow disabling mob spawner spawn egg transformation
525b50737 Cache burn durations
2c37d1077 Optimized tick ready check
b4000b01a Add API to get the Material of Boats and Minecarts
f1317386d Fix sign lazy initialisation
9f61759d9 Updated Upstream (CraftBukkit/Spigot) (#4972)
aaff430b6 [CI-SKIP] Use GitHub Actions for build status
9f4055d99 Fix harming potion dupe
7bfb781ff Additional Block Material API's
0eaffd008 Micro Optimize DataBits

Tuinity Changes:
9e5cabb6e Port starlight changes
2021-01-04 15:21:27 -08:00

203 lines
10 KiB
Diff

From 0000000000000000000000000000000000000000 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
diff --git a/src/main/java/net/minecraft/server/BlockPosition.java b/src/main/java/net/minecraft/server/BlockPosition.java
index 2291135eaef64c403183724cb6e413cd7e472672..bc61aaff65a7dc1e7534452b285953b83adb7000 100644
--- a/src/main/java/net/minecraft/server/BlockPosition.java
+++ b/src/main/java/net/minecraft/server/BlockPosition.java
@@ -36,6 +36,12 @@ public class BlockPosition extends BaseBlockPosition {
private static final int m = 38;
// Paper end
+ // Purpur start
+ public BlockPosition(Entity entity) {
+ super(entity.locX(), entity.locY(), entity.locZ());
+ }
+ // Purpur end
+
public BlockPosition(int i, int j, int k) {
super(i, j, k);
}
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
index 5ab1121c99c67662ce659428be46f2189f7e2d04..802d5488876a4bebad18fbb6b2256c0259ba50c2 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
@@ -98,9 +98,9 @@ public abstract class EntityLiving extends Entity {
protected int aO;protected int getKillCount() { return this.aO; } // Paper - OBFHELPER
public float lastDamage;
public boolean jumping; // Paper protected -> public
- public float aR;
- public float aS;
- public float aT;
+ public float aR; public float getStrafe() { return aR; } public void setStrafe(float strafe) { aR = strafe; } // Purpur - OBFHELPER
+ public float aS; public float getVertical() { return aS; } public void setVertical(float vertical) { aS = vertical; } // Purpur - OBFHELPER
+ public float aT; public float getForward() { return aT; } public void setForward(float forward) { aT = forward; } // Purpur - OBFHELPER
protected int aU;
protected double aV;
protected double aW;
diff --git a/src/main/java/net/minecraft/server/EntityMinecartAbstract.java b/src/main/java/net/minecraft/server/EntityMinecartAbstract.java
index efe5c0cecaf12ef921f6d32ff6670eff051bf323..a814cf280d1ce0d446d24da8e596f13e49678852 100644
--- a/src/main/java/net/minecraft/server/EntityMinecartAbstract.java
+++ b/src/main/java/net/minecraft/server/EntityMinecartAbstract.java
@@ -445,16 +445,62 @@ public abstract class EntityMinecartAbstract extends Entity {
public void a(int i, int j, int k, boolean flag) {}
+ // Purpur start
+ private Double lastSpeed;
+
+ 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 (!block.material.isSolid()) {
+ speed = lastSpeed;
+ } else if (speed == null) {
+ speed = world.purpurConfig.controllableMinecartsBaseSpeed;
+ }
+ return lastSpeed = speed;
+ }
+ // Purpur end
+
protected void h() {
double d0 = this.getMaxSpeed();
Vec3D vec3d = this.getMot();
this.setMot(MathHelper.a(vec3d.x, -d0, d0), vec3d.y, MathHelper.a(vec3d.z, -d0, d0));
+
+ // 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 && this.onGround) {
+ setMot(new Vec3D(getMot().x, world.purpurConfig.controllableMinecartsHopBoost, getMot().z));
+ }
+ if (entityhuman.getForward() != 0.0F) {
+ Vector velocity = entityhuman.getBukkitEntity().getEyeLocation().getDirection().normalize().multiply(getControllableSpeed());
+ if (entityhuman.getForward() < 0.0) {
+ velocity.multiply(-0.5);
+ }
+ setMot(new Vec3D(velocity.getX(), getMot().y, velocity.getZ()));
+ }
+ this.yaw = passenger.yaw - 90;
+ setStepHeight(world.purpurConfig.controllableMinecartsStepHeight);
+ } else {
+ setStepHeight(0.0F);
+ }
+ } else {
+ setStepHeight(0.0F);
+ }
+ // Purpur end
+
if (this.onGround) {
// 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
}
+ else if (world.purpurConfig.controllableMinecarts) setMot(new Vec3D(getMot().x * derailedX, getMot().y, getMot().z * derailedZ)); // Purpur
this.move(EnumMoveType.SELF, this.getMot());
if (!this.onGround) {
diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
index 26c508258f1638fcf7d11ba87816cdf4771e9fc6..452675eb071513609665ec214ddb0b01874c3a09 100644
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
@@ -1004,6 +1004,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
if (this.isInvulnerable(damagesource)) {
return false;
} else {
+ if (damagesource == DamageSource.FALL && getRootVehicle() instanceof EntityMinecartAbstract && world.purpurConfig.controllableMinecarts && !world.purpurConfig.controllableMinecartsFallDamage) return false; // Purpur
boolean flag = this.server.j() && this.canPvP() && "fall".equals(damagesource.translationIndex);
if (!flag && isSpawnInvulnerable() && damagesource != DamageSource.OUT_OF_WORLD) { // Purpur
diff --git a/src/main/java/net/minecraft/server/ItemMinecart.java b/src/main/java/net/minecraft/server/ItemMinecart.java
index ceef7aaf923026ff1044d6feba4297279eb44157..002651aaf3b8a9b489fe323756cd1ad13f9874e8 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((Tag) 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.a(world.isClientSide);
- }
+ //} // 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 ce7b3775d81135a785599d1866a8fe88f897eff7..7bb80ab8fde39f39a0834e4ed2d3002e73885737 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -1,5 +1,7 @@
package net.pl3x.purpur;
+import net.minecraft.server.Block;
+import net.minecraft.server.Blocks;
import net.minecraft.server.IRegistry;
import net.minecraft.server.Item;
import net.minecraft.server.Items;
@@ -7,7 +9,10 @@ import net.minecraft.server.MinecraftKey;
import org.bukkit.configuration.ConfigurationSection;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+
import static net.pl3x.purpur.PurpurConfig.log;
public class PurpurWorldConfig {
@@ -68,6 +73,34 @@ public class PurpurWorldConfig {
armorstandStepHeight = (float) getDouble("gameplay-mechanics.armorstand.step-height", armorstandStepHeight);
}
+ public boolean controllableMinecarts = false;
+ public boolean controllableMinecartsPlaceAnywhere = false;
+ public float controllableMinecartsStepHeight = 1.0F;
+ public double controllableMinecartsHopBoost = 0.5D;
+ public boolean controllableMinecartsFallDamage = true;
+ public double controllableMinecartsBaseSpeed = 0.1D;
+ public Map<Block, Double> controllableMinecartsBlockSpeeds = new HashMap<>();
+ private void controllableMinecartsSettings() {
+ 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);
+ controllableMinecartsFallDamage = getBoolean("gameplay-mechanics.controllable-minecarts.fall-damage", controllableMinecartsFallDamage);
+ 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 idleTimeoutKick = true;
public boolean idleTimeoutTickNearbyEntities = true;
public boolean idleTimeoutCountAsSleeping = false;