Jump to content

[1.8] Help creating Custom Commands


CoalOres

Recommended Posts

if (false) return;

There are two possible places for this, which are you referring to?

Here

                if (ChatListener.isAFK = false) {
	    ChatListener.isAFK = true;
	    icommandsender.addChatMessage(new ChatComponentText("You are now AFK!"));
	    return;
                }

If this doesn't work it is not being called.

I use that and it only comes up with the "Hello" message, not the "You are now AFK!".

Link to comment
Share on other sites

  • Replies 50
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

 

- Why are you still on 1.8? Update.

I'm more familiar with 1.8 and my goal is to create a special mod which is based around Hypixel, which supports 1.8. 1.9 and 1.10 is new territory for me.

10/10 IGN will never update again!

 

EDIT: I felt like adding some humor to this thead... So I did.

Link to comment
Share on other sites

if (false) return;

There are two possible places for this, which are you referring to?

Here

                if (ChatListener.isAFK = false) {
	    ChatListener.isAFK = true;
	    icommandsender.addChatMessage(new ChatComponentText("You are now AFK!"));
	    return;
                }

If this doesn't work it is not being called.

I use that and it only comes up with the "Hello" message, not the "You are now AFK!".

Then it is never making it into the if statement, or it can't send the message try removing the help message.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

if (false) return;

There are two possible places for this, which are you referring to?

Here

                if (ChatListener.isAFK = false) {
	    ChatListener.isAFK = true;
	    icommandsender.addChatMessage(new ChatComponentText("You are now AFK!"));
	    return;
                }

If this doesn't work it is not being called.

I use that and it only comes up with the "Hello" message, not the "You are now AFK!".

Then it is never making it into the if statement, or it can't send the message try removing the help message.

Removed the help message and this time it came up with nothing.  I don't really understand how the code you sent me is going to work, what if isAfk = true? Then it does nothing and doesn't set it to false so it just doesn't work.

 

Was I supposed to use two of those if statements? <-- Will try

 

Edit: Having two statements returned "No longer afk" constantly. I feel like it isn't setting the variable to true.

Link to comment
Share on other sites

In your MainMod class in the @Mod annotation set clientSideOnly = true not sure if that will fix it, but you should do that anyways.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

In your MainMod class in the @Mod annotation set clientSideOnly = true not sure if that will fix it, but you should do that anyways.

Didn't help, but if I set the isAfk variable to true beforehand the /r function works, upon doing it again it says "No longer afk" constantly and doesnt work.

Link to comment
Share on other sites

@EventHandler

    public void preInit(FMLPreInitializationEvent event)

    {

        // Stub Method

    MinecraftForge.EVENT_BUS.register(new ChatListener());

   

    }

What do you mean by "// Stub Method"?

 

@EventHandler

    public void postInit(FMLPostInitializationEvent event)

    {

        // Stub Method

    }

Why is this here? It does precisely nothing.

 

public static boolean isAFK = false;
Pretty ugly to just have it in a global variable somewhere, but I suppose this will work.

 

@Override

public int compareTo(Object o) {

// TODO Auto-generated method stub

return 0;

}

Why is this still here? How many times do I need to say this?

Also why do all your methods still have the stupid comment from Eclipse inside them?!

 

if (ChatListener.isAFK = false)
This is not how you check a boolean variable. This if statement will never run. = means assign, not compare. You want ==. Please learn basic Java.

 

@Override

public boolean isUsernameIndex(String[] arg0, int arg1) {

// TODO Auto-generated method stub

return false;

}}

Same as above, why is this still here?

 

1. It's something generated automatically by eclipse.

 

2.It may do in the future, all of the tutorials I have seen recommend keeping those for the future.

 

3. Anyway I could make it neater? It was a post I saw on stack overflow.

 

4. I thought anything that returns false or 0 was important, but anything which returned null wasn't.

 

5. I'm sorry, it was a mistake I won't make again.

 

6. 4

 

And how do I add a reason to it? Another global string called reason which I modify in the SampleCommand class?

Link to comment
Share on other sites

It's something generated automatically by eclipse.
And why is it still there?

 

It may do in the future, all of the tutorials I have seen recommend keeping those for the future.

...

 

Anyway I could make it neater? It was a post I saw on stack overflow.
Well, static state is always bad, because it hurts maintainability, etc. Ideally you'd want this in like a capability on the player, but that is overkill for now.

 

I thought anything that returns false or 0 was important, but anything which returned null wasn't.
What... that is not how Java works.

 

And how do I add a reason to it? Another global string called reason which I modify in the SampleCommand class?

I guess you could do that, yes.

But as you can see this is already getting kinda messy ;)

 

Would this segment of code work?

 

if (args.length == 1){
		ChatListener.reason = args[0].toString();
		ChatListener.isAFK = true;

Link to comment
Share on other sites

Not sure why the

toString

call is there, but yes, that would set the two fields...

The reason isn't working for some reason.

 

New Code:

 

Main:

 

package com.testmod;

import com.testmod.SampleCommand;

import net.minecraftforge.client.ClientCommandHandler;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.Mod.Instance;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;

@Mod(modid="testmod", name="Test Mod", version="1.0", clientSideOnly = true)

public class TutorialMain
{

    // The instance of your mod that Forge uses, in my case tutorial.
    @Instance("testmod")
    public static TutorialMain instance;
    

    @EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
        // Stub Method
    	MinecraftForge.EVENT_BUS.register(new ChatListener());
    	
    }

    @EventHandler
    public void init(FMLInitializationEvent event)
    {
    	ClientCommandHandler.instance.registerCommand(new SampleCommand());
    	
    	

    }

    @EventHandler
    public void postInit(FMLPostInitializationEvent event)
    {
        // Stub Method
    }
    

   

}

 

SampleCommand:

 

package com.testmod;

import java.util.ArrayList;
import java.util.List;
import eu.copybara.barra.util.*;
import net.minecraft.command.CommandBase;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommand;
import net.minecraft.command.ICommandSender;
import net.minecraft.util.BlockPos;
import net.minecraft.util.ChatComponentText;

public class SampleCommand extends CommandBase {

@Override
public boolean canCommandSenderUse(ICommandSender icommandsender) {
	// TODO Auto-generated method stub
	return true;
}
@Override
public void execute(ICommandSender icommandsender, String[] args) throws CommandException {
	// TODO Auto-generated method stub
	if (ChatListener.isAFK == false) {
	    ChatListener.isAFK = true;
	    icommandsender.addChatMessage(new ChatComponentText("You are now AFK!"));
	    return;
    }
	if (ChatListener.isAFK == true) {
	    ChatListener.isAFK = false;
	    icommandsender.addChatMessage(new ChatComponentText("You are no longer AFK!"));
	    return;
    }
	if (args.length == 1){
		ChatListener.reason = args[0].toString();
		ChatListener.isAFK = true;
	}

}
@Override
public String getCommandUsage(ICommandSender icommandsender) {
	// TODO Auto-generated method stub
	return "afk <reason>";
}

@Override
public String getName() {
	// TODO Auto-generated method stub
	return "afk";
}
@Override
public boolean isUsernameIndex(String[] arg0, int arg1) {
	// TODO Auto-generated method stub
	return false;
}}

 

 

 

ChatListener:

 

package com.testmod;

import net.minecraft.client.Minecraft;
import net.minecraftforge.client.event.ClientChatReceivedEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

public class ChatListener {
public static boolean isAFK = false;
public static String reason = "";

@SubscribeEvent
public void onChat(ClientChatReceivedEvent event) {
	String message = event.message.getUnformattedText();
	if (message.contains("From") && isAFK) {
		Minecraft.getMinecraft().thePlayer.sendChatMessage("/r I am currently AFK. Reason: " + ChatListener.reason);
	}




	}
}



 

If I do /afk <reason> it just comes up with whatever I had it preset to in the code, which in this case is "".

Link to comment
Share on other sites

If I do /afk <reason> it just comes up with whatever I had it preset to in the code, which in this case is "".

Because args.length is equal to the number of arguments aka "Hello my name is Anime" is 5 not 1.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

if (status == true)
do stuff;
if (status == false)
do otherStuff;

 

*triggered*

 

if (status)
do stuff;
else
do otherStuff;

 

^ Hint: 2nd is better?

 

As to "args problem" - build your string with StringBuilder or just with:

String res = "";
for (String s : strings)
res += s + " ";

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

if (status == true)
do stuff;
if (status == false)
do otherStuff;

 

*triggered*

 

if (status)
do stuff;
else
do otherStuff;

 

^ Hint: 2nd is better?

 

As to "args problem" - build your string with StringBuilder or just with:

String res = "";
for (String s : strings)
res += s + " ";

How do I incorporate that bottom thing?

 

I've got to this stage:

 

		String res = ""; {

		for (String s : args) {
		res += s + " ";
		}}

Link to comment
Share on other sites

As to "args problem" - build your string with StringBuilder or just with

Simpler imho:

Joiner.on("").join(strings);

 

Or some Java 8 magic:

Stream.of(strings).join(Collectors.joining());

 

How do I incorporate that bottom thing? It says "strings cannot be resolved to a variable".

Jesus... you are not supposed to just copy the code. You are supposed to understand it and adapt it to your situation.

 

I understand now, just threw me off with the Strings thing, didn't realise I needed to replace it with args. I would have written it for(String s: (strings)), that would have made more sense to me because it was in brackets.

 

Either way I understand now, still don't know how to incorporate it. Be nice if you could just send me a corrected version.

Link to comment
Share on other sites

Correct version? The version Ernio posted was fine.

You dump the array of strings into one String. It's really not hard. If you do not understand basic programming like this you need to stop modding and learn programming first.

Why is it so difficult to convey things to you -_-. I meant the corrected version of MY code. I have no idea how to put that into my code. It would save a lot of time if I could just have it fixed and then try to understand from that.

Link to comment
Share on other sites

Correct version? The version Ernio posted was fine.

You dump the array of strings into one String. It's really not hard. If you do not understand basic programming like this you need to stop modding and learn programming first.

Why is it so difficult to convey things to you -_-. I meant the corrected version of MY code. I have no idea how to put that into my code. It would save a lot of time if I could just have it fixed and then try to understand from that.

 

No one is going to provide you code that you can copy and paste. You have top actually know what you're doing.

 

You apparently missed the "this is not Java school" on the board description. Good news: that info is also in my sig.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Correct version? The version Ernio posted was fine.

You dump the array of strings into one String. It's really not hard. If you do not understand basic programming like this you need to stop modding and learn programming first.

Why is it so difficult to convey things to you -_-. I meant the corrected version of MY code. I have no idea how to put that into my code. It would save a lot of time if I could just have it fixed and then try to understand from that.

 

No one is going to provide you code that you can copy and paste. You have top actually know what you're doing.

 

You apparently missed the "this is not Java school" on the board description. Good news: that info is also in my sig.

 

Helpful comment is helpful.

 

The majority of stuff said in this post could be on the first page.

 

I've had an issue getting the arguments to work at all.

Link to comment
Share on other sites

I've had an issue getting the arguments to work at all.

Could you explain a little more?

 

This is my command's execute method:

 

public void execute(ICommandSender icommandsender, String[] args) throws CommandException {
	// TODO Auto-generated method stub
	if (ChatListener.isAFK == false) {
	    ChatListener.isAFK = true;
	    icommandsender.addChatMessage(new ChatComponentText("You are now AFK!"));
	    return;
    }
	if (ChatListener.isAFK == true) {
	    ChatListener.isAFK = false;
	    icommandsender.addChatMessage(new ChatComponentText("You are no longer AFK!"));
	    return;
    }
	 ChatListener.reason = Joiner.on(" ").join(args);

 

This is my chatlistener class:

 

public void onChat(ClientChatReceivedEvent event) {
	String message = event.message.getUnformattedText();
	if (message.contains("From") && isAFK) {
		Minecraft.getMinecraft().thePlayer.sendChatMessage("/r I am currently AFK. Reason: " + ChatListener.reason);
	}

Upon doing /afk this is a test, it replies "I am currently AFK. Reason: "

 

If I change Reason manually in the code it sets it to that.

Link to comment
Share on other sites

Try removing the space in the Joiner.on(" ")

Nope...

Try removing the space in the Joiner.on(" ")

Didn't work.

Because it was correct. Read Guava docs.

 

I already gave you solution in my 1st post.

DO YOUR STATEMENTS LIKE I SHOWED AND DON'T USE "return"... (Joiner is never reached)

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.

Announcements




  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • They were already updated, and just to double check I even did a cleanup and fresh update from that same page. I'm quite sure drivers are not the problem here. 
    • i tried downloading the drivers but it says no AMD graphics hardware has been detected    
    • Update your AMD/ATI drivers - get the drivers from their website - do not update via system  
    • As the title says i keep on crashing on forge 1.20.1 even without any mods downloaded, i have the latest drivers (nvidia) and vanilla minecraft works perfectly fine for me logs: https://pastebin.com/5UR01yG9
    • Hello everyone, I'm making this post to seek help for my modded block, It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :  The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :  The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :   Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6} Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} here is the code inside my custom "freeze" item :    @Override     public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {         if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {             BlockPos blockPos = pContext.getClickedPos();             BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));             if (secondBlockPos != null) {                 createFrozenBlock(pContext, secondBlockPos);             }             createFrozenBlock(pContext, blockPos);             return InteractionResult.SUCCESS;         }         return super.useOn(pContext);     }     public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {         BlockState oldState = pContext.getLevel().getBlockState(blockPos);         BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;         CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;         if (oldBlockEntity != null) {             pContext.getLevel().removeBlockEntity(blockPos);         }         BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);         pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);     }     public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {         BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();         ((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);         return FrozenBlock;     }  
  • Topics

×
×
  • Create New...

Important Information

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