我的世界游击队mod铁道游击队的作者是谁谁

发布时间: 21:25:09
来源:巴士手游
  你是否厌倦了村庄mod的烦躁,讨厌那帮无所事事、天天问你要资源的二货?是否厌倦了大鼻子村民天天学猪叫?是否觉得村民们智商太低?没关系,下面巴士小编就给大家带来我的世界虚拟人生mod下载,并分享虚拟人生mod详细介绍。
我的世界虚拟人生mod下载地址:
  虚拟人生mod基本特点:
  1、村民们不在大声叫喊,也没有令人厌恶的大鼻子了。这个mod取代他们原有的样子做成了男性或者女性的人类。
  2、村民可以互动。你可以与他们正常交易,也能和他们交谈,告诉他们一个笑话,送礼物等互动活动。建立友好关系后,最后还能结婚。
  3、你可以与任何村民或玩家结婚生小孩,孩子们可以做家务,比如农业、渔业、采矿、伐木、狩猎等。随着时间的推移,儿童会成长为大人,也可以结婚生子。
  虚拟人生mod详细介绍:
  1、作者只做了一个API,将允许玩家自行制作的MODS与MCA之间互动。MCA包含超过2000条对话,能翻译成20种语言。
  2、有超过200个不同的皮肤的男性和女性村民。你可以很容易地添加自己的皮肤以及对话的模式。
  3、增加了三个新职业:守卫、农夫、矿工。
  4、你的配偶可以为你做饭,但是你必须提供材料。村民的情绪和性格决定他们是否容易相处,并且他们的情绪和心情会改变他们的一整天,一到晚上,村民就会传送到家里睡觉。
  5、村民可以雇来做一段时间的工作,你甚至可以雇佣农民帮你种田或者当你的保镖。
  6、玩家可以制作的王冠成为君主来免费雇佣村民。作为君王的继承人,你死后可以找他要回遗产。
  7、玩家可以重命名村民的姓名标签,还可以设置一个村民集聚点,他们将在那个地方过夜。守卫可以定制为哨兵并且能攻击特定的目标。
  8、你和其他村民结婚生下的孩子可以做家务,并且还能获得经验解锁额外的能力,让他们做家务更快更好。
  开始游戏基本教程:
  由于这个mod是直接改变原版村庄,所以我们必须去寻找村庄。村庄的生成几率和原版一直,不像村庄mod一样到处生成。
  安装好这个mod后,新建世界,进入世界后会进行选择:
  1、性别:男或女。
  2、名字:系统会自动使用这个名字,会影响村民对你的称呼。
  3、设置:
  熟睡标签隐藏:决定了村民在睡觉时是否在头上标识。
  子女自动成长:同意的话,孩子就会自动长成大人,否则就会永远处于小孩子的状态,在游戏中我们可以选择让他继续成长。
  村民情绪显示:一些表情设置可以帮你更好的识别村民的心情。
  你的性向:这个就直接决定了以后是跟男的结婚还是女的结婚,之后如果因为配对生不出小孩,可以在神父那里领养孩子。
  以上就是我的世界虚拟人生mod下载以及虚拟人生mod详细介绍。更多我的世界的攻略,尽在电玩巴士手游频道。|  
|  
|  
|  
|  
只需一步,快速开始
查看: 238589|回复: 626
【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了。
<p id="rate_9579" onmouseover="showTip(this)" tip="支持!!&金元 + 1
" class="mtn mbn">
<p id="rate_3442" onmouseover="showTip(this)" tip="我很赞同&金元 + 1
" class="mtn mbn">
<p id="rate_5309" onmouseover="showTip(this)" tip="原创内容&贡献度 + 15
" class="mtn mbn">
<p id="rate_6184" onmouseover="showTip(this)" tip="支持&金元 + 1
" class="mtn mbn">
<p id="rate_0354" onmouseover="showTip(this)" tip="好帖..好支持&金元 + 1
" class="mtn mbn">
主题帖子积分
本帖最后由 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这个方块
本帖子中包含更多资源
才可以下载或查看,没有帐号?
<p id="rate_5806" onmouseover="showTip(this)" tip="鼓励鼓励!加油&贡献度 + 4
" class="mtn mbn">
主题帖子积分
本帖最后由
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中。
<p id="rate_5806" onmouseover="showTip(this)" tip="鼓励鼓励!加油&贡献度 + 1
" class="mtn mbn">
主题帖子积分
本帖最后由
21:17 编辑
[size=150%]给炉子加入其它可以锻造的物品,并生成其他指定物品
这篇文章的主要目的在于你可以用一个你创建的新的物品,来替代如煤炭等物品,在炉子中燃烧。你首先需要把这个物品添加到火炉的燃料中。如果你在之前已经制作好了这个方块,那么,你只需要从这儿开始,让这个方块燃烧起来。
步骤 1 - 找到炉子的定义文件
你必须先找到 &TileEntityFurnace.java& ,这个文件就在 MineCraft的Src文件夹下. 你会在文件夹的很后面找到这个,应该是最后一列。要想快速找到,按T.
步骤 2 - 找到并添加一个新的定义
你一定在&TileEntityFurnace.java&中找到了&&&private int getSmeltingResultItem(int i)& 这句话
. 这里你可以添加一个新的类型,作为你的可燃烧方块。自从方块可以从任何地方定义以来,你只需要确保这个物品已经被定义好了。我们会用之前的两个例子作为获得的物品。
游客,如果您要查看本帖隐藏内容请
本帖子中包含更多资源
才可以下载或查看,没有帐号?
<p id="rate_5806" onmouseover="showTip(this)" tip="鼓励鼓励!加油&贡献度 + 5
" class="mtn mbn">
主题帖子积分
本帖最后由
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]
这样会制造一个房子,就像图片中一样
就像之前那些例子一样,你能创建一个自定义的方块,通过重写Block.class中的方法,并添加一些精彩的功能,比如上面的创建一个房子
本帖子中包含更多资源
才可以下载或查看,没有帐号?
<p id="rate_5806" onmouseover="showTip(this)" tip="鼓励鼓励!加油&贡献度 + 5
" class="mtn mbn">
主题帖子积分
本帖最后由
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
你可以把我的“疯狂牛”的材质文件拿去:
这个声音仅仅是牛的声音,不过我重命名为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:(译者注:果然就是头牛)
本帖子中包含更多资源
才可以下载或查看,没有帐号?
<p id="rate_5806" onmouseover="showTip(this)" tip="鼓励鼓励!加油&金元 + 30
贡献度 + 5
" class="mtn mbn">
主题帖子积分
本帖最后由
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变量是非常多功能的。我提供了你了解这个变量的例子,我也希望你能更好地使用这个变量,创造更多花样。享受吧!
<p id="rate_5806" onmouseover="showTip(this)" tip="鼓励鼓励!加油&贡献度 + 5
" class="mtn mbn">
<p id="rate_1399" onmouseover="showTip(this)" tip="辛苦辛苦&金元 + 60
贡献度 + 30
" class="mtn mbn">
主题帖子积分
本帖最后由
12:56 编辑
[size=150%]怎么控制世界的生成
在这篇教程中我会讲述地图的生成方式,并且教大家怎么创建一个属于你自己的世界生成方式。我的意思是通过世界生成方式,当一个新世界杯创造或者一个新的chunk(译者注:也许是想说未探索的chunk吧)生成时,地形会依照这个生成方式来创建。这个教程会教你怎么自定义这个过程。我制作了一些地图生成mod,并且我的想说的是这非常有趣。以下是几个例子:
有苍天大树的森林
如你所见,这是一个富有多样性的生成。在这个教程中我会教大家怎么去创建一个地图生成器,并且随机地放置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刷新在了地表。你也许希望设置其他的细节,不过我在此就不多说了。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
<p id="rate_5806" onmouseover="showTip(this)" tip="鼓励鼓励!加油&贡献度 + 5
" class="mtn mbn">
主题帖子积分
本帖最后由
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变得可能。
可以像这样合成
这看起来像一个碗装着一碗肉汤。(译者注:杀了我吧,这是肉棒!)
--------------------------------------------------------------------------------------
现在我们准备让这个物品被使用,那我们创建一个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);
& && &&&
& & }
复制代码
这是最后一段代码,注意代码之间的层级关系。
现在保存代码、编译,等等。
最后,喝你的汤,吃肉棒去吧!
本帖子中包含更多资源
才可以下载或查看,没有帐号?
<p id="rate_5806" onmouseover="showTip(this)" tip="更新完加精华,鼓励&贡献度 + 5
" class="mtn mbn">
主题帖子积分
本帖最后由
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);
& && &}
& &}
}复制代码
现在我们在地平面上创建了一个巨大的盒子,并且在里面还有火炬!
<p id="rate_5806" onmouseover="showTip(this)" tip="惯例支持..&金元 + 10
" class="mtn mbn">
主题帖子积分
本帖最后由
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;
}
复制代码
<p id="rate_5806" onmouseover="showTip(this)" tip="惯例支持..&金元 + 10
贡献度 + 5
" class="mtn mbn">
主题帖子积分
本帖最后由
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,会更有意思。(译者注,谁尝试过请告诉我 (∩_∩) )
现在你的鹤嘴锄可以挖遍天下啦!你也可以自定义它们~
<p id="rate_5806" onmouseover="showTip(this)" tip="惯例支持..&金元 + 10
" class="mtn mbn">
主题帖子积分
本帖最后由 robinxb 于
23:00 编辑
[size=200%]让你的mod和Modloader兼容
在这儿我会教大家怎么让你做的mod和modloader兼容。如果你在使用MCP,那么你已经陷入了万劫不复的悲剧当中。你会注意到,其他教程需要修改主要的MC类文件。不过如果你用Modloader你就不用这么做了!
游客,如果您要查看本帖隐藏内容请
<p id="rate_5806" onmouseover="showTip(this)" tip="支持..&金元 + 5
" class="mtn mbn">
主题帖子积分
本帖最后由 robinxb 于
23:20 编辑
[size=200%]教你怎么用MCP做一个简单的怪物
游客,如果您要查看本帖隐藏内容请
本帖子中包含更多资源
才可以下载或查看,没有帐号?
<p id="rate_5806" onmouseover="showTip(this)" tip="支持..&金元 + 5
贡献度 + 2
" class="mtn mbn">
主题帖子积分
主题帖子积分
主题帖子积分
主题帖子积分
主题帖子积分
主题帖子积分
主题帖子积分
游戏狂人, 积分 1901, 距离下一级还需 99 积分
游戏狂人, 积分 1901, 距离下一级还需 99 积分
第一页站位!!!!
主题帖子积分
超级玩家, 积分 867, 距离下一级还需 133 积分
超级玩家, 积分 867, 距离下一级还需 133 积分
插楼。。。。。。。。。。。。。
主题帖子积分
游戏精英, 积分 7448, 距离下一级还需 1552 积分
游戏精英, 积分 7448, 距离下一级还需 1552 积分
贡献度1330
主题帖子积分
你爱,或者不爱我,我就在这里,不离不弃。
贡献度4405
太强了...感谢高手..对我相当有帮助..
主题帖子积分
游戏狂人, 积分 1194, 距离下一级还需 806 积分
游戏狂人, 积分 1194, 距离下一级还需 806 积分
我的地下室没了,喂?我啊?我在下水道里~~
主题帖子积分
打完这场仗,我就回老家结婚
贡献度6054
金元129880
主题帖子积分
高级玩家, 积分 530, 距离下一级还需 70 积分
高级玩家, 积分 530, 距离下一级还需 70 积分
支持,看中文比看英文舒服多了。。
主题帖子积分
游戏狂人, 积分 1841, 距离下一级还需 159 积分
游戏狂人, 积分 1841, 距离下一级还需 159 积分
牛人!我昨天看到有人想翻译这个东西,进去看了一下就懒得动手了……太长了
主题帖子积分
鸭梨好大。沉得好快。不知道对多少人有用。。
主题帖子积分
高级玩家, 积分 281, 距离下一级还需 319 积分
高级玩家, 积分 281, 距离下一级还需 319 积分
好东西啊挖挖
3DM论坛死忠专属勋章。
不思議の國
歷史記憶(暂不发放)
终身荣誉勋章
由管理员直接授予,历史上对3DM论坛做出过巨大贡献,会员最高荣誉
获取条件:节日活动专属勋章,用户参加活动获奖后可得。
蒹葭汉化组
蒹葭汉化组
Powered by

我要回帖

更多关于 铁道游击队作者 的文章

 

随机推荐