【重发】【教程】Custom Stuff 2

Custom Stuff 2是一个API性质的Mod,可以实现往里面添加方块,物品,改变图形界面(GUI,用户图形接口),在地图上生成方块等功能。【想往游戏里添加物品或方块的吧友一定可以试下这个mod】

楼主 腐蚀品恐惧者  发布于 2013-07-24 20:12:00 +0800 CST  
注意下面的中/、\和=都是全角字,若想简单复制粘贴请先用替换工具换成半角的/、\和=
无聊原创教程——Custom Stuff 2
其实这个mod自配的Document(下载地址:见楼中楼)已经把他的用法讲的很详细了,所以这里我只是抛砖引玉地简化讲下这个mod玩法。
这里我不细讲javascript,因为一般玩家可能不需要用到javascript(虽然我后面举例可能要用到比较难的javascript),只是往里面添加方块的话只需要注意javascript的“区分大小写”的特性就可以了。
这个Mod可以实现往里面添加方块,物品,改变图形界面(GUI,用户图形接口),在地图上生成方块等功能,可惜不能生成生物,应该会在以后的版本里改进(这个想法在官网上已有很多人提出。)
首先先安装CustomStuff2,将这个mod下载(见楼中楼)之后放到.Minecraft\mods\下面就好了。
启动minecraft,这个mod就会在.minecraft\config文件夹下面生成一个叫CustomStuff的文件夹,打开,就会看到里面有个mods文件夹,在这里我们可以添加自制的方块和物品。

楼主 腐蚀品恐惧者  发布于 2013-07-24 20:14:00 +0800 CST  
【例1】例如我们可以尝试做一个蘑菇阶梯:
①先在这个文件夹里面新建一个叫mushroomStairs的文件夹,打开,然后在里面新建一个文本文档,起名为mod.js,用记事本打开(当然也可以用Notepad++等打开),往里面输入如下代码:(注意大小写!)

config.addBlockIdProperty(“StairId”,2000);
mod.addBlock(“mushroomStair.js”,”stairs”);

解释下上面这段话的功效,第一句config.addBlockIdProperty(“StairId”,2000);是实现了往你的自制方块或物品的cfg文件中添加登记一个名为“StairId”的“方块id”属性的功能,它的初始值为2000,cfg文件保存在config文件下面,众所周知玩家是可以通过修改mod的cfg文件来更改mod的功能的,这个也不例外。玩家可以修改你的自制方块或物品的cfg文件中的属性来改变它的功能。前面的“StairId”是对应的键,后面的2000是这个方块的初始键值,以后玩家可以通过修改cfg文件里的StairId键值来修改你的蘑菇阶梯的id。
第二句mod.addBlock(“mushroomStair.js”,”stairs”);是关键,它实现了将你的方块载入游戏的功能,前面的mushroomStair.js是方块的脚本,后面的stairs是方块的模型,这里的模型是stairs,即“台阶”。除台阶以外还有其他的模型,可以在ducument的Block.htm里面找到。
②保存并退出这个mod.js,在该文件夹下面新建一个叫Blocks的文件夹,里面新建一个叫mushroomStair.js(注意大小写)的文件,打开,往里面输入以下代码:

name= "mushroomStair";
id = config.getBlockId("StairId" );
displayName[0]= "蘑菇阶梯";
material="cloth";
stepSound="cloth";
addToCreative[0]= true;
creativeTab="buildingBlocks";
hardness[0]= 1.0;
tileTransparent[0]= true;
opacity= 255;

textureFileXN[0]= "/mushroom_skin_red.png";
textureFileXP[0]= "/mushroom_skin_red.png";
textureFileYN[0]= "/mushroom_skin_red.png";
textureFileYP[0]= "/mushroom_skin_red.png";
textureFileZN[0]= "/mushroom_skin_red.png";
textureFileZP[0]= "/mushroom_skin_red.png";

依旧是逐句解释:第一行name表示这个mod的英文名称,id = config.getBlockId("StairId" );表示从cfg文件里面获取id信息并加载,displayName[0]= "蘑菇阶梯";表示这个物品的工具提示信息,material="cloth";表示这个方块的行为类似与羊毛,stepSound="cloth";表示玩家在上面行走时发出的声音和玩家踩在羊毛上面的声音一样,addToCreative[0] = true;表示这个方块能在创造模式的物品栏里面找到,creativeTab ="buildingBlocks";表示玩家可以在物品栏的建筑材料一栏里面找到,hardness[0] = 1.0;表示这个东西的硬度是1.0,如果你不想这个方块被打碎的话可以将硬度设为-1.0,就像基岩一样,tileTransparent[0]= true;表示这个方块和其他方块连接的时候不消除边界,这个是防止别的方块放到你的方块上面的时候你的方块会因为消除边界而被透视了(这个是传说中的人工CJB√),opacity= 255;表示这个方块是的阿尔法值是255,此时光线完全不能透过这个方块。当设为0时光线完全可以透过这个方块。后面的一堆textureFile**[0]= "/mushroom_skin_red.png";表示贴上去的材质文件,当后面的路径前面有/的时候表示调用的是游戏材质包里面的文件,否则就是调用这个mushroomStairs文件夹里面的Textures文件夹的文件。
③保存,然后打开游戏,只要你一步一步按照要求做了,你就会在游戏里面见到你添加的方块/物品。
至此关于这个方块的讲解已经结束了,至于该方块的效果在这个帖子里面(泥垢):http://tieba.baidu.com/p/2465658063。

楼主 腐蚀品恐惧者  发布于 2013-07-24 20:15:00 +0800 CST  
【例2】我们做一碗饭怎么样√,包含生饭和熟饭√:
①类似的我们在mods文件夹下面新建一个文件夹叫rice,在里面新建mod.js,在里面输入如下的脚本:


config.addItemIdProperty("cookedRiceId" ,2015);
mod.addItem("cookedRice.js","food");

config.addItemIdProperty("rawRiceId" ,2016);
mod.addItem("rawRice.js","food");

mod.addSmeltingRecipe(config.getItemId("cookedRiceId"),config.getItemId("rawRiceId"));
mod.addRecipe(config.getItemId("rawRiceId")+"1",1,2,296,281);


这里加的就不是BlockId了而是ItemId,表示是物品的id,而mod.addBlock也变成了mod.addItem,表示往游戏里面添加的不是方块而是物品,然后添加物品的方式是”food”,表示添加的是食物,能添加的还有其他种类,可以在document的Items.htm里面找到。mod.addSmeltingRecipe(config.getItemId("cookedRiceId"),config.getItemId("rawRiceId"));这句则是实现了往游戏里面添加一个熔炉的合成公式,将生饭烤成熟饭的功能,同理mod.addRecipe(config.getItemId("rawRiceId")+" 1",1,2,296,281);实现了小麦+碗=生饭的功能。
②在rice文件夹下面新建一个文件夹叫textures,打开,在里面再新建一个文件夹叫items,往里面添加一个png文件(至于图画就自己画了√),名字rice.png。
③在rice文件夹下面新建一个文件夹叫items,里面新建两个文件分别为rawRice.js和cookedRice.js,分别输入以下内容:
在rawRice.js输入:


name= "RawRice";
id = config.getItemId("rawRiceId" );

displayName= "生米";
textureFile="rice.png";

addToCreative= true;
creativeTab= "food";
full3d= true;
maxStack=1;
containerItem= "281";
leaveContainerItem= true;

onEaten="itemstack.setValues(281,1,0);"

alwaysEdible=false;
hunger=1;
saturation=1;

在cookedRice.js输入:


name="CookedRice";
id = config.getItemId("cookedRiceId" );

displayName= "熟饭";
textureFile="rice.png";

addToCreative= true;
creativeTab= "food";
full3d= true;
maxStack=1;
hasEffect=true;
containerItem= "281";
leaveContainerItem= true;

onEaten="itemstack.setValues(281,1,0);"

alwaysEdible=false;
hunger=3;
saturation=1;


继续解释逐句的含义:name、id、displayName、addToCreative、creativeTab的功用和方块里面的相同,full3d=true;表示该物品是像镐子、剑等工具或武器一样拿在手上的,maxStack=1;表示最大堆叠数为1,containerItem = "281";leaveContainerItem= true;表示装着它的物品是碗,并且合成之后留下碗,onEaten= "itemstack.setValues(281,1,0);"表示吃完之后留下碗。这句话用到了比较高级的javascript,如果不加上这句话的话吃完就连碗一起吃掉了。alwaysEdible=false;表示饥饿值慢的时候不能吃,hunger=1;表示增加一点饥饿度(熟饭是加3点饥饿度),saturation=1;表示吃完之后有一段时间是不掉饥饿的。而hasEffect=true;表示“熟饭”是有附魔效果的。
④写完之后保存,在游戏能看到如图(看下一楼)的效果。


楼主 腐蚀品恐惧者  发布于 2013-07-24 20:16:00 +0800 CST  

生米与熟饭的效果

楼主 腐蚀品恐惧者  发布于 2013-07-24 20:19:00 +0800 CST  
看来是wikia那个连接被度受吞了rz

注意上面的/、\、=都是【全角字】要先换成【半角】才能用呀~

楼主 腐蚀品恐惧者  发布于 2013-07-24 20:21:00 +0800 CST  
或者我详细说明一下mob和方块的物品掉落吧:

关于mob的物品掉落:
在对应的mod.js文件里面加上这一句脚本:mod.addMobDrop("Blaze",266,0,1,0.2);
这句话就是表示我打死一只Blaze(烈焰人)有0.2的机会掉落1个id为266,数据值为0的物品(266:0的物品是金锭),这里的生物名称,id,数据值,还有几率可以换成别的嗯。生物名称也可以是id。
当然你用mod产生的生物就要通过其他脚本查找到mod产生的生物名称或id。

关于方块的物品掉落:
在对应方块的脚本上加上一句drop[0]="260:0 1";,表示我敲烂这块方块的时候会掉落1颗苹果(即260:0)。

@755252949

楼主 腐蚀品恐惧者  发布于 2013-07-24 20:56:00 +0800 CST  
顺便讲这个mod纠错的方法吧
这个应该是相对于任何mod都通用的。

首先forge每载入一次mod都会产生日志文件,即ForgeModLoader-client-0.log,并将上一次的日志文件向后移一位,例如由ForgeModLoader-client-0变成ForgeModLoader-client-1,由ForgeModLoader-client-1变成ForgeModLoader-client-2。

用记事本【最好用NotePad++】打开日志文件,我们可以找到这样的格式:
2013-07-24 19:26:57 [信息] [ForgeModLoader] Forge Mod Loader version 5.2.2.684 for Minecraft 1.5.2 loading

前面的是日期,第一个方括号内的是提示类型,第二个方括号是发出提示的mod,最后是提示信息。如果出错的话,或说就是出现了java里面的“例外(Exception)”,日志就会以[严重](或[SEVERE])提示,后面显示例外类型,以及出现例外的线程。一般可以根据这点来纠错。

楼主 腐蚀品恐惧者  发布于 2013-07-24 22:20:00 +0800 CST  
既然通宵睡不着我就更更这里吧,以下列举几个常见错误:①报错中显示“找不到文件,磁盘,卷”:检查引用文件名是否与被引用文件名一致。例如textureFileXN[0]="X.png",而实际文件名为x.png的时候,就会报错,因为X和x的ASCII码不一样。②报错显示“xxx.js中含有非法字符……”:有两种可能,一是你的脚本有语法错误,可以根据报错的字符找到错误的位点,二是minecraft的字库,或java的字库不支持这个字,一般情况下是由于编码错误造成的,例如ANSI编码编成了UTF-8,就有可能报错,一般显示illegal character "?"(0xFFFD)。③minecraft打开时就显示minecraft has crashed,里面报错/报例外是NullPointerException,抑或是自制方块没出现,日志显示这个错误/例外,说明你的某些参数引用了错误的值,最常见的是把stepSound="rock";写成stepSound="stone";了。④物品没有出现,后台显示数列下标越界,这时检查你的初始值或cfg文件中设置的值是否太大。一般不过4096为宜。

楼主 腐蚀品恐惧者  发布于 2013-07-28 06:23:00 +0800 CST  
接下来教的是地图生成,既然要地图生成就弄最邪恶的基岩♂空洞,而且要伪装成真基岩的样子,让玩家到虚空去旅行一顿√
我就懒得单独解释了,一切都用注释(//注释)来解释
首先先创建一个新文件夹叫做BedRockHole,里面按照一般自定义物品的做法写mod.js,
里面写上
config.addBlockIdProperty("BRHId",2051);
mod.addBlock("BRH.js",normal);

config.addBooleanProperty("generateBedRockHole", false,"此项为True将产生基岩空洞!");//这个是产生基岩空洞的开关,即在cfg文件里面添加一项generateBedRockHole,初始值为false,并添上后面“此项为True将产生基岩空洞!”的注释提示
if(config.getBoolean("generateBedRockHole")){//判断基岩空洞是否打开
mod.addWorldGen("WGBRH.js","ore");//如果基岩空洞开关打开的话,通过addWorldGen方法读取WGBRH.js,并按ore(矿石)的方式生成。
}

在文件夹的Blocks\BRH.js里面写上如下代码

name = "BedRockHole";
id = config.getBlockId( "BRHId" );

displayName[0] = "基岩";

material = "fire";
addToCreative[0] = true;

creativeTab = "buildingBlocks";

hardness[0] = -1;

tileTransparent[0] = true;
transparent[0] = true;

opacity = 255;
hasCollision[0] = false;

semiTransparent = true;

textureFileXN[0] = "/bedrock.png";
textureFileXP[0] = "/bedrock.png";
textureFileYN[0] = "/bedrock.png";
textureFileYP[0] = "/bedrock.png";
textureFileZN[0] = "/bedrock.png";
textureFileZP[0] = "/bedrock.png";

这段非常简单我就不作注释了,功能就是产生基岩空洞方块。

再在BedRockHole文件夹下面新建一个文件叫worldGeneration,在里面添加一个BRHWG.js,里面写上

blockId = config.getBlockId( "BRHId" );
blockMeta = 0;//这两行指定要地图生成的方块

minHeight = 0;
maxHeight = 1;//这两行指定生成方块可能出现的高度,如这里是高度为0或1
numberOfBlocks = 5;//这里指定一次最大的生成数目

allowedBiomes = "all";//这里指定这种方块可能出现的生态域
overworldReplacedBlocks = "7";//这里指定会被替换的方块是7号方块,即基岩

generateInEnd = true;
generateInOverworld = true;
generateInNether = true;//这三项分别指定是否在末界,主世界,下界进行地图生成

generationsPerChunk = 1.0;//这里指每个区块生成这种方块的概率,注意这里的“概率”可以大于1,大于1的时候先生成整数部分个数的生成数目,再把小数部分当几率算再进行一次地图生成,例如2.5就是先生成2个最大生成数目的该方块,再以50%的几率进行第三次生成。

这样就可以让你的服务器人数减少了【哪不对】

有时间我就把最后的自定义GUI更了吧=。-

楼主 腐蚀品恐惧者  发布于 2013-07-30 00:53:00 +0800 CST  
@flashtt不好意思我想我不会再把GUI那部分更了的。。。我现在找不到写这个教程的意义所在了。。。

楼主 腐蚀品恐惧者  发布于 2013-08-14 04:52:00 +0800 CST  
我觉得作者超神了,居然在文档里面说了有living和player这两个域可是真正用就说域未定义√

楼主 腐蚀品恐惧者  发布于 2013-08-17 01:54:00 +0800 CST  
来一些自己设计的可以供大家使用的脚本。
_NORISAMA_GENERAL:百度网盘地址/share/link?shareid=28603544&uk=1477336565
这里面暂时包含2个构造器,用来储存方块信息。
new ID(方块id);——返回一个id为已知id,数据值为0的方块信息
new BLOCK(方块id,方块数据值);——返回一个id为已知id,数据值为指定数据值的方块信息

_NORISAMA_TREE_1:百度网盘地址/share/link?shareid=47547330&uk=1477336565
这里面只包含一个生成树木的函数,用法请打开脚本看注释。

_NORISAMA_TREE_2:百度网盘地址/share/link?shareid=56128425&uk=1477336565
这里面只包含一个生成树木的函数,用法请打开脚本看注释。


若要使用请在此楼回复,请不要随意变更脚本里面的内容。否则一是对设计者的不尊重,而是导致错误的根源。

楼主 腐蚀品恐惧者  发布于 2013-08-21 22:39:00 +0800 CST  

楼主:腐蚀品恐惧者

字数:8079

发表时间:2013-07-25 04:12:00 +0800 CST

更新时间:2016-03-08 01:10:12 +0800 CST

评论数:249条评论

帖子来源:百度贴吧  访问原帖

 

热门帖子

随机列表

大家在看