Skip to content

Commit

Permalink
Ability to disable nested parkour commands
Browse files Browse the repository at this point in the history
Added ability to affect vehicles with ParkourKit (WIP)
Added ability to return items achieved while on Course (WIP)
Fixed decimal rewarddelay not working
  • Loading branch information
A5H73Y committed Mar 15, 2023
1 parent 9ce67e1 commit 61099df
Show file tree
Hide file tree
Showing 12 changed files with 236 additions and 25 deletions.
6 changes: 5 additions & 1 deletion src/main/java/io/github/a5h73y/parkour/Parkour.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import io.github.a5h73y.parkour.listener.SignListener;
import io.github.a5h73y.parkour.listener.interact.AutoStartListener;
import io.github.a5h73y.parkour.listener.move.ParkourBlockListener;
import io.github.a5h73y.parkour.listener.move.VehicleMoveListener;
import io.github.a5h73y.parkour.other.AbstractPluginReceiver;
import io.github.a5h73y.parkour.other.ParkourUpdater;
import io.github.a5h73y.parkour.other.PluginBackupUtil;
Expand Down Expand Up @@ -248,9 +249,12 @@ private void registerEvents() {
if (getDefaultConfig().getBoolean("AutoStart.Enabled")) {
pluginManager.registerEvents(new AutoStartListener(this), this);
}
if (getDefaultConfig().getBoolean("OnCourse.UseParkourKit")) {
if (getDefaultConfig().getBoolean("OnCourse.ParkourKit.Enabled")) {
pluginManager.registerEvents(new ParkourBlockListener(this), this);
}
if (getDefaultConfig().getBoolean("OnCourse.ParkourKit.IncludeVehicles")) {
pluginManager.registerEvents(new VehicleMoveListener(this), this);
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,14 +77,15 @@ public boolean onCommand(@NotNull CommandSender sender,
return true;
}

String commandLabel = args[0].toLowerCase();
String combinedLabels = String.join(" ", args).toLowerCase();

if (parkour.getParkourConfig().getBoolean("DisableCommand." + commandLabel)
if (parkour.getParkourConfig().getBoolean("DisableCommand." + combinedLabels)
&& !PermissionUtils.hasPermission(player, Permission.PARKOUR_ALL, false)) {
TranslationUtils.sendTranslation("Error.DisabledCommand", player);
return false;
}

String commandLabel = args[0].toLowerCase();
switch (commandLabel) {
case "addjoinitem":
if (!PermissionUtils.hasPermission(player, Permission.ADMIN_COURSE)) {
Expand All @@ -102,11 +103,11 @@ public boolean onCommand(@NotNull CommandSender sender,
if (!PermissionUtils.hasPermission(player, Permission.ADMIN_ALL)) {
return false;

} else if (!ValidationUtils.validateArgs(player, args, 3)) {
} else if (!ValidationUtils.validateArgs(player, args, 3, 99)) {
return false;
}

parkour.getAdministrationManager().processAdminCommand(player, args[1], args[2]);
parkour.getAdministrationManager().processAdminCommand(player, args[1], args[2], args);
break;

case "cache":
Expand Down Expand Up @@ -508,7 +509,7 @@ public boolean onCommand(@NotNull CommandSender sender,
case "hideall":
case "leave":
case "restart":
parkour.getParkourSessionManager().processCommand(player, commandLabel);
this.onCommand(sender, command, label, "session", commandLabel);
break;

// parkourkit aliases
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,11 @@ public boolean onCommand(@NotNull CommandSender commandSender,

case "admin":
case "administrator":
if (!ValidationUtils.validateArgs(commandSender, args, 3)) {
if (!ValidationUtils.validateArgs(commandSender, args, 3, 99)) {
return false;
}

parkour.getAdministrationManager().processAdminCommand(commandSender, args[1], args[2]);
parkour.getAdministrationManager().processAdminCommand(commandSender, args[1], args[2], args);
break;

case "cache":
Expand Down Expand Up @@ -307,6 +307,8 @@ public boolean onCommand(@NotNull CommandSender commandSender,
return false;
}

// TODO if (--force) then parkour.getPlayerManager().increaseCheckpoint(

parkour.getPlayerManager().manuallyIncreaseCheckpoint(
findPlayer(commandSender, args[1]), Integer.parseInt(args[2]));
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,8 @@ public DefaultConfig(File file) {
this.setDefault("OnCourse.SequentialCheckpoints.AlertPlayer", true);
this.setDefault("OnCourse.SneakToInteractItems", true);
this.setDefault("OnCourse.TreatLastCheckpointAsFinish", false);
this.setDefault("OnCourse.UseParkourKit", true);
this.setDefault("OnCourse.ParkourKit.Enabled", true);
this.setDefault("OnCourse.ParkourKit.IncludeVehicles", false);
this.setDefault("OnCourse.EnforceParkourCommands.Enabled", true);
this.setDefault("OnCourse.EnforceParkourCommands.Whitelist", Collections.singletonList("login"));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,10 @@ protected Prompt acceptValidatedInput(ConversationContext context, Number amount
private static class ChooseDisplayName extends BooleanPrompt {
@Override
public String getPromptText(ConversationContext context) {
return ChatColor.LIGHT_PURPLE + " Would you like to add a custom display name?\n" +
ChatColor.GREEN + "[yes, no]";
return ChatColor.LIGHT_PURPLE + " Would you like to add a custom display name?\n"
+ ChatColor.GREEN + "[yes, no]";
}

@Override
protected Prompt acceptValidatedInput(ConversationContext context, boolean addName) {
if (addName) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,8 +252,8 @@ public int getPositionOnLeaderboard(OfflinePlayer player, String courseName) {
int courseId = getCourseId(courseName);

if (courseId > 0 && hasPlayerAchievedTime(player, courseName)) {
String leaderboardPositionQuery = "SELECT COUNT(*) AS position FROM time WHERE courseId=? AND time < " +
"(SELECT time FROM time WHERE courseId=? AND playerId=? ORDER BY time LIMIT 1)";
String leaderboardPositionQuery = "SELECT COUNT(*) AS position FROM time WHERE courseId=? AND time < "
+ "(SELECT time FROM time WHERE courseId=? AND playerId=? ORDER BY time LIMIT 1)";

PluginUtils.debug("Checking leaderboard position for: " + leaderboardPositionQuery);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

public class ParkourBlockListener extends AbstractPluginReceiver implements Listener {

private static final List<BlockFace> BLOCK_FACES =
public static final List<BlockFace> BLOCK_FACES =
Arrays.asList(BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST);

public ParkourBlockListener(final Parkour parkour) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
package io.github.a5h73y.parkour.listener.move;

import static io.github.a5h73y.parkour.listener.move.ParkourBlockListener.BLOCK_FACES;

import io.github.a5h73y.parkour.Parkour;
import io.github.a5h73y.parkour.other.AbstractPluginReceiver;
import io.github.a5h73y.parkour.type.kit.ParkourKit;
import io.github.a5h73y.parkour.type.kit.ParkourKitAction;
import io.github.a5h73y.parkour.type.player.session.ParkourSession;
import io.github.a5h73y.parkour.utility.MaterialUtils;
import io.github.a5h73y.parkour.utility.PlayerUtils;
import org.bukkit.Material;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.entity.Vehicle;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.vehicle.VehicleMoveEvent;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.Vector;

public class VehicleMoveListener extends AbstractPluginReceiver implements Listener {

public VehicleMoveListener(final Parkour parkour) {
super(parkour);
}

/**
* Handle Player Move.
* While the Player is moving on a Course, handle any actions that should be performed.
*
* @param event VehicleMoveEvent
*/
@EventHandler
public void onVehicleMove(VehicleMoveEvent event) {
if (!(event.getVehicle().getPassenger() instanceof Player)) {
return;
}

Player player = (Player) event.getVehicle().getPassenger();

if (!parkour.getParkourSessionManager().isPlaying(player)) {
return;
}

ParkourSession session = parkour.getParkourSessionManager().getParkourSession(player);
ParkourKit parkourKit = session.getCourse().getParkourKit();

if (parkourKit == null) {
return;
}

if (parkour.getParkourConfig().isAttemptLessChecks()
&& MaterialUtils.sameBlockLocations(event.getFrom(), event.getTo())) {
return;
}

Material belowMaterial = event.getVehicle().getLocation().getBlock().getRelative(BlockFace.DOWN).getType();
ParkourKitAction kitAction = parkourKit.getAction(belowMaterial);

if (kitAction != null) {
performBelowAction(player, event.getVehicle(), kitAction);
} else {
performWallAction(player, event.getVehicle(), parkourKit);
}
}

private void performBelowAction(Player player, Vehicle vehicle, ParkourKitAction kitAction) {
Vector velocity = vehicle.getVelocity();
switch (kitAction.getActionType()) {
case FINISH:
parkour.getPlayerManager().finishCourse(player);
break;

case DEATH:
parkour.getPlayerManager().playerDie(player);
break;

case LAUNCH:
// player.sendMessage(String.valueOf(velocity.getY()));
// TODO why is this so temperamental
velocity.setY(velocity.getY() + 5);
break;

case BOUNCE:
if (!player.hasPotionEffect(PotionEffectType.JUMP)) {
PlayerUtils.applyPotionEffect(PotionEffectType.JUMP, kitAction.getDuration(),
(int) kitAction.getStrength(), player);
}
break;

case SPEED:
if (!player.hasPotionEffect(PotionEffectType.SPEED)) {
PlayerUtils.applyPotionEffect(PotionEffectType.SPEED, kitAction.getDuration(),
(int) kitAction.getStrength(), player);
}
break;

case POTION:
PotionEffectType effect = PotionEffectType.getByName(kitAction.getEffect());
if (effect != null) {
PlayerUtils.applyPotionEffect(effect, kitAction.getDuration(),
(int) kitAction.getStrength(), player);
}
break;

case NORUN:
player.setSprinting(false);
break;

case NOPOTION:
PlayerUtils.removeAllPotionEffects(player);
player.setFireTicks(0);
break;

default:
break;
}

vehicle.setVelocity(velocity);
}

private void performWallAction(Player player, Vehicle vehicle, ParkourKit parkourKit) {
for (BlockFace blockFace : BLOCK_FACES) {
Material material = player.getLocation().getBlock().getRelative(blockFace).getType();
ParkourKitAction kitAction = parkourKit.getAction(material);

if (kitAction != null) {
switch (kitAction.getActionType()) {
case CLIMB:
vehicle.setVelocity(new Vector(0, kitAction.getStrength(), 0));
break;

case REPULSE:
double strength = kitAction.getStrength();
double x = blockFace == BlockFace.NORTH || blockFace == BlockFace.SOUTH ? 0
: blockFace == BlockFace.EAST ? -strength : strength;
double z = blockFace == BlockFace.EAST || blockFace == BlockFace.WEST ? 0
: blockFace == BlockFace.NORTH ? strength : -strength;

vehicle.setVelocity(new Vector(x, 0.3, z));
break;
default:
break;
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,8 @@ public void processCacheCommand(@NotNull CommandSender commandSender,
*/
public void processAdminCommand(@NotNull CommandSender commandSender,
@NotNull String command,
@NotNull String argument) {
@NotNull String argument,
@Nullable String... args) {

switch (command.toLowerCase()) {
case "addwhitelist":
Expand All @@ -291,11 +292,11 @@ public void processAdminCommand(@NotNull CommandSender commandSender,
break;

case "disablecommand":
disableParkourCommand(commandSender, argument);
disableParkourCommand(commandSender, StringUtils.extractMessageFromArgs(args, 2));
break;

case "enablecommand":
enableParkourCommand(commandSender, argument);
enableParkourCommand(commandSender, StringUtils.extractMessageFromArgs(args, 2));
break;

default:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public class PlayerConfig extends Json {
public static final String PARKOUR_LEVEL = "ParkourLevel";
public static final String PARKOUR_RANK = "ParkourRank";
public static final String LAST_REWARDED = "LastRewarded.";
public static final String START_PARKOUR_INVENTORY = "StartParkourInventory";
public static final String INVENTORY = "Inventory";
public static final String ARMOR = "Armor";
public static final String HEALTH = "Health";
Expand Down Expand Up @@ -197,6 +198,16 @@ public void setPlayerDataSnapshot(Player player) {
}
}

public void setSnapshotStartParkourInventory(Player player) {
if (!this.contains(SNAPSHOT + START_PARKOUR_INVENTORY)) {
this.setSerializable(SNAPSHOT + START_PARKOUR_INVENTORY, player.getInventory().getContents());
}
}

public ItemStack[] getSnapshotStartParkourInventory() {
return this.getSerializable(SNAPSHOT + START_PARKOUR_INVENTORY, ItemStack[].class);
}

public boolean hasPlayerDataSnapshot() {
return this.contains(SNAPSHOT);
}
Expand Down
Loading

0 comments on commit 61099df

Please sign in to comment.