有人可能发问了,我们不是在第零章已经前言了一章么?我们这里还废话什么,而且还将这个废话的前言放在最前面? 是因为我觉得这个很重要,所以我需要在此进行进一步的强调。 如果你从上一章节幸存的话,就说明你拥有学习魔改的资质,是天选之人(???)。而如果你完成了本章的学习你就会成为一个真正的魔改工作者。. 这一章节,我将叙述几乎所有关于CS的知识,包括无法查询的GUI(浅学??),流体和事件 而我希望了学习了这些的你可以发挥自己全部的创造力。 我总是强调创造力创造力,那么创造力到底是什么呢? 创造力,不是异想天开,我想着做一个巨大的MOD,或者是将现实移植进MC中 而是一种切合于实际的想法,在自己力所能及的范围内,达到最终的目的。或者说,是用魔改的手段,超越魔改! 但也不是循规蹈矩,仅仅如同其他人一样,模仿着制作。 既然大家都着急看教程,那样我也闲话省去,现在开始我们的旅程。 朋友们,我们的旅程现在开始! 花开落去,光阴回转,将其予你 |
CustomStuff中文自定义物品,这款神奇的模组允许你使用javascript语言自己向游戏添加新内容:包括新方块,新物品以及新的合成表。 CS3作为CS2的后身,其添加了可视化编程界面(就跟MT的那个RecipesMaker是一个道理,简单易用)。所以本篇将大篇幅介绍CS2,而略微介绍CS3,因为CS3过于简单,而且CS3的功能缺少了很多。不过我们也会专门介绍CS2&CS3互补原则。 安装CS的过程跟安装普通MOD一样,值得注意的是CS2有一个前置MOD,JS,所以安装的时候请不要漏选。 本篇介绍采用的MC版本1.7.10,CS2版本0.11.15,CS3版本0.7.9 在学习之前,请先下载其配套文件https://bitbucket.org/cubex2/custom-stuff-2-documentation 如若下载不了,请点击后文的下载链接。 Stage.1 CS2的准备工作 CS(除非特殊注明,以下均用CS表示CS2)与MT一样,也是要通过使用者自己创建文件来进行编写加载的,而与MT不同的是,CS的结构更加复杂,不过条例也更清晰。如果各位有时间不如跟我一起来学习创建一个CS的文件。如果各位没有时间也可以下载后面的整合版。 首先,安装CS2和JS,并且在你的MOD文件夹内创建一个文件,名字叫做CS2_xxx,其中xxx代表你用CS添加的MOD名称 但是不能用中文——以后取名字都是这样 ![]() 如果这么创建一个文件夹,然后你再进入游戏,你会发现这个空无一物的文件夹里面多了一个文件夹“_customstuff” ![]() 这个文件夹是CS自动生成的,最好不要删除,然而就算删除了也会自己重新生成 这里面将会存储所有有关你MOD的信息,也就是说,其他部分都是累赘,只有这个文件中储存的才是你做的MOD所加载的 事实上CS3也采用了这种储存方式。 但是光有这个是不行的,我们还需要在CS2_XXX这个文件夹下面补充许多的文件夹和文件 ![]() assets:资源文件夹,内部用于存放材质和语言文件 在Assets目录下我们需要新建一个文件夹,这个文件夹的名称和你的MOD名称相同 我的MOD叫做Mixer,所以就用Mixer创建了一个文件夹,大小写不需要关心 ![]() 再在这个文件夹下方新建两个文件夹,分别叫做lang(语言文件夹)和textures(材质文件夹) ![]() 在textures文件夹下面,我们还需要如图创建几个文件夹 ![]() blocks:存放方块材质 entity:存容器/实体材质 gui:存放GUI材质 item:存放物品材质 models:存放盔甲材质 在lang文件夹下面,我们也需要创建两个文件 ![]() en_US.lang是用于存放英文语言文件的 zh_CN.lang适用于存放中文 注意:中文语言文件一定要用UTF-8编码!!!!不然会乱码!!! 中文语言文件一定要用UTF-8编码!!!!不然会乱码!!! 中文语言文件一定要用UTF-8编码!!!!不然会乱码!!! 用记事本打开命名好的文件,然后文件-另存为,修改编码为UTF-8,然后保存 ![]() 回到MOD主目录 blocks:有关方块信息JS的存放位置 data:我们用不到的文件夹 guis:存放图形界面也就是GUI的文件夹 items:存放物品信息JS的文件夹 scripts:联动事件的存放文件夹 tileEntities:定义容器属性 worldGeneration:世界生成 config.ini:据说是可以生成跟MOD一样的可调试配置文件 mcmod.info:是存放制作者信息和MOD信息的(就是你在游戏中MOD里面看到的介绍) mod.js:最重要的,用于导入的文件(也就是相当一个链接器) 现在,一切准备就绪,our story begins! |
Stage.1 CS2-第一个物品 首先,我们必须要明确我们的第一个目标,就是写一个物品 这个物品的效果不必太特殊,只要有就行 现在,请按照以下步骤进行 1.打开items文件夹创建一个XXX.js文件(这个文件的名称最好和你的物品名称保持一致,防止混淆,其中XXX代表名称) ![]() 打开这个JS文件,在其中写入词条
2.由于物品需要材质,我们需要在textures-items文件夹内加入对应名称的材质 ![]() 材质可以是16x16,也可是32x32,后缀为png,名称必须和你test里面调用的材质名称相同 3.为物品添加游戏内的名称,物品的表示名称并非是它在游戏内显示的名称 打开lang,在en_US.lang内写入
在zh_CN.lang内写入
4.打开mod.js,连接我们创建的js 输入
![]() 还有,写这些词条的时候尽量空出来第一行(玄学) Stage.2 通用讲解 由于CS2更加系统化,所以在教程内可能无法做到一个个解释,但是会将一些奇奇怪怪的东西加以解释 下文将会采用简单易行的通用讲解来代替长篇幅的解说叙述 譬如说,物品我可以这么讲给你们听 //item文件夹下 Test.js
mod.js //代表打开mod.js
这样,我就完成了对一类东西的介绍了 现在,介绍几个通用概念---在制作方块等物品时可以用到 创造分类名称---实际上我们在后面会提到用CS3添加Lab为CS2服务
这样做的优点是方便了我的叙述,同时也方便了大家的复制粘贴,也加快了看教程的速度 其实CS2只要给个例子,一般人都能摸明白,谁叫现在连例子都缺呢?(笑) |
添加方块(最简单方块) //block文件夹下 TestBlock.js
mod.js
lang
//item文件夹下 TestAxe.js
lang.js
添加食物 //item文件夹下 TestFood.js
|
还记得我们最开始的时候下载过的那个文件么,也就是CS2的配套文件。![]() 打开它,你会发现一个叫做src的文件夹,打开你会发现一堆html文件和几个文件夹 现在我们来讲我们工作主要围绕的几个文件以及其作用。 block.html:里面综合了所有关于方块的信息和词条 item.html:综合了关于物品的信息和词条 我们先看这两个就行了。 Block.html:我想告诉你一些秘密 ![]() 进入block.html之后,迎面而来的就是所有的方块类型 这些方块类型代表什么我们将在一会之后讨论,首先我们先找我们认识的一些东西。 ![]() 嗯?好熟悉,这些addToCreative和drop之类的好像在我们之前编写最基础方块的时候用到过 不光这样,还有name,stepSound....全都有!!! 现在我们打开addToCreative ![]() 这里解释了:什么叫做addToCreative呢,这个就是用来定义你的方块是否被添加到创造物品栏中的(creative inventory) 这个还允许附加值改变呢,因为addToCreative[0] = true;,后面的[0]就代表附加值0(后文专门会讲附加值流水线工艺) 哇!好厉害,这样岂不是可以随便组合这些词条形成一个方块么! 正是如此! 如果我要做个玻璃方块,仅仅是透明材质会导致透视的问题,所以我们需要加上
如果我要做一个经验掉落,我就可以用
如果我要在右键到方块的时候进行事件,我需要添加(后文会专门介绍事件,所以请不要着急)
等等等等等,你都可以进行添加,只要你觉得哪个需要,你就可以将它放在最基础方块的词条末尾这样,它就会被加载,而这些词条也会发挥作用。 那如果我要做个按钮,那就更简单了,因为配套文件早就给你列出来了按钮这个方块所特有的属性 ![]() 也就是说,我只需要在做的普通方块的后面添加
不,首先,这个词条效果只是让弓箭能够触发按钮 其次,由于方块类型不一样,你需要在导入时做些改动 原本方块是
唯几值得一提的之一就是流体,这里可以设置的东西包括粘度,是否是气体,流动长度等等(顺便一说,流体不需要原版那样长条的材质,单个方块材质就行) ![]() 但是他并不包括对应的桶怎么做。 不过在item.html里面你会发现桶的做法 ![]() 因此我强烈建议你先通读一遍所有的html然后再进行编写。 另外还有值得一提的就是箱子,熔炉。由于这些方块属于容器,因此独树一帜,我们将在后文专门研究他们、 Others:其他所有的html都是这样这里介绍这些,是因为后文会大量引用这里的知识,所以在这里提出 包括后文的GUI(用户图形界面)和容器以及大量的事件 而笔者大部分的经验也是从这些html之中领悟到的 希望大家也能从中有所收获。 值得一提,javadoc--index-files内部的html记载了一些调用的语句,不过不看也罢,因为我们拥有一些特殊方法。 |
这大概也是笔者的原创吧。随着时间的增长,你会发现写一堆物品是相当困难的。 而你还记得附加值么,也就是[0] [0]意味着你可以在一个文件内写无限个附加值不同的物品 ![]() 如图所示,这是一个范例物品,他的一些特性用附加值区分开的 而name之类的通性并未区分,可以书写在同一个文件内 而导入时也仅仅需要导入一个,也就是这个文件.js 不过在语言文件那里需要依次导入 ![]() 在名称后面的0现在用途也清晰了,那个0代表的就是附加值!!! 而这个跟流水线工艺有什么关系呢 也就是说,我们可以在js中先输入第一个物品,譬如
|
事件是什么?事件有什么作用?这或许是作为玩家我们不所关心的。 事件,与其说是事件,不如说是触发,当然这里为了叙述简单,用了事件的名字 触发的组成结构很简单 分为:事件,条件,动作 三部分 事件代表的是触发的原因,譬如说踩上压力板这个触发,玩家踩上压力板这个动作就是触发原因,也就是事件 条件代表的是进行动作之前的一个判定,这个条件是非必须的,可以省略,譬如说红石线是连续的就是红石信号能传导的条件 动作代表的是事件所导致的一个结果,譬如说踩下压力板的事件,将导致门打开的结果,这个门打开便是动作 其实以上只是我自己的说法,事实上基本没有人这么讲。但是为了下文行文方便,这里推出了这几个概念。 准备工作:打开你的cubex2 (这里的例子MOD为自制的CS2_Steel) 我们先打开item.html ![]() 在这里,我们可以看到许多这些onxxx的代码,大部分带on的都是事件 on意为当什么什么时,譬如说onUsing当使用的时候,onUpdate每Tick发生判定时 以此类推,这些你都可以用翻译软件查到对应的翻译,所以我就不一个个讲了 那现在我们有了事件,动作呢??? 现在我们打开javadoc/index-files,我们会看到很多个html 这些html里面装的就是我们所有可以调用的动作和get到的数据和特殊技巧 当然这可能对某些人来说使用很困难,所以请允许我在下一节讲一讲更简单的更大众的方法 不过首要是要做一个事件来展现展现我们的技巧 说做就做,我们今天来做一个锤钢的MOD 首先我们需要一个钢块,这个钢块拥有不同的状态,分别是完全,损坏一点,损坏很大,和完全损坏 大概这样 所以我创建了这个物品,代码如下
通过不同的Meta值来标志不同的钢块耐久 作为锤钢,自然需要一个锤子,所以我也相对的做了一个锤子 锤子的代码如下
加载HammerFortest.js???这个是什么东西?? 还记得刚开始我们分析CS2文件夹组成的时候么,我们曾经创建过一个scripts文件夹 当时我说是干什么用的?? 用于联动事件!!(事实上这句话有些问题) 也就是说HammerFortest实际上是这个文件夹里的一个文件 mod.loadScript('HammerFortest.js');这个动作将加载这个JS文件内的东西并且运行! 现在我们看看HammerFortest.js里面写了什么
![]() ![]() 大概就是这样了 顺便一说,事件需要一些js水平 最后一说,原版锄头的制作就需要事件 |
或许在上一节我提到过什么特殊方法,事实上,这只是偷鸡而已 不过就算是偷鸡,我也会讲一下的 如果我们在MC中打开CS3的话,映入眼前的是创建MOD的界面 ![]() 两个选项,一个是打开你的MOD,另一个是查看Javascript 下面我要讲一下CS2和CS3的关系,他们两个是亲兄弟,功能几乎相同,除了交易和列表 最重要的一点是,他们对事件那些奇奇怪怪的调用是一样的! 没错,这也就意味着如果我们在CS2中找不到事件的正确编写方法,我们可以在CS3中查询 有的人可能说了这破玩意我也看不懂啊,什么垃圾教程!摔! ![]() 好吧好吧,既然我们写教程就一定要写个简单的对吧,我们随便用CS3创建一个MOD然后再创建一个方块 我们打开这个方块,然后找啊找... ![]() 嗯,这些东西好像有些熟悉?这不就是CS2的那些触发事件么?! 没错,在CS3中,这些事件它代表的跟CS2相同,而且完全等同于
![]() 这个界面其实就是我们在CS2中scripts文件夹中建立的js文档 看到右下角的那个Info么,他会告诉你这个类别的事件兼容哪种词条 ![]() position:代表的是默认的属性,方块的位置 world:代表一个类,通俗来说就是world里面的动作你需要加上world这个前缀 我们打开world ![]() 这里面的就是我们可以调用的,举个例子,如果我们要判定方块名称 ![]() string:字符串,在这里你可以理解为名称 所以它的实际应用是
以上,便是CS2&CS3联合事件体系 说白了就是,用你看得懂的,补全看不懂的。事实上这个体系复杂得多,这里只讲它在事件的应用 事实上用CS3添加创造列表然后将CS2的物品添加进去也属于CS2&CS3互补的内容,但是由于太简单这里就不多谈了 最后一提,CS3的这个事件info文件是可以在CS3的MOD压缩包里看到的 ![]() 如图所示,这个可以称作CS3的研究草案了,里面将几乎所有用得到的CS3属性全部罗列出来,包括事件 所以如果CS2迷茫的时候你可以翻翻这个,或许有新的收获 |
如果大家有好好的回去复习,一定会注意到几个很奇妙的东西。什么?没注意到?那也不要紧,今天我们来讲讲这些让人迷惑的东西。 容器。 容器是什么?是箱子?是漏斗?或是熔炉? 嗯,你说的都对,这便是我们今天要做的。 Stage.1 CS2-类熔炉机器 首先,我们打开cubex,查看跟Block有关的属性,找到一条属性
事实上类别是normal的方块也是可以定义容器的 什么叫做容器?它不一定要有GUI界面(GUI可视化交互界面)也就是说右键它不一定会弹出一个界面 它通俗的特征是可以在内储存物品,并且破坏它后可以获得其中储存的物品 这会不会让你联想到什么东西?譬如一些MOD中没有GUI经常吞物品的机器? 也就是说,加了这个属性,你的物品就有了容器的灵魂,但是没有外表! 所以我们需要用事件来为它赋予一个人们能够理解的外表 这里我举出一个熔炉机器的例子
player.openGui('GrowerGUI', position);result = true;:打开一个GUI界面叫做GrowerGUI 如果大家经过一些思考之后,会发现这里面有两个未知的属性需要定义 一个是GrowerR容器属性,一个是GrowerGUI GUI属性 这两个分别对应了我们的两个文件夹分别是guis和tileEntities ![]() 跟事件一样,我们需要在里面创建JS来定义属性,从容器属性开始,我们打开tileEntities 建立一个js叫做GrowerR.js 打开进行定义
usedFuelLists:将来在mod.js可以输入导入的燃料 这个属性定义了熔炉容器的内在属性,而非显示出来的属性 现在我们进行GUI界面的定义,打开guis文件夹,建立一个文件叫做GrowerGUI.js
具体这些你都可以在guis的html中看到详细的介绍,这里我就不赘述 下面就是growergui的样子 ![]() 透明背景,熔炉改界面。这个GUI是由我的材质画师PP所作,在这里感谢 由于我们是熔炉机器,所以只能有两个输入一个输出槽,但是CS4兼容多槽的机器,将来我们会专门开贴讲一下CS4。 不过就算我们没有多槽机器,我们也是有其他方法添加类似于多槽机器的效果。 根据槽的位置和燃料条和燃烧指示不断调整槽位置的属性。 最后我们进行导入,在mod.js中输入
mod.addGui("GrowerGUI.js", "furnace"); :以熔炉的形式添加GUI mod.addSmeltingRecipeFor :添加配方 mod.addFuelFor :添加燃料 关于onItemSmelted = "mod.loadScript('Growers.js');";由于涉及了事件,我们会在下一章事件深谈提到 以下是效果图 ![]() Stage.2 CS2-箱子 |
[缓慢更新]魔改教程-或许我们可以从零开始:http://mcbbs.tvt.im/thread-666167-1-1.html [从零开始]魔改教程-MT技巧性使用叙述:http://www.mcbbs.net/thread-673968-1-1.html |
在学习之前,请先下载其配套文件https://bitbucket.org/cubex2/custom-stuff-2-documentation
如若下载不了,请点击后文的下载链接。
但是CS4兼容多槽的机器,将来我们会专门开贴讲一下CS4。
残夜の残月 发表于 2017-8-30 20:56
CS4,有这种东西吗??