diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index eddf071..81c2d0e 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -6,6 +6,11 @@
+
+
+
+
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
index d61b968..5274667 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -8,7 +8,7 @@
-
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index bc0353c..4815a74 100644
--- a/pom.xml
+++ b/pom.xml
@@ -8,11 +8,11 @@
com.rsscripting
RS-FasterMinecarts
- 0.1.0
+ 0.2.0
jar
- 21
+ 25
UTF-8
@@ -27,7 +27,7 @@
io.papermc.paper
paper-api
- 1.21.10-R0.1-SNAPSHOT
+ 26.1.2.build.63-stable
provided
@@ -35,13 +35,20 @@
RS-FasterMinecarts-0-1-0
+
+
+ src/main/resources
+ true
+
+
+
org.apache.maven.plugins
maven-compiler-plugin
3.14.1
- 21
+ 25
diff --git a/src/main/java/com/rsscripting/rsfasterminecarts/MinecartListener.java b/src/main/java/com/rsscripting/rsfasterminecarts/MinecartListener.java
index db47886..14bbad9 100644
--- a/src/main/java/com/rsscripting/rsfasterminecarts/MinecartListener.java
+++ b/src/main/java/com/rsscripting/rsfasterminecarts/MinecartListener.java
@@ -1,11 +1,14 @@
package com.rsscripting.rsfasterminecarts;
+import org.bukkit.block.Block;
+import org.bukkit.block.data.Rail;
import org.bukkit.entity.Minecart;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.vehicle.VehicleEnterEvent;
import org.bukkit.event.vehicle.VehicleExitEvent;
+import org.bukkit.event.vehicle.VehicleMoveEvent;
import java.util.HashMap;
import java.util.Map;
@@ -33,7 +36,6 @@ public class MinecartListener implements Listener {
UUID minecartId = minecart.getUniqueId();
- // Do not multiply an already modified minecart.
if (originalSpeeds.containsKey(minecartId)) {
return;
}
@@ -46,6 +48,102 @@ public class MinecartListener implements Listener {
minecart.setMaxSpeed(originalSpeed * multiplier);
}
+ @EventHandler
+ public void onVehicleMove(VehicleMoveEvent event) {
+
+ if (!(event.getVehicle() instanceof Minecart minecart)) {
+ return;
+ }
+
+ UUID minecartId = minecart.getUniqueId();
+
+ Double originalSpeed = originalSpeeds.get(minecartId);
+
+ if (originalSpeed == null) {
+ return;
+ }
+
+ Block currentBlock = event.getTo().getBlock();
+
+ Rail currentRail = getRail(currentBlock);
+
+ if (currentRail == null) {
+ return;
+ }
+
+ boolean onHill = isAscending(currentRail);
+
+ if (onHill) {
+ minecart.setMaxSpeed(originalSpeed);
+ return;
+ }
+
+ boolean approachingHill = isApproachingHill(minecart, currentBlock);
+
+ if (approachingHill) {
+ minecart.setMaxSpeed(originalSpeed);
+ return;
+ }
+
+ double multiplier = plugin.getConfig().getDouble("max-speed", 3.0);
+
+ minecart.setMaxSpeed(originalSpeed * multiplier);
+ }
+
+ private Rail getRail(Block block) {
+
+ if (block.getBlockData() instanceof Rail rail) {
+ return rail;
+ }
+
+ Block below = block.getRelative(0, -1, 0);
+
+ if (below.getBlockData() instanceof Rail rail) {
+ return rail;
+ }
+
+ return null;
+ }
+
+ private boolean isAscending(Rail rail) {
+
+ return rail.getShape() == Rail.Shape.ASCENDING_EAST
+ || rail.getShape() == Rail.Shape.ASCENDING_WEST
+ || rail.getShape() == Rail.Shape.ASCENDING_NORTH
+ || rail.getShape() == Rail.Shape.ASCENDING_SOUTH;
+ }
+
+ private boolean isApproachingHill(Minecart minecart, Block currentBlock) {
+
+ Rail currentRail = getRail(currentBlock);
+
+ if (currentRail == null) {
+ return false;
+ }
+
+ Rail.Shape shape = currentRail.getShape();
+
+ if (shape != Rail.Shape.NORTH_SOUTH
+ && shape != Rail.Shape.EAST_WEST) {
+ return false;
+ }
+
+ double x = minecart.getVelocity().getX();
+ double z = minecart.getVelocity().getZ();
+
+ Block nextBlock;
+
+ if (Math.abs(x) > Math.abs(z)) {
+ nextBlock = currentBlock.getRelative(x > 0 ? 1 : -1, 0, 0);
+ } else {
+ nextBlock = currentBlock.getRelative(0, 0, z > 0 ? 1 : -1);
+ }
+
+ Rail nextRail = getRail(nextBlock);
+
+ return nextRail != null && isAscending(nextRail);
+ }
+
@EventHandler
public void onVehicleExit(VehicleExitEvent event) {
diff --git a/target/RS-FasterMinecarts-0-1-0.jar b/target/RS-FasterMinecarts-0-1-0.jar
index 58a2ed1..88f6a4a 100644
Binary files a/target/RS-FasterMinecarts-0-1-0.jar and b/target/RS-FasterMinecarts-0-1-0.jar differ
diff --git a/target/classes/com/rsscripting/rsfasterminecarts/MinecartListener.class b/target/classes/com/rsscripting/rsfasterminecarts/MinecartListener.class
index acca1ef..5242a1a 100644
Binary files a/target/classes/com/rsscripting/rsfasterminecarts/MinecartListener.class and b/target/classes/com/rsscripting/rsfasterminecarts/MinecartListener.class differ
diff --git a/target/classes/com/rsscripting/rsfasterminecarts/RSFasterMinecarts.class b/target/classes/com/rsscripting/rsfasterminecarts/RSFasterMinecarts.class
index 6439097..9091aa1 100644
Binary files a/target/classes/com/rsscripting/rsfasterminecarts/RSFasterMinecarts.class and b/target/classes/com/rsscripting/rsfasterminecarts/RSFasterMinecarts.class differ
diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml
index cb51fe6..8740c4c 100644
--- a/target/classes/plugin.yml
+++ b/target/classes/plugin.yml
@@ -1,5 +1,5 @@
name: RS-FasterMinecarts
-version: ${project.version}
+version: 0.1.0
main: com.rsscripting.rsfasterminecarts.RSFasterMinecarts
api-version: '1.21'
description: Increases the maximum speed of player-occupied minecarts.