我的世界自定义npcmodNPCmod怎样把制作出来的人复制好多个

查看: 918|回复: 10
家具模组里,很多东西都可以当武器架,像展示框,工具架,储物柜,还可以加锁,多人的时候别人打不开,做法也有很多,装了模组会给你本书,教你怎么做。不过只能是PC的
在npc面板的背包一格,在npc人物旁边有三个格,分别是:右手武器 远程发射物品 左手装备,在其中放入武器即可。
chenlan1021
不能 这些是插件 简称“服务器神器” npcmod不能达到此效果
liuwei291009
去Minecraft中文下载站等网站下载“元素枪Mod”文件,选择对应版本。 将下载的mod放置到Minecraft程序“.minecraft”——“mods”文件夹中。 启动游戏,打开Mods选项查看确认mod载入成功。 进入游戏,在工作台中按照枪的合成公式合成各类枪。如按照下图
不用点他的,你远离他之后又接近他试试 (那个黑手不用在意)
直接把压缩文件放到 .minecraft 文件夹里的 mods 文件夹就行了,但是要想在纯净版里安装就要下载forge的,我个人推荐还是下载我的世界懒人包比较方便,你要懒人包可以去这个网站:http://www.mcbbs.net/forum.php
直接把压缩文件放到 .minecraft 文件夹里的 mods 文件夹就行了,但是要想在纯净版里安装就要下载forge的,我个人推荐还是下载我的世界懒人包比较方便
只有NPCmod你要吗
如果是招募的士兵: 1.可能按到F5“停止射击”模式,再按次F5切可以换回“自由射击” 2.战斗刚一开始士兵的状态都是冲锋(F3),所以机枪兵冲锋时更喜欢拿近战武器——如同现实,机枪更多用来防御:让你的人驻守(F1)一个制高点,他们站稳了不动,八【高级教程】NPCmod(对话,任务,可用性等)_minecraft吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:1,343,128贴子:
【高级教程】NPCmod(对话,任务,可用性等)
教程不是很好,有些地方没有琢磨出来。
任务要求: 1.沸枰??碌...
Ni yuan yi bu
3D双端东方魔幻网游「大青云」勾魂公测,穿越逆转,封神故事,全新演绎!
对话:对话是NPCmod内的一个主要部分可以通过对话建立起非常多的功能比如,主线任务,隐藏任务先打开“全局”选项栏并选中“对话”一栏
点击右侧的写好一个名字然后再点击一下
挽尊                   门前大桥下,游过一群鸭…       哎呦卧槽!游不过去, 卡住了…
再次点击“增加”①标题部分 关于对话的标题,不会显示在对话框上,一般来说不能重名,不然会出BUG②文本对话框 在右键NPC时对话时的显示③可用性 这个对话在某个条件下才会产生 你右键NPC才会弹出这个对话或者有这个选项④阵营 弹出这个对话后会增加或减少你的阵营积分⑤对话框选项 弹出对话后下面会有一个圆盘 那里可以设置你回答NPC的对话或者功能按钮⑥任务 弹出这个对话后你会接受某一个任务⑦声音 弹出这个对话后会播放一个音效 比如文本写的是你好然后再播放一个“你好”的声音⑧邮件 1.6.4的新功能[吧] 弹出这个对话后会给某个人或者你发送一条邮件⑨命令 弹出这个对话后会执行某个命令 比如把你TP到什么什么地方或者kill
没人看么 算了还是不更了 本来以为还能教会一大批人NPCmod的- -
我我 我在看
报考一级消防师要求,学尔森13年考培经验为您解答,更有百度信贷分期付学费.
怎么让NPC打怪 自动
继续让我们来做一个最普通的对话文本对话框可用性选项不用改变然后就是对话框选项注意这里有6个编辑 一个对话可以最多6个分歧标题: 就是选项的名字 会在“盘子”上面显示颜色:选项名字的颜色 这个代码自己慢慢写吧- -选项类型:一共有五种 禁用就是不显示 不能用 角色就是点击后会使用这个NPC的角色 比如商店银行等 在角色部分设置 命令方块应该大家都知道吧- - 关闭就是显示名字但是按了之后就关闭对话框 最核心的就是对话 对话就是点击这个后会弹到另一个对话框
如果你要弄一个分歧弹出另一个对话框 那么你要再弄一个对话框编辑好之后 你就可以回来设置这个选项点击选择对话后 选择这个对话
一个对话已经做好了 下面我们需要把他绑定到一个NPC上面选择到“高级”选项 然后点一下“对话框”点一下第一个栏 然后选择到那个对话 主要的一个对话
顶一下 然后下午更 没人看。。
怎么刚来就走了
顶楼主,以收藏
大家都是水笔
楼主快晚上了
楼主太好了,我正愁服务器npcmod不会用呢,楼主快更啊!
白银星玩家
百度星玩家累积成长值为1,
马上做完作业开始更了!
生存用NPC,瞬间成土豪
任务:任务系统是与对话系统连接的 如果没有对话就做不出任务在全局中选择“对话”做出一个最普通的对话借用上面的
稍微做做修改
现在 点开“任务”一栏同样 点开增加
1.标题 不多说了 这个按L键打开任务列表的时候会显示的2.完成记录 在你完成任务的时候弹出来的一个框 上面会显示什么什么的 这个随便写3.任务日志 按了L后再点击任务 可以看到的任务日志,用来提示任务的4.奖励 完成任务总是要有点奖励吧? 可以放物品经验等5.类型 一共3种任务类型 可以是对话任务 跟某个人说完话后任务完成 可以是杀怪任务 杀死几个什么什么怪 可以是物品收集 就是收集一些东西不多说了6.重复 你可以设置这是每周任务 也可以是每日任务 或者一直可以做[重复] 或者是只能做一次[否]7.任务交付的NPC 就是你完成任务的时候在哪里交任务 你也可以设置成立即完成 就是达成任务条件的时候直接弹出完成任务的框8.阵营选项 就是你完成任务后会增加一些阵营点数或者减少9.创建邮件 完成任务后给某个玩家发个邮件10.下一个任务 做完这个任务后自动开始做下一个任务 可以设置
现在我们做的是杀怪任务 所以更改选项[关于日志记录什么的就不多说了]点开编辑注意这里 你可以设置3种怪物 也就是说你可以在一个任务中设置你必须要杀死的怪物最多3种右边是原版怪物的名字 你也可以在框里填写你要杀死的NPC的名字 you can fill in npc or player names to
玩家的名字也行 【你可以制作通缉令了】
贴吧热议榜
使用签名档&&
保存至快速回贴我的世界1.6.2复制术MOD_我的世界mod吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:21,025贴子:
我的世界1.6.2复制术MOD
例如,一个钻石变64个钻石,生存必备
小猪君镇楼~
其实我也不知道具体的,...
1.7.10 forge 也是一样...
一个过小的船镇楼 2L放...
壮哉我大MOD!谁说滚3MO...
植物大战僵尸镇楼图
首先召唤第一张图! 谷...
哈喽~~我又来介绍mod了...
镇楼 我才不是来水经验...
3D双端东方魔幻网游「大青云」勾魂公测,穿越逆转,封神故事,全新演绎!
需要什么复制术跟我说,我立刻发,不发我吞xiang
没有这种mod吧
任何东西都可以,是居家旅行,出门打劫的必备品
报考一级消防师要求,学尔森13年考培经验为您解答,更有百度信贷分期付学费.
我要NPCmod
和战备双持最新的
要其他MOD别在这说行吗?
就算有这种mod,生存也失去了乐趣。而且在多人里也用不了
1.6.2钻石复制交出来QAQ求求
1.6.2钻石复制啊求求你了
直接把这个文件夹丢进MODS
貌似mod制作器制作很容易
贴吧热议榜
使用签名档&&
保存至快速回贴|  
|  
|  
|  
|  
只需一步,快速开始
查看: 217452|回复: 619
【mod制作教程连载全翻译】:轻松让你成为mod制作者的一员!( 23:23更新2篇其他类教程)
主题帖子积分
本帖最后由 robinxb 于
23:33 编辑
原帖地址:
此篇文章全手打翻译,请尊重劳动成果,翻译版转帖请征得我个人同意,此文章3dm首发。
因个人语文不是很好,java学得也不精通,估如果有错误或不合适的地方,请随时PM我,我会立刻更正。谢谢
个人工作学习原因无法继续更新啦,各位将就看下吧 谢谢啦
基本计划:
1、翻译游戏修改类mod,完成度(12/12)
2、翻译其他类教程,完成度(2/5)
3、翻译原帖中比较有代表性的FAQ、以及给教程中的代码添加注释
在这篇教程中,我会解释怎么去创建最基本的mod。我很愿意帮助大家,教大家怎么去做mod,并且我也乐意接受制作mod的邀请。这个帖子的目的是集中所有的教程。
下面是一个教程清单,每个都有详细的介绍。记住无论这教程多么陈旧,你要从这教程中学到的是怎么去做mod,并且了解这游戏的方方面面。
MCP只能工作在对应的minecraft版本下。你不能用mcp修改更新或者更旧的mc版本。比如用mcp2.6,你就只能修改minecraft 的1.1_02版本。
(以下列表凡标注“已完成”,都可直接点击跳到相应楼层)
[size=150%]教程列表 (游戏修改类mod):
& &(已完成)
难度系数: 2/10
最后更新: 21/Feb/2011
MC版本: Alpha 1.2.6 - Beta 1.3_01
MCP版本: 2.7-2.9
作者: simo_415
& &(已完成)
难度系数: 1/10
最后更新: 12/Dec/2010
MC版本: Alpha 1.2.6 - Beta 1.3_01
MCP版本: 2.5 - 2.9
作者: simo_415
& &(已完成)
难度系数: 2/10
最后更新: 12/Dec/2010
MC版本: Alpha 1.2.6 - Beta 1.2_02
MCP版本: 2.5 - 2.7
作者: simo_415
& &(已完成)
难度系数: 2/10
最后更新: 14/Dec/2010
MC版本: 1.2.6
MCP版本: 2.5
作者: Marcus101RR
& &(已完成)
难度系数: 3/10
最后更新: 17/Dec/2010
MC版本: Alpha 1.2.6 - Beta 1.2_02
MCP版本: 2.5 - 2.7
作者: simo_415
& &(已完成)
难度系数: 6/10
最后更新: 17/Dec/2010
MC版本: Beta 1.2_02
MCP版本: 2.7
作者: simo_415
& &(已完成)
难度系数: 6/10
最后更新: 20/Jan/2011
MC版本: 1.1_02
MCP版本: 2.6
作者: OgreSean
难度系数: 5/10
最后更新: 17/Dec/2010
MC版本: Alpha 1.2.6 - Beta 1.2_02
MCP版本: 2.5 - 2.7
作者: simo_415
难度系数: 3/10
最后更新: 20/Feb/2011
MC版本: Beta 1.2_02
MCP版本: 2.7
作者: Gidding
难度系数: 5/10
最后更新: 20/Feb/2011
MC版本: Beta 1.2_02
MCP版本: 2.7
作者: Club559
难度系数: 3/10
最后更新: 18/Mar/2011
MC版本: Beta 1.3_01
MCP版本: 2.9
作者: blahthing
难度系数: 3/10
最后更新: 18/Mar/2011
MC版本: Beta 1.3_01
MCP版本: 2.9
作者: blahthing
[size=150%]教程列表 (其他):
&&(已完成)
难度系数: 4/10
最后更新: 9/Jan/2011
作者: Club559
& &(已完成)
难度系数: 5/10
最后更新: 9/Jan/2011
作者: Club559
难度系数: 8/10
最后更新: 28/Dec/2010
作者: simo_415
难度系数: 4/10
最后更新: 12/Jan/2011
作者: BHCS
难度系数: 1-3/10
作者: birjolaxew
[size=150%]要求
3. EditPlus/Notepad++/Eclipse/Netbeans (文字编辑器,或者其他IDE)
4. 最重要的,程序语言基础,最好学的是java,c++也不错
[size=150%]从这儿开始
1. 安装minecraft的程序包(MCP)
& &1.1 解压zip文件到一个目录,比如 C:\MCP
& &1.2 复制所有的.minecraft/bin 以及.minecraft/resources 到 C:\MCP\jars\
& &1.3 运行decompile.bat
2. 打开两个资源浏览器窗口, 一个是 C:\MCP\sources\minecraft\net\minecraft\src&&另一个是&&C:\MCP\
[size=150%]运行你的mod
要运行你的mod,你必须经过编译,调试,测试
1. 要编译的话,运行 'recompile.bat' ,这会创建所有的class文件。
2. 到C:\MCP\logs\minecraft_compile.log 并且查找 ^,如果没有找到,那么标明没有编译错误&&如果找到了,那么说明你代码写错了,改正错误并重新编译.
3. 如果没有错误,那么运行'test_game.bat'.
4. 这会运行游戏,并且加载了你制作的mod,这可以让你测试自己的.
如果你对自己的mod满意了,你就可以让你的代码整合进mc,也就是放进minecraft.jar了
[size=150%]使用Eclipse
你可以使用 Eclipse写你的mod, 调试你的代码, 编译你的代码并且运行 - 这回节约你大部分时间(译者注:写java有不用eclipse的么?)
[size=150%]整合你的代码
整合你的代码,这样就可以放进 minecraft.jar,让大家来使用了
1. 打开 C:\MCP\conf\client_conf.txt
2. 删除所有的内容
3. 加入你修改过的类,比如:BlockExample
Block
CraftingManager复制代码4. 运行'reobf.bat'
5. 所有的class文件,包括C:\MCP\final_out\minecraft\ 下面的,都是你mod的class文件。把这些class文件放到minecraft.jar文件夹下就能装载你的mod了。
贡献度 +65
好帖..好支持
主题帖子积分
本帖最后由 robinxb 于
15:01 编辑
在这篇教程中,我会介绍怎么在MC中创建新的方块,并且利用它来进行合成。
[size=150%]创建新方块
1. 你需要在src文件夹中建立一个新的文件,名字叫BlockExample.java.
2. 基本的构成如下:& & package net.minecraft.
& & import java.util.R
& & public class BlockExample extends Block
& & {
& && &&&public BlockExample(int i, int j)
& && &&&{
& && && && &super(i, j, Material.rock);
& && &&&}
& && &&&public int idDropped(int i, Random random)
& && &&&{
& && && && &return 0;
& && &&&}
& & }
复制代码3. 你现在需要把这个方块加入到MC中。现在打开Block.java文件。
4. 你应该在文件的顶部中看到整段的类声明,在他们最后添加这样一句话:public static final Block
复制代码5.在声明下方,你应该看到许多类的实例。那么,实例化你的方块类example = (new
BlockExample(92,
1)).setHardness(1.5F).setResistance(10F).setStepSound(soundStoneFootstep);
复制代码就像之前提到过的,创建一个新的“石头”方块
new BlockExample(92,1)创建了一个方块,第一个参数是方块的id(必须是不与其他重复的),第二个参数是方块的图像,在这个例子中,这个方块外形就和石头一样。
setHardness(1.5F)设置了这个方块的硬度,也就是要多久能摧毁它
setResistance(10F) 设置了方块对爆炸的抗性
setStepSound(soundStoneFootstep) 你走在上面的脚步声就是靠这个定义的
你现在成功地创建了一个方块。为了使用你创建的方块,可以使用单人命令,比如
&/give 92&.
往下继续阅读,如果你希望让这个方块制作其他物品
[size=150%]制作新的配方
1. 打开CraftingManager.java
2. 你应该立刻看到各种类构造函数,并且使用addRecipe这个函数进行添加配方的。
3. 移动滚轮到配方的最底部,并且添加一个新的上去:& & addRecipe(new ItemStack(Block.example,
1), new Object[] {&##&, &##&, Character.valueOf('#'), Block.dirt});
复制代码这样就会增加一个配方
new ItemStack(Block.example, 1) - 这个可以设置什么东西被生产,并且能设置生成的数量.
new Object[] {&##&, &##&, Character.valueOf('#'), Block.dirt} - 这个可以设置是用什么合成的.
这个配方是这样的:
会得到你的BlockExample这个方块
(375 Bytes, 下载次数: 231)
14:59 上传
鼓励鼓励!加油
主题帖子积分
本帖最后由
21:18 编辑
[size=150%]创建一个新的物品类型
1. 你需要创建一个名为ItemExample.java的文件,于src目录下。
2. 这个文件的基本构造方法如下:
package net.minecraft.
public class ItemExample extends Item
{
& & public ItemFood(int i)
& & {
& && &&&super(i);
& && &&&maxStackSize = 64;
& & }
& & public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
& & {
& & }
}复制代码
3. 你现在需要再MC中添加这个物品。打开Item.java文件
4. 在文件头部,你会看到一些实例化的类。在后面加一个新的:
public static Item example = (new ItemExample(95)).setIconIndex(42);复制代码
这样就会创建一个新的物品,id是256+95,物品图标是42号。这个例子中,应该看起来像个标志牌。当然,这个物品没有任何属性,你也不能利用它合成。但是你编译并且加载之后,这个物品会出现在MC中。
鼓励鼓励!加油
主题帖子积分
本帖最后由
21:17 编辑
[size=150%]给炉子加入其它可以锻造的物品,并生成其他指定物品
这篇文章的主要目的在于你可以用一个你创建的新的物品,来替代如煤炭等物品,在炉子中燃烧。你首先需要把这个物品添加到火炉的燃料中。如果你在之前已经制作好了这个方块,那么,你只需要从这儿开始,让这个方块燃烧起来。
步骤 1 - 找到炉子的定义文件
你必须先找到 &TileEntityFurnace.java& ,这个文件就在 MineCraft的Src文件夹下. 你会在文件夹的很后面找到这个,应该是最后一列。要想快速找到,按T.
步骤 2 - 找到并添加一个新的定义
你一定在&TileEntityFurnace.java&中找到了&&&private int getSmeltingResultItem(int i)& 这句话
. 这里你可以添加一个新的类型,作为你的可燃烧方块。自从方块可以从任何地方定义以来,你只需要确保这个物品已经被定义好了。我们会用之前的两个例子作为获得的物品。
游客,如果您要查看本帖隐藏内容请
鼓励鼓励!加油
主题帖子积分
本帖最后由
12:55 编辑
[size=150%]自定义一个方块类型
在这篇教程中,我会向大家介绍怎么自定义一个方块的行为,而不仅仅是制作一个简单的方块。这全部来自于对于Block.class文件里面的方法的重写。(译者注:终于看到java的overwrite了)。这能创建一个方块,当你点击或者激活的时候,能让这个方块激活,发光,爆炸等等。基本上你想得到的都能做出来。
[size=150%]部署一个房屋的例子
接下来我会提供一个例子,给我们创造的Example方块加入一个特性,我们点击它的时候,它会创建一个基本的房子。这为我们创建一个简单的房子提供了一个简单的方式。
这些代码需要添加到BlockExample class里面.
& &public void onBlockClicked(World world, int i, int j, int k, EntityPlayer entityplayer)
& &{
& && &// Basic Building
& && &int block = Block.wood.blockID;
& && &int size = 5;
& && &for (int i1 = 0; i1 & i1++)
& && &{
& && && &for (int j1 = 0; j1 & j1++)
& && && &{
& && && && &//Walls
& && && && &// i == ++ k == 0
& && && && &world.setBlockWithNotify(i+i1,j+j1,k,block);
& && && && &// i == ++ k == 4
& && && && &world.setBlockWithNotify(i+i1,j+j1,k+(size-1),block);
& && && && &// i == 0 k == ++
& && && && &world.setBlockWithNotify(i,j+j1,k+i1,block);
& && && && &// i == 4 k == ++
& && && && &world.setBlockWithNotify(i+(size-1),j+j1,k+i1,block);
& && && && &
& && && && &//Roof
& && && && &world.setBlockWithNotify(i+i1,j+(size-1),k+j1,block);
& && && && &//Floor
& && && && &world.setBlockWithNotify(i+i1,j,k+j1,block);
& && && &}
& && &}
& && &//Door
& && &world.setBlockWithNotify(i+1,j+2,k,0);
& && &world.setBlockWithNotify(i+1,j+1,k,0);
& && &//Windows
& && &int offset = size % 2 == 0 ? (size / 2) - 1 : (size / 2);
& && &world.setBlockWithNotify(i,j+offset,k+offset,Block.glass.blockID);
& && &world.setBlockWithNotify(i+offset,j+offset,k,Block.glass.blockID);
& && &world.setBlockWithNotify(i+(size-1),j+offset,k+offset,Block.glass.blockID);
& && &world.setBlockWithNotify(i+offset,j+offset,k+(size-1),Block.glass.blockID);
& && &//Utilities
& && &world.setBlockWithNotify(i+1,j+1,k+(size-2),Block.crate.blockID);
& && &world.setBlockWithNotify(i+(size-2),j+1,k+1,Block.workbench.blockID);
& && &world.setBlockWithNotify(i+(size-2),j+1,k+(size-2),Block.stoneOvenIdle.blockID);
& &}
复制代码[/hide]
这样会制造一个房子,就像图片中一样
h7EtW.png (210.95 KB, 下载次数: 35)
15:09 上传
就像之前那些例子一样,你能创建一个自定义的方块,通过重写Block.class中的方法,并添加一些精彩的功能,比如上面的创建一个房子
鼓励鼓励!加油
主题帖子积分
本帖最后由
12:56 编辑
[size=150%]怎么创建一个自定义NPC
In 在这篇教程中我会教大家怎么创建一个自定义NPC。我必须警告大家,这会比上面那些添加一个方块之类的困难得多。所以,在这个例子中,我会添加一个NPC,这个NPC是根据牛来修改的——疯狂的牛。这个怪物最初会对玩家友好,但是也会教你怎么让它变得对你具有威胁性。
首先,你必须创建一个&logic&类,这个逻辑是从Entity类继承的。你可以简单地添加任何东西到entity类中,以便激活自定义的行为。那么,让我们来创建一个entity类,叫做EntityExample.java,以便创建一个热爱和平的NPC。
package net.minecraft.
public class EntityExample extends EntityAnimals
{
& & public EntityExample(World world)
& & {
& && &&&super(world);
& && &&&texture = &/mob/example.png&;
& && &&&setSize(0.9F, 1.3F);
& & }
& & public void writeEntityToNBT(NBTTagCompound nbttagcompound)
& & {
& && &&&super.writeEntityToNBT(nbttagcompound);
& & }
& & public void readEntityFromNBT(NBTTagCompound nbttagcompound)
& & {
& && &&&super.readEntityFromNBT(nbttagcompound);
& & }
& & protected String getLivingSound()
& & {
& && &&&return &mob.example&;
& & }
& & protected String getHurtSound()
& & {
& && &&&return &mob.example&;
& & }
& & protected String getDeathSound()
& & {
& && &&&return &mob.example&;
& & }
& & protected float getSoundVolume()
& & {
& && &&&return 0.4F;
& & }
& & protected int getDropItemId()
& & {
& && &&&return 0;
& & }
}
复制代码上面的代码说明可能太少了,不过我会马上把细节说一遍。
getSoundVolume() 返回一个从0到1的数字,这是这个生物的音量大小。这可以转换为100进制,你只需要乘以100即可。(译者注,作者好细心)
getLivingSound, getHurtSound, getDeathSound 返回一个声音,这声音是上面这些事件发生的时候所发出的。(译者注,分别是“活着”,“受伤”,“死亡”)。这个声音能在&resources&这个文件夹下找到。在这个例子中,我仅仅是从其他怪物那儿拷贝了一份代码,这比我自己做要来得快。
(译者注:这儿还有句话,原文是read and write entity to NBT allows the creature to be saved and loaded from your save.实在不明白是啥意思,哪位好心哥们提个醒)
那么,下一步就是确保你有类中所有的声音和材质文件。把声音加到:
/jars/resources/newsound/mob/example.ogg
材质文件需要放到:
/temp/minecraft/mob/example.png
你可以把我的“疯狂牛”的材质文件拿去:
ErVJX.png (1.82 KB, 下载次数: 73)
15:10 上传
这个声音仅仅是牛的声音,不过我重命名为example.ogg.
这样,我们的entity类就完成了
下一步,你需要创建一Model类(模型类)。一个模型类基本上能提供MC创建怪物模型所需要的所有细节。所以这些都是根据你的example.png来的。因为我要做的就是个牛,所以我就根据ModelCow这个模型类来修改了。
package net.minecraft.
public class ModelExample extends ModelQuadraped
{
& & public ModelExample()
& & {
& && &&&super(12, 0.0F);
& && &&&head = new ModelRenderer(0, 0);
& && &&&head.addBox(-4F, -4F, -6F, 8, 8, 6, 0.0F);
& && &&&head.setPosition(0.0F, 4F, -8F);
& && &&&horn1 = new ModelRenderer(22, 0);
& && &&&horn1.addBox(-4F, -5F, -4F, 1, 3, 1, 0.0F);
& && &&&horn1.setPosition(0.0F, 3F, -7F);
& && &&&horn2 = new ModelRenderer(22, 0);
& && &&&horn2.addBox(4F, -5F, -4F, 1, 3, 1, 0.0F);
& && &&&horn2.setPosition(0.0F, 3F, -7F);
& && &&&udders = new ModelRenderer(52, 0);
& && &&&udders.addBox(-2F, -3F, 0.0F, 4, 6, 2, 0.0F);
& && &&&udders.setPosition(0.0F, 14F, 6F);
& && &&&udders.rotateAngleX = 1.570796F;
& && &&&body = new ModelRenderer(18, 4);
& && &&&body.addBox(-6F, -10F, -7F, 12, 18, 10, 0.0F);
& && &&&body.setPosition(0.0F, 5F, 2.0F);
& && &&&leg1.offsetX--;
& && &&&leg2.offsetX++;
& && &&&leg1.offsetZ += 0.0F;
& && &&&leg2.offsetZ += 0.0F;
& && &&&leg3.offsetX--;
& && &&&leg4.offsetX++;
& && &&&leg3.offsetZ--;
& && &&&leg4.offsetZ--;
& & }
& & public void render(float f, float f1, float f2, float f3, float f4, float f5)
& & {
& && &&&super.render(f, f1, f2, f3, f4, f5);
& && &&&horn1.render(f5);
& && &&&horn2.render(f5);
& && &&&udders.render(f5);
& & }
& & public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5)
& & {
& && &&&super.setRotationAngles(f, f1, f2, f3, f4, f5);
& && &&&horn1.rotateAngleY = head.rotateAngleY;
& && &&&horn1.rotateAngleX = head.rotateAngleX;
& && &&&horn2.rotateAngleY = head.rotateAngleY;
& && &&&horn2.rotateAngleX = head.rotateAngleX;
& & }
& & ModelR
& & ModelRenderer horn1;
& & ModelRenderer horn2;
}
复制代码就像上面这样,我们提到这个新生物的了位置和方向。要创建一个全新的生物,你需要和这些构造函数中的数字好好玩玩。
Aft在创建一个模型类之后,我们需要创建一个&给予&(Render)类。这个给予类会提供一个联接模型(Model)类和实体(Entity)之间的方法。那么,我们创建一个名字为RenderExample.java。这些代码十分露骨,基本上都在重写doRender 和func_171_a这两个方法。
package net.minecraft.
public class RenderExample extends RenderLiving
{
& & public RenderExample(ModelBase modelbase, float f)
& & {
& && &&&super(modelbase, f);
& & }
& & public void doRenderLiving(EntityLiving entityliving, double d, double d1, double d2,
& && && && &float f, float f1)
& & {
& && &&&super.doRenderLiving((EntityExample)entityliving, d, d1, d2, f, f1);
& & }
& & public void doRender(Entity entity, double d, double d1, double d2,
& && && && &float f, float f1)
& & {
& && &&&doRenderLiving((EntityExample)entity, d, d1, d2, f, f1);
& & }
}
复制代码这样我们就创建了一个基本的类,来定义我们的新NPC。下一步就是让MC知道它们,并且生成它们。要达到这个效果,你需要添加一些代码到RenderManager.java这个文件中,并且使用下面的这个构造函数:
entityRenderMap.put(EntityExample.class, new RenderExample(new ModelExample(),0.7F));
复制代码你还得添加它们到生物群落制造器列表(biome generator lists)中去,这能通过修改MobSpawnerBase.class来完成。可以使用如下的构造方法,来让实体添加到生物群落(biomeCreature)数组中去。
EntityExample.class
复制代码在这些都完成之后,你就能编译运行你的新NPC了。
如果你希望创建一个有侵略性的NPC,只需要稍稍修改一下实体类(Entity class)就可以。让它从EntityMobs继承,而非从EntityAnimals继承就好了。如果你希望让它在晚上刷新,而非在白天刷新,你还需要改变怪物刷新列表(MobSpawnerBase list)。
就像格子类一样,要自定义NPC的话,你所需要做的是重写EntityCreature 和EntityCreature 或者EntityMobs 这几个类,这就能让你的NPC做基本上所有的事情了。
秀一下做出来的NPC:(译者注:果然就是头牛)
TojNq.png (233.23 KB, 下载次数: 31)
15:10 上传
鼓励鼓励!加油
主题帖子积分
本帖最后由
12:56 编辑
[size=150%]高级 NPC 教程: 控制NPC行为
最后更新 February 16, 2011
这个教程会通过对几种方法的探索,来让mod制作者们控制NPC的行为。这个教程目前只针对Beta1.2_02,并且java代码是在MCP2.7下使用的。现在,这个教程只详细讲述两种方法来控制NPC,不过我会在将来更新更多方法。(译者注:如果作者更新了新的方法而我没发现,还望大家提醒我一下)
方法 1: 重写EntityCreature的 getBlockPathWeight() 方法(译者注:JAVA里面函数就是方法,方法就是函数)
当一个NPC空闲时,他会随机的到处走。NPC的这一行为是通过随机地选择十个附件的个子,并检查这个个子的路径重量(Block Path Weights ,BPW)。如果某个格子有很高的路径重量,那么就会选择这个格子作为移动的目的地。
getBlockPathWeight() 函数会调用这10个格子并返回一个BPW。这个函数会影响到NPC空闲时的所有动作,但不会包括攻击指令。
protected float getBlockPathWeight(int i, int j, int k)
& & {
&&
& && &return 0.0F;
& & }
复制代码这个EntityCreature 默认的函数不会让NPC对某个特别的格子感兴趣。
动物
protected float getBlockPathWeight(int i, int j, int k)
& & {
& && &&&if(worldObj.getBlockId(i, j - 1, k) == Block.grass.blockID)
& && &&&{
& && && && &return 10F;
& && &&&} else
& && &&&{
& && && && &return worldObj.getLightBrightness(i, j, k) - 0.5F;
& && &&&}
& & }
复制代码动物会对草皮地感兴趣。另外,动物会对更明亮的地方感兴趣。
怪物
protected float getBlockPathWeight(int i, int j, int k)
& & {
& && &&&
return 0.5F - worldObj.getLightBrightness(i, j, k);
& & }
复制代码怪物会朝更黑暗的地方走。
通过修改或者重写getBlockPathWeight 方法, 你能改变NPC更热衷于哪个方向的格子。
比如,我创建了一个山羊的NPC。我希望山羊NPC能朝更高的地方走,那么我就使用getBlockPathWeight 方法:
protected float getBlockPathWeight(int i, int j, int k)
& & {
& && &&&return (float)
& & }
复制代码一个简单的getBlockPathWeight 函数就能让山羊NPC随机地向更高的格子移动。山羊就会稍微倾向于攀爬山坡或者高山等等……
现在如果我想让山羊NPC对周遭的环境有感应,你可以像这样用getBlockPathWeight 方法:
protected float getBlockPathWeight(int i, int j, int k)
& & {
& && &&&if(health & 5)
& && && &&&return MathHelper.floor_double(getDistance(i, j, k));
& && &&&else if(!worldObj.isDaytime())
& && && &&&return -(MathHelper.floor_double(getDistance(i, j, k)));
& && &&&else
& && && &&&return (float)
& & }
复制代码这个函数让山羊的移动因为环境而变得不同。
当他们生命值比较低的时候,他们会在同一时间内移动更长的距离。
在晚上,他们会在同一时间内移动很短的距离。
在白天,当他们有比较高的生命值时,他们会更亢奋。
作为最后一个例子,我还想让山羊在游泳的时候不会对格子有特殊的喜好。我会把这个函数改成这样:
protected float getBlockPathWeight(int i, int j, int k)
& & {
& && &
if(inWater)
& && && & return 0.0F;
& && & else{
& && && & if(health
& 5)
& && && && & return MathHelper.floor_double(getDistance(i, j,
k));
& && && & else if(!worldObj.isDaytime())
& && && && & return
-(MathHelper.floor_double(getDistance(i, j, k)));
& && && & else
& && && &
& & return (float)
& && & }
& & }
复制代码
getBlockPathWeight 方法会让山羊在水里没有什么特别的表现。
重写或改写这个方法,会给你提供一个简单的方式来让NPC的行为变得可控。你可以做一个特别的NPC,来对其他NPC产生兴趣,甚至是对玩家。你可以你还可以让NPC移动到特定的坐标。为什么不让NPC的移动取决于他们所站的方块上呢?无限种可能,等待你去实现!
PS: 这是仅仅是一个小建议,让你明白getBPW方法在NPC生成之后不会返回一个负数。EntityLiving 的 canSpawnHere() 方法会调用getBPW方法,并且当BPW小于零的时候,会阻止NPC的生成。
方法 2: 设置EntityCreature的 playerToAttack 变量
每个NPC都是从EntityCreature继承的,并且每个实例都有一个playerToAttack变量。当这个变量被设置为任何实例时,这个NPC会设置它的下一个目标至被设置的实例。通过改变这个变量,你可以让NPC朝着几乎所有实例移动。
无论如何,这里有几个附加的规则,在你尝试这么做的时候,你所必须考虑到的:
1. 当playerToAttack这个变量为空时,NPC会常规地调用findPlayerToAttack()这个方法,直到playerToAttack不为空为止。
2. 一旦NPC设置了playerToAttack变量,默认地,这个变量只会在被设置的目标死亡之后才会改变。
3. 在距离为16以内,NPC只会朝着这个目标走
4. 如果与目标之间的路没有被完全堵死,NPC也只会朝着这个目标走。
5. 当3或者4条被违背,那么NPC会闲置,并且会闲逛直到两个条件都满足。
6. NPC从EntityMobs类继承的话,会有一些附加代码,来使他们当靠近目标时对目标造成上海。并且在一些附加的情况下改变他们的目标。
*EntityCreature这个类中 findPlayerToAttack() 方法永远会返回空.
那么,怎么改变这个变量呢?你几乎有无限种可能。你可以简单地设置或情况这个变量,就像其他变量一样。你也可以在任何地方任何时间,通过重写方法来改变这个变量。最显而易见的重写应该是重写findPlayerToAttack() 方法。
让我们回头看看方法一中提到的改变山羊移动方式的方法。下面是重写findPlayerToAttack() 方法。如果我想让山羊靠近其他附近的山羊的话:
protected Entity findPlayerToAttack()
& & {
& && &&&double d1 = -1D;
&&
& && &EntitySheep sheep =
& && &&&
& && &&&//check each entity that
is in the world
& && &&&for(int i = 0; i &
worldObj.loadedEntityList.size(); i++)
& && &&&{
& && && && &Entity
entity1 = (Entity)worldObj.loadedEntityList.get(i);
& && && && &
& && && &
&&//if entity is not a sheep, check next entity on entityList
& && && && &
if(!(entity1 instanceof EntitySheep))
& && && && &{
& && && && && &
& && && && &}
& && && && &
& && && && &//if sheep, check how
far it is from goat.
& && && && &//The closest &seen& sheep within a distance
of 16 will be identified by the sheep variable.
& && && && &double d2 =
entity1.getDistance(posX, posY, posZ);
& && && && &if((d2 & 16) &&
(d1 == -1D || d2 & d1) &&
((EntitySheep)entity1).canEntityBeSeen(this))
& && && && &{
& && && && &&&
&&d1 = d2;
& && && && && & sheep = (EntitySheep)entity1;
& && && && &
}
& && &&&}
& && &&& //returns the closest sheep to the
goat
& & }
复制代码
该方法会让山羊对周围的绵羊进行常规的检查(当playerToAttack没有被设置时)。如果他们找到了附近的绵羊,他们会设置附近的绵羊作为自己的目标,除非绵羊死亡,否则会一直跟随下去。
对只能修改你自己的NPC的行动不满意?好,这里有更多的资料。
自从所有的NPC的playerToAttack 变量被定义为public类型后,你可以在任何时间任何地方改变任何生物的这个变量。
比如,可以让绵羊更随山羊,而不是让山羊更随绵羊。or example, instead of having my Mountain Goats follow sheep, lets have the sheep follow my goats.
要这么做,我不再需要修改findPlayerToAttack()这个方法。我会通过重写onUpdate()方法来实现 :
public void onUpdate()
& & {
& && &&&super.onUpdate();
& && &&&
& &
& & //check each entity that is in the world
& && &&&for(int i = 0; i &
worldObj.loadedEntityList.size(); i++)
& && &&&{
& && && && &Entity
entity1 = (Entity)worldObj.loadedEntityList.get(i);
& && && && &
& && && &
&&//if entity is not a sheep, check next entity on entityList
& && && && &
if(!(entity1 instanceof EntitySheep))
& && && && &{
& && && && && &
& && && && &}
& && && && &
& && && && &//if nearby &seen&
sheep's playerToAttack is null, set it to this goat
& && && && &double d2 =
entity1.getDistance(posX, posY, posZ);
& && && && &EntitySheep sheep =
(EntitySheep)entity1;
& && && && &if((d2 & 16) &&
sheep.canEntityBeSeen(this) && sheep.playerToAttack == null)
& && &&&
& & {
& && && && && & sheep.playerToAttack =
& && && && &}
& && &
&&}
& & }
复制代码
这个函数会让山羊检查附近的绵羊。所有山羊附近的空闲的绵羊会更随山羊。(译者注:绵羊,山羊,头大,希望看官能分清,山羊是我们做的NPC,绵羊是原版中在地上跑的羊。)
最后,还有一个使用playerToAttack 的小技巧。除了设置playerToAttack变量为已经存在的生物外,还可以设置这个变量指向所有新生成的实体。如果你从来不调用worldObj中的entityJoinedWorld()方法,那么它会完全地不可见且被冻结。如果实体从未进入这个世界,那么它的OnUpdate方法永远不会被调用。如果你是一个创造者,你可以用这个方法实现命令的多样化,来使得你的NPC听从你的指令。
比如,假设我想让山羊连续不断地再A和B点之间巡逻。假设我已经设置了地点的坐标,那么我就可以重写我的山羊的onUpdate方法,像这样:
public void onUpdate()
& & {
& && &&&super.onUpdate();
& && &&&
& &
& & //if Goat is near location A, order it to move to location B
& && &&&
if(this.getDistance(locAX, locAY, locAZ) & 4){
& && && &&&//create new
Entity at location B for Goat to move toward
& && && &&&playerToAttack =
(Entity) new EntityItem(worldObj);
& && && &
playerToAttack.setPosition(locBX, locBY, locBZ);
& && &&&}
& && &&&//if
Goat is near location B or has no playerToAttack set, order it to move to
location A
& && &&&else if(this.getDistance(locBX, locBY, locBZ) & 4 ||
playerToAttack == null){
& && && &&&//create new Entity at location A for
Goat to move toward
& && && &&&playerToAttack = (Entity) new
EntityItem(worldObj);
& && && &&&playerToAttack.setPosition(locAX, locAY,
locAZ);
& && &&&}
& & }
复制代码
该onUpdate() 方法会导致山羊在A和B点之间来回走动。考虑到playerToAttack 变量,A和B点之间的距离必须小于16,并且没有庞大的障碍阻挡在A和B之间。如果我添加更多的地点,我可以让我的山羊在更远的距离间巡逻。
最后,playerToAttack变量是非常多功能的。我提供了你了解这个变量的例子,我也希望你能更好地使用这个变量,创造更多花样。享受吧!
贡献度 +35
鼓励鼓励!加油
主题帖子积分
本帖最后由
12:56 编辑
[size=150%]怎么控制世界的生成
在这篇教程中我会讲述地图的生成方式,并且教大家怎么创建一个属于你自己的世界生成方式。我的意思是通过世界生成方式,当一个新世界杯创造或者一个新的chunk(译者注:也许是想说未探索的chunk吧)生成时,地形会依照这个生成方式来创建。这个教程会教你怎么自定义这个过程。我制作了一些地图生成mod,并且我的想说的是这非常有趣。以下是几个例子:
v0lql.JPG (94.34 KB, 下载次数: 25)
15:17 上传
有苍天大树的森林
YVTj8.JPG (81.14 KB, 下载次数: 24)
15:17 上传
I1sZm.JPG (87.11 KB, 下载次数: 25)
15:17 上传
Y7T29.JPG (72.31 KB, 下载次数: 27)
15:17 上传
如你所见,这是一个富有多样性的生成。在这个教程中我会教大家怎么去创建一个地图生成器,并且随机地放置TNT在地图中。(仅仅为了娱乐)
你首先需要创建一个WorldGen类,这个类的惯例名字是WorldGen[XXX],所以在这个例子中我会创建一个类名叫WorldGenExample. 这个类需要一个构造函数以及生成方法。如下:
package net.minecraft.
import java.util.R
public class WorldGenExample extends WorldGenerator
{
& & public WorldGenExample()
& & {
& & }
& & public boolean generate(World world, Random random, int i, int j, int k)
& & {
& & }
}
复制代码
在这个生成方法中我们希望放入一些富有逻辑性的东西。i,j,k变量是MC中方块的坐标,在生成过程中,不是每个方块都调用这个方法,在一个chunk中只有一个方块会调用这个方法。所以,记住,每当该生成方法被调用(通常上来说),那么只有一次会被一个chunk调用。
要创建随机生成的TNT,我需要加入这个代码到生产方法中:
// Gives this a 1 in 10 chance of generating
if (random.nextInt(10) == 0)
{
& &// Loops 64 times, this could create up to 64 TNT
& &for (int z = 0; z & 64; z++)
& &{
& && &int i1 = i + random.nextInt(8) - random.nextInt(8);
& && &int j1 = j + random.nextInt(8) - random.nextInt(8);
& && &int k1 = k + random.nextInt(8) - random.nextInt(8);
& && &// Checks that there is nothing in the current location and there is grass beneath.
& && &if(world.getBlockId(i1, j1, k1) == 0 && world.getBlockId(i1, j1 - 1, k1) == Block.grass.blockID && Block.tnt.canPlaceBlockAt(world, i1, j1, k1))
& && &{
& && && &world.setBlockAndMetadata(i1, j1, k1, Block.tnt.blockID, random.nextInt(4));
& && &}
& &}
}& &
复制代码
在完成逻辑设计后你需要让MC知道它,这样才能生成你自定义的地形。要这样做你需要修改ChunkProviderGenerate, 尤其是 populate 方法。你需要在这个方法中加入你的类,所以在它的列表中加入你做的类是很重要的。如果你放在了方法的最上面,那么就比放在最下面来说更有可能被生成——这供你自己选择。我放在了较为底部的位置,特别是WorldGenLiquids 调用之后.
(new WorldGenExample()).generate(worldObj, rand, k + rand.nextInt(16), rand.nextInt(112) + 16, l + rand.nextInt(16));
复制代码
最后,当通过编译和生成一个世界后,你应该可以看到TNT刷新在了地表。你也许希望设置其他的细节,不过我在此就不多说了。
lVipI.png (213.22 KB, 下载次数: 23)
15:29 上传
鼓励鼓励!加油
主题帖子积分
本帖最后由
12:59 编辑
[size=200%]利用Modloader制作一个物品或者食物
在这篇教程中我会教大家怎么利用Modloader制作一个具有医疗效果的物品。
我还会向大家展示怎么利用modloader添加一个具有古怪的名字和不一样的材质的物品。
我用Soup这个变量,不过你可以随便改为其他名字,比如Steak或者Cabbage。(译者注:改为WTF比较合适,因为这东西实在是太诡异了)
首先你需要写一些调用Modloader的代码。
package net.minecraft.
public class mod_SoupItem extends BaseMod
public mod_SoupItem()
& &{
& & ModLoader.AddName(soupItem, &Soup&);& &
& &} 复制代码
这就是最基本的使用Modloader文件了。
把这个文件保存为mod_SoupItem.java.
ModLoader.AddName 这个方法的用处你应该很清楚了。
下一步你需要为你的物品添加一些实例的变量。
public static final Item soupI
& & static
& & {
& && &soupItem = (new ItemSoup(4001, 11)).setIconIndex(ModLoader.addOverride(&/gui/items.png&, &/giddingtextures/Soup.png&)).setItemName(&soupItem&);
& & }复制代码
现在,通过这些变量的加入,你可以加载进MC了。
在4001后面的11代表治疗的多少。
11的话可以治疗5颗半心。
新消息:ModLoader.addOverride 方法让你可以改变你的材质,通过gui/items.png或者其他的东西。我的地图叫 giddingtextures 并且这个图片是一个png图片,名为Soup.png。
你的图片需要是16X16大小,并且别用windows自带的画图工具。用GIMP或者其他东西。如果你用画图工具,你会使得你的物品后面有一个白色的背景。 (译者注:其实之所以要用png图片是应为这个格式支持透明色)
下一步你需要加入一个&Version&方法,返回一个字符串。这可以帮助ModLoader 判断你的mod是哪个版本。像这样加就可以:
public String Version()
& & {
& && &return &1&;
& & }
& &复制代码
把这个方法加入你的类文件中。(在已存在的代码后面)
现在你想使你的Soup在游戏中能合成出来,那么就在你的类中加入这个方法:
public void AddRecipes(CraftingManager craftingmanager)
& &{
& && &craftingmanager.addRecipe(new ItemStack(soupItem), new Object[]{
& && && && X &, &###&, Character.valueOf('#'), Item.stick, Character.valueOf('X'), Item.porkCooked
& && &});
& &}复制代码
这会使得你合成Soup变得可能。
可以像这样合成
1.jpg (2.74 KB, 下载次数: 29)
15:53 上传
这看起来像一个碗装着一碗肉汤。(译者注:杀了我吧,这是肉棒!)
--------------------------------------------------------------------------------------
现在我们准备让这个物品被使用,那我们创建一个ItemSoup.java文件.
这个文件使你用右键吃“肉”变得可能。
package net.minecraft.
public class ItemSoup extends Item复制代码
注意:这个文件是继承的Item而不是Basemod。
你需要添加一个实例化的变量,像这样:
private int healA复制代码
然后给这个类添加一个构造方法:
public ItemSoup (int i, int j)
& & {
& && &&&super(i);
& && &&&healAmount =
& && &&&maxStackSize = 1;
& & }复制代码
初始化这个类的时候,就确定了你只能一次喝一碗肉汤。
你也可以改大一点,但是不要超过64!
现在我们准备重写onItemRightClick 方法,使你可以吃掉这个物品。你需要在你的类中添加这些代码:
public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
& & {
& && &&&itemstack.stackSize--;
& && &&&entityplayer.heal(healAmount);
& && &&&
& & }
复制代码
这是最后一段代码,注意代码之间的层级关系。
现在保存代码、编译,等等。
最后,喝你的汤,吃肉棒去吧!
更新完加精华,鼓励
主题帖子积分
本帖最后由
12:59 编辑
[size=200%]用Modloader制作你自己的世界!现在你的创造一个世界的机会来了!
这个小教程会教你怎么制作一个世界生成器。
首先,创建一个基本的类:
package net.minecraft.
import java.util.R
public class mod_FlatWorld_WoodDeposits extends BaseMod
{
& &public mod_FlatWorld_WoodDeposits()
& &{
& &}
& &public String Version()
& &{
& && &return &Hello :3&;
& &}
}复制代码
下一步:制作一个木头盒子。
80是高度,这会创建一个16×16的格子。
16是一个chunk的宽度。
128是一个chunk的高度,不过如果创建一个16高度的,会看起来更像一个盒子。
package net.minecraft.
import java.util.R
public class mod_FlatWorld_WoodDeposits extends BaseMod
{
& &public mod_FlatWorld_WoodDeposits()
& &{
& &}
& &public String Version()
& &{
& && &return &Hello :3&;
& &}
& &public void GenerateSurface(World world, Random random, int i, int j)
& &{
& && &//Start with a random check
& && &if(random.nextInt(30) == 0)
& && &{
& && && &//The depth: a block with a height of 16 above ground
& && && &for(int depth = 64; depth & 80; depth++)
& && && &{
& && && && &//Generate for all rows: 16 x position (As big as a chunk)
& && && && &for(int row = 0; row & 16; row++)
& && && && &{
& && && && && &//Generate for all columns: 16 y position (As big as a chunk)
& && && && && &for(int column = 0; column & 16; column++)
& && && && && &{
& && && && && && &//Create wood block
& && && && && && &world.setBlock(i+row, depth, j+column, Block.wood.blockID);
& && && && && &}
& && && && &}& && && && && && &
& && && &}
& && &}
& &}
}复制代码
第三步:挖空中心。
我们想在盒子中间放入空气,这样看起来就更像一个盒子了。
package net.minecraft.
import java.util.R
public class mod_FlatWorld_WoodDeposits extends BaseMod
{
& &public mod_FlatWorld_WoodDeposits()
& &{
& &}
& &public String Version()
& &{
& && &return &Hello :3&;
& &}
& &public void GenerateSurface(World world, Random random, int i, int j)
& &{
& && &//Start with a random check
& && &if(random.nextInt(30) == 0)
& && &{
& && && &//The depth: a block with a height of 16 above ground
& && && &for(int depth = 64; depth & 80; depth++)
& && && &{
& && && && &//Generate for all rows: 16 x position (As big as a chunk)
& && && && &for(int row = 0; row & 16; row++)
& && && && &{
& && && && && &//Generate for all columns: 16 y position (As big as a chunk)
& && && && && &for(int column = 0; column & 16; column++)
& && && && && &{
& && && && && && &//Create wood block
& && && && && && &world.setBlock(i+row, depth, j+column, Block.wood.blockID);
& && && && && &}
& && && && &}& && && && && && &
& && && &}
& && && &//Hollow out the inside! ^.^
& && && &for(int depth = 65; depth & 79; depth++)
& && && &{
& && && && &//Generate for all rows: 15 x position (1 smaller than a chunk)
& && && && &for(int row = 1; row & 15; row++)
& && && && &{
& && && && && &//Generate for all columns: 15 y position (1 smaller than a chunk)
& && && && && &for(int column = 1; column & 15; column++)
& && && && && &{
& && && && && && &//Destroy the insides!
& && && && && && &world.setBlock(i+row, depth, j+column, 0);
& && && && && &}
& && && && &}& && && && && && &
& && && &}
& && &}
& &}
}复制代码
最后一步:添加一些火炬
现在我们只是简简单单地制作了一个盒子,让我们来添一些火炬吧。
package net.minecraft.
import java.util.R
public class mod_FlatWorld_WoodDeposits extends BaseMod
{
& &public mod_FlatWorld_WoodDeposits()
& &{
& &}
& &public String Version()
& &{
& && &return &Hello :3&;
& &}
& &public void GenerateSurface(World world, Random random, int i, int j)
& &{
& && &//Start with a random check
& && &if(random.nextInt(30) == 0)
& && &{
& && && &//The depth: a block with a height of 16 above ground
& && && &for(int depth = 64; depth & 80; depth++)
& && && &{
& && && && &//Generate for all rows: 16 x position (As big as a chunk)
& && && && &for(int row = 0; row & 16; row++)
& && && && &{
& && && && && &//Generate for all columns: 16 y position (As big as a chunk)
& && && && && &for(int column = 0; column & 16; column++)
& && && && && &{
& && && && && && &//Create wood block
& && && && && && &world.setBlock(i+row, depth, j+column, Block.wood.blockID);
& && && && && &}
& && && && &}& && && && && && &
& && && &}
& && && &//Hollow out the inside! ^.^
& && && &for(int depth = 65; depth & 79; depth++)
& && && &{
& && && && &//Generate for all rows: 14 x position (1 smaller than a chunk)
& && && && &for(int row = 1; row & 15; row++)
& && && && &{
& && && && && &//Generate for all columns: 14 y position (1 smaller than a chunk)
& && && && && &for(int column = 1; column & 15; column++)
& && && && && &{
& && && && && && &//Destroy the insides!
& && && && && && &world.setBlock(i+row, depth, j+column, 0);
& && && && && &}
& && && && &}& && && && && && &
& && && &}
& && && &//Now, let's add some torches.
& && && &world.setBlock(i+1, 65, j+1, Block.torchWood.blockID);
& && && &world.setBlock(i+14, 65, j+14, Block.torchWood.blockID);
& && && &world.setBlock(i+14, 65, j+1, Block.torchWood.blockID);
& && && &world.setBlock(i+1, 65, j+14, Block.torchWood.blockID);
& && &}
& &}
}复制代码
现在我们在地平面上创建了一个巨大的盒子,并且在里面还有火炬!
惯例支持..
主题帖子积分
本帖最后由
13:00 编辑
为武器创建一个物理攻击效果(modloader)
--------------------------------------------------
好,你已经创建了一个mod_**** 文件
现在在mod_****中定义你的mod .
例如: Public static final ItemDagger = (new ItemDagger(100)). *Extra Features of your Item go here*
----------------------------------------------
如果这个物品是 ItemDagger (译者注:挖掘性物品,例如铲子),那么:
package net.minecraft.
public class ItemDagger extends Item
& & public ItemDagger(int i)
& & {
& && && &super(i);
复制代码
-------------------------------
在 public ItemDagger(int i) 中,为什么有个 (int i)?
因为借口会被定义为 i ,令super(i); 方法能工作。
------------------------------
现在加入你的特性:
maxStackSize = 1; MAX STACK SIZE
maxDamage = 3124; HOW DURABLE IT IS, IN THIS CASE 3124 USES
field_22047_d = 20; THE AMOUNT OF DAMAGE, 20 HEALTH OR 10 HEARTS.
----------------------------------
现在我们想让这个物品造成伤害。
所以在下面我们还会加上:
& & public void hitEntity(ItemStack itemstack, EntityLiving entityliving)
& & {
& && &&&itemstack.damageItem(1);
& & }
& & public void hitBlock(ItemStack itemstack, int i, int j, int k, int l)
& & {
& && &&&itemstack.damageItem(2);
& & }复制代码
这个代码的意思是当你用这个物品击打一个实体的时候,会造成1伤害。当摧毁一个格子的时候,会对自己造成2的伤害。你可以自己定义这些。
---------------------------------
现在我们需要检查一下方法&&field_22047_d;
在你已经添加的代码后面加入这些:
& & public int getDamageVsEntity(Entity entity)
& & {
& && &&&return field_22047_d;
& & }
& & public boolean isFull3D()
& & {
& && &&&
& & }复制代码
最后以这个作为结尾:
& & private int field_22047_d;
}
复制代码
完成了!编译后运行你的mod吧!
如果你出现了错误,那么用这个构造函数:
package net.minecraft.
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: /jad.html
// Decompiler options: packimports(3) braces deadcode
public class ItemDagger extends Item
{
& & public ItemDagger(int i)
& & {
& && &&&super(i);
& && &&&maxStackSize = 1;
& && &&&maxDamage = 500;
& && &&&field_22047_d = 5;
& & }
& & public void hitEntity(ItemStack itemstack, EntityLiving entityliving)
& & {
& && &&&itemstack.damageItem(1);
& & }
& & public void hitBlock(ItemStack itemstack, int i, int j, int k, int l)
& & {
& && &&&itemstack.damageItem(2);
& & }
& & public int getDamageVsEntity(Entity entity)
& & {
& && &&&return field_22047_d;
& & }
& & public boolean isFull3D()
& & {
& && &&&
& & }
& && &&&
& & private int field_22047_d;
}
复制代码
惯例支持..
主题帖子积分
本帖最后由
13:00 编辑
制作一个铲子或者锄头(Modloader)
现在你可能想要制作一个工具,这是非常cool的!
每个人都希望有新的工具!那么这就是一个利用Modloader制作工具的教材!
-----------------------------------------------------------
这个例子中,你的新工具叫NEWPICKAXE
在你的 mod_**** 文件中定义你的mod
用这个作为例子
public static final Item NewP
then add below
static
}
NewPickaxe = (newItemNewPickaxe(Item ID, EnumToolMaterial.GOLD)).OTHER
{复制代码
现在,这个mod文件会说需要一个变量: ItemNewPickaxe.
你也会看到EnumToolMaterial.GOLD, 这个是你鹤嘴锄的材料。如果你想要个钻石的,那么就用EnumToolMaterial.EMERALD。
-------------------------------------------------
创造一个NEWPICKAXE
一切都从这些代码开始:
package.net.minecraft.src
public class ItemNewPickaxe extends ItemTool
}
&&protected ItemNewPickaxe(int i, EnumToolMaterial enumtoolmaterial)
& & {
& && &&&super(i, 2, enumtoolmaterial, blocksEffectiveAgainst);
& && &&&maxDamage = 10;
& && &&&maxStackSize = 1;
& & }复制代码
这个物品能用10次,并且只能重叠一个。
现在我们知道super这个方法的用法了,就像maxStackSize 和 maxDamage 一样,你都明白了吧.
不过enumtoolmaterial是什么?这个涵盖了工具原料的代码。
-----------------------------------------------------------------
现在,我们需要在这个铲子挖方块时给方块添加一个效果。
&&public boolean canHarvestBlock(Block block)
& & {
& && &&&if(block == Block.obsidian)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() == 3;
& && &&&}
& && &&&if(block == Block.blockDiamond || block == Block.oreDiamond)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() &= 2;
& && &&&}
& && &&&if(block == Block.blockGold || block == Block.oreGold)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() &= 2;
& && &&&}
& && &&&if(block == Block.blockSteel || block == Block.oreIron)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() &= 1;
& && &&&}
& && &&&if(block == Block.blockLapis || block == Block.oreLapis)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() &= 1;
& && &&&}
& && &&&if(block == Block.oreRedstone || block == Block.oreRedstoneGlowing)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() &= 2;
& && &&&}
& && &&&if(block.blockMaterial == Material.rock)
& && &&&{
& && && && &
& && &&&}
& && &&&return block.blockMaterial == Material.
& & }
& & private static Block blocksEffectiveAgainst[];
& & static
& & {
& && &&&blocksEffectiveAgainst = (new Block[] {
& && && && &Block.cobblestone, Block.stairDouble, Block.stairSingle, Block.stone, Block.sandStone, Block.cobblestoneMossy, Block.oreIron, Block.blockSteel, Block.oreCoal, Block.blockGold,
& && && && &Block.oreGold, Block.oreDiamond, Block.blockDiamond, Block.ice, Block.bloodStone, Block.oreLapis, Block.blockLapis
& && &&&});
& & }
}复制代码
现在这个文件可以说是完成了。你可以随便修改。
如果你希望制作一个完全的原料,你必须创建一个你自己的枚举(译者注:似乎作者没明确说明怎么创建?)。不过这取决于你,你可以用默认的文件来修改伤害。
还是不行?那就用这个:
package net.minecraft.
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: /jad.html
// Decompiler options: packimports(3) braces deadcode
public class ItemNewPickaxe extends ItemTool
{
& & protected ItemNewPickaxe(int i, EnumToolMaterial enumtoolmaterial)
& & {
& && &&&super(i, 2, enumtoolmaterial, blocksEffectiveAgainst);
& && &&&maxDamage = 10;
& && &&&maxStackSize = 1;
& & }
& & public boolean canHarvestBlock(Block block)
& & {
& && &&&if(block == Block.obsidian)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() == 3;
& && &&&}
& && &&&if(block == Block.blockDiamond || block == Block.oreDiamond)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() &= 2;
& && &&&}
& && &&&if(block == Block.blockGold || block == Block.oreGold)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() &= 2;
& && &&&}
& && &&&if(block == Block.blockSteel || block == Block.oreIron)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() &= 1;
& && &&&}
& && &&&if(block == Block.blockLapis || block == Block.oreLapis)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() &= 1;
& && &&&}
& && &&&if(block == Block.oreRedstone || block == Block.oreRedstoneGlowing)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() &= 2;
& && &&&}
& && &&&if(block.blockMaterial == Material.rock)
& && &&&{
& && && && &
& && &&&}
& && &&&return block.blockMaterial == Material.
& & }
& & private static Block blocksEffectiveAgainst[];
& & static
& & {
& && &&&blocksEffectiveAgainst = (new Block[] {
& && && && &Block.cobblestone, Block.stairDouble, Block.stairSingle, Block.stone, Block.sandStone, Block.cobblestoneMossy, Block.oreIron, Block.blockSteel, Block.oreCoal, Block.blockGold,
& && && && &Block.oreGold, Block.oreDiamond, Block.blockDiamond, Block.ice, Block.bloodStone, Block.oreLapis, Block.blockLapis
& && &&&});
& & }
}
[size=150%]额外的教程
哈哈,我做了一个自己的鹤嘴锄,挖起石头来比金子做的还快。太有用了!
等等!我不能挖黑曜石或者钻石!
别慌,这个教程包含了一个额外的教程,来教你怎么用你创建的鹤嘴锄挖所有的方块。
& & public boolean canHarvestBlock(Block block)
& & {
& && &&&if(block == Block.obsidian)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() == 1;
& && &&&}
& && &&&if(block == Block.blockDiamond || block == Block.oreDiamond)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() &= 1;
& && &&&}
& && &&&if(block == Block.blockGold || block == Block.oreGold)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() &= 1;
& && &&&}
& && &&&if(block == Block.blockSteel || block == Block.oreIron)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() &= 1;
& && &&&}
& && &&&if(block == Block.blockLapis || block == Block.oreLapis)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() &= 1;
& && &&&}
& && &&&if(block == Block.oreRedstone || block == Block.oreRedstoneGlowing)
& && &&&{
& && && && &return toolMaterial.getHarvestLevel() &= 1;
& && &&&}
& && &&&if(block.blockMaterial == Material.rock)
& && &&&{
& && && && &
& && &&&}
& && &&&return block.blockMaterial == Material.
& & }
复制代码
现在看看这个改进后的代码,只是修改了HarvestLevel为1,表示这个东西能挖掘所有的东西。太棒了!可以试着改成0,会更有意思。(译者注,谁尝试过请告诉我 (∩_∩) )
现在你的鹤嘴锄可以挖遍天下啦!你也可以自定义它们~
惯例支持..
主题帖子积分
本帖最后由 robinxb 于
23:00 编辑
[size=200%]让你的mod和Modloader兼容
在这儿我会教大家怎么让你做的mod和modloader兼容。如果你在使用MCP,那么你已经陷入了万劫不复的悲剧当中。你会注意到,其他教程需要修改主要的MC类文件。不过如果你用Modloader你就不用这么做了!
游客,如果您要查看本帖隐藏内容请
主题帖子积分
本帖最后由 robinxb 于
23:20 编辑
[size=200%]教你怎么用MCP做一个简单的怪物
untitled.jpg (32.33 KB, 下载次数: 51)
23:07 上传
游客,如果您要查看本帖隐藏内容请
主题帖子积分
主题帖子积分
主题帖子积分
主题帖子积分
主题帖子积分
主题帖子积分
主题帖子积分
游戏狂人, 积分 1832, 距离下一级还需 168 积分
游戏狂人, 积分 1832, 距离下一级还需 168 积分
第一页站位!!!!
主题帖子积分
超级玩家, 积分 816, 距离下一级还需 184 积分
超级玩家, 积分 816, 距离下一级还需 184 积分
插楼。。。。。。。。。。。。。
主题帖子积分
游戏精英, 积分 7448, 距离下一级还需 1552 积分
游戏精英, 积分 7448, 距离下一级还需 1552 积分
贡献度1330
主题帖子积分
你爱,或者不爱我,我就在这里,不离不弃。
贡献度4405
太强了...感谢高手..对我相当有帮助..
主题帖子积分
游戏狂人, 积分 1149, 距离下一级还需 851 积分
游戏狂人, 积分 1149, 距离下一级还需 851 积分
我的地下室没了,喂?我啊?我在下水道里~~
主题帖子积分
打完这场仗,我就回老家结婚
贡献度6054
金元129860
主题帖子积分
高级玩家, 积分 503, 距离下一级还需 97 积分
高级玩家, 积分 503, 距离下一级还需 97 积分
支持,看中文比看英文舒服多了。。
主题帖子积分
游戏狂人, 积分 1833, 距离下一级还需 167 积分
游戏狂人, 积分 1833, 距离下一级还需 167 积分
牛人!我昨天看到有人想翻译这个东西,进去看了一下就懒得动手了……太长了
主题帖子积分
鸭梨好大。沉得好快。不知道对多少人有用。。
主题帖子积分
高级玩家, 积分 281, 距离下一级还需 319 积分
高级玩家, 积分 281, 距离下一级还需 319 积分
好东西啊挖挖
3DM死忠专属勋章
不思議の國
おかしな国へようこそ!
终身荣誉勋章
由管理员直接授予,历史上对3DM论坛做出过巨大贡献,会员最高荣誉
中秋活动勋章
蒹葭汉化组
蒹葭汉化组
Powered by

我要回帖

更多关于 我的世界自定义npcmod 的文章

 

随机推荐