minecraft mod教程:Item类功能详解-GameRegistry的使用4

最近好忙,不过教程更新还是不能停。这回就偷懒一下详细的写一写Item里面有点什么方法吧,大概也能算作GameRegistry的使用的续吧……


Item类是Minecraft的十分重要的类。我们之前已经学会了创建一个没有任何功能但是有自己名字的Item了。我们今天就来学习一下如何创建一个有自己功能的Item。

要让自己的Item能够实现自己的功能,我们就需要理解Item的各种各样的变量和方法,当然对于一个正常的Java程序员来说这是非常容易的。不过本着偷懒的态度我还是来写一下关于Item的介绍。为了方便起见,这里的名称都是使用的反混淆之后的名称。当前forge版本是forge-1.7.10-10.13.0.1187,如果是其他版本,可能会略有不同

下面是包含的各种有用的变量:

  • private CreativeTabs tabToDisplayOn;物品所在的创造模式物品栏
    • public CreativeTabs getCreativeTab():返回当前物品所在的物品栏
    • public Item setCreativeTab(CreativeTabs p_77637_1_):设置创造模式物品栏。物品栏只需要调用net.minecraft.creativetab里面的就好了。当然你也可以创建你自己的物品栏,但是这将会在未来的教程介绍。
  • protected int maxStackSize = 64;物品的最大堆叠
    • public int getItemStackLimit():获得物品的最大堆叠,请不要Override这个方法
    • public Item setMaxStackSize(int p_77625_1_):设置物品的最大堆叠。注意:你不可给工具设置比1更大的堆叠(那样会被判断成不是工具而无法附魔等问题)。你也不可给物品设置超过64的堆叠(超过64可能会丢失)。
  • private int maxDamage;物品最大耐久
    • public int getMaxDamage():返回最大耐久
    • public Item setMaxDamage(int p_77656_1_):设置最大耐久
    • public boolean isDamageable():返回物品是否可以被损耗(要求物品有子类型或者最大耐久小于等于0)
  • protected boolean bFull3D;是否是全3D(一个没什么用的东西,大概只有骨头和工具什么的是了吧,只是看起来角度有点不一样而已)
    • public boolean isFull3D():是否全3D
    • public boolean isFull3D():设置全3D
  • protected boolean hasSubtypes;是否有子类型,意思就是是否利用同一个ID的不同附加值来代表不同的物品。
    • public boolean getHasSubtypes():返回是否有子类型
    • public Item setHasSubtypes(boolean p_77627_1_):设置是否有子类型
  • private Item containerItem;容器物品。比如桶就是水桶的容器物品。
    • public Item getContainerItem():返回当前物品的容器物品
    • public boolean hasContainerItem():返回是否拥有容器物品
    • public Item setContainerItem(Item p_77642_1_):设置容器物品
  • private String potionEffect;对于酿造的作用。用来生成药水合成表
    • public Item setPotionEffect(String p_77631_1_):设置药水酿造作用
    • public String getPotionEffect(ItemStack p_150896_1_):返回药水酿造作用
  • private String unlocalizedName;没有经过本地化的名字(参见上回)
  • protected IIcon itemIcon;物品的图标。你不用亲自管理,图标管理器会自动在你设置之后加载的
    • public IIcon getIconFromDamage(int p_77617_1_):根据损害值来返回图标
    • public void registerIcons(IIconRegister p_94581_1_):注册图标。你需要设置图标字符串才可以
  • protected String iconString;图标字符串
    • protected String getIconString():返回图标字符串
    • public Item setTextureName(String p_111206_1_):设置图标名称
  • protected boolean canRepair = true;是否可以修复
    • public boolean isRepairable():返回当前的物品是否可以修复
    • public Item setNoRepair():设置不可修复
  • private HashMap<String, Integer> toolClasses = new HashMap<String, Integer>();保存这种物品作为某类工具的时候的级别的东西
    • public int getHarvestLevel(ItemStack stack, String toolClass):返回物品作为某类工具的收获等级
    • public Set<String> getToolClasses(ItemStack stack):返回某个物品可以作为那些种物品使用
    • public void setHarvestLevel(String toolClass, int level):设置收获等级。0-木头;1-石头;2-铁;3-钻石;0-钻石

刚刚没有提到的其他方法:

  • public void addInformation(ItemStack p_77624_1_, EntityPlayer p_77624_2_, List p_77624_3_, boolean p_77624_4_) {}:用来在鼠标移动到物品上时显示额外信息
  • public boolean canHarvestBlock(Block par1Block, ItemStack itemStack):是否可以破坏方块
  • public boolean canItemEditBlocks():是否可以用这个物品来修改方块,比如种子或者甘蔗
  • public Entity createEntity(World world, Entity location, ItemStack itemstack):生成实体。返回你生成的实体或者是返回null使用默认
  • public boolean doesContainerItemLeaveCraftingGrid(ItemStack p_77630_1_):是否合成的时候不会消耗容器物品
  • public boolean doesSneakBypassUse(World world, int x, int y, int z, EntityPlayer player):是否可以点击(是否把点击传送到物品后面的方块)
  • public float func_150893_a(ItemStack p_150893_1_, Block p_150893_2_):返回物品的挖掘力量。默认1.0。
  • public boolean func_150897_b(Block p_150897_1_):还是是否能收获方块。没用的方法
  • public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot):返回作为盔甲渲染的时候的模型
  • public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type):返回作为盔甲渲染的时候的贴图
  • public Multimap getAttributeModifiers(ItemStack stack):返回作为武器使用的一个伤害调节值
  • public WeightedRandomChestContent getChestGenBase(ChestGenHooks chest, Random rnd, WeightedRandomChestContent original):调节在奖励箱子中生成的
  • public int getColorFromItemStack(ItemStack p_82790_1_, int p_82790_2_):返回显示的颜色
  • public CreativeTabs[] getCreativeTabs():列出存在的创造模式物品栏
  • public int getDamage(ItemStack stack):返回损害值
  • public float getDigSpeed(ItemStack itemstack, Block block, int metadata):返回挖掘速度
  • public double getDurabilityForDisplay(ItemStack stack):返回耐久条的比例
  • public int getEntityLifespan(ItemStack itemStack, World world):物品实体在地图上存在时间
  • public FontRenderer getFontRenderer(ItemStack stack):返回字体,用来修改物品栏显示的时候的字体
  • public IIcon getIconIndex(ItemStack p_77650_1_):返回指定的索引的图标(用于子物品)
  • public int getItemEnchantability():返回附魔能力
  • public String getItemStackDisplayName(ItemStack p_77653_1_):返回显示名
  • public EnumAction getItemUseAction(ItemStack p_77661_1_):使用物品的时候的动画
  • public int getMaxItemUseDuration(ItemStack p_77626_1_):冷却时间
  • public int getMetadata(int p_77647_1_):返回方块的物品能够被放置的元数据
  • protected MovingObjectPosition getMovingObjectPositionFromPlayer(World p_77621_1_, EntityPlayer p_77621_2_, boolean p_77621_3_):返回被停止加载的据玩家的距离
  • public EnumRarity getRarity(ItemStack p_77613_1_): 物品的稀有程度
  • public int getRenderPasses(int metadata):渲染的时候的层数
  • public boolean getShareTag():客户端和服务端是否应该共享NBT
  • public float getSmeltingExperience(ItemStack item):烧炼经验
  • public void getSubItems(Item p_150895_1_, CreativeTabs p_150895_2_, List p_150895_3_):获得子物品
  • public boolean hasCustomEntity(ItemStack stack):是否有自定义实体
  • public boolean hasEffect(ItemStack par1ItemStack, int pass):是否有特殊效果
  • public boolean hitEntity(ItemStack p_77644_1_, EntityLivingBase p_77644_2_, EntityLivingBase p_77644_3_):打击实体
  • public boolean isBookEnchantable(ItemStack stack, ItemStack book):是否可以用附魔书附魔
  • public boolean isDamaged(ItemStack stack):是否已经损坏
  • public boolean isMap():是否是地图
  • public boolean isPotionIngredient(ItemStack p_150892_1_):是否是药水成分
  • public boolean isValidArmor(ItemStack stack, int armorType, Entity entity):是否是盔甲
  • public boolean itemInteractionForEntity(ItemStack p_111207_1_, EntityPlayer p_111207_2_, EntityLivingBase p_111207_3_):是否可以在指定的实体上使用
  • public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack):作为盔甲穿上
  • public boolean onBlockDestroyed(ItemStack p_150894_1_, World p_150894_2_, Block p_150894_3_, int p_150894_4_, int p_150894_5_, int p_150894_6_, EntityLivingBase p_150894_7_):破坏方块
  • public boolean onBlockStartBreak(ItemStack itemstack, int X, int Y, int Z, EntityPlayer player):开始破坏方块
  • public void onCreated(ItemStack p_77622_1_, World p_77622_2_, EntityPlayer p_77622_3_) {}:被合成或者是烧炼出来
  • public boolean onDroppedByPlayer(ItemStack item, EntityPlayer player):玩家扔出
  • public ItemStack onEaten(ItemStack p_77654_1_, World p_77654_2_, EntityPlayer p_77654_3_):被食用
  • public boolean onEntityItemUpdate(EntityItem entityItem):在物品更新的时候调用
  • public boolean onEntitySwing(EntityLivingBase entityLiving, ItemStack stack):在物体显示“摆动”动画的时候被调用
  • public ItemStack onItemRightClick(ItemStack p_77659_1_, World p_77659_2_, EntityPlayer p_77659_3_):物品被右击
  • public boolean onItemUse(ItemStack p_77648_1_, EntityPlayer p_77648_2_, World p_77648_3_, int p_77648_4_, int p_77648_5_, int p_77648_6_, int p_77648_7_, float p_77648_8_, float p_77648_9_, float p_77648_10_):物品被使用
  •  public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ):物品被使用之后,在方块收到消息之前被调用
  • public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity):物品被左键使用
  • public void onPlayerStoppedUsing(ItemStack p_77615_1_, World p_77615_2_, EntityPlayer p_77615_3_, int p_77615_4_) {}:玩家停止使用
  • public void onUpdate(ItemStack p_77663_1_, World p_77663_2_, Entity p_77663_3_, int p_77663_4_, boolean p_77663_5_) {}:在玩家物品栏的时候每一刻都会被调用
  • public void onUsingTick(ItemStack stack, EntityPlayer player, int count):在使用的时候每一刻都会被调用
  •  public void renderHelmetOverlay(ItemStack stack, EntityPlayer player, ScaledResolution resolution, float partialTicks, boolean hasScreen, int mouseX, int mouseY){}:头部盔甲的覆盖,用来创造南瓜头效果
  • public boolean shouldRotateAroundWhenRendering():是否应该旋转
  • public boolean showDurabilityBar(ItemStack stack):是否显示耐久条

 

发现写完这篇充数的用的时间更长……

 

 

17 thoughts on “minecraft mod教程:Item类功能详解-GameRegistry的使用4

  1. 怎么让物品自带附魔效果
    为什么这样
    public void onCreated(ItemStack ItemStack, World par2World, EntityPlayer par3EntityPlayer)
    {
    ItemStack.addEnchantment(Enchantment.knockback, 2);
    ItemStack.addEnchantment(Enchantment.fireAspect, 4);
    }
    不行
    求解

  2. public void addInformation(ItemStack p_77624_1_, EntityPlayer p_77624_2_, List p_77624_3_, boolean p_77624_4_) {}
    这个里面的参数应该填什么?

    • 像这样
      public void addInformation(ItemStack p_77624_1_, EntityPlayer p_77624_2_, List List, boolean p_77624_4_)
      {
      List.add(“信息”);
      List.add(“信息”);
      }

  3. 请问如何让鼠标指针指着物品的时候显示注释(比如GT里的矿石化学式)

  4. http://pan.baidu.com/s/1jG7SBxO
    这是错误日志求帮忙看看那出错了

  5. 请问博主在哪里找的资料看

  6. 1.我想请教一下Subtypes在新版的forge下怎么设置。我想像工业mod那样一个id然后用不同的子id来表示不同的机器,还有就是像格雷科技那样一个id表示不同的矿物,或者不同的金属锭等;
    2.还想问一下创造模式分类具体怎么设置;
    3.还有就是怎么能像格雷一样屏蔽原版的合成表或者矿物生成;
    4.然后怎么能让自己的合成表在nei显示,还有自定义的合成表(比如自己的机器)怎么能在nei显示合成;
    谢谢,平安夜快乐

    • 首先先谢谢你的祝福(虽然说看到的时候已经是第二天凌晨了
      第一个问题:让一个物品能够具有subtype并不是一件困难的事情,setHasSubtypes这个API就能方便的完成。但是你不得不操作物品的元数据(MetaData)来完成。你要明白在Minecraft中一个物品(Item)和一个方块(Block)的处理是不同的。系统会自动为你的方块生成物品,但是你也可以指定你的物品。下面就以物品为例子来说明一下。至于方块的处理需要NBT
      http://minecraftforgetutorials.weebly.com/item-with-metadata.html
      这篇教程还是很不错的,你可以参考一下它的方法。当然了,去参考bc之类的mod的源代码也是很方便的。
      第二个问题:你说的是创造模式标签(CreativeTabs)么。Minecraft的默认的创造模式标签你可以在CreativeTabs内部找到。
      第三个问题:这个问题你不能简单的通过一些配置禁用了,你必须拦截矿物生成事件:http://www.minecraftforge.net/forum/index.php?topic=23931.0
      第四个问题:自己机器的合成表需要有自己的NEI接口才能显示出来的。这个你需要参考NEI的文档。具体的还要看他的源代码
      https://github.com/Chicken-Bones?tab=repositories

      希望这些回答能够帮助到你。圣诞快乐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注