Jump to content

Recommended Posts

Posted

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

Posted

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/

Posted

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!

Posted

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!

Posted

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?

 

 

Posted

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 :)

Posted

I got rid of the error in my Main Class by making it

 

new TeleportCrystalClass(startEntityId)

 

but the error on super(par1); is still causing my game to crash

Posted

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/

Posted

Here is my complete Class File

 

 

  Reveal hidden contents

 

 

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++;

 

 

Posted

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.

Posted

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()"?

Posted

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.

Posted

The start entity id was placed there by eclipse, not sure why.

As for the rest of the code, I just copied it from an earlier reply suggesting what I should do. I'm trying to make an item that teleports me to my spawn point.

Posted

There's an error on "new TeleportCrystalClass()" because it's "Undefined". I'm guessing that means it needs the "int par1" from my class file? I'm not sure what those are

Posted

Are you importing

achilleus.sao.food.TeleportCrystalClass

in your main mod file?

 

Also,

food

seems an odd package to keep

TeleportCrystalClass

in, don't you think? :)

Posted

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.

Posted

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;

}

 

  • 4 months later...
Posted

Haha sorry, I posted that when I was still using 1.6.4  :P

 

Just use the item without a constructor. That int was the old itemID, which doesn't exist in 1.7

Romejanic

 

Creator of Witch Hats, Explosive Chickens and Battlefield!

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • https://mclo.gs/9y5ciD2 anyone ever had this issue?  Internal exception illegal argument exception: unable to fit 3194354 into 3
    • Hoffman Law Recovery helped me recovered my lost funds
    • Hi! I'm trying to add my custom models/textures renderer like this: public class PonyPlayerWrapperRenderer extends EntityRenderer<Player> { // wrapper class under my LivingEntityRenderer class implementation private final PonyPlayerRenderer innerRenderer; private final PonyPlayerRenderer innerSlimRenderer; public PonyPlayerWrapperRenderer(final EntityRendererProvider.Context context) { super(context); System.out.println("creating new PonyPlayerWrapperRenderer"); this.innerRenderer = new PonyPlayerRenderer(context, false); this.innerSlimRenderer = new PonyPlayerRenderer(context, true); } @Override public void render(final Player entity, final float yaw, final float partialTicks, final PoseStack poseStack, final MultiBufferSource bufferSource, final int packedLight) { System.out.println("PonyPlayerWrapperRenderer render: " + entity.toString()); if (entity instanceof AbstractClientPlayer clientPlayer) { if (clientPlayer.getModelName().contains("slim")) { innerSlimRenderer.render(clientPlayer, yaw, partialTicks, poseStack, bufferSource, packedLight); } else { innerRenderer.render(clientPlayer, yaw, partialTicks, poseStack, bufferSource, packedLight); } } } @Override public ResourceLocation getTextureLocation(final Player player) { System.out.println("PonyPlayerWrapperRenderer getTextureLocation"); if (player instanceof AbstractClientPlayer clientPlayer) { return clientPlayer.getSkinTextureLocation(); } System.out.println("player instanceof AbstractClientPlayer is false"); return getDefaultSkin(player.getUUID()); } } public class PonyPlayerRenderer extends LivingEntityRenderer<AbstractClientPlayer, PlayerModel<AbstractClientPlayer>> { private final PlayerModel<AbstractClientPlayer> earthModel; private final PlayerModel<AbstractClientPlayer> pegasusModel; private final PlayerModel<AbstractClientPlayer> unicornModel; public PonyPlayerRenderer(final EntityRendererProvider.Context context, final boolean slim) { super( context, slim ? new PonyModelSlim(context.bakeLayer(PonyModelSlim.LAYER_LOCATION)) : new PonyModel(context.bakeLayer(PonyModel.LAYER_LOCATION)), 0.5f ); System.out.println("creating new PonyPlayerRenderer"); this.earthModel = slim ? new PonyModelSlim(context.bakeLayer(PonyModelSlim.LAYER_LOCATION)) : new PonyModel(context.bakeLayer(PonyModel.LAYER_LOCATION)); this.pegasusModel = new PegasusModel(context.bakeLayer(PegasusModel.LAYER_LOCATION)); this.unicornModel = new UnicornModel(context.bakeLayer(UnicornModel.LAYER_LOCATION)); } @Override public void render(final AbstractClientPlayer player, final float entityYaw, final float partialTicks, final PoseStack poseStack, final MultiBufferSource buffer, final int packedLight) { final PonyRace race = player.getCapability(PONY_DATA) .map(data -> ofNullable(data.getRace()).orElse(PonyRace.EARTH)) .orElse(PonyRace.EARTH); this.model = switch (race) { case PEGASUS -> pegasusModel; case UNICORN -> unicornModel; case EARTH -> earthModel; }; super.render(player, entityYaw, partialTicks, poseStack, buffer, packedLight); } @Override public ResourceLocation getTextureLocation(final AbstractClientPlayer player) { final PonyRace race = player.getCapability(PONY_DATA) .map(data -> ofNullable(data.getRace()).orElse(PonyRace.EARTH)) .orElse(PonyRace.EARTH); return switch (race) { case EARTH -> fromNamespaceAndPath(MODID, "textures/entity/earth_pony.png"); case PEGASUS -> fromNamespaceAndPath(MODID, "textures/entity/pegasus.png"); case UNICORN -> fromNamespaceAndPath(MODID, "textures/entity/unicorn.png"); }; } } @Mod.EventBusSubscriber(modid = MODID, bus = MOD, value = CLIENT) public class ClientRenderers { // mod bus render registration config @SubscribeEvent public static void onRegisterLayerDefinitions(final EntityRenderersEvent.RegisterLayerDefinitions event) { event.registerLayerDefinition(PonyModel.LAYER_LOCATION, PonyModel::createBodyLayer); event.registerLayerDefinition(PonyModelSlim.LAYER_LOCATION, PonyModelSlim::createBodyLayer); event.registerLayerDefinition(PegasusModel.LAYER_LOCATION, PegasusModel::createBodyLayer); event.registerLayerDefinition(UnicornModel.LAYER_LOCATION, UnicornModel::createBodyLayer); event.registerLayerDefinition(InnerPonyArmorModel.LAYER_LOCATION, InnerPonyArmorModel::createBodyLayer); event.registerLayerDefinition(OuterPonyArmorModel.LAYER_LOCATION, OuterPonyArmorModel::createBodyLayer); } @SubscribeEvent public static void onRegisterRenderers(final EntityRenderersEvent.RegisterRenderers event) { event.registerEntityRenderer(EntityType.PLAYER, PonyPlayerWrapperRenderer::new); System.out.println("onRegisterRenderers end"); } } Method onRegisterRenderers() is called and I can see it being logged. But when I enter the world, my PonyWrapperRenderer render() method doesn't ever seem to be called. I also tried to put my renderer to EntityRenderDispatcher's playerRenderers via reflection: @Mod.EventBusSubscriber(modid = MODID, bus = MOD, value = CLIENT) public class ClientRenderers { @SubscribeEvent public static void onRegisterLayerDefinitions(final EntityRenderersEvent.RegisterLayerDefinitions event) { event.registerLayerDefinition(PonyModel.LAYER_LOCATION, PonyModel::createBodyLayer); event.registerLayerDefinition(PonyModelSlim.LAYER_LOCATION, PonyModelSlim::createBodyLayer); event.registerLayerDefinition(PegasusModel.LAYER_LOCATION, PegasusModel::createBodyLayer); event.registerLayerDefinition(UnicornModel.LAYER_LOCATION, UnicornModel::createBodyLayer); event.registerLayerDefinition(InnerPonyArmorModel.LAYER_LOCATION, InnerPonyArmorModel::createBodyLayer); event.registerLayerDefinition(OuterPonyArmorModel.LAYER_LOCATION, OuterPonyArmorModel::createBodyLayer); } @SubscribeEvent public static void onClientSetup(final FMLClientSetupEvent event) { event.enqueueWork(() -> { try { final EntityRenderDispatcher dispatcher = Minecraft.getInstance().getEntityRenderDispatcher(); final Field renderersField = getEntityRenderDispatcherField("playerRenderers"); final Field itemInHandRenderer = getEntityRenderDispatcherField("itemInHandRenderer"); @SuppressWarnings("unchecked") final Map<String, EntityRenderer<? extends Player>> playerRenderers = (Map<String, EntityRenderer<? extends Player>>)renderersField.get(dispatcher); final PonyPlayerWrapperRenderer renderer = new PonyPlayerWrapperRenderer( new EntityRendererProvider.Context( dispatcher, Minecraft.getInstance().getItemRenderer(), Minecraft.getInstance().getBlockRenderer(), (ItemInHandRenderer)itemInHandRenderer.get(dispatcher), Minecraft.getInstance().getResourceManager(), Minecraft.getInstance().getEntityModels(), Minecraft.getInstance().font ) ); playerRenderers.put("default", renderer); playerRenderers.put("slim", renderer); System.out.println("Player renderers replaced"); } catch (final Exception e) { throw new RuntimeException("Failed to replace player renderers", e); } }); } private static Field getEntityRenderDispatcherField(final String fieldName) throws NoSuchFieldException { final Field field = EntityRenderDispatcher.class.getDeclaredField(fieldName); field.setAccessible(true); return field; } } But I receive the error before Minecraft Client appears (RuntimeException: Failed to replace player renderers - from ClientRenderers onClientSetup() method - and its cause below): java.lang.IllegalArgumentException: No model for layer anotherlittlepony:earth_pony#main at net.minecraft.client.model.geom.EntityModelSet.bakeLayer(EntityModelSet.java:18) ~[forge-1.20.1-47.4.0_mapped_official_1.20.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.renderer.entity.EntityRendererProvider$Context.bakeLayer(EntityRendererProvider.java:69) ~[forge-1.20.1-47.4.0_mapped_official_1.20.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at com.thuggeelya.anotherlittlepony.client.renderer.pony.PonyPlayerRenderer.<init>(PonyPlayerRenderer.java:32) ~[main/:?] {re:classloading} at com.thuggeelya.anotherlittlepony.client.renderer.pony.PonyPlayerWrapperRenderer.<init>(PonyPlayerWrapperRenderer.java:24) ~[main/:?] {re:classloading} at com.thuggeelya.anotherlittlepony.client.renderer.ClientRenderers.lambda$onClientSetup$0(ClientRenderers.java:79) ~[main/:?] {re:classloading} ... 33 more Problem appears when EntityRendererProvider context tries to bakeLayer with my model layer location: new PonyModel(context.bakeLayer(PonyModel.LAYER_LOCATION)); // PonyPlayerRenderer.java:32 public class PonyModel extends PlayerModel<AbstractClientPlayer> { // the model class itself public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation( ResourceLocation.fromNamespaceAndPath(MODID, "earth_pony"), "main" ); public PonyModel(final ModelPart root) { super(root, false); } public static LayerDefinition createBodyLayer() { // some CubeListBuilder stuff for model appearance } } Textures PNGs are placed at: resources/assets/[my mod id]/textures/entity. My forge version is 1.20.1. Would appreciate any help.
    • Well, a bit more information about what you're trying to do would be helpful. e.g. why you're trying to use "INVOKE_ASSIGN" instead of "INVOKE". "INVOKE_ASSIGN" calls your code after the "target" is called and its value is stored, if applicable. "INVOKE" calls your code before the target is called. "target" expects a fully qualified name, as per the SpongePowered docs, if that name is going to be remapped (which it will be if your injecting into Minecraft itself and not another mod). For more information on fully qualified names versus canonical names, see the Java specifications. Here's an example of a working "@At" from my own code that targets the "getClosestsVulnerablePlayerToEntity" call inside a mob's logic: @At(value = "INVOKE_ASSIGN", target = "net.minecraft.world.World.getClosestVulnerablePlayerToEntity(Lnet/minecraft/entity/Entity;D)Lnet/minecraft/entity/player/EntityPlayer;") Hope this helps!
    • Ran it one more time just to check, and there's no errors this time on the log??? Log : https://mclo.gs/LnuaAiu I tried allocating more memory to the modpack, around 8000MB and it's still the same; stopping at "LOAD_REGISTRIES". Are some of the mods clashing, maybe? I have no clue what to do LOL
  • Topics

×
×
  • Create New...

Important Information

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