diff --git a/src/main/java/pl/piecuu/killstreak/Killstreak.java b/src/main/java/pl/piecuu/killstreak/Killstreak.java index 7f778fd..b736dbf 100644 --- a/src/main/java/pl/piecuu/killstreak/Killstreak.java +++ b/src/main/java/pl/piecuu/killstreak/Killstreak.java @@ -6,6 +6,8 @@ import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; +import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; + public class Killstreak extends JavaPlugin implements Listener { private static Plugin invisNinja; public static Plugin getInvisNinja() { @@ -24,6 +26,9 @@ public class Killstreak extends JavaPlugin implements Listener { new KillstreakManager(this); pm.registerEvents(this, this); pm.registerEvents(new PlayerManager(this), this); + this.getLifecycleManager().registerEventHandler(LifecycleEvents.COMMANDS, commands -> { + commands.registrar().register(KillstreakCommand.createCommand()); + }); } else { getLogger().warning("Could not find PlaceholderAPI! This plugin is required."); pm.disablePlugin(this); diff --git a/src/main/java/pl/piecuu/killstreak/KillstreakCommand.java b/src/main/java/pl/piecuu/killstreak/KillstreakCommand.java new file mode 100644 index 0000000..375fdfb --- /dev/null +++ b/src/main/java/pl/piecuu/killstreak/KillstreakCommand.java @@ -0,0 +1,108 @@ +package pl.piecuu.killstreak; + +import java.util.Collection; + +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; + +import com.destroystokyo.paper.profile.PlayerProfile; +import com.mojang.brigadier.arguments.LongArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.builder.RequiredArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.tree.LiteralCommandNode; + +import io.papermc.paper.command.brigadier.CommandSourceStack; +import io.papermc.paper.command.brigadier.Commands; +import io.papermc.paper.command.brigadier.argument.ArgumentTypes; +import io.papermc.paper.command.brigadier.argument.resolvers.PlayerProfileListResolver; +import io.papermc.paper.command.brigadier.argument.resolvers.selector.PlayerSelectorArgumentResolver; + +public class KillstreakCommand { + public static LiteralCommandNode createCommand() { + RequiredArgumentBuilder playerArgument = Commands.argument("player", ArgumentTypes.player()); + + LiteralArgumentBuilder ks = Commands.literal("ks") + .then(Commands.literal("get") + .requires(s -> s.getSender().hasPermission("ks.get")) + .executes(KillstreakCommand::getOwnKillstreak) + .then(Commands.argument("profile", ArgumentTypes.playerProfiles()) + .requires(s -> s.getSender().hasPermission("ks.admin.get")) + .executes(KillstreakCommand::getOtherKillstreak) + ) + ) + .then(Commands.literal("set") + .then(playerArgument.then(Commands.argument("killstreak", LongArgumentType.longArg(0L, 999999L)) + .requires(s -> s.getSender().hasPermission("ks.admin.set")) + .executes(KillstreakCommand::setKillstreak) + )) + ) + .then(Commands.literal("reset") + .then(playerArgument + .requires(s -> s.getSender().hasPermission("ks.admin.reset")) + .executes(KillstreakCommand::resetKillstreak) + ) + ); + + return ks.build(); + } + + private static Player getFirstPlayerFromCtx(CommandContext ctx) throws CommandSyntaxException { + final PlayerSelectorArgumentResolver playerResolver = ctx.getArgument("player", PlayerSelectorArgumentResolver.class); + return playerResolver.resolve(ctx.getSource()).getFirst(); + } + + private static OfflinePlayer getOfflinePlayerFromCtx(CommandContext ctx) throws CommandSyntaxException { + final PlayerProfileListResolver profilesResolver = ctx.getArgument("profile", PlayerProfileListResolver.class); + final Collection foundProfiles = profilesResolver.resolve(ctx.getSource()); + + //for (final PlayerProfile profile : foundProfiles) {} + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(foundProfiles.iterator().next().getId()); + return offlinePlayer; + } + + private static int resetKillstreak(CommandContext ctx) throws CommandSyntaxException { + final Player player = getFirstPlayerFromCtx(ctx); + KillstreakManager km = KillstreakManager.getInstance(); + + km.resetKillstreak(player); + + ctx.getSource().getSender().sendMessage(km.getKillstreakComponent(0L)); + return 1; + } + + private static int setKillstreak(CommandContext ctx) throws CommandSyntaxException { + final Player player = getFirstPlayerFromCtx(ctx); + final long killstreak = LongArgumentType.getLong(ctx, "killstreak"); + + KillstreakManager km = KillstreakManager.getInstance(); + km.setKillstreak(player, killstreak); + + ctx.getSource().getSender().sendMessage(km.getKillstreakComponent(killstreak)); + return 1; + } + + private static int getOtherKillstreak(CommandContext ctx) throws CommandSyntaxException { + final OfflinePlayer offlinePlayer = getOfflinePlayerFromCtx(ctx); + KillstreakManager km = KillstreakManager.getInstance(); + + final long killstreak = km.getKillstreak(offlinePlayer); + + ctx.getSource().getSender().sendMessage(km.getKillstreakComponent(killstreak)); + return 1; + } + + private static int getOwnKillstreak(CommandContext ctx) { + final Entity entity = ctx.getSource().getExecutor(); + if(!(entity instanceof Player p)) return 0; + KillstreakManager km = KillstreakManager.getInstance(); + + final long killstreak = km.getKillstreak(p); + + ctx.getSource().getSender().sendMessage(km.getKillstreakComponent(killstreak)); + return 1; + } +} \ No newline at end of file diff --git a/src/main/java/pl/piecuu/killstreak/KillstreakManager.java b/src/main/java/pl/piecuu/killstreak/KillstreakManager.java index ba05d28..2e1d39f 100644 --- a/src/main/java/pl/piecuu/killstreak/KillstreakManager.java +++ b/src/main/java/pl/piecuu/killstreak/KillstreakManager.java @@ -1,6 +1,7 @@ package pl.piecuu.killstreak; import org.bukkit.NamespacedKey; +import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.persistence.PersistentDataType; import org.bukkit.plugin.Plugin; @@ -30,7 +31,7 @@ public class KillstreakManager { player.getPersistentDataContainer().set(playerKillstreakKey, PersistentDataType.LONG, streak); } - public long getKillstreak(Player player) { + public long getKillstreak(OfflinePlayer player) { return player.getPersistentDataContainer().getOrDefault(playerKillstreakKey, PersistentDataType.LONG, 0L); } @@ -53,8 +54,8 @@ public class KillstreakManager { } public int getColor(long killstreak) { - if(killstreak == 0) return 0x0; - else if(killstreak == 1) return 0x858585; // dark grey + if(killstreak == 0) return 0xffffff; + else if(killstreak == 1) return 0xfbffa8; // washed out yellow else if(killstreak < 5) return 0xfae92f; // yellow else if(killstreak < 10) return 0xe6aa1e; // orange orange else if(killstreak < 15) return 0xe6711e; // darker orange