mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 08:27:43 +01:00
152 lines
7.9 KiB
Diff
152 lines
7.9 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] Minecart settings and WASD controls
|
|
|
|
|
|
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
|
index 6c5dab657ae7a7f5fd6fb73a86b3e8e4803dae50..998ce3a34e48e56cd907fc61cc3715518cbfae28 100644
|
|
--- a/net/minecraft/server/level/ServerPlayer.java
|
|
+++ b/net/minecraft/server/level/ServerPlayer.java
|
|
@@ -1153,6 +1153,11 @@ public class ServerPlayer extends Player {
|
|
} else {
|
|
// Purpur start - Add boat fall damage config
|
|
if (damageSource.is(net.minecraft.tags.DamageTypeTags.IS_FALL)) {
|
|
+ // Purpur start - Minecart settings and WASD controls
|
|
+ if (getRootVehicle() instanceof net.minecraft.world.entity.vehicle.AbstractMinecart && level().purpurConfig.minecartControllable && !level().purpurConfig.minecartControllableFallDamage) {
|
|
+ return false;
|
|
+ }
|
|
+ // Purpur end - Minecart settings and WASD controls
|
|
if (getRootVehicle() instanceof net.minecraft.world.entity.vehicle.Boat && !level().purpurConfig.boatsDoFallDamage) {
|
|
return false;
|
|
}
|
|
diff --git a/net/minecraft/world/entity/vehicle/AbstractMinecart.java b/net/minecraft/world/entity/vehicle/AbstractMinecart.java
|
|
index 99617c08cbd989092ba357d8df928786fd04c89a..9d88b260528c3cea2c5fe8e2760094b0a8a35667 100644
|
|
--- a/net/minecraft/world/entity/vehicle/AbstractMinecart.java
|
|
+++ b/net/minecraft/world/entity/vehicle/AbstractMinecart.java
|
|
@@ -103,6 +103,10 @@ public abstract class AbstractMinecart extends VehicleEntity {
|
|
private double flyingY = 0.95;
|
|
private double flyingZ = 0.95;
|
|
public @Nullable Double maxSpeed;
|
|
+ // Purpur start - Minecart settings and WASD controls
|
|
+ public double storedMaxSpeed;
|
|
+ public boolean isNewBehavior;
|
|
+ // Purpur end - Minecart settings and WASD controls
|
|
// CraftBukkit end
|
|
|
|
@@ -111,8 +115,13 @@ public abstract class AbstractMinecart extends VehicleEntity {
|
|
this.blocksBuilding = true;
|
|
if (useExperimentalMovement(level)) {
|
|
this.behavior = new NewMinecartBehavior(this);
|
|
+ this.isNewBehavior = true; // Purpur - Minecart settings and WASD controls
|
|
} else {
|
|
this.behavior = new OldMinecartBehavior(this);
|
|
+ // Purpur start - Minecart settings and WASD controls
|
|
+ this.isNewBehavior = false;
|
|
+ maxSpeed = storedMaxSpeed = level.purpurConfig.minecartMaxSpeed;
|
|
+ // Purpur end - Minecart settings and WASD controls
|
|
}
|
|
}
|
|
|
|
@@ -277,6 +286,14 @@ public abstract class AbstractMinecart extends VehicleEntity {
|
|
|
|
@Override
|
|
public void tick() {
|
|
+ // Purpur start - Minecart settings and WASD controls
|
|
+ if (!this.isNewBehavior) {
|
|
+ if (storedMaxSpeed != level().purpurConfig.minecartMaxSpeed) {
|
|
+ maxSpeed = storedMaxSpeed = level().purpurConfig.minecartMaxSpeed;
|
|
+ }
|
|
+ }
|
|
+ // Purpur end - Minecart settings and WASD controls
|
|
+
|
|
// CraftBukkit start
|
|
double prevX = this.getX();
|
|
double prevY = this.getY();
|
|
@@ -384,15 +401,61 @@ public abstract class AbstractMinecart extends VehicleEntity {
|
|
this.behavior.moveAlongTrack(level);
|
|
}
|
|
|
|
+ // Purpur start - Minecart settings and WASD controls
|
|
+ private Double lastSpeed;
|
|
+
|
|
+ public double getControllableSpeed() {
|
|
+ BlockState blockState = level().getBlockState(this.blockPosition());
|
|
+ if (!blockState.isSolid()) {
|
|
+ blockState = level().getBlockState(this.blockPosition().relative(Direction.DOWN));
|
|
+ }
|
|
+ Double speed = level().purpurConfig.minecartControllableBlockSpeeds.get(blockState.getBlock());
|
|
+ if (!blockState.isSolid()) {
|
|
+ speed = lastSpeed;
|
|
+ }
|
|
+ if (speed == null) {
|
|
+ speed = level().purpurConfig.minecartControllableBaseSpeed;
|
|
+ }
|
|
+ return lastSpeed = speed;
|
|
+ }
|
|
+ // Purpur end - Minecart settings and WASD controls
|
|
+
|
|
protected void comeOffTrack(ServerLevel level) {
|
|
double maxSpeed = this.getMaxSpeed(level);
|
|
Vec3 deltaMovement = this.getDeltaMovement();
|
|
this.setDeltaMovement(Mth.clamp(deltaMovement.x, -maxSpeed, maxSpeed), deltaMovement.y, Mth.clamp(deltaMovement.z, -maxSpeed, maxSpeed));
|
|
+
|
|
+ // Purpur start - Minecart settings and WASD controls
|
|
+ if (level().purpurConfig.minecartControllable && !isInWater() && !isInLava() && !passengers.isEmpty()) {
|
|
+ Entity passenger = passengers.get(0);
|
|
+ if (passenger instanceof net.minecraft.server.level.ServerPlayer player) {
|
|
+ net.minecraft.world.entity.player.Input lastClientInput = player.getLastClientInput();
|
|
+ float forward = (lastClientInput.forward() == lastClientInput.backward() ? 0.0F : lastClientInput.forward() ? 1.0F : -1.0F);
|
|
+ if (lastClientInput.jump() && this.onGround) {
|
|
+ setDeltaMovement(new Vec3(getDeltaMovement().x, level().purpurConfig.minecartControllableHopBoost, getDeltaMovement().z));
|
|
+ }
|
|
+ if (forward != 0.0F) {
|
|
+ org.bukkit.util.Vector velocity = player.getBukkitEntity().getEyeLocation().getDirection().normalize().multiply(getControllableSpeed());
|
|
+ if (forward < 0.0) {
|
|
+ velocity.multiply(-0.5);
|
|
+ }
|
|
+ setDeltaMovement(new Vec3(velocity.getX(), getDeltaMovement().y, velocity.getZ()));
|
|
+ }
|
|
+ this.setYRot(passenger.getYRot() - 90);
|
|
+ maxUpStep = level().purpurConfig.minecartControllableStepHeight;
|
|
+ } else {
|
|
+ maxUpStep = 0.0F;
|
|
+ }
|
|
+ } else {
|
|
+ maxUpStep = 0.0F;
|
|
+ }
|
|
+ // Purpur end - Minecart settings and WASD controls
|
|
if (this.onGround()) {
|
|
// CraftBukkit start - replace magic numbers with our variables
|
|
this.setDeltaMovement(new Vec3(this.getDeltaMovement().x * this.derailedX, this.getDeltaMovement().y * this.derailedY, this.getDeltaMovement().z * this.derailedZ));
|
|
// CraftBukkit end
|
|
}
|
|
+ else if (level().purpurConfig.minecartControllable) setDeltaMovement(new Vec3(getDeltaMovement().x * derailedX, getDeltaMovement().y, getDeltaMovement().z * derailedZ)); // Purpur - Minecart settings and WASD controls
|
|
|
|
this.move(MoverType.SELF, this.getDeltaMovement());
|
|
if (!this.onGround()) {
|
|
diff --git a/net/minecraft/world/item/MinecartItem.java b/net/minecraft/world/item/MinecartItem.java
|
|
index 620069daba04d48b57fc933328eda77f6ca9333e..0403b9b01994269d394820e8c8710ba1b9808bf0 100644
|
|
--- a/net/minecraft/world/item/MinecartItem.java
|
|
+++ b/net/minecraft/world/item/MinecartItem.java
|
|
@@ -30,8 +30,9 @@ public class MinecartItem extends Item {
|
|
BlockPos clickedPos = context.getClickedPos();
|
|
BlockState blockState = level.getBlockState(clickedPos);
|
|
if (!blockState.is(BlockTags.RAILS)) {
|
|
- return InteractionResult.FAIL;
|
|
- } else {
|
|
+ if (!level.purpurConfig.minecartPlaceAnywhere) return InteractionResult.FAIL; // Purpur - Minecart settings and WASD controls
|
|
+ if (blockState.isSolid()) clickedPos = clickedPos.relative(context.getClickedFace());
|
|
+ } // else { // Purpur - Minecart settings and WASD controls
|
|
ItemStack itemInHand = context.getItemInHand();
|
|
RailShape railShape = blockState.getBlock() instanceof BaseRailBlock
|
|
? blockState.getValue(((BaseRailBlock)blockState.getBlock()).getShapeProperty())
|
|
@@ -72,6 +73,6 @@ public class MinecartItem extends Item {
|
|
itemInHand.shrink(1);
|
|
return InteractionResult.SUCCESS;
|
|
}
|
|
- }
|
|
+ // } // Purpur - Minecart settings and WASD controls
|
|
}
|
|
}
|