Jump to content

How to assign commands to an item?


Achilleus

Recommended Posts

I want to assign three commands to go into effect when an item is used, and also destroy that item. Anyone know how to do this?

The commands I want to add are

 

/gamerule keepInventory true

/kill

/gamerule keepInventory false

 

so that the player is teleported to their spawn point without losing anything

Link to comment
Share on other sites

If it is a custom item, then I think you just need to override the method onItemUse() or maybe onItemRightClick() depending on how you want it to work.  In that method you can just teleport back to the spawn point, I think just by setting the position back to the spawn position.  You shouldn't need to kill the player to do that.  You can just set the player position to the spawn position.

 

The last spawn position if they Player slept in a bed is from the getBedLocation() method.  If that returns null, then it means they haven't slept in a bed so you need to get the original spawn location which I believe is from worldObj.getSpawnPoint() method.

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

Using the command would disrupt the gameplay (if they want to use that command) and it would be a little inconvenient. Instead, you can use this:

 

ChunkCoordinates spawn = player.getBedLocation();

	if(spawn == null) {

		spawn = player.worldObj.getSpawnPoint();

	}

	player.setPosition(spawn.posX, spawn.posY, spawn.posZ);

 

It will check if the player has slept in a bed. If they have, teleport them to the bed. Otherwise, teleport the to the world spawn.

Romejanic

 

Creator of Witch Hats, Explosive Chickens and Battlefield!

Link to comment
Share on other sites

Here is an example item with the code:

package test;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.world.World;

public class ItemTest extends Item {

public ItemTest(int par1) {

	super(par1);


}

/**
 * This is called when the player right-clicks with the item in hand
 * This is triggered anytime the player right-clicks
 */
public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
{
	ChunkCoordinates spawn = par3EntityPlayer.getBedLocation();

	if(spawn == null) {

		spawn = par3EntityPlayer.worldObj.getSpawnPoint();

	}

	par3EntityPlayer.setPosition(spawn.posX, spawn.posY, spawn.posZ);

	return par1ItemStack;
}

/**
 * This is called when the player right-clicks with the item in hand
 * This is triggered only when a block is right-clicked
 */
    public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10)
    {
    	ChunkCoordinates spawn = par2EntityPlayer.getBedLocation();

	if(spawn == null) {

		spawn = par2EntityPlayer.worldObj.getSpawnPoint();

	}

	par2EntityPlayer.setPosition(spawn.posX, spawn.posY, spawn.posZ);
    	
        return true;
    }

}

Romejanic

 

Creator of Witch Hats, Explosive Chickens and Battlefield!

Link to comment
Share on other sites

I get two errors with this:

 

on "super(par1)" that says "The constructor Item(int) is undefined"

 

and another in my Main Class where I declared it,

 

public static Item TeleportCrystal = new TeleportCrystalClass().setUnlocalizedName("TeleportCrystal").setCreativeTab(saoTab);

 

the error is on "new TeleportCrystalClass()" and it says "The constructor TeleportCrystalClass() is undefined"

 

Where did I go wrong?

 

 

Link to comment
Share on other sites

When you see errors like these, you may want to have a look at the classes you are actually inheriting/using.

 

There doesn't seem to be an explicit constructor for

Item

, so just use

super();

.

 

As for the TeleportCrystalClass() constructor ... You have written that class yourself, so we can't tell you what the constructor signature is. Whatever arguments your defined constructor/s take, that is what you need to supply it with when you call it.

 

On a side note ... TitleCase is usually reserved for classes and similar, camelCase is for variables and fields, and lowercase is - I believe - generally preferred for unlocalised names. Having

Class

appended to every class seems a tad redundant and repetitive, no?

 

May I suggest you rename your

TeleportCrystal

field to

teleportCrystal

, and your

TeleportCrystalClass

to

TeleportCrystal

? It would probably end up saving you a lot of grief in the long run if you stay consistent to the Minecraft/Forge identifier naming conventions :)

Link to comment
Share on other sites

It's telling you what you did wrong--you didn't make a constructor that doesn't have parameters but then you called it without parameters.  I think you should read a book on Java.  There is a very simple book I recommend called Java in Easy Steps that is really short and isn't boring but covers all the main topics.  But not to be mean, but if you don't understand constructors you won't be able to program mods.

 

I don't think you should just put start id in the new instance call, the int parameter is meant to represent the rarity of the item.  From Item class comment: how often the item is chosen, higher number is higher chance(lower is lower)

 

For the error regarding the super call, it seems that maybe you imported the wrong Item class.  Can you post your code to show the imports in your class?

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

Here is my complete Class File

 

 

 

package achilleus.sao.food;

 

import achilleus.sao.MainClass;

import net.minecraft.entity.player.EntityPlayer;

import net.minecraft.item.Item;

import net.minecraft.item.ItemStack;

import net.minecraft.util.ChunkCoordinates;

import net.minecraft.world.World;

 

public class TeleportCrystalClass extends Item {

 

public TeleportCrystalClass(int par1) {

super();

setTextureName(MainClass.MODID + ":TeleportCrystal");

 

}

 

/**

* This is called when the player right-clicks with the item in hand

* This is triggered anytime the player right-clicks

*/

public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)

{

ChunkCoordinates spawn = par3EntityPlayer.getBedLocation();

 

if(spawn == null) {

 

spawn = par3EntityPlayer.worldObj.getSpawnPoint();

 

}

 

par3EntityPlayer.setPosition(spawn.posX, spawn.posY, spawn.posZ);

 

return par1ItemStack;

}

 

/**

* This is called when the player right-clicks with the item in hand

* This is triggered only when a block is right-clicked

*/

    public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10)

    {

    ChunkCoordinates spawn = par2EntityPlayer.getBedLocation();

 

if(spawn == null) {

 

spawn = par2EntityPlayer.worldObj.getSpawnPoint();

 

}

 

par2EntityPlayer.setPosition(spawn.posX, spawn.posY, spawn.posZ);

   

        return true;

    }

 

}

 

 

 

And this is what I currently have in my MainClass:

public static Item TeleportCrystal = new TeleportCrystalClass(startEntityId).setUnlocalizedName("TeleportCrystal").setCreativeTab(saoTab);

 

and regarding what you said about startEntityId, this is also in my main class. Would that change anything?

 

private static int startEntityId = 300;

 

public static int getUniqueEntityId() {

do {

startEntityId++;

}

while(EntityList.getStringFromID(startEntityId) != null );

return startEntityId++;

 

 

Link to comment
Share on other sites

Well, you seemed to have solved the issue of calling

super();

.

 

As for the

startEntityId

, no, that would not change anything, for several reasons.

 

  • You are only constructing the
    TeleportCrystalClass

    once (not once per item).

  • Since your
    Item

    class complained when you gave it a parameter, I assume you're developing for [1.7.2] or higher - these versions do not require (or even allow) you to set an id - but I could be confusing your use of the startEntityId field.

  • You are not actually using the passed in parameter to your
    TeleportCrystalClass

    constructor.

 

On another note, I believe texture names have to be lowercase - I know their namespaces have to be.

Link to comment
Share on other sites

The start entity ID was used to make a mob, but that's how the error corrector fixed it when I clicked it.

 

I have about 15 other items with textures labeled the exact same way in this mod and they all work fine, so I don't think that's part of it

 

Yes, I am developing for 1.7.2

 

Sorry for my lack of experience with code, but what would you recommend I put in "new TeleportCrystalClass()"?

Link to comment
Share on other sites

You don't need to apologise for your inexperience :)

 

As for the textures - alright, apparently I am inexperienced as well! Keep to your TitleCase naming scheme for textures if that works for you :)

 

And uh ... what is the startEntityId supposed to do? I need to know this to recommend putting anything as a parameter to or contents of the TeleportCrystalClass constructor.

Link to comment
Share on other sites

Yes, it is imported.

 

The reason it's in "food" is because that's where the other "Crystals" are. One crystal heals you, one crystal is an antidote like milk, and this one is supposed to teleport you. None are really food but the other two are treated like it so I put this one in the same package with those. It's supposed to be based off the Anime, Sword Art Online (SAO). My little brother is obsessed with it so I am making this for him.

Link to comment
Share on other sites

This ended up being what works

 

 

public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)

{

ChunkCoordinates bed = par3EntityPlayer.getBedLocation(par3EntityPlayer.dimension);

if(bed == null) {

 

bed = par3EntityPlayer.worldObj.getSpawnPoint();

 

}

par3EntityPlayer.setPositionAndUpdate(bed.posX, bed.posY, bed.posZ);

return par1ItemStack;

}

 

Link to comment
Share on other sites

  • 4 months later...

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.