0

你好互联网的人们,我想知道是否有一种方法可以让定制的食物给你 XP。我正在制作一个模组,并希望“SimonApple”给我 XP。请让我知道是否有办法做到这一点。

package com.notsimon.blocksplus;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.block.Block;
import net.minecraft.block.material.MapColor;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemFood;
import net.minecraft.item.ItemStack;

@Mod(modid = "ep", name = "Experience Plus", version = "1.0")
public class ExperiencePlus {

    public static Item SimonApple;
    public static Item MagentaDust;
    public static Block MagentaOre;
    public static Block MagentaBlock;

    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        //Item/Block init and registering
        //Config handling
        //X * 0.5 = 20 Hunger
        SimonApple = new ItemFood(10, 0.5F, false).setUnlocalizedName("SimonApple").setTextureName("bp:SimonApple").setCreativeTab(tabBlocksPlus);
        MagentaOre = new BlockTable(Material.iron).setBlockName("MagentaOre").setBlockTextureName("bp:MagentaOre").setCreativeTab(tabBlocksPlus);
        MagentaDust = new ItemTable().setUnlocalizedName("MagentaDust").setTextureName("bp:MagentaDust").setCreativeTab(tabBlocksPlus);
        MagentaBlock = new MagentaBlock(Material.iron).setBlockName("MagentaBlock").setBlockTextureName("bp:MagentaBlock").setCreativeTab(tabBlocksPlus);
        //item.itemTable and substring(5) removes "item."
        GameRegistry.registerItem(SimonApple, SimonApple.getUnlocalizedName().substring(5));
        GameRegistry.registerBlock(MagentaOre, MagentaOre.getUnlocalizedName().substring(5));
        GameRegistry.registerItem(MagentaDust, MagentaDust.getUnlocalizedName().substring(5));
        GameRegistry.registerBlock(MagentaBlock, MagentaBlock.getUnlocalizedName().substring(5));
        GameRegistry.registerWorldGenerator(new OreGeneration(), 0);
    }

    @EventHandler
    public void init(FMLInitializationEvent event) {
        //Proxy, TileEntity, entity, GUI and Packet Registering
        GameRegistry.addRecipe(new ItemStack(SimonApple, 2), new Object[]{"MMM","MBM","MMM", 'M', ExperiencePlus.MagentaDust, 'B', ExperiencePlus.MagentaBlock});
        GameRegistry.addRecipe(new ItemStack(MagentaBlock), new Object[] {"MMM", "MMM", "MMM",'M', ExperiencePlus.MagentaDust});
    }

    @EventHandler
    public void postInit(FMLPostInitializationEvent event) {

    }

    public static CreativeTabs tabBlocksPlus = new CreativeTabs("tabBlocksPlus"){
        @Override
        public Item getTabIconItem() {
            return new ItemStack(MagentaOre).getItem();
        }
    };




}
4

2 回答 2

1

要么按照 Abob78 的建议创建一个新项目,要么创建一个订阅PlayerUseItem事件的 eventHandler 以在 Finish 状态下触发。

要限制触发它的项目,您必须考虑使用 itemstack NBT 数据来存储一个标志,以从普通苹果中识别“西蒙苹果”。这可以像“isSimonApple”之类的布尔标志一样简单

从事件中,您应该能够提取可以转换为玩家引用的EntityLiving引用。然后要么增加触发玩家的 XP,要么在他们的位置生成 XP 球。

于 2016-03-08T10:16:20.253 回答
1

您无法在游戏中编辑当前的苹果项目,您必须创建自己的作为锻造模组项目,这似乎是 oyu 所做的。要让一个物品获得 XP,你可以这样使用:

player.addExperienceLevel(1); //player is an EntityPlayer or an EntityPlayerMP

SimonApple 项目类

这是 SimonApple 的项目类的样子(没有导入):

public class SimonApple extends ItemFood {
    private static final int LevelsToAdd = 10; //just an example number; play around with it

    public SimonApple(String unlocalizedName, int healAmount, float saturationModifier, boolean wolvesFavorite, CreativeTab creativeTab) {
        super(healAmount, saturationModifier, wolvesFavorite);
        this.setUnlocalizedName(unlocalizedName);
        this.setTextureName(Main.MODID + ":" + unlocalizedName);
        this.setCreativeTab(creativeTab);
    }

    @Override
    protected void onFoodEaten(ItemStack stack, World world, EntityPlayer player) {
        super.onFoodEaten(stack, world, player);
        player.addExperienceLevel(LevelsToAdd);
    }
}

在 ExperiencePlus 类中更改变量

你需要改变这个:

public static Item SimonApple;

围绕这一点:

public static Item simonApple;

你需要改变这个:

SimonApple = new ItemFood(10, 0.5F, false).setUnlocalizedName("SimonApple").setTextureName("bp:SimonApple").setCreativeTab(tabBlocksPlus);

仅此:

simonApple = new SimonApple("SimonApple", 10, .5f, false, tabBlocksPlus);

注意: 10 应该是愈合量,0.5f 应该是饱和量(参见此处的表格)

于 2016-02-22T01:08:01.420 回答