Jump to content

Recommended Posts

Posted

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();
            }
        }
    }
}

 

Posted (edited)

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

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.