I've been trying to get a custom command plugin functioning for my 1.21 server. For some reason, even thought the .yml and class files should be formatted correctly, the commands are not registering in the actual game. I'm pasting the two class files and the yml file below. If anyone could help me out, i would be thankful. Main Class Code: package org.smpmakers.commandplugin; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.time.Duration; import java.time.Instant; import java.util.HashMap; import java.util.HashSet; import java.util.Set; import java.util.UUID; public final class Commandplugin extends JavaPlugin implements Listener{ private HashMap<UUID, Vote> activeVotes = new HashMap<>(); private HashMap<UUID, UUID> invitedPlayers = new HashMap<>(); private Set<UUID> allowedPlayers = new HashSet<>(); @Override public void onEnable() { // Plugin startup logic getLogger().info("Voteban Plugin Enabled. Here you go Collyn!"); getServer().getPluginManager().registerEvents(this, this); } @Override public void onDisable() { // Plugin shutdown logic getLogger().info("Voteban Plugin Disabled :("); } @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { if (command.getName().equalsIgnoreCase("voteban")) { if (args.length < 2) { sender.sendMessage("Usage: /voteban <player> <reason>"); return false; } Player target = Bukkit.getPlayer(args[0]); if (target == null) { sender.sendMessage("Player not found!"); return false; } String reason = String.join(" ", args); if (Bukkit.getOnlinePlayers().size() < 7) { sender.sendMessage("Not enough players online to start a vote!"); return false; } Vote vote = new Vote(target.getUniqueId(), sender.getName(), reason); activeVotes.put(target.getUniqueId(), vote); Bukkit.broadcastMessage(sender.getName() + " has started a vote to ban " + target.getName() + " for: " + reason); Bukkit.broadcastMessage("Type /vote yes or /vote no to cast your vote."); return true; } if (command.getName().equalsIgnoreCase("vote")) { if (args.length < 1) { sender.sendMessage("Usage: /vote <yes|no>"); return false; } Player player = (Player) sender; Vote vote = activeVotes.values().stream() .filter(v -> !v.hasVoted(player.getUniqueId())) .findFirst() .orElse(null); if (vote == null) { sender.sendMessage("There is no active vote! Either that, or you have already voted!"); } if (args[0].equalsIgnoreCase("yes")){ vote.addYesVote(player.getUniqueId()); sender.sendMessage("You voted YES to ban " + Bukkit.getPlayer(vote.getTarget()).getName()); } else if (args[0].equalsIgnoreCase("no")) { vote.addNoVote(player.getUniqueId()); sender.sendMessage("You voted NO to ban " + Bukkit.getPlayer(vote.getTarget()).getName()); } else { sender.sendMessage("Usage: /vote <yes|no>"); return false; } checkVote(vote); return true; } if (command.getName().equalsIgnoreCase("invite")) { if (args.length < 1) { sender.sendMessage("Usage: /invite <player>"); return false; } Player target = Bukkit.getPlayer(args[0]); if (target == null) { sender.sendMessage("Player not found!"); return false; } Player player = (Player) sender; invitedPlayers.put(target.getUniqueId(), player.getUniqueId()); allowedPlayers.add(target.getUniqueId()); sender.sendMessage("You have invited " + target.getName() + " to the server."); target.sendMessage("You have been invited to the server by " + player.getName() + "."); return true; } if (command.getName().equalsIgnoreCase("forceallow")) { if (args.length < 1) { sender.sendMessage("Usage: /forceallow <player>"); return false; } if (!sender.hasPermission("voteban.forceallow")) { sender.sendMessage("You do not have permission to use this command."); return false; } Player target = Bukkit.getPlayer(args[0]); if (target == null) { sender.sendMessage("Player not found!"); return false; } allowedPlayers.add(target.getUniqueId()); sender.sendMessage(target.getName() + " has been forcibly allowed to join the server."); target.sendMessage("You have been forcibly allowed to join the server by an admin."); return true; } return false; } private void checkVote(Vote vote){ int totalVotes = vote.getYesVotes().size() + vote.getNoVotes().size(); int onlinePlayers = Bukkit.getOnlinePlayers().size(); double requiredVotes = Math.ceil(onlinePlayers * .6666667); if (totalVotes >= requiredVotes){ if (vote.getYesVotes().size() >= requiredVotes){ Player target = Bukkit.getPlayer(vote.getTarget()); if (target != null){ Instant instant = Instant.now(); target.ban("You have been banned by vote for: " + vote.getReason(), instant, vote.getReason()); Bukkit.broadcastMessage(target.getName() + " has been banned by vote for: " + vote.getReason()); UUID inviterUUID = invitedPlayers.get(target.getUniqueId()); if (inviterUUID != null) { Player inviter = Bukkit.getPlayer(inviterUUID); if (inviter != null) { inviter.isBanned(); inviter.ban("You have been banned because your invitee was banned.", instant, "Your Invitee was banned"); Bukkit.broadcastMessage(inviter.getName() + " has been banned because their invitee was banned."); } } }else{ Bukkit.broadcastMessage("The vote to ban " + Bukkit.getPlayer(vote.getTarget()).getName() + " has failed."); } activeVotes.remove(vote.getTarget()); } } } public boolean playerAllowed(UUID playerUUID) { return allowedPlayers.contains(playerUUID); } /*@EventHandler public void onPlayerLogin(PlayerJoinEvent event){ Player player = event.getPlayer(); if(!playerAllowed(event.getPlayer().getUniqueId())){ player.kick(); } }*/ @EventHandler public void onPlayerDeath(PlayerDeathEvent event){ Player player = event.getPlayer(); Duration time = Duration.ofMinutes(3); if (player.getKiller() instanceof Player){ player.ban("You were killed by a player.", time, "Death By Player"); } } } Vote Class File Code: package org.smpmakers.commandplugin; import java.util.HashSet; import java.util.Set; import java.util.UUID; public class Vote { private UUID target; private String initiator; private String reason; private Set<UUID> yesVotes = new HashSet<>(); private Set<UUID> noVotes = new HashSet<>(); public Vote(UUID target, String initiator, String reason) { this.target = target; this.initiator = initiator; this.reason = reason; } public UUID getTarget() { return target; } public String getInitiator() { return initiator; } public String getReason() { return reason; } public Set<UUID> getYesVotes() { return yesVotes; } public Set<UUID> getNoVotes() { return noVotes; } public void addYesVote(UUID player) { yesVotes.add(player); } public void addNoVote(UUID player) { noVotes.add(player); } public boolean hasVoted(UUID player) { return yesVotes.contains(player) || noVotes.contains(player); } } paper.yml Code: name: commandplugin version: '${project.version}' main: org.smpmakers.commandplugin.Commandplugin api-version: '1.21' commands: voteban: description: Start a vote to ban a player usage: /voteban <player> <reason> vote: description: Vote yes or no to ban a player usage: /vote <yes|no> invite: description: Invite a player to the server usage: /invite <player> forceallow: description: Forcibly allow a player to join the server usage: /forceallow <player>
@Is3kai I can't recall whether command registration is necessary in the main class, but just in case, try that. Additionally, if you have any errors in your server log, please post them here as well using pastebin or similar.
That's the odd thing, there are no errors in the server log. The plugin is functioning, but the commands aren't registering. The PvP Death Ban is working, but nothing else. And if the kick without invite is uncommented, it also functions.
@Is3kai I tried compiling the source code you provided and run it on a Spigot 1.21 server (to be exact: CraftBukkit version 4258-Spigot-491f367-8fd64b0 (MC: 1.21) (Implementing API version 1.21-R0.1-SNAPSHOT)). I could not reproduce the problem; the commands registered just fine for me. What server software do you use? I notice you mentioned "paper.yml" rather than "plugin.yml".
I'm trying to run it on a paper server, but none of the commands are registering or showing up when I run the /help command. I said paper.yml cause the file is a paper-plugin.yml file