Minecraft(我的世界)中文论坛
标题: 利用Forge API开发联机MOD【基础篇】【第六章】
作者: yuxuanchiadm 时间: 2012-8-1 19:52
标题: 利用Forge API开发联机MOD【基础篇】【第六章】
本帖最后由 yuxuanchiadm 于 2013-7-26 09:22 编辑
利用Forge API开发联机MOD【基础篇】【第六章】
给你的MOD添加一个方块
作者:yuxuanchiadm
索引贴地址:http://www.mcbbs.net/thread-38211-1-1.html
请确定你已经阅读完成第五章的内容:
http://www.mcbbs.net/thread-38387-1-1.html
否则不要阅读此贴!
序:
在上一章里,我们学会了如何创建一个物品,并应用于游戏中。现在我们将创建一个高级刷怪笼方块的基本Block对象,使你可以设置刷怪笼所刷的怪物。
添加一个新方块:
首先,我们要想好这个方块所能实现的功能。
1.可以被任何镐子直接挖掉。
2.可以设置刷怪笼所刷的怪物。
3.可以设置刷怪笼刷怪的时间间隔。
下面,开始行动!
首先,添加一个可以合成普通刷怪笼的合成表:- ModLoader.addRecipe(new ItemStack(Block.mobSpawner,1), new Object[]
- {
- "###","#*#","###",Character.valueOf('#'),Item.ingotIron,Character.valueOf('*'),Item.redstone
- });
复制代码 然后,在myFirstMod下新建一个包Block,再新建一个类,命名为BlockAdvancedMobSpawner,并更改内容为:- package myFirstMod.Block;import java.util.Random;import net.minecraft.block.BlockContainer;
- import net.minecraft.block.material.Material;
- import net.minecraft.entity.player.EntityPlayer;
- import net.minecraft.tileentity.TileEntity;
- import net.minecraft.world.World;public class BlockAdvancedMobSpawner extends BlockContainer
- {
- // 构造函数
- public BlockAdvancedMobSpawner(int par1)
- {
- super(par1, Material.rock);
- this.setHardness(5.0F);
- this.setStepSound(soundMetalFootstep);
- this.setBlockName("Advanced Mob Spawner");
- }
- // TileEntity对象
- public TileEntity createNewTileEntity(World var1)
- {
- return new TileEntityAdvancedMobSpawner();
- }
- // 掉落的物品ID
- public int idDropped(int par1, Random par2Random, int par3)
- {
- return this.blockID;
- }
- // 不是不透明方块
- public boolean isOpaqueCube()
- {
- return false;
- }
- // 玩家右击方块
- public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
- {
- if (par5EntityPlayer.isSneaking())
- {
- if(par1World.isRemote)
- {
- //如果蹲下但是客户端,也跳出,但返回true使其挥舞手臂
- return true;
- }
- }
- else
- {
- //如果没有蹲下则跳出
- return false;
- }
- // 以后会在这里添加代码
- return true;
- }
- }
复制代码 这里Eclipse会报错,因为没有定义TileEntityAdvancedMobSpawner类,我们将在稍后将其补全。
/**知识点:在Minecraft里用什么表示一个方块?
Minecraft里所有的方块都表示为继承自Block类的一个类,在Block类里,定义了许多有用的方法,这些方法会在玩家执行右击、破坏、左击......等动作时调用,以实现相应的处理,Minecraft的方块时一个接一个的储存在存档文件里的,在读取的时候顺序读取,存储在存档文件里面的一个方块只包含基础信息,不包含其方块的坐标,方块的坐标是在载入时根据先后顺序依次计算的。
**/
在mod_myFirstMod里添加字段:
- public static int BlockAdvancedMobSpawnerID;
- public static Block AdvancedMobSpawner;
复制代码
在preInit函数唯一一个try语句块中添加- BlockAdvancedMobSpawnerID = myFirstModConfig.GetBlockID("BlockAdvancedMobSpawner", 300);
复制代码 复制一个刷怪笼的纹理图片到myFirstMod\sprites\blocks.png,用PS打开,并乱涂一番。
得到高级刷怪笼的纹理:)
在myFirstModProxyClient中注册(预载入)这个纹理:
添加字段:- public final static String BLOCKS_PNG_PATH = "/myFirstMod/sprites/blocks.png";
复制代码 在registerRenderers方法中添加:- MinecraftForgeClient.preloadTexture(BLOCKS_PNG_PATH);
复制代码 在BlockAdvancedMobSpawner中绑定这个纹理:- this.blockIndexInTexture = 0;
- this.setTextureFile(myFirstModProxyClient.BLOCKS_PNG_PATH);
复制代码 然后在load函数添加:
- AdvancedMobSpawner = new BlockAdvancedMobSpawner(BlockAdvancedMobSpawnerID);
- ModLoader.registerBlock(AdvancedMobSpawner);
- ModLoader.addName(AdvancedMobSpawner, "高级刷怪笼");
复制代码
添加合成表:
- ModLoader.addRecipe(new ItemStack(AdvancedMobSpawner,1), new Object[]
- {
- "###","#*#","###",Character.valueOf('#'),Item.diamond,Character.valueOf('*'),Block.mobSpawner
- });
复制代码
现在,你可以把这个方块的createNewTileEntity()函数改成(记得改回来):
- public TileEntity createNewTileEntity(World var1)
- {
- return null;
- }
复制代码
并测试游戏,你可以用8个钻石和1个刷怪笼得到一个类似刷怪笼的玩意(伪·钻石氪金刷怪笼),但是这玩意丝毫没有用处,在下一章里,我将教你如何让这玩意起作用。
总结:
在这一章里,我们学会了如何创建一个基本的方块,在下一章里,我们会让这个方块能够像刷怪笼一样刷各种生物。
作者: Condor 时间: 2012-8-1 19:54
目测这对一些人做MOD很有帮助,辛苦了。。。
作者: masson_ma 时间: 2013-4-29 04:33
1.5.1中MinecraftForgeClient.preloadTexture()方法过期了怎么破?好像改了写法了
作者: kuafuzhuguang 时间: 2013-8-5 20:13
完成。。。
作者: huanghongxun 时间: 2013-10-31 18:56
问一下new ResourceLocation("MyMod:textures/block/blocks.png")指的位置是哪里= =
作者: yuxuanchiadm 时间: 2013-10-31 21:48
huanghongxun 发表于 2013-10-31 18:56 
问一下new ResourceLocation("MyMod:textures/block/blocks.png")指的位置是哪里= =
Nope如果你想给方块加材质的话,那么1.6.2不是这么写的。
重载Block的registerIcons方法然后注册材质,例如:
public void registerIcons(IconRegister iconRegister)
{
blockIcon = iconRegister.registerIcon("AssemblyProgramCraft:BaseTexture");
}
然后把方块材质放到assets/assemblyprogramcraft/textures/blocks目录里并命名为BaseTexture.png,不需要加/textures/block/,物品也一样,并且其在代码里引用的资源包名可以有大写,但实际资源包名必须小写,另外1.6.4开始每个方块都有个单独的材质文件,不再是放一起了。
作者: yuxuanchiadm 时间: 2013-10-31 21:57
本帖最后由 yuxuanchiadm 于 2013-10-31 21:58 编辑
huanghongxun 发表于 2013-10-31 18:56 
问一下new ResourceLocation("MyMod:textures/block/blocks.png")指的位置是哪里= =
另外如果直接使用ResourceLocation,那么
private static final ResourceLocation scrollTextures = new ResourceLocation("AssemblyProgramCraft:textures/gui/scroll.png");
对应:
assets/assemblyprogramcraft/textures/gui/scroll.png
绘制则用:
FMLClientHandler.instance().getClient().renderEngine.bindTexture(scrollTextures);
进行纹理绑定
作者: huanghongxun 时间: 2013-10-31 22:01
yuxuanchiadm 发表于 2013-10-31 21:57 
另外如果直接使用ResourceLocation,那么
private static final ResourceLocation scrollTextures = new R ...
恩可以了!
做了一个高级水力发电机MOD。。
作者: huanghongxun 时间: 2013-11-2 13:30
如何在TileEntity里面获取Player。。。。
作者: huanghongxun 时间: 2013-11-2 19:16
yuxuanchiadm 发表于 2013-10-31 21:48 
Nope如果你想给方块加材质的话,那么1.6.2不是这么写的。
重载Block的registerIcons方法然后注册材质,例 ...
这个assets/assemblyprogramcraft/textures/blocks目录
打包后的确可以
但是我想在调试的时候有材质应该放到哪里?
mcp/jars/assets/...不能加载
minecraft.jar里不能加载
mods/assets/...不能加载
作者: phpair 时间: 2014-7-17 07:46
eclipse编译在ec的bin里
作者: soil-sword 时间: 2019-12-8 03:08
看 看不懂。。。