我的世界怎么弄草方块修改方块硬度

>我的世界做出方块扩大和人变小效果
请输入中文英文下划线分割线
教程速查:&& 开服速查:&&
热门搜索:&
我的世界做出方块扩大和人变小效果
人已读 && 来源: 互联网
&& 作者: 佚名 &&&发布时间:
我的世界方块扩大怎么做?今天小编给大家带来一份我的世界做出方块扩大和人变小效果,希望大家能够喜欢。
就是这个方块,他从坐标x0 y0 z0一直延伸到x2 y2 z2(疑似每16为一格) 那么这个方块“的大小”就是2*2(为什么要用双引号?后面会说) 那么我们将这个粉色羊毛(这个文件的名字是粉色羊毛,就是它记录着这个方块)放置在地上
可以看到,轮廓暴露了它,实际上还是1*1的大小,只不过显示是2*2的大小 那么我们看看这个轮廓的上面一格方块
可以看到,显示不出来 于是我们可以很愉快的站在“上面”
那么作者是怎么做出来可以站在上面的效果呢? 没错,用屏障
我们用屏障拼出了一个2*2的方块,这就是方块扩大的效果 我们再多做几个
&& 可以看到,这就是方块扩大,你站在上面自然就看起来缩小了 删掉这个材质后 && 就是图中这个效果 那么,视频当中还有“竖起来的半砖”是怎么做出来的呢? 很简单,还是修改坐标
推荐理由 热门小说斗罗大陆皮肤合集,内有史莱克七怪皮肤,过了这村没这店,赶紧点进来吧~
周排行 月排行 总排行
地图存档下载
常用资料 物品合成表 &&&&&&&& 生物图鉴 &&&&&& 资源替换教程 &&&&&&&&|  
|  
|  
|  
|  
只需一步,快速开始
查看: 208823|回复: 612
【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 上传
游客,如果您要查看本帖隐藏内容请
主题帖子积分
主题帖子积分
主题帖子积分
主题帖子积分
主题帖子积分
主题帖子积分
主题帖子积分
游戏狂人, 积分 1726, 距离下一级还需 274 积分
游戏狂人, 积分 1726, 距离下一级还需 274 积分
第一页站位!!!!
主题帖子积分
超级玩家, 积分 801, 距离下一级还需 199 积分
超级玩家, 积分 801, 距离下一级还需 199 积分
插楼。。。。。。。。。。。。。
主题帖子积分
游戏精英, 积分 7448, 距离下一级还需 1552 积分
游戏精英, 积分 7448, 距离下一级还需 1552 积分
贡献度1330
主题帖子积分
你爱,或者不爱我,我就在这里,不离不弃。
贡献度4405
太强了...感谢高手..对我相当有帮助..
主题帖子积分
游戏狂人, 积分 1141, 距离下一级还需 859 积分
游戏狂人, 积分 1141, 距离下一级还需 859 积分
我的地下室没了,喂?我啊?我在下水道里~~
主题帖子积分
打完这场仗,我就回老家结婚
贡献度6054
金元129830
主题帖子积分
高级玩家, 积分 500, 距离下一级还需 100 积分
高级玩家, 积分 500, 距离下一级还需 100 积分
支持,看中文比看英文舒服多了。。
主题帖子积分
游戏狂人, 积分 1832, 距离下一级还需 168 积分
游戏狂人, 积分 1832, 距离下一级还需 168 积分
牛人!我昨天看到有人想翻译这个东西,进去看了一下就懒得动手了……太长了
主题帖子积分
鸭梨好大。沉得好快。不知道对多少人有用。。
主题帖子积分
高级玩家, 积分 281, 距离下一级还需 319 积分
高级玩家, 积分 281, 距离下一级还需 319 积分
好东西啊挖挖
3DM死忠专属勋章
不思議の國
おかしな国へようこそ!
终身荣誉勋章
由管理员直接授予,历史上对3DM论坛做出过巨大贡献,会员最高荣誉
中秋活动勋章
蒹葭汉化组
蒹葭汉化组
Powered by

我要回帖

更多关于 我的世界草方块怎么做 的文章

 

随机推荐