diff --git a/pom.xml b/pom.xml
index 14bc582..30b3000 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,8 +10,8 @@
UTF-8
UTF-8
- ${project.groupId}.plugin.${project.groupId}
- 1.0.2
+ ${project.groupId}.plugin.${project.artifactId}
+ 1.1.0
com.artformgames
tempflight
@@ -105,6 +105,13 @@
+
+ org.bstats
+ bstats-bukkit
+ 3.0.0
+ compile
+
+
com.artformgames
artcore-api
diff --git a/src/main/java/com/artformgames/plugin/tempflight/Main.java b/src/main/java/com/artformgames/plugin/tempflight/Main.java
index b818404..74b2a55 100644
--- a/src/main/java/com/artformgames/plugin/tempflight/Main.java
+++ b/src/main/java/com/artformgames/plugin/tempflight/Main.java
@@ -2,6 +2,7 @@
import cc.carm.lib.easyplugin.EasyPlugin;
import cc.carm.lib.mineconfiguration.bukkit.MineConfiguration;
+import com.artformgames.core.ArtCore;
import com.artformgames.core.utils.GHUpdateChecker;
import com.artformgames.plugin.tempflight.command.TempFlightCommands;
import com.artformgames.plugin.tempflight.conf.PluginConfig;
@@ -10,7 +11,6 @@
import com.artformgames.plugin.tempflight.manager.FlightManager;
import dev.rollczi.litecommands.LiteCommands;
import dev.rollczi.litecommands.bukkit.LiteCommandsBukkit;
-import dev.rollczi.litecommands.schematic.SchematicFormat;
import org.bstats.bukkit.Metrics;
public class Main extends EasyPlugin {
@@ -44,11 +44,7 @@ protected boolean initialize() {
registerListener(new TempFlyListener());
log("Register commands...");
- this.commands = LiteCommandsBukkit.builder()
- .missingPermission((i, p, chain) -> PluginMessages.COMMANDS.NO_PERMISSION.send(i.sender()))
- .commands(new TempFlightCommands())
- .build();
-
+ this.commands = ArtCore.createCommand().commands(new TempFlightCommands()).build();
if (PluginConfig.METRICS.getNotNull()) {
log("Initializing bStats...");
diff --git a/src/main/java/com/artformgames/plugin/tempflight/command/TempFlightCommands.java b/src/main/java/com/artformgames/plugin/tempflight/command/TempFlightCommands.java
index 9c23bf5..893f66b 100644
--- a/src/main/java/com/artformgames/plugin/tempflight/command/TempFlightCommands.java
+++ b/src/main/java/com/artformgames/plugin/tempflight/command/TempFlightCommands.java
@@ -1,11 +1,11 @@
package com.artformgames.plugin.tempflight.command;
import com.artformgames.core.ArtCore;
+import com.artformgames.core.utils.TimeStringUtils;
import com.artformgames.plugin.tempflight.Main;
import com.artformgames.plugin.tempflight.conf.PluginMessages;
import com.artformgames.plugin.tempflight.manager.FlightManager;
import com.artformgames.plugin.tempflight.user.FlightAccount;
-import com.artformgames.plugin.tempflight.utils.TimeUtils;
import dev.rollczi.litecommands.annotations.argument.Arg;
import dev.rollczi.litecommands.annotations.command.Command;
import dev.rollczi.litecommands.annotations.context.Context;
@@ -17,7 +17,6 @@
import org.bukkit.entity.Player;
import java.time.Duration;
-import java.util.Optional;
@Command(name = "tempflight", aliases = {"tempfly"})
@@ -26,48 +25,50 @@
public class TempFlightCommands {
@Execute(name = "start")
- void start(@Context CommandSender sender,
- @Arg Player target, @Arg String duration, @OptionalArg Boolean back) {
- back = Optional.ofNullable(back).orElse(false);
+ @Description("Start a temporary flight for a player")
+ void start(@Context CommandSender sender, @Arg Player target, @Arg String duration, @OptionalArg Boolean back) {
+ long time = TimeStringUtils.toMilliSecPlus(duration);
+ if (time < 0) {
+ PluginMessages.COMMANDS.WRONG_TIME_FORMAT.send(sender);
+ return;
+ }
+
FlightAccount data = ArtCore.getHandler(target, FlightAccount.class);
if (data.isTempFlying()) {
- PluginMessages.COMMANDS.ALREADY_FLYING.send(sender, target.getName());
+ PluginMessages.COMMANDS.ALREADY_ENABLED.send(sender, target.getName());
PluginMessages.FLYING.send(target, data.getRemainMillis() / 1000);
return;
}
- FlightManager manager = Main.getFlightManager();
- long cooldown = manager.getCooldownMillis(target);
+ FlightManager flightManager = Main.getFlightManager();
+ long cooldown = flightManager.getCooldownMillis(target);
if (cooldown > 0) {
PluginMessages.COMMANDS.COOLING.send(sender, target.getName(), cooldown / 1000);
PluginMessages.COOLING.send(target, cooldown / 1000);
return;
}
- Duration time = TimeUtils.parseDuration(duration);
- if (time.isZero() || time.isNegative()) {
- PluginMessages.COMMANDS.TIME_USAGE.send(sender);
- return;
- }
-
- if (manager.startFly(target, time, back)) {
- PluginMessages.COMMANDS.FLY_ENABLED.send(sender, target.getName(), time.toSeconds());
- PluginMessages.ENABLED.send(target, duration);
- if (back) PluginMessages.WILL_BACK.send(target);
+ if (flightManager.startFly(target, Duration.ofMillis(time), Boolean.TRUE.equals(back))) {
+ PluginMessages.COMMANDS.ENABLED.send(sender, target.getName(), (time / 1000));
+ PluginMessages.ENABLED.send(target, time / 1000);
+ if (Boolean.TRUE.equals(back)) PluginMessages.WILL_BACK.send(target);
} else {
- PluginMessages.COMMANDS.ALREADY_FLYING.send(sender, target.getName());
+ PluginMessages.COMMANDS.ALREADY_ENABLED.send(sender, target.getName());
}
+
}
- @Execute(name = "stop")
- void stop(@Context CommandSender sender, @Arg Player player) {
- FlightManager manager = Main.getFlightManager();
- if (manager.endFly(player)) {
- PluginMessages.COMMANDS.FLY_DISABLED.send(sender, player.getName());
- PluginMessages.DISABLED.send(player);
- } else {
- PluginMessages.COMMANDS.NOT_FLYING.send(sender, player.getName());
+ @Execute(name = "stop", aliases = "shut")
+ @Description("Stop temporary flight for a player.")
+ void stop(@Context CommandSender sender, @Arg Player target) {
+ FlightManager flightManager = Main.getFlightManager();
+ FlightAccount data = ArtCore.getHandler(target, FlightAccount.class);
+ if (!data.isTempFlying() || !flightManager.endFly(target)) {
+ PluginMessages.COMMANDS.ALREADY_DISABLED.send(sender, target.getName());
+ return;
}
+ PluginMessages.COMMANDS.DISABLED.send(sender, target.getName());
+ PluginMessages.DISABLED.send(target);
}
}
diff --git a/src/main/java/com/artformgames/plugin/tempflight/conf/PluginConfig.java b/src/main/java/com/artformgames/plugin/tempflight/conf/PluginConfig.java
index aab0975..4829bf6 100644
--- a/src/main/java/com/artformgames/plugin/tempflight/conf/PluginConfig.java
+++ b/src/main/java/com/artformgames/plugin/tempflight/conf/PluginConfig.java
@@ -2,9 +2,9 @@
import cc.carm.lib.configuration.core.Configuration;
import cc.carm.lib.configuration.core.annotation.HeaderComment;
-import cc.carm.lib.configuration.core.value.ConfigValue;
+import cc.carm.lib.configuration.core.value.impl.ConfigValueMap;
+import cc.carm.lib.configuration.core.value.type.ConfiguredMap;
import cc.carm.lib.configuration.core.value.type.ConfiguredValue;
-import com.artformgames.core.utils.TimeStringUtils;
public interface PluginConfig extends Configuration {
@@ -26,12 +26,16 @@ public interface PluginConfig extends Configuration {
})
ConfiguredValue CHECK_UPDATE = ConfiguredValue.of(Boolean.class, true);
- @HeaderComment("The cooldown time for the player to use the flight command, format: 1d,2h,3m,4s")
- ConfiguredValue COOLDOWN = ConfigValue.builder()
- .asValue(Long.class).fromString()
- .parseValue((v, d) -> TimeStringUtils.toMilliSecPlus(v))
- .serializeValue(TimeStringUtils::toTimeString)
- .defaults(60000L).build();
+ @HeaderComment({
+ "The cooldown time for the player to use the flight command of each permissions",
+ "format -> millisecond: permission"
+ })
+ ConfiguredMap COOLDOWN = ConfigValueMap.builderOf(Long.class, String.class)
+ .asLinkedMap().fromString().parseKey(Long::parseUnsignedLong).parseValue(Object::toString)
+ .defaults(m -> {
+ m.put(60000L, "tempflight.use");
+ m.put(30000L, "group.vip");
+ }).build();
}
diff --git a/src/main/java/com/artformgames/plugin/tempflight/conf/PluginMessages.java b/src/main/java/com/artformgames/plugin/tempflight/conf/PluginMessages.java
index 45df6f4..8614cfb 100644
--- a/src/main/java/com/artformgames/plugin/tempflight/conf/PluginMessages.java
+++ b/src/main/java/com/artformgames/plugin/tempflight/conf/PluginMessages.java
@@ -1,102 +1,69 @@
package com.artformgames.plugin.tempflight.conf;
-import cc.carm.lib.configuration.core.Configuration;
-import cc.carm.lib.mineconfiguration.bukkit.builder.message.CraftMessageListBuilder;
-import cc.carm.lib.mineconfiguration.bukkit.builder.message.CraftMessageValueBuilder;
-import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredMessage;
import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredMessageList;
-import de.themoep.minedown.MineDown;
-import me.clip.placeholderapi.PlaceholderAPI;
+import com.artformgames.core.conf.Messages;
import net.md_5.bungee.api.chat.BaseComponent;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-import java.util.function.BiFunction;
+public interface PluginMessages extends Messages {
-public interface PluginMessages extends Configuration {
- static @NotNull CraftMessageListBuilder list() {
- return ConfiguredMessageList.create(getParser())
- .whenSend((sender, message) -> message.forEach(m -> sender.spigot().sendMessage(m)));
- }
+ interface COMMANDS extends Messages {
- static @NotNull CraftMessageValueBuilder value() {
- return ConfiguredMessage.create(getParser())
- .whenSend((sender, message) -> sender.spigot().sendMessage(message));
- }
+ ConfiguredMessageList WRONG_TIME_FORMAT = Messages.list()
+ .defaults("&c&lWrong format! &fPlease use &e&o1h,2m,3s &f.")
+ .build();
+
+ ConfiguredMessageList ALREADY_ENABLED = Messages.list()
+ .defaults("&fThe player &6%(player) &fis already enabled flying.")
+ .params("player")
+ .build();
+
+ ConfiguredMessageList ALREADY_DISABLED = Messages.list()
+ .defaults("&fThe player &6%(player) &fis not enabled flying.")
+ .params("player")
+ .build();
+
+ ConfiguredMessageList COOLING = Messages.list()
+ .defaults(
+ "&fThe player &6%(player) &fneed to wait for &e%(time) &fseconds before he can use the timed flight again."
+ ).params("player", "time").build();
+
+ ConfiguredMessageList ENABLED = Messages.list()
+ .defaults("&fSuccessfully enabled temp flight for &6%(player) &fwith &e%(time) &fseconds.")
+ .params("player", "time")
+ .build();
+ ConfiguredMessageList DISABLED = Messages.list()
+ .defaults("&fSuccessfully disabled temp flight for &6%(player) &f.")
+ .params("player")
+ .build();
- private static @NotNull BiFunction getParser() {
- return (sender, message) -> {
- if (sender == null) return MineDown.parse(message);
- if (sender instanceof Player player) {
- return MineDown.parse(PlaceholderAPI.setPlaceholders(player, message));
- } else {
- return MineDown.parse(message);
- }
- };
}
- ConfiguredMessageList COOLING = list()
+ ConfiguredMessageList COOLING = Messages.list()
.defaults("&fYou need to wait for &e%(time) &fseconds before you can use the timed flight again.")
.params("time")
.build();
- ConfiguredMessageList FLYING = list()
+ ConfiguredMessageList FLYING = Messages.list()
.defaults("&fYou have enabled time-limited flying, and the remaining flight time is &e%(time) &fseconds.")
.params("time")
.build();
- ConfiguredMessageList ENABLED = list()
- .defaults("&fYou &a&l&Enabled &f for timed flights, and from now on you can fly &e%(time) &fseconds.")
+ ConfiguredMessageList ENABLED = Messages.list()
+ .defaults("&fYou are &a&lEnabled &f for timed flights, and from now on you can fly &e%(time) &fseconds.")
.params("time")
.build();
- ConfiguredMessageList DISABLED = list()
+ ConfiguredMessageList DISABLED = Messages.list()
.defaults("&fYour timed flight has ended and your flight status has been automatically turned off.")
.build();
- ConfiguredMessageList MODE_CHANGE = list()
+ ConfiguredMessageList MODE_CHANGE = Messages.list()
.defaults("&fYou've switched to &eCreative Mode&f, so there's no longer a time limit for flying.")
.build();
- ConfiguredMessageList WILL_BACK = list()
- .defaults("&7Note: Teleport back to your current location after the flight is over!")
+ ConfiguredMessageList WILL_BACK = Messages.list()
+ .defaults("&7Note: Will teleport back to your start location after the flight is over!")
.build();
- interface COMMANDS extends Configuration {
-
- ConfiguredMessageList NO_PERMISSION = list()
- .defaults("&cYou don't have permission to do this.")
- .build();
-
- ConfiguredMessageList ALREADY_FLYING = list().defaults(
- "The player is already flying, and you can't do it again."
- ).params("player").build();
-
- ConfiguredMessageList NOT_FLYING = list().defaults(
- "The player is not flying, and you can't do it."
- ).params("player").build();
-
- ConfiguredMessageList FLY_DISABLED = list().defaults(
- "&fThe player &e%(player)&f is not flying, and you can't do it."
- ).params("player").build();
-
-
- ConfiguredMessageList FLY_ENABLED = list().defaults(
- "&fSuccessfully enabled temporary flight in %(time) seconds for the player &e%(player)&f."
- ).params("player", "time").build();
-
- ConfiguredMessageList COOLING = list().defaults(
- "&fThe player %(player) need to wait for &e%(time) &fseconds before flying again."
- ).params("player", "time").build();
-
- // TIME USAGE
- ConfiguredMessageList TIME_USAGE = list().defaults(
- "&fThe time format is incorrect, the format is &e1d2h3m4s&f."
- ).build();
-
-
- }
-
}
diff --git a/src/main/java/com/artformgames/plugin/tempflight/manager/FlightManager.java b/src/main/java/com/artformgames/plugin/tempflight/manager/FlightManager.java
index 260c05d..a0bb2a9 100644
--- a/src/main/java/com/artformgames/plugin/tempflight/manager/FlightManager.java
+++ b/src/main/java/com/artformgames/plugin/tempflight/manager/FlightManager.java
@@ -22,22 +22,19 @@ public class FlightManager {
* Used to record the last time the user enabled an ad-hoc flight
* The UUID is the user's UUID, and the time is the timestamp when the user theoretically ended the flight
*/
- protected final @NotNull Map lastTime = new HashMap<>();
+ protected final @NotNull Map cooldownTime = new HashMap<>();
public static @NotNull BukkitRunnable repeatRunnable = new BukkitRunnable() {
@Override
public void run() {
- Bukkit.getOnlinePlayers().forEach(Main.getFlightManager()::checkFlight);
+ FlightManager flightManager = Main.getFlightManager();
+ Bukkit.getOnlinePlayers().forEach(flightManager::checkFlight);
Main.getFlightManager().purgeCooldownData();
}
};
public FlightManager(Main main) {
- ArtCore.getUserManager().registerHandler(
- main, FlightAccount.class,
- FlightAccount::new, FlightAccount::new,
- (k, a) -> lastTime.remove(k.uuid())
- );
+ ArtCore.getUserManager().registerHandler(main, FlightAccount.class, FlightAccount::new, FlightAccount::new);
repeatRunnable.runTaskTimerAsynchronously(Main.getInstance(), 100L, 20L);
}
@@ -54,7 +51,12 @@ public boolean startFly(@NotNull Player player, @NotNull Duration duration, bool
if (account.isTempFlying()) return false;
long end = account.start(duration, teleportBack ? player.getLocation() : null);
- lastTime.put(player.getUniqueId(), end);
+ long cooldown = PluginConfig.COOLDOWN.entrySet().stream()
+ .filter(e -> player.hasPermission(e.getValue()))
+ .mapToLong(Map.Entry::getKey).min().orElse(-1);
+ if (cooldown > 0) {
+ cooldownTime.put(player.getUniqueId(), end + cooldown);
+ }
player.setAllowFlight(true);
player.setFlying(true);
@@ -65,8 +67,15 @@ public boolean endFly(@NotNull Player player) {
FlightAccount account = getAccount(player);
if (!account.isTempFlying()) return false;
- account.reset();
Optional.ofNullable(account.getStartLocation()).ifPresent(player::teleport);
+ account.reset();
+
+ long cooldown = PluginConfig.COOLDOWN.entrySet().stream()
+ .filter(e -> player.hasPermission(e.getValue()))
+ .mapToLong(Map.Entry::getKey).min().orElse(-1);
+ if (cooldown > 0) {
+ cooldownTime.put(player.getUniqueId(), System.currentTimeMillis() + cooldown);
+ }
if (player.getAllowFlight()) {
player.setFlying(false);
@@ -93,22 +102,15 @@ public boolean isCoolingDown(@NotNull Player player) {
}
public long getCooldownMillis(@NotNull Player player) {
- Long time = lastTime.get(player.getUniqueId());
+ Long time = cooldownTime.get(player.getUniqueId());
if (time == null) return 0;
- long cooldown = PluginConfig.COOLDOWN.getNotNull();
- if (cooldown <= 0) return 0;
-
- return cooldown - (System.currentTimeMillis() - time);
+ return time - System.currentTimeMillis();
}
public void purgeCooldownData() {
- long cooldown = PluginConfig.COOLDOWN.getNotNull();
- if (cooldown > 0) {
- lastTime.entrySet().removeIf(entry -> System.currentTimeMillis() - entry.getValue() > cooldown);
- } else {
- lastTime.clear();
- }
+ long v = System.currentTimeMillis();
+ cooldownTime.entrySet().removeIf(entry -> v > entry.getValue());
}
}
diff --git a/src/main/java/com/artformgames/plugin/tempflight/user/FlightAccount.java b/src/main/java/com/artformgames/plugin/tempflight/user/FlightAccount.java
index f2f8afa..ca9c42c 100644
--- a/src/main/java/com/artformgames/plugin/tempflight/user/FlightAccount.java
+++ b/src/main/java/com/artformgames/plugin/tempflight/user/FlightAccount.java
@@ -38,7 +38,7 @@ public boolean isTempFlying() {
public long getRemainMillis() {
if (this.endMillis == null) return 0;
- else return (this.endMillis) - System.currentTimeMillis();
+ else return this.endMillis - System.currentTimeMillis();
}