Hello, I code for fun and recently I wanted to code a UHC. I am currently coding an Anonymous scenario (which changes the skin and nickname of all players). The scenario works well but I wanted to make sure that players can put the player's initial nickname in the commands (/msg Neyuux_ rather than /msg Anonymous1) for example. But using CommandPreProcessEvent the result is not good and shows "player not found" in console. Code : Code: @EventHandler(priority = EventPriority.HIGHEST) public void onCommand(PlayerCommandPreprocessEvent ev) { String message = ev.getMessage(); String[] messageWords = message.split(" "); List<String> broadcastAliases = new ArrayList<>(Arrays.asList("/b", "/broadcast", "/bd", "/bc", "/annonce", "/announce", "/ann", "/say")); List<String> directMessageAliases = new ArrayList<>(Arrays.asList("/msg", "/m", "/message", "/tell")); if (messageWords.length <= 1) return; if (directMessageAliases.contains(messageWords[0])) { String receiver = messageWords[1]; for (Map.Entry<PlayerUHC, String> name : realName.entrySet()) if (receiver.equalsIgnoreCase(name.getValue())) message = message.replace(receiver, name.getKey().getPlayer().getName()); } else if (!broadcastAliases.contains(messageWords[0])) { for (Map.Entry<PlayerUHC, String> name : realName.entrySet()) message = message.replaceAll("(?i)" + name.getValue(), name.getKey().getPlayer().getName()); } ev.setMessage(message); Bukkit.broadcastMessage(message.replace("§", "&")); //this for (Player player : Bukkit.getOnlinePlayers()) { // is Bukkit.broadcastMessage(player.getName().replace("§", "&")); //just Bukkit.broadcastMessage(String.valueOf(message.split(" ")[1].equalsIgnoreCase(player.getName()))); //for testing } } Console : (2nd line in console is a broadcast in chat to announce that a player types a command)
Hmm. Well, I played around to see if I could swap a nick for a proper username in commands in preprocess, worked for me doing this: Code: Map<String, String> nicks = new HashMap<>(); nicks.put("Lupu", "Lupusregina_Beta"); @EventHandler(priority = EventPriority.LOWEST) public void onPCPE(PlayerCommandPreprocessEvent e) { List<String> segments = Arrays.asList(e.getMessage().split(" ")); for (Map.Entry<String, String> nick : nicks.entrySet()) { if (!segments.stream().anyMatch(nick.getKey()::equalsIgnoreCase)) continue; for (int x=0; x<segments.size(); x++) { if (!segments.get(x).equalsIgnoreCase(nick.getKey())) continue; segments.set(x, nick.getValue()); } } e.setMessage(StringUtils.join(segments.toArray(), " ", 0, segments.size())); } I went in game and did /give lupu stone and my Lupusregina_Beta character got a stack of stone. No errors in console or client. Also notice I changed your priority out for lowest - it'd be best to do the swap as early as possible before other plugins interfere. Not sure how this would really integrate to what you are doing, but figured I'd post it since it worked for me.