Jump to content

Executing commands


link182

Recommended Posts

Hello, I am making a mod that uses the commands from another mod to create portals. That mod is in a state of disrepair environment wise, so I'm not able to use its code, that's why I have to use commands. So essentially what I'm trying to make is a glorified command stick. I have a few question regarding the design. The relevant code snippets can be find below. This code works in a single player world, but, while I haven't tested it there yet, I don't think it would work in a multiplayer one, even if I tweak the whole "!worldIn.isRemote" part.

1. You can see I create a PortalManager when the item is used. Obviously this is not ideal. For example, if I reload a world where I've created portals, I am creating a new PM that doesn't know about them. The problem is I need the "playerIn" object provided by "onItemRightClick" to create the CommandSource and Commands objects. I've tried using "Minecract.getInstance().getServer()", but that returns "null". Ideally, I would want to make PM outside of all this so I can initialize it with stuff from an existing world with portals in it. So basically, how can I get a CommandSource and a Commands object without the "playerIn" from "onItemRightClick"? 

2. Sort of related to 1. What tweaks would I have to make in order for this to work on a dedicated server as well as single player world? I don't think I have to worry about packets as the commands from the mod I'm using already take care of spawning entities and what not. Should the commands be executed on the server instead of the client? I don't have a good understanding of which side should execute what.

PortalGunItem

Spoiler



public class PortalGunItem extends Item {
	...
    PortalManager pm;

    @Override
    public ActionResult<ItemStack> onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) {
       if (!worldIn.isRemote)
      		if (pm != null)	
        		pm = new PortalManager(playerIn);
    }
      
}

 

PortalManager

Spoiler



public class PortalManager {
    private final PortalCommands portalCommands;
	private final CommandSource commandSource;
    private final Commands commandManager;

    public PortalManager(Entity playerIn) {
        this.commandSource = playerIn.getServer().getCommandSource().withPermissionLevel(2)
                                                                    .withEntity(playerIn)
                                                                    .withFeedbackDisabled(),
        this.commandManager = playerIn.getServer().getCommandManager());

        this.PORTAL_1_ID = "portal_1_" + playerIn.getUniqueID();
        this.PORTAL_2_ID = "portal_2_" + playerIn.getUniqueID();
    }
}

 

Thank you very much for the help, it is greatly appreciated. Please let me know if you need to see more code in order to help me. I have a pretty functional od already, but didn't want to flood this post with all the code obviously.

Edited by link182
Link to comment
Share on other sites

17 hours ago, diesieben07 said:

Re 1: Use a World capability.

Re 2: If you coded things correctly, nothing. Single player has basically the same architecture as playing on a MP server, as it runs an integrated server.

 

How do I use World capability? Could you give me a short example?

Edited by link182
Link to comment
Share on other sites

14 hours ago, diesieben07 said:

This is what using a World capability will fix. It allows you to attach additional data to a world, optionally even persisting it through world unloads.

Still not sure I understand. How can I get the world and player without it coming through itemRightClicked? Again, I would appreciate an actual example of this stuff working.

Link to comment
Share on other sites

11 hours ago, diesieben07 said:

Which player and which world? There is not just one.

The player using the item and the world he's playing in. No offense and I'm really not trying to be rude here, but I feel like this a pretty good question that deserves some better answers and engagement than what it's been given. I think you can intuit which world and which player I'm talking about. You don't need to try to hit me with a gotcha question. I would really appreciate some help on this with some actual examples that I can use. Considering there is almost no documentation on this stuff, I don't think that's too much to ask. 

Link to comment
Share on other sites

On 8/9/2021 at 2:08 AM, link182 said:

Ideally, I would want to make PM outside of all this so I can initialize it with stuff from an existing world with portals in it. So basically, how can I get a CommandSource and a Commands object without the "playerIn" from "onItemRightClick"? 

The Portal Manager takes in a CommandSource and a Commands object. How do I get these without the Item method? I can't use world and player from the item method because then the player would first have to use the item before the portal manager knows anything about the world.  I think it's made pretty clear in my question. 

Link to comment
Share on other sites

Just now, diesieben07 said:

Exactly... Dude what do you want from me?

That was before you said you had no idea what I was talking about...so clearly you still didn't understand and yet you didn't ask for more clarification so you could actually help. 

Link to comment
Share on other sites

1 minute ago, diesieben07 said:

Originally I thought I knew exactly what you wanted. Then you asked about how to get the player and then I no longer knew, so I asked.

I'll ask the question again. Differently this time. I would like to initialize the PM outside of the item method. It requires a CommandSource, a Commands object, and the player. Right now, these are gotten from the player in the item method. How can I accomplish this without using the item method? 

Link to comment
Share on other sites

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.