mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 16:37:43 +01:00
Upstream has released updates that appear to apply and compile correctly Paper Changes: 8c74d3126 Updated Upstream (Bukkit) (#5359) fd3c66a91 bug #5362 - correctly pass "render type" when registering a new scoreboard objective 39c487b37 Add per-command perms for paper command cdbf2578c Add Item Rarity API (#5352) d80e43647 [CI-SKIP] Removal from the MIT list (#5345) Tuinity Changes: aea6b8347 Merge dev/playerchunkloading 722c7ca8a Use hash table for maintaing changed block set 98ae59d85 Custom table implementation for blockstate state lookups 8b8704fb6 Oprimise map impl for tracked players ea71d6ba4 Optimise snow & ice in chunk ticking 9871d4ce5 Remove chunk lookup & lambda allocation from counting mobs 5a4a35f3e Add patreon 7d93d9618 Refactor data management for region manager c3035219f Change license from MIT to LGPLv3 Airplane Changes: 580f380b6 Updated Upstream (Tuinity) 82253fd36 Early return optimization for target finding 9572643bb Cache entityhuman display name 5df98254f Remove iterators from inventory contains 18d2be193 Merge pull request #14 from violetwtf/patch-1 f716d4c33 Merge pull request #13 from violetwtf/master 128cbe519 Reduce entity chunk ticking checks from 3 to 1 03ac0933b Skip copying unloading tile entities 97dd027b5 Smaller pool size for tracking 9e9f57be4 Only set up Flare if token is available
203 lines
10 KiB
Diff
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 72ee5fe0ca25844cbcd8f1bbbbd6a7f8ced24bc4..f38382cc681f03d9a6a0efa85f045e3770398739 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 0eae140eb55526e5eb88dab0e267b45fdef43ff6..65dfe107566244b96a9eb1520336caa8cc79361d 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 be859a1b41254b299a507d03e453dc8efee6f3dd..4de2877f30a9b231a5c8bbd1739416991e9d7633 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 e03c80f4b61e211c104e809d52d16a400b713f00..b05137eb7de2d5b236d9195db37b613733b99cf2 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
@@ -1002,6 +1002,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 56793a9e8f963b63a22aac5337299fbfb07389f0..c6682064ff5d653d14f658396a6a5461d4554fab 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;
|