Posted June 24, 20205 yr I need to check for the command /op or 'op' from the console so that I can identify when the list of operators contained within the PlayerList for the dedicated server changes. I do have a system that works right now, it involves checking the 'MinecraftServer' from a command event and from this event getting an opped player list. It works however on simply checking the string equivalent of the command. Although it works I figured there must be a better way of implementing this, e.g. with an instanceof check. @Mod.EventBusSubscriber(modid = Metropolis.MOD_ID, value = Dist.DEDICATED_SERVER, bus = Mod.EventBusSubscriber.Bus.FORGE) public class CommandEvent { public static String[] OP_LIST = null; @SubscribeEvent(priority = EventPriority.LOW) public static void dedicatedServerCommand(final net.minecraftforge.event.CommandEvent event){ if(FMLEnvironment.dist == Dist.DEDICATED_SERVER){ ParseResults<CommandSource> parseResults = event.getParseResults(); String cRaw = parseResults.getReader().getRead(); String c = cRaw.replace("/", ""); if(c.startsWith("op") || c.startsWith("deop") || c.startsWith("reload")){ Metropolis.LOGGER.debug("Metropolis permissions updated"); MinecraftServer ds = parseResults.getContext().getSource().getServer(); OP_LIST = ds.getPlayerList().getOppedPlayerNames(); } } } }
June 24, 20205 yr Author EDIT: I realized essentially I could just do player.hasPermissionLevel(4) on my tile entity block break to check an operator can still remove the tile which is tied to a specific players UUID meaning I didn't have to write any of this essentially. *Sighs*. Either way i'll leave the code I would have used below just incase anyone else would benefit from it. Thank you all the same though. I can use the following apporach (below) if i ever have to check for a different type of command. Thank you. Thats a much better way of checking for the command. For reference the code i've used is... ParseResults<CommandSource> parseResults = event.getParseResults(); CommandNode pcn = parseResults.getContext().getNodes().get(0).getNode(); if(pcn instanceof LiteralCommandNode){ LiteralCommandNode lcn = (LiteralCommandNode) pcn; if(lcn.getLiteral().equals("op")){ Metropolis.LOGGER.debug("Op command fired."); } } Instead of using names as well I can grab the UUID of the player it seems by searching the player list for anyone with a permission level of 4. Wondering if this might be a better approach. List<ServerPlayerEntity> spe = ds.getPlayerList().getPlayers(); for(ServerPlayerEntity player: spe){ if(player.hasPermissionLevel(4)){ UUID uuid = player.getUniqueID(); } } Obviously this is just test code. I would add the UUID to a list instead to check. I also load in the playerlist of operators at server startup but essentially i'm just making sure that if a player has permission level 4, IE is an operator that they have access to delete certain tile entities I am creating within my mod. Edited June 24, 20205 yr by profjb58
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.