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

Paper Changes:
54890033 [Auto] Updated Upstream (CraftBukkit)
f96c6f5c [Auto] Updated Upstream (CraftBukkit)
4be8312f [CI-SKIP] [Auto] Rebuild Patches
43e5174a Fix Entity Teleportation and cancel velocity if teleported (#4210)
0fb3daf4 [Auto] Updated Upstream (CraftBukkit)
819ff324 Use wrapped StructureManager to prevent worldgen deadlock
507f302c Fix Zombie ShouldBurnInDay API (#4268)
ef5af6f6 [Auto] Updated Upstream (CraftBukkit)
101b0110 [Auto] Updated Upstream (Bukkit/CraftBukkit)
03689cf9 Fix javadoc (#4276)
c247857f Cache block data strings
ce2eae5c [Auto] Updated Upstream (Bukkit/CraftBukkit)
563f77ad install remapped server jar to paper package space
1ab021dd Updated Upstream (Bukkit/CraftBukkit)
c970f880 Properly pass the close reason for new inventory opens (#2658) (#4247)
07bca94f Create HoverEvent from ItemStack Entity
da33f8bb Add a way to get translation keys for blocks, entities and materials
5a20cbd7 Add more Evoker API
7a3e2520 [Auto] Updated Upstream (CraftBukkit)
b0cbebdc Fix build conflicts
dfc54a8b Add zombie targets turtle egg config (#4181)
0fe00f61 Add BellRingEvent for village bells (#2230)
414e5e1d fix #4144 (#4170)
5c7f3fc0 Fix PersistentDataContainer contract violation (_->!null returns null) (#3990)
65dbf5ff [CI-SKIP] [Auto] Rebuild Patches
7ed0f7f0 Fix NPE in getBedSpawnLocation (#4238)
9e0f1101 [CI-SKIP] Add issue template
6c138412 Fix CraftTeam null check (#4249)
32e45448 Update Paperclip
b84a37b7 Update Armor items in PlayerArmorChangeEvent (#4243)
a67abf5b Increase visibility of a few methods
7d69214b [Auto] Updated Upstream (CraftBukkit)
cbfc2362 PortalCreateEvent needs to know its entity
29032edb Fix PersistentDataContainer contract violation (_->!null returns null)
f42c53df [CI-SKIP] [Auto] Rebuild Patches
3efe45f5 Port Eigencraft to 1.16
0bad6958 Make engine-mode 2 truly random
cd06ca5e Updated Upstream (CraftBukkit)
ef36b4f8 Fix TNT not pushing creative players
915fe522 Fix hex colors not working in some kick messages
f5904171 [Auto] Updated Upstream (Bukkit/CraftBukkit)
757948dc [Auto] Updated Upstream (CraftBukkit)
0893de14 Fix reading the brand message from clients
243d2313 Updated Upstream (Bukkit/CraftBukkit)
4cc7de6c Add playPickupItemAnimation to LivingEntity
20fc1b5c [Auto] Updated Upstream (CraftBukkit/Spigot)
655258b3 [Auto] Updated Upstream (CraftBukkit)
167b1db6 Fix some modded clients getting kicked for invalid payload - Fixes #4201
7f0786cd Fix enderdragon tracking range to honor vanilla
586073c3 [CI-SKIP] Update README.md (for 1.16.2) (#4202)
853f4168 Remove debug
4d7ea429 fix config option in last commit
74d27463 Buffer joins to world
ac96307b [CI-SKIP] switch back to trusty now we figured out the issue
c97ce029 1.16.2 Release (#4123)
5486b3db Fix javadocs failing jenkins builds (#4189)
1330eb5f Brand support
b8372fc0 Improve handling of indestructable blocks
a2a06640 Add moon phase API
47f71aea Fix SpawnChangeEvent not firing for all use-cases
b6c860f2 Don't require FACING data
0c1716a1 Add #setMaxPlayers API
02aed275 [CI-SKIP] Require dependencies script (#4172)
1ccc1c67 Add smithing item helpers
627f4b85 Brand support
20d9ec6b Fix MC-197271
e9287056 [CI-SKIP] Update issue templates with notices
dccaf59a MC-197883: Bandaid decode issue
99a1e58f Merge branch 'master' into progress/1.16.2
ecbc5ca0 Updated Upstream (CraftBukkit)
99362d3c Decomp fix
5f9861a0 Fix MC-197883 by specifying the typeKey
1d8c9c23 [CI-SKIP] Make checkoutpr.sh use $SHELL (#4167)
2b1ca210 update checkout-pr to latest I use
95c9b45d Fix IDE Debug JVM Flag 2 (#4141)
9e6d742c Merge remote-tracking branch 'origin/master' into progress/1.16.2
c8542f23 Fix MC-99259 Wither Boss Bar doesn't update until invulnerability period is over (#4164)
862b8c18 Updated Upstream (Bukkit/CraftBukkit)
100d51eb Do not obfuscate air (#4149)
47740f67 Updated Upstream (CraftBukkit)
948c20e0 Merge remote-tracking branch 'origin/master' into progress/1.16.2
1daafe45 Updated Upstream (Bukkit/CraftBukkit)
98828b00 Merge pull request #4132 from Proximyst/progress/1.16.2
b23f27f8  Fix incorrect return for WorldServer#addAllEntitiesSafely (#3)
5085fa30 Fix MC-187716 Use configured height
c44add5a Initialise a new chunk section if none was found yet updated
74a4d5f8 Remove armour stand double add to world
6d25cc4e Don't mark null chunk sections for block updates
1ba2f214 Updated Upstream (Bukkit/CraftBukkit)
d29d5aaa Fix anti xray
ce6bbaa4 Import fastutil classes patch
9d4616a4 Updated Upstream (Bukkit/CraftBukkit)
109d072b Fix test, add strider mob goal and fix piglin goals
e6caaa20 Fix running; forgot to push this
ee7dce8b Add this to SHIT_TO_CHECK.md aswell
d378257c Fix IDE debug JVM flag for 1.16.2
0d8db446 Merge pull request #4112 from BillyGalbreath/progress/1.16.2
d319d8c4 It compiles!
8f8371c5 Add an OBFHELPER
9caa8e9f missed this
3ce5a5d7 volatile
159eb2e1 Oopsies
7eb08d2f Almost ready
7ca11e97 Current progress on 1.16.2

Tuinity Changes:
eaa6b50 Fix missing block property portal crash
fea5fbd Retain vanilla behavior for error correction rules in collisions
9eb1a3e Do not add a delayed unload ticket for some ticket types
2020-09-09 07:05:20 -05:00

177 lines
8.7 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 2291135ea..bc61aaff6 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 76575ea5f..c8b1fbcf1 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
@@ -99,9 +99,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 13fcb666e..d5e129678 100644
--- a/src/main/java/net/minecraft/server/EntityMinecartAbstract.java
+++ b/src/main/java/net/minecraft/server/EntityMinecartAbstract.java
@@ -445,12 +445,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 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));
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 ceef7aaf9..002651aaf 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 2763cc943..e54d071dd 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,32 @@ 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 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);
+ 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;