Jump to content

Recommended Posts

Posted

This Code i wrote will check if the item to the left of ur currently equipped item is not null, if not then it will check to see if its the item u want to swap to. If so the swap will occur. It also takes into account items like tools and weapons that could have damage on them.

 

 

@SubscribeEvent

public void onEvent (PlayerUseItemEvent.Stop event) {

 

if (event.entityPlayer instanceof EntityPlayer) {

 

if (event.entityPlayer.getItemInUse().getItem() == ModItems.longSword) {

 

event.entityPlayer.inventory.changeCurrentItem(1);

}

 

if (event.entityPlayer.inventory.getCurrentItem() != null) {

 

i = event.entityPlayer.inventory.getCurrentItem().getItemDamage();

 

}

 

if (event.entityPlayer.inventory.getCurrentItem() != null && event.entityPlayer.inventory.getCurrentItem().isItemEqual(new ItemStack(ModItems.forgeHammer, OreDictionary.WILDCARD_VALUE, i))) {

 

} else event.entityPlayer.inventory.changeCurrentItem(-1);

 

}

 

}

 

Posted

You could use the following code to get the current / equipped item and the item next to it. (I haven't actually tested it so you might have to add an offset to currentItem. Also make sure to test for another item when the last slot is selected.)

@Override
    public ItemStack onItemRightClick(ItemStack s, World w, EntityPlayer p) {
        return super.onItemRightClick(s, w, p);
        p.inventory.currentItem; //To get the current equipped item...
        p.inventory.getStackInSlot(p.inventory.currentItem+1);
    }

PM's regarding modding questions should belong in the Modder Support sub-forum and won't be answered.

Posted

So gave that piece of code a go

 

Current Code:

 

 

@Override

public ItemStack onItemRightClick(ItemStack s, World w, EntityPlayer p) {

 

//p.inventory.getCurrentItem();

//ItemStack y = p.inventory.getStackInSlot(1);

if(p.inventory.hasItem(ModItems.forgeHammer) == true) {

p.inventory.changeCurrentItem(1);

}

 

return super.onItemRightClick(s, w, p);

}

 

 

 

Have a problem: its changing the players slot but its duplicating the sword in the next slot instead of just switching to that slot. I think it has to do with the return statement.

Posted

So I got the checking and switching working, with some big help from a friend. However i've run into another problem. The switch wont work if the item is damaged.

 

Current Semi Working code:

 

@Override

public ItemStack onItemRightClick(ItemStack s, World w, EntityPlayer p) {

 

p.inventory.changeCurrentItem(1);

s = p.inventory.getCurrentItem();

 

if (p.inventory.getCurrentItem() == null) {

p.inventory.changeCurrentItem(-1);

} else if (s.isItemEqual(new ItemStack(ModItems.forgeHammer))) {

i = 0;

} else p.inventory.changeCurrentItem(-1);

 

 

s = p.inventory.getCurrentItem();

 

 

 

y = s.getItemDamage();

s.setItemDamage(y);

return super.onItemRightClick(s, w, p);

}

 

Posted

You have to create the ItemStack for the test with all the damage values:

new ItemStack(ModItems.forgeHammer, 1, Short.maxValue())

 

It might also be Byte.maxValue (I always mix those up)

PM's regarding modding questions should belong in the Modder Support sub-forum and won't be answered.

Posted

You have to create the ItemStack for the test with all the damage values:

new ItemStack(ModItems.forgeHammer, 1, Short.maxValue())

 

It might also be Byte.maxValue (I always mix those up)

 

Hmm Short didn't work, and Byte didnt work either also Short.MAX_VALUE and Byte.MAX_VALUE were the only available options. Also u put () after urs, that wasn't a valid option for Short or for Byte.

Posted

First of all, max and min values are fields, not methods. You do not use brackets.

 

Second, they're all CAPS like MAX_VALUE.

 

Lastly, because the 'wildcard value' changes (it used to be -1 I think) you use OreDictionary.WILDCARD_VALUE.

 

Anyway, to compare items just use ItemStack#getItem and then compare the reference, since there is only one instance of your item at a time.

BEFORE ASKING FOR HELP READ THE EAQ!

 

I'll help if I can. Apologies if I do something obviously stupid. :D

 

If you don't know basic Java yet, go and follow these tutorials.

Posted

First of all, max and min values are fields, not methods. You do not use brackets.

 

Second, they're all CAPS like MAX_VALUE.

 

Lastly, because the 'wildcard value' changes (it used to be -1 I think) you use OreDictionary.WILDCARD_VALUE.

 

Anyway, to compare items just use ItemStack#getItem and then compare the reference, since there is only one instance of your item at a time.

 

So I tried all the iterations of what you suggested,  -1, 0, 1,

-1, OreDictionary.WILDCARD_VALUE

0, OreDictionary.WILDCARD_VALUE

1, OreDictionary.WILDCARD_VALUE

OreDictionary.WILDCARD_VALUE, OreDictionary.WILDCARD_VALUE

OreDictionary.WILDCARD_VALUE, -1

OreDictionary.WILDCARD_VALUE, 0

OreDictionary.WILDCARD_VALUE, 1

 

Posted

Hi

 

Here is a working example from vanilla code, like what shieldbug said

 

           ItemStack itemstack = player.inventory.getCurrentItem();

            if (itemstack == null)  {
                return true;
            } else {
               if (itemstack.getItem() == Items.water_bucket) {
                        // do your stuff
               }
            }

 

-TGG

 

 

 

 

Posted

Made some progress but i'm still having a serious issue with keeping the damage on the item. 

 

Current Code Will correctly check, and switch even if item is damage. However, if the item is damaged it will NOT keep the damage value, instead it will reset the hammer to new. Need to find a way to run s.setItemDamage(y); AFTER the return statement runs.

 

Code Logic:

@Override

public ItemStack onItemRightClick(ItemStack s, World w, EntityPlayer p) {

 

p.inventory.changeCurrentItem(1);

s = p.inventory.getCurrentItem();

y = s.getItemDamage();

 

if (p.inventory.getCurrentItem() == null) {

p.inventory.changeCurrentItem(-1);

} else if (s.isItemEqual(new ItemStack(ModItems.forgeHammer, y, y ))) {

i = 0;

} else p.inventory.changeCurrentItem(-1);

 

 

s = p.inventory.getCurrentItem();

 

s.setItemDamage(y);

return super.onItemRightClick(s, w, p);

 

}

Posted

Hi

 

Here is a working example from vanilla code, like what shieldbug said

 

           ItemStack itemstack = player.inventory.getCurrentItem();

            if (itemstack == null)  {
                return true;
            } else {
               if (itemstack.getItem() == Items.water_bucket) {
                        // do your stuff
               }
            }

 

-TGG

 

This example only handles the check. I have the check working. Its the switch that's not working correctly. i'll post the whole class at the end. I have to Override the onItemRightClick since i need the code to run when onItemRightClick occurs. Like I said in my previous post. The code isn't complete because the ItemStack.setItemDamage(); isnt being applied after the return statement.

 

@Override

public ItemStack onItemRightClick(ItemStack s, World w, EntityPlayer p) {

 

p.inventory.changeCurrentItem(1);

s = p.inventory.getCurrentItem();

y = s.getItemDamage();

 

if (p.inventory.getCurrentItem() == null) {

p.inventory.changeCurrentItem(-1);

} else if (s.isItemEqual(new ItemStack(ModItems.forgeHammer, y, y ))) {

i = 0;

} else p.inventory.changeCurrentItem(-1);

 

s = p.inventory.getCurrentItem();

 

s.setItemDamage(y);

 

return super.onItemRightClick(s, w, p);

}

}

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

    • that happens every time I enter a new dimension.
    • This is the last line before the crash: [ebwizardry]: Synchronising spell emitters for PixelTraveler But I have no idea what this means
    • What in particular? I barely used that mod this time around, and it's never been a problem in the past.
    • Im trying to build my mod using shade since i use the luaj library however i keep getting this error Reason: Task ':reobfJar' uses this output of task ':shadowJar' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed. So i try adding reobfJar.dependsOn shadowJar  Could not get unknown property 'reobfJar' for object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler. my gradle file plugins { id 'eclipse' id 'idea' id 'maven-publish' id 'net.minecraftforge.gradle' version '[6.0,6.2)' id 'com.github.johnrengelman.shadow' version '7.1.2' id 'org.spongepowered.mixin' version '0.7.+' } apply plugin: 'net.minecraftforge.gradle' apply plugin: 'org.spongepowered.mixin' apply plugin: 'com.github.johnrengelman.shadow' version = mod_version group = mod_group_id base { archivesName = mod_id } // Mojang ships Java 17 to end users in 1.18+, so your mod should target Java 17. java.toolchain.languageVersion = JavaLanguageVersion.of(17) //jarJar.enable() println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), Arch: ${System.getProperty 'os.arch'}" minecraft { mappings channel: mapping_channel, version: mapping_version copyIdeResources = true runs { configureEach { workingDirectory project.file('run') property 'forge.logging.markers', 'REGISTRIES' property 'forge.logging.console.level', 'debug' arg "-mixin.config=derp.mixin.json" mods { "${mod_id}" { source sourceSets.main } } } client { // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. property 'forge.enabledGameTestNamespaces', mod_id } server { property 'forge.enabledGameTestNamespaces', mod_id args '--nogui' } gameTestServer { property 'forge.enabledGameTestNamespaces', mod_id } data { workingDirectory project.file('run-data') args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') } } } sourceSets.main.resources { srcDir 'src/generated/resources' } repositories { flatDir { dirs './libs' } maven { url = "https://jitpack.io" } } configurations { shade implementation.extendsFrom shade } dependencies { minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" implementation 'org.luaj:luaj-jse-3.0.2' implementation fg.deobf("com.github.Virtuoel:Pehkui:${pehkui_version}") annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' minecraftLibrary 'luaj:luaj-jse:3.0.2' shade 'luaj:luaj-jse:3.0.2' } // Example for how to get properties into the manifest for reading at runtime. tasks.named('jar', Jar).configure { manifest { attributes([ 'Specification-Title' : mod_id, 'Specification-Vendor' : mod_authors, 'Specification-Version' : '1', // We are version 1 of ourselves 'Implementation-Title' : project.name, 'Implementation-Version' : project.jar.archiveVersion, 'Implementation-Vendor' : mod_authors, 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), "TweakClass" : "org.spongepowered.asm.launch.MixinTweaker", "TweakOrder" : 0, "MixinConfigs" : "derp.mixin.json" ]) } rename 'mixin.refmap.json', 'derp.mixin-refmap.json' } shadowJar { archiveClassifier = '' configurations = [project.configurations.shade] finalizedBy 'reobfShadowJar' } assemble.dependsOn shadowJar reobf { re shadowJar {} } publishing { publications { mavenJava(MavenPublication) { artifact jar } } repositories { maven { url "file://${project.projectDir}/mcmodsrepo" } } } my entire project:https://github.com/kevin051606/DERP-Mod/tree/Derp-1.0-1.20
  • Topics

×
×
  • Create New...

Important Information

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