Minecraft(我的世界)中文论坛
标题: 利用Forge API开发联机MOD【基础篇】【第五章】
作者: yuxuanchiadm 时间: 2012-8-1 08:40
标题: 利用Forge API开发联机MOD【基础篇】【第五章】
本帖最后由 yuxuanchiadm 于 2013-2-13 04:40 编辑
利用Forge API开发联机MOD【基础篇】【第五章】
给你的MOD添加一个物品
作者:yuxuanchiadm
索引贴地址:http://www.mcbbs.net/thread-38211-1-1.html
请确定你已经阅读完成第四章的内容:
http://www.mcbbs.net/thread-83003-1-1.html
否则不要阅读此贴!
序:
在上一章里,我们已经学会了如何制作一个MOD的配置文件,是时候做一个功能强大的MOD了把 : )。现在,我将要手把手教你做一个有一定内容的MOD。
添加一个新的物品:
(这次的教程我准备讲解一个名为刷怪笼手工艺的MOD,当然这是我自己的MOD :D,顺便把这MOD做成联机的,一举两得:D,此MOD的老版本下载地址:http://www.mcbbs.net/thread-37772-1-1.html)
首先,我们需要做一个镐子,来采集传说中的刷怪笼 :D
新建一个包:myFirstMod.Item
新建一个类,命名为ItemSpawnerPickaxe,继承自ItemPickaxe,
然后写入如下代码:- package myFirstMod.Item;
- import net.minecraft.block.Block;
- import net.minecraft.entity.EntityLiving;
- import net.minecraft.entity.item.EntityItem;
- import net.minecraft.item.EnumToolMaterial;
- import net.minecraft.item.ItemPickaxe;
- import net.minecraft.item.ItemStack;
- import net.minecraft.world.World;
- public class ItemSpawnerPickaxe extends ItemPickaxe
- {
- //构造函数(参数1:物品ID)
- public ItemSpawnerPickaxe(int par1)
- {
- super(par1, EnumToolMaterial.EMERALD);
- this.setItemName("SpawnerPickaxe");
- }
- //破坏方块时调用(参数1:玩家拿着的物品栈(此物品的物品栈),参数2:方块世界,参数3:方块ID,参数4-6:方块坐标,参数7:使方块被摧毁的玩家)
- public boolean onBlockDestroyed(ItemStack par1ItemStack, World par2World, int par3, int par4, int par5, int par6, EntityLiving par7EntityLiving)
- {
- //损伤这个物品
- par1ItemStack.damageItem(1, par7EntityLiving);
- //如果被破坏的方块等于刷怪笼
- if(par3 == Block.mobSpawner.blockID)
- {
- //新建一个掉落的方块
- EntityItem entityitem = new EntityItem(ModLoader.getMinecraftInstance().theWorld, (float)par4, (float)par5, (float)par6, new ItemStack(Block.mobSpawner.blockID,1,0));
- //设置可拿起的间隔
- entityitem.delayBeforeCanPickup = 10;
- //抛出这个方块
- ModLoader.getMinecraftInstance().theWorld.spawnEntityInWorld(entityitem);
- }
- return true;
- }
- }
复制代码 现在,我们已经成功的创建了一把可以回收刷怪笼的稿子,别急着编译,先添加到MOD里:
首先,上次创建的配置文件管理类有用处了=w=,在mod_myFirstMod的字段区域添加:
- public static int ItemSpawnerPickaxeID;
复制代码 这个字段储存我们制作的稿子的ID。然后在preInit方法里添加:
- myFirstModConfig.InitliazeConfig(event.getSuggestedConfigurationFile());
- try
- {
- ItemSpawnerPickaxeID = myFirstModConfig.GetItemID("ItemSpawnerPickaxe",12001);
- }
- catch(Exception error)
- {
- System.out.println(error.getMessage());
- System.out.println(error.getStackTrace());
- }
- myFirstModConfig.SaveConfig();
复制代码
现在,我们已经成功的获取到了镐子的ID,默认为12001,并且可以在配置文件修。
是时候了,编译此MOD,再运行一次游戏,你将在MCP62ForgeMod\jars\config下得到一个漂亮的配置文件LOL,虽然此MOD任然不能玩。
现在,我们需要把这个镐子添加进游戏里。
第一步:我们需要纹理
首先,复制这个图片:
到\mcp725ForgeMOD\src\minecraft\myFirstMod\sprites并命名为items.png。
打开此文件,用PS乱涂一番,保存为items.png,建议把.psd文件一起保存,方便日后修改,就得到了我们镐子的纹理:)。
(记得注意透明通道 :D)
第二步:纹理需预载入
还记得我们在第四章做的代理类么,现在派上用处了 :D
打开myFirstModProxyCommon类,添加:- public void registerRenderers()
- {
-
- }
复制代码 打开myFirstModProxyClient类,添加:- public final static String ITEMS_PNG_PATH = "/myFirstMod/sprites/items.png";
- public void registerRenderers()
- {
- MinecraftForgeClient.preloadTexture(ITEMS_PNG_PATH);
- }
复制代码 第三步:给物品绑定纹理
打开ItemSpawnerPickaxe,在构造函数中添加代码:- this.setTextureFile(myFirstModProxyClient.ITEMS_PNG_PATH);this.setIconIndex(0);
复制代码 第四步:注册物品到游戏中
在mod_myFirstMod中新建字段:- public static Item SpawnerPickaxe;
复制代码 然后导入类:
- import net.minecraft.src.EnumToolMaterial;
- import net.minecraft.src.Item;
- import myFirstMod.Item.ItemSpawnerPickaxe;
复制代码 在load方法里添加:
- SpawnerPickaxe = new ItemSpawnerPickaxe(ItemSpawnerPickaxeID);
- ModLoader.addName(SpawnerPickaxe, "刷怪笼回收镐");
复制代码
这样,你就成功的把你的镐子添加进了游戏:),现在,再添加个合成公式:
- ModLoader.addRecipe(new ItemStack(SpawnerPickaxe,1), new Object[]
- {
- "###"," * "," * ",Character.valueOf('#'),Item.redstone,Character.valueOf('*'),Item.stick
- });
复制代码
现在,编辑并测试的的MOD,尝试合成一个镐子,如果你能够合成,就说明你成功了!
(好吧,代码编辑功能极度不好用,空格键差点被我敲坏)
作者: KYCN.卡神 时间: 2012-8-1 08:59
好复杂!!!!!!!!!!!!{:10_527:}
作者: jacky1440 时间: 2012-8-1 09:21
看懂了~用Modloader做Mod路过...
作者: xmq1991 时间: 2012-9-23 09:21
如何在调试的时候加上其他mod,方便测试
作者: xmq1991 时间: 2012-9-23 09:39
LZ有些偷懒了
这个函数在哪里,我表示没看到
而且这个类的写法与之前你的写法不同,这个是采用实现接口的方式实现的
作者: xmq1991 时间: 2012-9-23 10:06
本帖最后由 xmq1991 于 2012-9-23 10:06 编辑
这个问题不大,就在刚才,我已经实现了这一部分的功能
除了索引贴之外,你还有其他的资料吗,能发给我看看嘛?
[email protected]
在这里先谢过了
作者: mcpan 时间: 2013-1-26 17:53
xmq1991 发表于 2012-9-23 09:39 
LZ有些偷懒了
这个函数在哪里,我表示没看到
而且这个类的写法与之前你的写法不同,这个是采用实现接口的 ...
我也遇到这个问题,怎么解决?
作者: yyfish 时间: 2013-1-27 23:14
楼主跨度太大了,如果是新人,不太可能会看懂
getName()是继承于BaseMod下的
Orz...
作者: painkilling 时间: 2013-4-4 23:01
成功了 写的很详细 明天继续看
作者: Devilk 时间: 2013-4-26 17:27
为什么在导入
import net.minecraft.src.EnumToolMaterial;
import net.minecraft.src.Item;
import myFirstMod.Item.ItemSpawnerPickaxe;
的时候 无法解析。
作者: Devilk 时间: 2013-4-26 18:04
为什么无法读取 纹理图片。
作者: 金坷居士 时间: 2013-5-16 14:40
在Forge7.7就是那个对应MC1.5.1的版本中楼主的代码可以掉落刷怪龙但是会掉落两个而且都不能捡起来
作者: yuxuanchiadm 时间: 2013-5-16 16:37
金坷居士 发表于 2013-5-16 14:40 
在Forge7.7就是那个对应MC1.5.1的版本中楼主的代码可以掉落刷怪龙但是会掉落两个而且都不能捡起来
此教程1.4.7不谢(PS:为啥总是扯1.5的)
作者: 金坷居士 时间: 2013-5-16 18:15
yuxuanchiadm 发表于 2013-5-16 16:37 
此教程1.4.7不谢(PS:为啥总是扯1.5的)
窝错了QAQ
顺便说下1.5.1的贴图神马东西变化都好大
作者: WH的MC 时间: 2013-6-22 20:18
知道吗,我快死了
作者: kuafuzhuguang 时间: 2013-8-4 23:25
成功。终于完事了。。。从头来了好几遍。
不过
import net.minecraft.src.EnumToolMaterial;
import net.minecraft.src.Item;
import myFirstMod.Item.ItemSpawnerPickaxe;
这几个确实有问题。。注了之后似乎也没啥影响
作者: 饕餮魍魉枭蹀躞 时间: 2013-8-23 20:10
最坑爹的是什么?setItemname()报错!
作者: yuxuanchiadm 时间: 2013-8-23 22:54
饕餮魍魉枭蹀躞 发表于 2013-8-23 20:10 
最坑爹的是什么?setItemname()报错!
无JAVA基础请买书看或放弃
作者: 饕餮魍魉枭蹀躞 时间: 2013-8-25 10:24
yuxuanchiadm 发表于 2013-8-23 22:54 
无JAVA基础请买书看或放弃
翻了翻Item.java
似乎在1.5.2里把setItemname()改成setUnlocalizedName()了
作者: yuxuanchiadm 时间: 2013-8-25 12:18
饕餮魍魉枭蹀躞 发表于 2013-8-25 10:24 
翻了翻Item.java
似乎在1.5.2里把setItemname()改成setUnlocalizedName()了
教程1.4.7没看见么
作者: 1123fff 时间: 2013-11-25 11:59
yuxuanchiadm 发表于 2013-8-25 12:18 
教程1.4.7没看见么
楼主神马时候来个 ·1.52的教程······
作者: adaer 时间: 2013-12-9 22:41
金坷居士 发表于 2013-5-16 14:40 
在Forge7.7就是那个对应MC1.5.1的版本中楼主的代码可以掉落刷怪龙但是会掉落两个而且都不能捡起来
在掉落的时候应该用参数传进去的world而不是从API得到world的实例,这样才能捡取掉落物品。然后掉落两个的原因大概是在掉落的时候没有判断传入的world是不是isRemote。
作者: adaer 时间: 2013-12-9 22:51
金坷居士 发表于 2013-5-16 14:40 
在Forge7.7就是那个对应MC1.5.1的版本中楼主的代码可以掉落刷怪龙但是会掉落两个而且都不能捡起来
研究了下其他方块掉落的代码,然后改成这个样子了。为了测试打土方快掉刷怪笼,并且掉耐久,判断了world是否是远程以后就没有掉两个刷怪笼了
@Override
public boolean onBlockDestroyed(ItemStack _itemStackAtHand, World _world,
int _blockId, int _blockX, int _blockY, int _blockZ,
EntityLivingBase _destorier)
{
if(_world.isRemote) return false;
if (_blockId == Block.dirt.blockID)
{
// damage the itemstack
_itemStackAtHand.damageItem(1, _destorier);
EntityItem dropedItem = new EntityItem(_world, _blockX, _blockY,
_blockZ, new ItemStack(Block.mobSpawner.blockID, 1, 0));
dropedItem.delayBeforeCanPickup = 10;
_world.spawnEntityInWorld(dropedItem);
return true;
}
return false;
}
作者: kimisnan 时间: 2013-12-15 12:02
MinecraftForgeClient这个类里面没有 preloadTexture这个静态方法?是不是换掉了我用的1.6.4 还有关于路径的问题,这个里面是是从根目录开始算么?
作者: yuxuanchiadm 时间: 2013-12-15 13:07
kimisnan 发表于 2013-12-15 12:02 
MinecraftForgeClient这个类里面没有 preloadTexture这个静态方法?是不是换掉了我用的1.6.4 还有关于路径的 ...
1.6有很大改动,使用资源包以及不需要预载入材质
作者: kimisnan 时间: 2013-12-16 09:18
yuxuanchiadm 发表于 2013-12-15 13:07 
1.6有很大改动,使用资源包以及不需要预载入材质
MinecraftForgeClient这个类里面没有 preloadTexture这个静态方法?如果我按照上面的教程在1.6里面去做,如何才能运行呢?还有您好,您知道哪里有1.6的API 就是每个类的解释,每个类的方法,或者您有没有参与什么类似的群,我也想进去探讨一下。
作者: kimisnan 时间: 2013-12-16 09:19
yuxuanchiadm 发表于 2013-12-15 13:07 
1.6有很大改动,使用资源包以及不需要预载入材质
如果在1.6里面我要如何去运行添加自己mod呢?还是您比较不推荐使用1.6呢?
作者: kimisnan 时间: 2013-12-16 09:20
yuxuanchiadm 发表于 2013-12-15 13:07 
1.6有很大改动,使用资源包以及不需要预载入材质
MinecraftForgeClient这个类里面没有 preloadTexture这个静态方法?如果我按照上面的教程在1.6里面去做,如何才能运行呢?还有您好,您知道哪里有1.6的API 就是每个类的解释,每个类的方法,或者您有没有参与什么类似的群,我也想进去探讨一下。
作者: zheng2002119 时间: 2014-7-24 16:50
可以说好像要把名字双写= =233333333333333333333333333333333333333333333333333333333333333333333333333333333333333
作者: cten 时间: 2015-10-14 17:40
提示: 作者被禁止或删除 内容自动屏蔽