Как заменить метадату предмета при клике пкм в руке с этим же предметом?

Версия Minecraft
1.7.10
116
4
Всем привет!
Хочу, чтобы нажатии на кпм с определенным предеметом в руке, у него менялась метадата, как это сделать?
Через какой эвент? Как это будет выглядеть? Надо ли будет удалять предыдущий предмет? Или можно его как-то менять на другой?
Вот скриншот, хочу сделать так, чтобы при нажатии можно было вращать камень, посредством измены его метадаты.
1553434247191.png
Буду очень признателен за помощь!
 
7,099
324
1,510
Переопределить YourItem#onItemRightClick
Вызывать там itemStack.setItemDamage(...) так, как тебе нужно
 
7,099
324
1,510
SharpedFlint#onItemRightClick
Когда где-то пишут A#B - имеется ввиду, что B находится в A, вот и все
public int "ForFirstDays.SharpedFlint"#onItemRightClick
отправляйте учить джаву
Истину глаголишь
 
7,099
324
1,510
Если предмет твой, лучше сделай через onItemRightClick, выше ты правильно написал переопределение, кроме @Subscribe
И в том методе вызывай у itemStack setItemDamage
Не забудь, что в констукторе предмета нужно указать setMaxDamage
~~~
Первая ссылка в гугле про переопределение Переопределение методов Java и перезагрузка методов
 
116
4
теперь когда нажимаю пкм, меняется только 1 раз, а мне нужно, чтобы менялось(крутилось) без конца от 0 до 3 метадаты, то есть 0 1 2 3 0 1 2 3 и тд.(Такое видел в аддоне к Botania, ExtraBotany. Конечно, может с метадатой так нельзя крутить и там не метадата. Если не метадата, то что еще может быть?) Можно ли сделать, чтобы хоть 3 раза менялось 0->1>2>3, а то у меня 0>1, а дальше не идет...

В коде нет this.setMaxDamage(0); или this.setMaxDamage(3); тк это не помогает...


Код:
public class ItemMaterialRotates extends Item {
   
      protected IIcon[] icons;

      public ItemMaterialRotates() {

        this.setHasSubtypes(true);
       
      }

      public void addRecipes() {}

      public void addOreDict() {

        for (EnumSharpedFlintRotates sfr : EnumSharpedFlintRotates.values()) {
          ItemStack stack = new ItemStack(this, 1, sfr.getMeta());
          OreDictionary.registerOre("SharpedFlintRotates" + sfr.getName(), stack);
        }
      }

      @Override
      public String getUnlocalizedName(ItemStack stack) {
         
        int metadata = stack.getItemDamage();
        EnumSharpedFlintRotates sfr = EnumSharpedFlintRotates.values()[metadata];
        return LocalizationHelper.ITEM_PREFIX + "SharpedFlintRotates_" + sfr.getName().toLowerCase();
       
      }

      @Override
      public void getSubItems(Item item, CreativeTabs tab, List list) {
         
        for (EnumSharpedFlintRotates sfr : EnumSharpedFlintRotates.values()) {
          list.add(new ItemStack(item, 1, sfr.getMeta()));
        }
       
      }

      @Override
      public void registerIcons(IIconRegister reg) {
         
        icons = new IIcon[EnumSharpedFlintRotates.count()];
        String prefix = ForFirstDays.RESOURCE_PREFIX + "SharpedFlintRotates_";
        for (EnumSharpedFlintRotates sfr : EnumSharpedFlintRotates.values()) {
          icons[sfr.getMeta()] = reg.registerIcon(prefix + sfr.getName().toLowerCase());
        }
       
      }

      @Override
      public IIcon getIconFromDamage(int meta) {
         
        if (meta >= 0 && meta < EnumSharpedFlintRotates.count()) {
          return icons[meta];
        }
        return null;
       
    }
     
      @Override
        public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) {
         
            itemStack.setItemDamage(1);
            return itemStack;
           
        }
     
}
 

timaxa007

Модератор
5,831
409
672
Наверное типа:
Java:
@Override
public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) {
     if (itemStack.getItemDamage() >= 0 && itemStack.getItemDamage() < EnumSharpedFlintRotates.count()) {
        itemStack.setItemDamage(itemStack.getItemDamage() + 1);
             else
        itemStack.setItemDamage(0);
    return itemStack;
}
 

tox1cozZ

aka Agravaine
8,455
598
2,892
itemStack.setItemDamage(1);
Господи, ты вообще понимаешь что ты пишешь!? Ты ж сам указал чтобы метадата становилась единицей всегда, какого ж фига она должна крутиться от 0 до 3!? Люди, вы реально такие глупые или это такой толстый троллинг?
 
116
4
Наверное типа:
Java:
@Override
public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) {
if (itemStack.getItemDamage() >= 0 && itemStack.getItemDamage() < EnumSharpedFlintRotates.count()) {
itemStack.setItemDamage(itemStack.getItemDamage() + 1);
else
itemStack.setItemDamage(0);
return itemStack;
}

Не, вылетает, да и я писал, что после первого пкм перестает дальше идти, как я написал выше Agravaine, просто меняет метадату на прописанный урон в itemStack.setItemDamage(); и все, а с этим кодом вылетает, вот краш лог:
---- Minecraft Crash Report ----
// Don't be sad. I'll do better next time, I promise!

Time: 3/25/19 7:47 PM
Description: Unexpected error

java.lang.ArrayIndexOutOfBoundsException: 4
at mod.Starcry.ForFirstDays.ItemMaterialRotates.getUnlocalizedName(ItemMaterialRotates.java:40)
at net.minecraft.item.Item.getUnlocalizedNameInefficiently(Item.java:607)
at net.minecraft.item.Item.getItemStackDisplayName(Item.java:744)
at net.minecraft.item.ItemStack.getDisplayName(ItemStack.java:537)
at net.minecraftforge.client.GuiIngameForge.renderToolHightlight(GuiIngameForge.java:589)
at net.minecraftforge.client.GuiIngameForge.renderGameOverlay(GuiIngameForge.java:157)
at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1114)
at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1067)
at net.minecraft.client.Minecraft.run(Minecraft.java:962)
at net.minecraft.client.main.Main.main(Main.java:164)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source)
at GradleStart.main(Unknown Source)


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Stacktrace:
at mod.Starcry.ForFirstDays.ItemMaterialRotates.getUnlocalizedName(ItemMaterialRotates.java:40)
at net.minecraft.item.Item.getUnlocalizedNameInefficiently(Item.java:607)
at net.minecraft.item.Item.getItemStackDisplayName(Item.java:744)
at net.minecraft.item.ItemStack.getDisplayName(ItemStack.java:537)
at net.minecraftforge.client.GuiIngameForge.renderToolHightlight(GuiIngameForge.java:589)
at net.minecraftforge.client.GuiIngameForge.renderGameOverlay(GuiIngameForge.java:157)

-- Affected level --
Details:
Level name: MpServer
All players: 1 total; [EntityClientPlayerMP['Player960'/2, l='MpServer', x=694.50, y=7.62, z=-957.50]]
Chunk stats: MultiplayerChunkCache: 25, 25
Level seed: 0
Level generator: ID 01 - flat, ver 0. Features enabled: false
Level generator options:
Level spawn location: World: (691,4,-960), Chunk: (at 3,0,0 in 43,-60; contains blocks 688,0,-960 to 703,255,-945), Region: (1,-2; contains chunks 32,-64 to 63,-33, blocks 512,0,-1024 to 1023,255,-513)
Level time: 796359 game time, 1000 day time
Level dimension: 0
Level storage version: 0x00000 - Unknown?
Level weather: Rain time: 0 (now: false), thunder time: 0 (now: false)
Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: false
Forced entities: 1 total; [EntityClientPlayerMP['Player960'/2, l='MpServer', x=694.50, y=7.62, z=-957.50]]
Retry entities: 0 total; []
Server brand: fml,forge
Server type: Integrated singleplayer server
Stacktrace:
at net.minecraft.client.multiplayer.WorldClient.addWorldInfoToCrashReport(WorldClient.java:415)
at net.minecraft.client.Minecraft.addGraphicsAndWorldToCrashReport(Minecraft.java:2566)
at net.minecraft.client.Minecraft.run(Minecraft.java:991)
at net.minecraft.client.main.Main.main(Main.java:164)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source)
at GradleStart.main(Unknown Source)

-- System Details --
Details:
Minecraft Version: 1.7.10
Operating System: Windows 10 (amd64) version 10.0
Java Version: 1.8.0_91, Oracle Corporation
Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
Memory: 888233672 bytes (847 MB) / 1056309248 bytes (1007 MB) up to 1056309248 bytes (1007 MB)
JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M
AABB Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used
IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
FML: MCP v9.05 FML v7.10.99.99 Minecraft Forge 10.13.4.1614 4 mods loaded, 4 mods active
States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored
UCHIJAAAAAAAAA mcp{9.05} [Minecraft Coder Pack] (minecraft.jar)
UCHIJAAAAAAAAA FML{7.10.99.99} [Forge Mod Loader] (forgeSrc-1.7.10-10.13.4.1614-1.7.10.jar)
UCHIJAAAAAAAAA Forge{10.13.4.1614} [Minecraft Forge] (forgeSrc-1.7.10-10.13.4.1614-1.7.10.jar)
UCHIJAAAAAAAAA ForFirstDays{1.0.0} [ForFirstDays] (bin)
GL info: ' Vendor: 'ATI Technologies Inc.' Version: '3.3.11672 Compatibility Profile Context' Renderer: 'ATI Mobility Radeon HD 3650'
Launched Version: 1.7.10
LWJGL: 2.9.1
OpenGL: ATI Mobility Radeon HD 3650 GL version 3.3.11672 Compatibility Profile Context, ATI Technologies Inc.
GL Caps: Using GL 1.3 multitexturing.
Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
Anisotropic filtering is supported and maximum anisotropy is 16.
Shaders are available because OpenGL 2.1 is supported.

Is Modded: Definitely; Client brand changed to 'fml,forge'
Type: Client (map_client.txt)
Resource Packs: []
Current Language: English (US)
Profiler Position: N/A (disabled)
Vec3 Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used
Anisotropic Filtering: Off (1)
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Java:
@Override
public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) {
    if (itemStack.getItemDamage() >= 0 && itemStack.getItemDamage() < EnumSharpedFlintRotates.count() - 1) {
        itemStack.setItemDamage(itemStack.getItemDamage() + 1);
    else
        itemStack.setItemDamage(0);
    return itemStack;
}
 
116
4
Спасибо огромное, Timaxa!
Спасибо огромное, Hohserg!

Вот рабочий код:

Java:
@Override
      public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) {
          if (itemStack.getItemDamage() >= 0 && itemStack.getItemDamage() < EnumSharpedFlintRotates.count() - 1) {
              itemStack.setItemDamage(itemStack.getItemDamage() + 1);
          }
          else
              itemStack.setItemDamage(0);
          return itemStack;
      }
 
7,099
324
1,510
Можно короче
Java:
@Override
public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) {
    if (itemStack.getItemDamage() < EnumSharpedFlintRotates.count() - 1) {
        itemStack.setItemDamage(itemStack.getItemDamage() + 1);
    }
    else
        itemStack.setItemDamage(0);
    return itemStack;
}
 
Сверху