killstreak command

This commit is contained in:
Piecuuu 2026-02-21 23:45:37 +01:00
parent dff4f13460
commit 3649f5a829
3 changed files with 117 additions and 3 deletions

View file

@ -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);

View file

@ -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<CommandSourceStack> createCommand() {
RequiredArgumentBuilder<CommandSourceStack,PlayerSelectorArgumentResolver> playerArgument = Commands.argument("player", ArgumentTypes.player());
LiteralArgumentBuilder<CommandSourceStack> 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<CommandSourceStack> ctx) throws CommandSyntaxException {
final PlayerSelectorArgumentResolver playerResolver = ctx.getArgument("player", PlayerSelectorArgumentResolver.class);
return playerResolver.resolve(ctx.getSource()).getFirst();
}
private static OfflinePlayer getOfflinePlayerFromCtx(CommandContext<CommandSourceStack> ctx) throws CommandSyntaxException {
final PlayerProfileListResolver profilesResolver = ctx.getArgument("profile", PlayerProfileListResolver.class);
final Collection<PlayerProfile> 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<CommandSourceStack> 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<CommandSourceStack> 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<CommandSourceStack> 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<CommandSourceStack> 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;
}
}

View file

@ -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