丨闲聊丨很少有人知道道饥荒mod的瓜子干什么用的吗

『mod教程』口渴mod的详细说明_饥荒游戏吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:146,405贴子:
『mod教程』口渴mod的详细说明
如果你觉得默认模式下的饥荒太简单,那么你可以试试这个现实增强的饥荒mod。该mod为口渴方面的现实增强,在中会加大游戏难度。你在担忧饥饿,精神,血量的同时还得担心口渴度。当然,与口渴度相对应的,mod也增加了许多恢复口渴的办法。如果你在默认模式下都无法正常生存,请无视该mod。二楼链接。后面再具体介绍红白镇楼
亲爱的宝宝们进来看看拉...
免费送转手绘教程 扣1 ...
基友拿出真实航天飞机的...
大家想必都知道,1.3MOD...
全家福以及各种鼻子镇...
对了这又是一个新坑 TAP...
转微博 , 黑白照好看
确立一下三个分之,此贴...
我说过会填……也许能在2....
需要的加我
1:发照片前请先添加个...
新版电子游戏来袭,注册送惊喜,超多免费游戏!
如何自己在创意工坊下载mod的帖子教程链接:该mod在创意工坊的链接:上一个增强难度的mod:hardmode的帖子链接本人的不做死也会死的帖子链接(有hardmode和口渴mod的试玩):
三楼先占着
啦啦啦,我是水贴的小行家
应用吧活动,
创意工坊的英文介绍:看得懂的大神可以直接看这个Mechanics:Thirst like other stats shown at the right upper corner of the screen. You can move thirst badge using configuration menu. - All the characters have 200 of max thirst. - Character loses thirst with 3 point / 10 seconds speed. - If character is overheated he looses thirst faster and sweats, getting wetness and reducing temperature. - If thirst drops to zero character takes 1dmg/sec. Gainig aquaTo gain thirst, you should drink some water (ty captain obvious): - Drink water from pond, +75 water, -9 to 3 random sanity delta, 3 to 9 random wetness delta. - Eat vegetables 25% of healing + 25% of satiety into water. - Eat raw meat 35% of satiety + 35% of healing into water. - Eat ice or hydromato. - Drink water from your bottle. New itemsNew tab &water& added to craft table, it includes bottles for water, water catcher, water-pool, aqua-backpack. 1) Bottles - are used to keep water in travels. +50 water per use. To fill bottle drop it near aqua sourse, or during winter drop it on the snow. - Mug, keeps 50 water, 2 uses. - Wooden Bottle, keeps 200 water, 10 uses. - Golden Bottle, keeps 450 water, 20 uses. - Cold Bottle, keeps 450 water, 20 uses. Drops temperature. - Hot Bottle, keeps 450 water, 20 uses. Rises temperature. 2) Water catchers - are used to catch water. Press &space& to drink from it. - 3 variants of Water capacitor, catches up to 150/200/400 water. Catches withour rain. Breaks under rain very fast. 3) Water-pool, your-own pond catches up to 900 water. Catches aqua only during rain. Looses water without rain. Can be destroyed with hummer. 4) Aqua-backpack, special backpack, fills bottles during rain. Fills bottles, what are inside it. Hydromato New food. Restores 20 thirst, can be found in the forest. Usefull for early-game. Water spiders Those are spawned with 20% chance if you drink water from wild pond. - Silver Spider, on attack drains water and wetness from character. - Water Spinner, ranged attack raises wetness of character. ------------------------------------------------------------------------------------------------------------------- Update log 1.35:- Fixed tons of bugs. - Add hydromato
在下应楼上@而来
本人的渣翻口渴mod1.屏幕右上增加一个新的图标量表,口渴度。可以使用配置菜单拖动。2.口渴最大200.3.每10秒减3点口渴。4.夏季出汗时候口渴下降快,出汗增加湿度,湿度增加会降温。5.口渴降0,和饥饿一样掉血,每秒1点。获得水:1.从池塘中喝水,+75水,-9至3随机理智,+3至9随机润湿。2.吃蔬菜,加水量等于25%饥饿+25%治疗。3.吃生肉,加水量等于35%饥饿+35%治疗。4.吃冰或水柿子。5.用瓶子喝水。该mod加入道具:增加多一个水标签一:瓶子:用于旅行中带水。每次用+50水。把瓶子放在水源附近地上不要动,放下瞬加自动装水。或者冬季放雪上。1.杯子(1木1草):容量50,2次。2.木瓶子(3木2燧2炭,一本):容量200,10次。3.金瓶子(2板3金4炭,二本):容量450,20次。4.冷瓶子(金瓶1蓝3噩,魔法一本):容量450,20次,带降温效果。5.热瓶子(金瓶1红3噩,魔法一本):容量450,20次,带加温效果。二:汲水器。在其边上,按空格键直接喝水,水池边也能喝。没雨时候也能汲水。下雨时候耐久掉的快1.150(4草5枝)2.200(3网5枝,一本)3.400(1蓝2噩5枝,魔法一本)三:水池(8板6网8砖1铲,二本)人造池子,上限900水。仅仅在下雨大量积水。没雨时候蒸发水。四:水背包(4皮6网4炭,二本)表面像小猪包,8格,和小猪包一样会降低人物移速。下雨时候,给瓶子填充水。(速度不快)新食品水柿子:加5饥饿5精神,恢复20口渴,可在森林里找到。早期不错的回复道具。该mod加入生物:水蜘蛛,水池边喝水20%几率出。1.银蜘蛛,攻击降你口渴和湿度。2.小喷吐蜘蛛,远程攻击,每次攻击提升角色湿度25。关于Hydromato的说明:百度翻译并无该词。hydr有水和氢的意思,tomato有西红柿的意思,故我叫其水柿。版本号1.35 有时也作1.4更新说明:1.修复了bug2.增加了Hydromato
你把我召唤出来了,你得送我经验
2017新游戏首选新游戏「修魔世界」1OO%免费新游戏_下载游戏1OO%送礼!2017新游戏_今日开测,下载游戏1OO%送微信红包!非RMB首选新游戏!
某些食物的测定。1.吃蔬菜,水果和蘑菇,仙人掌肉等同素食(包括煮熟的)。2.素料理(包括太妃糖)视为素3.肉,蛋,蜂蜜等各种肉料理不加水。4.吃蛋,熟肉和肉干不加水。5.如果扣血减水大于饥饿加水则会掉水(比如红蘑菇-2水)6.烤坚果,种子,烤种子,蜂蜜不加水7.灯泡和花+1,冰+25,水柿+20,蝴蝶算素+4。8.治疗物品(蜘蛛腺体,蜂蜜药膏),巨鹿眼球,守卫者的角,格洛姆黏液不加水未完全,可能以后会补充
说明:该版本为2014年4月还是六月来着更新的最后一次版本。与之前版本的较大改动在于:1.食物补水量大大下降,记得之前有一个版本是+100%的75%2.肉料理和蛋不再加水了,这意味着光吃肉是无法生存的。3.制作物品的配方有一些微调,不过影响不大。4.加大了水池容量。另外,该mod有官方参与的影子,所以兼容性较高。目前测试了不少常用的mod均不会造成冲突。
水蜘蛛:小喷吐蜘蛛。该生物不会像普通蜘蛛一样无限硬直,用矛能直接打死,用斧头可能直接打死,可能会被a一下该新增植物在我在落叶桦树林找到过不少。看起来其实像蓝色的南瓜
GIF不动了!╭(°A°`)╮
╭(°A°`)╮我的gif怎么不动了
机器人哭了
镇楼拿走~   -- 我相信肯定有新人是这样想的:CNM老子来你这破逼吧不耻下问你还得瑟的让老子去看置顶?!NMB来你们这问就够看得起你们了!置顶MB写了那么多一堆,老子就一个问题你凭什么让老子去看你那一堆碎碎念!快TMD过来QQ远程控制帮我弄好!别TNND整那么多名词!老子听不懂!TMD老子就玩个游戏你还想让我学这学那!QNMB的要告诉赶紧告诉,不告诉赶紧滚!SB玩意老子问问题用得着你管!反正TMD有大神来帮忙,你个GB滚粗!来自 这是七个字了吧
第六次看到有人搬运这个mod
表示黑暗英雄都没有研究明白,别说这个mod了
于怒水   --6666666+
太口渴晚上会有幻觉,树人蜘蛛猎狗什么的,还会打你,最可怕的是克隆人。我曾经口渴mod和作死mod一起玩
本来就光吃不拉翔了,现在还要光喝不让尿。就算它是异次元膀胱,不带这样无理取闹的。建议大家在出现饥荒排泄系统之前,请不要使用该MOD为主角省个膀胱。
北方喜欢这个mod(๑•̀ㅂ•́)و✧
以后别人写小说又有新梗了——和别人洗澡水2333_(:3」∠)_
这让我只吃肉的大女武神怎么办?
你把我召唤出来了
你要实现我100个愿望(。・∀・)ノ゙请我吃肉(。・∀・)ノ゙
应用吧活动,
0v0 -- 我相信肯定有新人是这样想的:CNM老子来你这破逼吧不耻下问你还得瑟的让老子去看置顶?!NMB来你们这问就够看得起你们了!置顶MB写了那么多一堆,老子就一个问题你凭什么让老子去看你那一堆碎碎念!快TMD过来QQ远程控制帮我弄好!别TNND整那么多名词!老子听不懂!TMD老子就玩个游戏你还想让我学这学那!QNMB的要告诉赶紧告诉,不告诉赶紧滚!SB玩意老子问问题用得着你管!反正TMD有大神来帮忙,你个GB滚粗!来自 这是七个字了吧
应用吧活动,
贴吧热议榜
使用签名档&&
保存至快速回贴16-03-09丨【mod】饥荒MOD编程入门_饥荒游戏吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:146,405贴子:
16-03-09丨【mod】饥荒MOD编程入门
不镇楼不吸睛,随手而写。前言:本文重点介绍饥荒MOD脚本编写的一些经验。因为本人比较懒,不喜欢配图,只写长文。出于兴趣而写,原本的目的只是整理我自己的知识体系,所以,爱学不学,嫌太长,嫌太难,嫌太枯燥,请右上点红X。可以问我问题,但我不会都回答,什么问题会回答?没准,看心情。欢迎小学生修改党,我希望这会成为你们进入有趣的编程世界的一个契机。这个时代的智能设备正在不断产生质的飞跃,我大胆地,在未来,编程一定会和读书写字一样,变成一项会对生活的方方面面产生巨大影响的重要基本技能。不要觉得编程是什么高大上的技能,也不要有畏难情绪,就把它当成读书写字一样自然就可以了。严格来说,我们做MOD,实际上是在编写脚本而不是编程。前者需要依赖其它程序来运行,后者在编译后能独立运行。不过厘清这个概念对于制作MOD来说不重要,还是习惯于说编程。
以前发的mod都太散了,...
一楼敬度娘
圣诞...元旦快乐! 这是...
所有mod由steam创意工坊...
贴图已完成,还剩代码...
2L地址,勿占!!!! ...
泡菜狗: 可长大,每十...
各种新鲜的mod,转发外...
更多食物mod大家都知道...
1.建筑几何学 http://pa...
楼主最喜欢的是晒肉架 ...
新版电子游戏来袭,注册送惊喜,超多免费游戏!
基本入门为编程0基础的人解释一些基本概念,这部分占本文的一半内容,有一定基础的人可以跳过2、 饥荒MOD框架为想要制作MOD但不清楚饥荒MOD框架的人,快速了解mod框架限于本人MOD经验,写得并不完全,只是突出讲了重点的内容。3、
实例和注释一些代码实例和注释,也包含了人物制作教程的代码部分。主要是代码和注释,让新手能通过模仿来快速上手。4、
DEBUG与测试,以及自行积累知识的一些技巧目前没写,因为看到蛮多人急需编程入门的教程,就先发出来了,后续会加上另外,我会在楼中楼里附上网盘,内附自己这段时间积累的MOD资料、实例和自己做MOD过程中随手记录的一些内容,没有整理,非常零散,仅供参考
第一章、基本入门编程0基础的人,要想学习制作MOD,阻力是比较大的,因为缺乏一些基本的编程概念,只懂得复制别人的代码或者在它们的基础上稍加改变,遇到稍微复杂一点的代码,就束手无策了。对于MOD崩溃,也几乎没什么办法。我这里不想费太多时间在解释基本概念上,这里只做简单介绍,目的是减少你阅读后续内容上的障碍。基本概念常量:初次赋值之后,数值不变的量。一般是集中大量写在脚本的开头,或者专门用一个文件存放,典型代表就是TUNING.lua里的那些值。使用时,直接引用他们的名字就可以。这样做的好处是,当你想要改变某些值的时候,你只需要在初始定义这个量的地方,改变它的值就行了。举个例子:饥荒里的武器攻击力,都是长矛攻击力的某个倍数。如果你不使用常量,而是一个一个填写具体数值的话,当想要对游戏全局的武器攻击力做统一调整的时候就比较麻烦了。比如说我希望长矛的攻击力变为20,其他的武器的攻击力也相应降低,这时候,你直接更改长矛攻击力这个常量,就显得非常方便。 变量:和常量一样,可以被引用。但变量有一些不一样的地方:它们的值能被反复改变,它们有自己的作用域。作用域的概念,我在下面单独讲。这里只简单说说变量的值能反复改变,能帮我们做什么。一个典型的代表:人物的饥饿值,这个值在游戏里几乎每时每刻都在不停变化着,这样一来,我们就可以根据不同的变化,设置不同的效果,比如沃尔夫冈不同的饥饿度下有不同的形态。而这是常量做不到的,因为常量在开头定义之后就必须保持不变。 作用域:变量的作用域,指的是这个变量的生效区域,在作用域以外的地方,你引用这个变量就会造成出错。作用域的判断,对于我们编程比较熟练的人来说,一般都是相对比较简单的事,但对0基础的人来说,可能就有些困难。这里不展开细讲,只告诉你,作用域分为整体和局部。在整个系统中都有效的变量,我们称为全局变量,而至能在一个小范围内有效的,则称为局部变量。饥荒MOD脚本的语言是lua,在这个语言里,全局变量在声明时无需附加任何内容,而局部变量则需要在最前面添加local。这个作用域的主要价值在于,使得你免于混乱。比如说,在被攻击的时候,需要计算所受到的伤害,为了方便进行多次计算,我们把这个数值设置为一个变量。但是,面对的敌人的攻击力会有变化,自身的防具减伤也会有变化,这时候我们就希望,计算结束,变量被引用到血量变化之后,这个变量能消失掉,不会影响我们下一次计算其他的伤害。这就是局部变量的重要作用。当然,局部变量还有另一个好处就是读取它的数据,要比全局变量快一些,不过,提高MOD性能不是本篇教程的重点,就不详细展开了。总而言之,全局变量,不到必不得已的情况,应当尽可能少用。 声明、引用、定义和赋值:在上面我多次提到了声明和引用,可能有些人不太清楚这两个术语的意思。我这里就顺带把定义和赋值一起讲了。定义,就是告诉系统,我设置了的这个变量/常量是什么。声明,就是告诉系统,我设置了一个变量/常量,你给我记好了。定义和声明是不一样的,但常常会混在一起。如果你只是想写写mod的话,不了解他们的区别也没关系,只认为是定义就够了。引用就是告诉系统,我要用这个变量/常量来做某某事,比如说用于某个表达式的计算,系统就会帮你读取储存在其中的数据。赋值就是告诉系统,往这个变量/常量里存入你给出的数据。注意,此处的数据,不仅仅指数字,可以是这个编程语言允许的任何类型,比如说一段文字(字符串),一个布尔值(真或假)等等。在某些语言比如C语言中,定义和赋值是可以分开的。但在饥荒MOD的脚本语言lua中,这两者是连在一起的。对一个变量的第一次赋值,就是对它的定义了。数据类型:对变量赋值,就是给它写入数据,那就涉及到了数据类型的问题。在初次赋值给一个变量时,所给予的值的数据类型,就是变量的数据类型。此后再给这个变量赋值,就必须赋予同一数据类型的值,如果值不同,就会导致系统崩溃(除了nil)。这里不展开细讲,只针对lua语言,简单地列出MOD中常用的几种类型。Nil:表示无效值,可以给任何数据类型的变量赋这个值。Boolean:包含两个值:false和true(假和真)String:字符串,用一对双引号或单引号括起来Function:函数,这个会在下面讲Table:表,这个概念会在后面讲
函数:这是编程里的一个非常重要的概念。展开来讲也非常复杂,这里只做简要介绍。一句话简单概括:函数与变量的重要区别,可以做这样的类比:一个变量,就好比是一个属性,你可以给一个客体以某个属性,让它可以被描述,比如说,属性:可以被烧毁。而函数,则是一种操作方法,你让一个客体拥有一个函数,就是让它有某种操作。比如说,操作方法:如何被烧毁。函数由函数名,参数表和函数体组成。函数也和变量一样,能被引用,也有作用域。不过与变量不同的是,函数需要单独定义,在不同的编程语言中,函数的定义格式不一样,但都少不了上面所说的三个基本组成。在lua中,函数也可以看成是变量,可以被赋值。Lua中,函数定义的基本格式如下为:Function 函数名(参数表)函数体end如果希望函数的作用域是局部的,则在function 前面添加local。 函数是怎样工作的呢?首先,你需要明白,定义函数并不会让函数工作。只有执行了函数语句才会让它工作。还是拿计算伤害来做例子。你定义了怎么计算伤害的函数,参数为攻击者的攻击力和防御者的护甲。这个函数在定义之后,本身并不会立刻工作。只有你设定了一系列的流程,让函数在出现攻击状态的时候触发,才能算是执行了这个函数。这时候函数是怎么工作的呢?函数执行的时候,输入了两个参数:攻击者的攻击力和防御者的护甲。在函数体中,经过一系列的计算,得到了结果,利用return返回来,由变量接收或者加在各种表达式里使用。需要注意的是,即使是没有参数的函数,在执行时,也必须写成这样的形式: 函数名() 函数的作用是什么呢?就是使得你的编程显得更有逻辑,模块化。定义好一个函数之后,就不再需要管这个函数里面详细的执行过程(也就是函数体写了什么),我们只需要知道这个函数的名字,参数表和返回值,和这个函数有什么作用。因为在饥荒的MOD中,大量的函数是没有返回值的(也就是返回值为nil),执行这样的函数,目的在于使用它的功能。 函数是做饥荒MOD时最重要的东西。我们在脚本中写代码,就是在执行一条条函数,了解这些函数在什么时候会触发,需要哪些参数,有什么功能,返回值是什么,是非常重要的。我们是在原游戏的基础上做MOD,也就是说,有很多已经定义好了的函数可以供我们使用。打个比方,饥荒这个游戏,就好比一部车,函数就是这部车上面的零件,它让这部车能够拥有某些功能:启动,刹车等等。我们现在觉得这部车不能满足我们的需要了,那么,很显然的,做适当的改装,要比重新造一部车容易。做MOD,就好比是做一些改装。既然是改装,那你就有必要了解到,你所需要改装的部分,需要哪些零件。有些核心零件是非要弄清楚不可的。 现在饥荒MOD本身的结构是非常开放的,但官方没有给出详细的说明文档,当我们想要实现一项功能的时候,我们不知道官方有没有给出来,怎么办呢?我的建议是,思考一下游戏里的各种功能,以及他人已经发布的MOD,有没有和你的需求类似的,去参考一下相应的代码。这是一种自适应学习的能力,我从上个月月初,开始学习制作,到现在一个月过去了,从没有任何lua编程经验,靠着查找资料、参考MOD、与人交流、制作实践等多种方法,到现在,已经积累了相当丰富的知识,足够写下这么一篇教程。关于如何自适应学习,这是另外一个大话题,这里按下不表,若是以后有空,会专门写一篇来阐述。
表:表不是一门编程语言的必须概念,但这个概念在饥荒MOD里使用得非常频繁。游戏的整个框架,也非常依赖于表。表的重要作用也和函数一样,是为了让你的编程显得逻辑清晰。比方说,现在有4个个体,a,b,c,d,有多项属性描述health,sanity,hunger,damage,armor,attack_period,walkspeed,runspeed。这些属性,对于4个个体来说,有的有,有的没有,我们要怎么组织起来呢?用多张表连起来,就是一个好主意。首先,我们来给属性分一下类,health,sanity,hunger,是饥荒中的三大基本属性,格子单独成一类,damage,armor,attack_period是和战斗有关的,分类为combat,至于walkspeed,runspeed是和移动有关的,分类为locomotor。那么,我们就有多张表了:一张总表:个体属性表 这个表中的每一个元素,都是一张表,现在不妨取a1的战斗属性表出来,是这样的:
那么,我们想要引用a1的damage的时候,怎么办呢?先在总表第一横栏中找到a,然后在竖栏中找到combat,这样我们就得到了提示:转去找a1的战斗属性表。然后在战斗属性表中,我们在横栏中找到了damage,这时候竖栏中只有一项,就不必再查找了。我们在查找过程中,寻找的a,combat,damage 就是所谓的索引。我们按先横后竖的顺序查找的,a为1级索引,combat为2级,damage为3级。按顺序最后找到damage的具体的值(20),就是所谓的值。这个值不仅仅是数值,比如说在总表中找到的a1的战斗属性表,也可以称为值。再拓展一些,如果说战斗属性表中的竖表不只有一项,而是有两项:max,min,此时我们想要查damage最大值,该如何呢?那就要增加一个四级索引,max。在编程里的调用语句就可以写成这样:当你想要引用a的伤害最大值时,你就可以写<bat.damage.max 结合饥荒Mod编程,我们常常会看到类似这样的一条语句。<ponents.sanity:DoDelta(-10) 这句话的意思是当前对象的精神减10.具体是怎么操作的呢?首先,游戏里这么多个体,要在茫茫人海中找到你,必须要有索引,这个索引就是inst,然后,inst下有很多属性类,我们需要的精神值,归类为components,也就是组件。组件这个概念,是饥荒为了编程上的逻辑清晰而创造出来的一个概念。后面会详细说明。然后我们继续寻找,就是sanity。这时候你可以看到sanity后面是冒号:而不是之前的那些点号.
这是因为,我们是希望执行这个函数。如果是想要引用这个函数做其他操作的话,还是要用点号. 的。学过C++的人都会了解类的概念,对这个肯定不陌生。没学过的人呢,看我在下面关于类的解释。
类和面向对象编程:类这个概念,就是在面向对象编程的思想上发展起来的。为什么要使用类呢?就是因为面向对象编程显得逻辑结构清晰,易于实现、互动和维护。那么,什么是一个类呢?在编程上,可以理解为一些变量和函数的集合。这个集合是封装起来的,其中有一些变量和函数你可以访问和引用,称为公有变量和公有函数,还有一些是你访问不到,也无法使用的,就是私有变量和私有函数。需要注意的是,类本身只是一个逻辑结构,并不是实体。用现实的东西举个例子,自行车就是一个类的概念,它有很多基本属性:颜色,材质等等,也有很多操作:骑、前进、刹车等等。属性就是变量,操作就是函数。颜色、材质,是你能够看到的,就是公有变量,而内部的转盘的颜色你看不到,就是私有变量。而骑和刹车的操作,是你能够决定的,就是公有函数。而前进这个操作,你没法直接进行,你必须要反复踩踏板,才能让自行车前进,所以前进就是私有函数。在头脑中想到自行车这个概念,就是类。而想到你的自行车,就是一个具体的实体。结合到饥荒MOD里,sanity这就是一个类,这里面有很多属性:当前精神值,最大精神值等等,也有很多操作:精神增加/减少,设置当前精神值,设置最大精神值等等。而具体到一个人物的sanity,那就是这个类的实体了。实际上,在lua里,只有表,没有类这个概念。但是饥荒的游戏制作者为了编程方便,还是用某种手段,在表的基础上,类这个概念创造出来了。我们只需要认识到,怎样使用一个类就可以了。引用类中的变量,操作方法就和引用表中元素一样。如果想要调用函数,则需要将点号.改成冒号:,并且在函数名后面添加(函数参数表)。比如说人物的当前精神值,人物的最大精神值等等,同时也有一些操作函数,比如上面举例的DoDelta。我之前说过了,在lua里,函数也可以看成变量。如果你想要引用这个函数,比如说引用去给一个函数赋值,那么,上面的冒号:就要改成点号.,而且后面的(-10)也要去掉。如果你想要执行这个函数,那就要用冒号: 并且添加相应的参数。
第一章到此结束。
第二章:饥荒的基本框架其实我并未完全掌握所有的框架知识,所以我只根据我已经掌握的框架知识,提供一点参考意见。 就以我所见到的大多数MOD来说,都是围绕着修改、制作新物品/生物/人物,以及添加界面组件来做的。添加界面组件这一方面,我还没有实践过,没有获取太多的知识。所以只谈如何能够逻辑清楚地修改、制作新物品/生物/人物(统称为实体),这是一个进入门槛较低,但想要精通则需要花费大量时间积累知识的领域。 除了常用的一些必备类以外,修改、制作新实体,都需要在以下四个大类的基础上进行:Prefab(预设物),Component(组件),StateGraphic(状态图),Brain(AI)
这四者的区别,我直接根据Klei论坛的Ipsquiggle所写的帖子Wots The Diff??Prefabs, Components, Stategraphs, And Brains,将其帖子的核心思想提取出来做一些说明。 Prefab和Component,是大多数MOD都必须要接触到的东西,是最值得注意和研究的。用一句话来概括他们的区别: Prefab 表述了一个实体 是什么。而Component则表述了一个实体能 做什么。 举火坑的例子来帮助理解:Firepit(火坑)是一个实体,我们需要对它进行描述,所以它就成了一个Prefab,我们会写一个名为Firepit的脚本,放在prefabs文件夹下。然后,火坑能干什么呢?它可以燃烧,可以接受燃料。所以我们就有了burnble,fueled这两个Component。那么Prefab和Component是怎么联系起来的呢?我们看到,主体是Prefab,所以我们应该是把组件往主体上添加。在饥荒MOD中的语言就是AddComponent。 这就是饥荒MOD里关于实体编程的最基本的逻辑:设定一个预设物,然后往它的身上添加组件以实现各种功能。 这样做有很多好处,不过不是本教程的重点,就不多提了。当我们知道了这么一个简单的编程逻辑之后,关于实体功能上的很多事,就迎刃而解了。凡是游戏里已经有的功能,我们可以通过“阅读拥有该功能物品的代码à找到相应组件à给我们想要增加功能的实体添加改组件 à部分修改 ”来做到。而游戏里的许多常用的组件,都提供了很多十分方便的修改接口,只要你能读得懂组件的代码,就能很轻松地完成许多新功能。举个例子:晨星法杖(黄宝石法杖),可以右键点击地板召唤晨星。这个物品有一个spellcaster的组件,就是召唤晨星的关键。这个组件下有一个函数型变量,spell,和相应的公有函数SetSpellFn。spell就是用于控制召唤晨星的函数。在黄宝石法杖下,这个函数被设定为creatlight。而如果我们不想召唤晨星,而是想要召唤青蛙雨,或者就是简单地想要弄一个群体回血,只需要写一个函数然后用SetSpellFn赋值给spell就可以了。 总结起来,组件的功能,并不限制于组件本身的功能上,他们提供的触发接口也是十分重要的。
学到这一方法之后,一个自然的问题就来了:我们该如何找到想要的组件?对于有点编程基础的人来说,阅读代码并找到其中的关键部分,并不困难。但对于没有基础的人来说,读代码就和读天书一样,想要在其中找到关键部分十分困难。但是,我们现在已经了解饥荒MOD的编程结构了,也知道它主要依靠表的形式组织数据了,只要有恰当的方法,即使不熟悉代码,你也可以快速找到想要的内容,这同样适用于只想看游戏内部数据,无意修改的人。 第一步:找到定义实体的脚本文件。几乎所有的实体,相应的脚本文件都储存在\data\scripts\prefabs下面。一般来说,一个脚本只定义一个实体,只需要找到实体的控制台英文名(请去参考饥荒wikia),然后直接搜索文件名就可以了。但实际上也有许多例外,同类型的,比如说spider和spier_warrior就定义在spider.lua下,你要找蜘蛛武士的定义,直接搜索spider_warrior就找不到了。但这也好说,这和spider毕竟关系紧密,也能很快搜出来。然而有一些实体是用其他的分类方式集合在一起的,直接搜索名字很难找到。对这一部分,一个方法是用文件文本搜索功能(Notepad ++就有提供),但有时候这个方法也不好用。想要找到,就需要依靠你灵活变通的智慧和丰富的想象力了,这部分说起来很麻烦,直接忽略吧。如果实在找不到,去询问别人是最好的办法。 第二步:在脚本文件内搜索AddComponent,一个实体要想拥有某个组件的功能,必须要使用这个函数,函数的参数就是组件的名字。搜索结果全部出来之后,仔细看函数的参数,挑出你觉得名字像是你要的组件的参数,搜索。看看相应的代码,一般是这样的形式:ponents.组件名.其他内容,估计大概是这个组件之后,就可以去\data\scripts\components文件夹下搜索这个组件,然后阅读其中的代码了。结合原本拥有这个组件的预设物的相应代码阅读,会有助于你的理解。至于说理解能到什么程度,就全看编程经验的积累了,遇到不懂的地方,多找人求教就是(你说没人愿意回答?大家都很忙,愿意无偿给你解答,只是心情好,不愿意回答也是十分正常的,不妨多问几个人,或者多读点编程的书) 但有时候,我们不是想要添加新的物品和新功能,而是想要修改原有物品的功能,或者给原有物品添加新功能,怎么办呢?这时候就需要使用饥荒MOD提供的API接口了。AddPrefabPostInit(&prefab&,fn)修改预设物。Prefab为实体被定义的名字,也就是控制台c_give()、c_spawn()指令的参数。Fn是一个函数,内部定义具体的修改操作。AddPrefabPostInitAny(fn) 这个和上面的是差不多的,只是这个会针对每一个实体进行修改,加入判断语句之后就可以一次性修改你想要修改的某一类目标了。这两个函数是在游戏开始时载入一次,然后,在实体每次生成的时候,执行fn。所以切记,试图利用这个函数在游戏里动态修改实体属性,是做不到的,你必须想其他办法。至于说其他的API,这里不做介绍。官方提供的所有API,全部都定义在modutil.lua文件夹下,需要者可以自行查阅。 需要明白的是,component是这个游戏最精华的东西,也是最难的部分,因为component实在太多太杂了,涉及的内容也包括了饥荒这个游戏的方方面面,当你深入了解下去,你就会惊讶于component竟然可以做那么多事。
讲完了Prefab和Component,也该提一下StateGraphic和Brain。但实际上,这两部分用得少,算得上是高级修改了。本文作为入门教程,只能点到即止。想要具体的描述,还需另开一篇。我只能简单地说,StateGraphic是用于控制动画播放的,比如战斗。人物的combat组件控制伤害的输入和输出,而StateGraphic里的一个State:”attack”,则控制整个过程中的动画播放。而Brain,就是所谓的AI。饥荒里的AI,是用行为树的模式编写的,叶子节点写在behaviour文件夹下或者定义在生物的brain文件里,非叶子节点,则全部写在sript下的behaviour.lua里。 没有编程基础的人看到这段话肯定感觉云里雾里了,如果觉得难以理解,就请跳过。没有编程基础,要想理解行为树,相对来说还是比较困难的。
2017新游戏首选新游戏「修魔世界」1OO%免费新游戏_下载游戏1OO%送礼!2017新游戏_今日开测,下载游戏1OO%送微信红包!非RMB首选新游戏!
在这四个大类之外,还有两个在饥荒里非常常用的东西:事件和标签。善于利用他们,可以帮助你非常灵活地控制功能的触发,是十分强大的动态触发工具。 什么是事件呢?这里引用一位前辈czfshine的通俗解释:事件就是你按下鼠标,降低生命,主角死亡啊等,这一类的事情就叫做事件。你玩饥荒的时候,它每时每刻都在等待事件的发生,之后调用对应的事件处理函数,处理事件,再继续等待。 饥荒本身就有大量的原生事件,比如说”hungerdelta“在你的饥饿变化时就会触发,”killed”在你击杀生物时就会触发。那么要如何利用这些事件呢?这就需要使用到ListenForEvent(“evet”,fn)这个函数了。第一个参数是事件名,第二个参数是操作函数。这个函数的含义就是在监听到某个event发生的时候,触发fn。只要你能了解到什么时候会触发事件,你就可以利用这个函数,在触发事件的同时增加你想要的效果。比如说,我们希望在击杀时获得经验,就可以监听killed事件,然后在fn里写上获得经验的代码。那么我们要怎么了解有什么事件呢?除了平时编程、阅读他人代码获得积累之外,还有一个最直接的办法:在script文件夹下,使用文本搜索寻找PushEvent。触发事件的办法有很多,但PushEvent是最常用的。这个函数在使用时的写法是PushEvent(“event”,data={传递数据表}),比如说killed这个event,传递数据表里写的就是victim = murdered或者victim = ingredient之类的,等号左边是要保存在data里的数据,右边则是这次事件发生时,被击杀的目标。然后返回来看ListenForEvent,fn的参数也是固定的,前两个输入参数分别是inst和data。Inst就是当前监听函数的对象,data就是上面PushEvent用到的data。就说击杀这个事件,如果我们需要根据击杀对象不同来获取不同的经验,我们就需要知道击杀对象是谁,这时候,你根据前面PushEvent的表述,就可以知道,data.victim就是我们的击杀对象了。然后就可以进行进一步的操作了。利用PushEvent可以创造自己的事件,然后利用ListenForEvent监听,就可以灵活地选择函数触发的事件了。 特别地,有时候,我们希望只监听1次。比如说,我们想要设置,只有下一次击杀会给我们加BUFF。这时候就需要在监听结束后移除触发的函数,这就需要使用inst:RemoveEventCallback(&event&, fn) 例:local function onkill(inst,data)其他内容inst:RemoveEventCallback(&killed&,onkill)--当执行onkill的时候就会执行这一句,从而将onkill函数和killed这个事件区分开来。
end inst:ListentForEvent(“killed”,onkil) 附带一提,还有一个函数,和ListenForEvent的用法很像,就是WatchWorldState(&worldstate&, fn)这个是监测世界状态的,比如说有没有下雨啊,是不是月圆啊,现在是白天还是黑夜啊,季节啊之类的。具体的参数,请自己去搜索游戏的脚本文件,或者参考其他MOD的代码,这里就不多提了。和它相关的一个变量是TheWorld.state 然后说另外一个系统,标签系统。这个系统有三个重要函数添加标签AddTag 移除标签RemoveTag判断是否有标签 HasTag
这个系统主要用于对一类目标执行某种效果。比如说,蜘蛛,蜘蛛武士和蜘蛛女王,都带有spider标签,我们设计的一个击杀buff是,击杀蜘蛛后,一定时间内,攻击会附加毒伤害。你要是一个个写判断是蜘蛛,蜘蛛武士还是蜘蛛女皇,还有地下的各种蜘蛛,就会比较麻烦,代码也不够简洁。这时候,使用标签系统,判断是否有HasTag就非常方便而且简洁了。 以上只是这个系统的一种简单使用示例,实际上这个系统可以非常灵活地使用,具体还请自己在编程中积累经验。
我会告诉你我一个字都没看吗——————————那不就是游戏s吧,还不快点进去关注?
另外,顺带介绍一些常用的系统函数,注意使用时要区分大小写,如果在modmain中使用,那些没有前缀的,比如SpawnPrefab,需要添加GLOBAL声明。 SpawnPrefab(&prefabname&)--生成一个预设物inst.Transform:GetWorldPosition(x,y,z)-获取inst的位置inst.Transform:SetPosition(x,y,z)--将inst转移到地图坐标为(x,y,z)的地方FindEntity(inst, radius, fn, musttags,canttags, mustoneoftags)--寻找inst附近radius距离内的物品。local ents =TheSim:FindEntities(x,y,z,range, musthavetags, canthavetags, musthaveoneoftags)--寻找以(x,y,z)坐标点为圆心,range为半径范围内的东西,一般配合下面的遍历ents来使用for k,v in pairs(ents) do 要做的事情end 这里就不写具体怎么用了,随便参考一些MOD吧。
另外,许多常用的函数、常量等,可以在这些文件中找到定义entityscript.lua --全局脚本函数simutil.lua - 一些公用函数modutil - 全部的MOD APITUNING.lua - 一些关于游戏数值的设定,是常量constants.lua - 游戏里的一些常量设定,比如说燃料的类型,科技的等级等等。
第二章完。
第三章:几个常用示例的注释这一章主要讲几个常用的示例,有一些语句是标准的,必须写,了解它们的含义,有助于我们的编程。首先,我们需要在游戏根目录/mods文件夹下建立一个文件夹来保存我们的mod,不妨就叫mymod。 先来看看最基本的: modinfo.lua这个文件写在mymod的根目录下,用于保存MOD的信息和设置。每个mod都必须有这个文件。代码如下:name = &[DST]Samansha& --mod的名字description = &The princess of Elf&---mod的描述author = &dangdang&--mod的作者version = &1.0& -- Mod的版本,当你在创意工坊要想更新MOD的时候,版本必须不一样。forumthread = && klei论坛的下载地址,没有可以不写。 api_version = 10 --API版本,当前而言,联机版填10,单机版填6 dst_compatible = true --以下几个参数都是设置是否兼容的,第一个是联机版,后面三个分别是单机原版,巨人统治和海难dont_starve_compatible = falsereign_of_giants_compatible = falseshipwrecked_compatible = false all_clients_require_mod = true --联机版特有,当你要加入自己设计的图画的时候,必须在这一项填trueclient_only_mod = false --联机版特有,是否为客户端mod,如果填了true,上面的必须填false。icon_atlas = &modicon.xml& --以下两项控制mod的图标icon = &modicon.tex&
server_filter_tags = {&Samansha&,}--服务器标签,加载了这个mod的房间/服务器,会在房间信息的标签栏里显示相应的标签信息。 configuration_options = {} --mod设置,没有可以不写,
然后是第二个重要的文件:modmain.lua这个文件是mod的主函数,mod里所有的资源,最后都要经过这里传送到游戏里去。其中的内容非常复杂,这里只说些基本的部分,更多的请自己阅读其他人的mod去积累。代码如下:PrefabFiles = { --预设物文件表,你所有自己写的prefab脚本,都必须要在这里添加,才能使用。
&samansha&,
&hat_eyeshade&,} Assets = { --添加材质文件,包括动画啊,图片什么的,都在这里添加。不过在这里只需要添加在modmain函数中会用到的部分,prefab专属的材质文件不需要放在这里。
Asset( &IMAGE&,&images/saveslot_portraits/samansha.tex& ),
Asset( &ATLAS&,&images/saveslot_portraits/samansha.xml& ),} 其他的,需要注意,modmain运行时,是一个独立的环境,如果需要使用全局变量或常量,如TUNING,SpawnPrefab,都需要添加GLOBAL声明,如:local TUNING = GLOBAL.TUNING 所有的MOD API,也必须写在这个文件里。需要注意的是,如果是联机版,API在客机上运行时,有可能会产生错误。建议添加如下指令:If GLOBAL.TheNet:GetIsServer()
then --这一句判断当前电脑是否为主机API内容end其他的内容,这里就不说了,太多太杂,还是参考其他mod好了。
要设置一个新的Prefab,假设名字为myprefab,则必须要在mymod/scrpits/prefabs下添加一个文件,文件名写成myprefab.lua 然后在modmain.lua的PrefabFiles表内写入”myprefab” 。在给出这个prefab的注释之前,先说一下基本的概念,每个prefab的的结尾,都有类似这样的语句return Prefab(&common/inventory/spear&, fn, assets)Prefab是系统提供的一个创建预设物的函数,第一个参数,最后一个斜杠后填的是你的prefab的名字,而前面那一段,则建议参考同类prefab来填写,比如说长矛是物品栏物品,就是common/inventory,如果是蜘蛛,是怪物,就是common/monster。 第二个参数fn,则是描述这个prefab的主函数,实际上,一个prefab,不管代码写得多长,最后所有的信息,都要集中到这个fn里来处理。所以如果你想了解一个prefab的信息,直接看这个prefab的fn就可以了。第三个,就是所附加的材质了,就是图片,动画之类的东西。 然后,就拿最简单的长矛来做个示例吧:(原注释来自猪哥,我部分修改) local assets={
Asset(&ANIM&, &anim/spear.zip&),--加载长矛 放在地面状态的 动画
Asset(&ANIM&, &anim/swap_spear.zip&),--加载长矛 拿在手上的动画}local function onfinished(inst)
inst:Remove()--耐久用完后,移除长矛这个物体endlocal function onequip(inst, owner)
owner.AnimState:OverrideSymbol(&swap_object&, &swap_spear&, &swap_spear&)--装备长矛后,持有者的状态 加上长矛的状态,第一个参数是对应持有武器的手的位置,第二个参数是动画的build名称,第三个参数是动画的bank名称
owner.AnimState:Show(&ARM_carry&) --装备长矛后,持有者 持有之手
owner.AnimState:Hide(&ARM_normal&) --装备长矛后,持有者 空闲之手
隐藏 (在动画里,持有手
空闲手 是 在一起的,根据不同的情况 来选择 谁隐藏 谁显示)endlocal function onunequip(inst, owner)
owner.AnimState:Hide(&ARM_carry&) --卸下长矛后,持有者 持有之手
owner.AnimState:Show(&ARM_normal&) ----卸下长矛后,持有者 空闲之手
显示(原理同上)endlocal function fn(Sim)
local inst = CreateEntity()--定义inst这个变量,初始化,创造这个物体,变量名为inst
local trans = inst.entity:AddTransform()--为inst这个实体 增加 Transform 标准组件,Transform负责的是 实体的大小,位置,形状等等。local anim = inst.entity:AddAnimState()--为inst这个实体 增加 AnimState 标准组件, AnimState负责 实体 的 动画效果,颜色滤镜等等。
MakeInventoryPhysics(inst)--这个定义的是inst这个实体 的 物理系统, 这个标准组建参考 scripts/standardcomponents.lua,里面有队友各个Make啥啥啥Physics函数的定义
anim:SetBank(&spear&)--动画效果 的 bank名称,bank就是 动画模板的 轮廓,控制的是 动画中 所有对应像素 的范围和边界(我只能理解到这一步)--本文作者附言:现在新增加的理解是,bank还控制着所有的动画。
anim:SetBuild(&spear&)--动画效果 的 build名称,build就是 动画 的模型,比如长矛的 具体像素分布,即长矛长啥样 (注意,这句话和前一句话指的是 长矛放在地面的状态,拿在手上的状态看前面 装备长矛后 的注释)
anim:PlayAnimation(&idle&)--动画效果初始化,比如长矛出现时 第一眼是什么动画, 就是&idle&这个静止状态,关于动画的话,在data/anim文件夹内有 各种zip文件,需要用ktools转换成spriter可以查看的scml文件,从scml文件的动画列表里就有各种动画状态,比如“idle”就是之一
inst:AddTag(&sharp&)--这个是增加“sharp”标签Tag,关于Tag的应用,是方便其他文件或组件进行不同情况的筛选 的作用。在此&sharp&这个Tag目前 我还不知道是什么作用
nst:AddComponent(&weapon&)--增加 武器 组件,长矛是武器嘛
ponents.weapon:SetDamage(TUNING.SPEAR_DAMAGE)--设置武器攻击力,里面的TUNING是指 在scripts/tuning.lua里定义了 SPEAR_DAMAGE这个常量的数值。
inst:AddComponent(&finiteuses&)--增加 有限耐久 组件,长矛作为武器 是有耐久的嘛
ponents.finiteuses:SetMaxUses(TUNING.SPEAR_USES)--设置 最大耐久
ponents.finiteuses:SetUses(TUNING.SPEAR_USES)--设置 当前耐久,一般情况下,崭新的长矛的 当前耐久=它的最大耐久, 在有些情况 比如彩蛋里或迷宫里的箱子,不一定是满的耐久
ponents.finiteuses:SetOnFinished( onfinished )
--设置 长矛用完的时候该怎么办,看看前面定义的 onfinished函数,就是移除长矛。 很多道具耐久用完就 删除本身,但是 矿工帽和 提灯 就不会,就是因为这个函数定义的不同咯。
inst:AddComponent(&inspectable&)--增加 检阅组件,就是 玩家 检查/查看 长矛,会说对应的 话
inst:AddComponent(&inventoryitem&)
--增加 物品栏物品 组件, 长矛当然可以放在 物品栏或容器里 啦
inst:AddComponent(&equippable&)--增加 可装备 组件,长矛 当然 装备后才能战斗嘛。
ponents.equippable:SetOnEquip( onequip )
--装备 长矛后,调用onequip函数,前面有定义
ponents.equippable:SetOnUnequip( onunequip ) -- 卸下长矛后,调用onunequip函数
return inst --刚开始
local inst = CreateEntity() 这句话只是创建长矛这个物体的开始,通过后面的代码逐渐完善, 直到这句
return inst 就正式说明 长矛这个物体定义完成了!!!endreturn Prefab( &common/inventory/spear&, fn, assets)
-- return inst 之后 并不能 把定义好的 长矛 归为 游戏正规的物品啊,那么 这句话 return Prefab 就是把长矛这个物体 加载完成,fn是定义长矛的主函数,assets是长矛的材质 附言:在联机版中,还需要在fn函数体中加入如下代码inst.entity:AddNetwork() --添加网络变量,如果你想要你的prefab被其他人看到的话必须添加if not TheWorld.ismastersim then --这个判断是否是主机,因为这些信息只在主机上运行计算,计算好之后再把信息传递到客机上。return inst
endinst.entity:SetPristine()--字面意思是设置初始化,具体什么用途我还没搞清楚,但几乎每个联机版的prefab都有这句话。
人物MOD教程的代码代码其实这部分内容,很多人都会用,Klei论坛的教程也写的非常清楚,所以只搬运klei论坛的Dleowolf 的mod示例,有关图片导入,请参考老崔的教程:教程贴内的网盘有人物示例MOD下载。这里只讲解其中部分代码的含义,但要想真正理解,还是需要自己实际动手操作一遍。要创建一个MOD人物,需要设置Modmain.lua和人物的prefab脚本两部分。 Modmain.lua的部分代码PrefabFiles = {--同上面的modmain部分,这里不再多解释&esctemplate&,}Assets = {--同上面的modmain部分,这里不再多解释
Asset( &IMAGE&, &images/saveslot_portraits/esctemplate.tex& ),
Asset( &ATLAS&, &images/saveslot_portraits/esctemplate.xml& ),
Asset( &IMAGE&, &images/selectscreen_portraits/esctemplate.tex& ),
Asset( &ATLAS&, &images/selectscreen_portraits/esctemplate.xml& ),
Asset( &IMAGE&, &images/selectscreen_portraits/esctemplate_silho.tex& ),
Asset( &ATLAS&, &images/selectscreen_portraits/esctemplate_silho.xml& ),
Asset( &IMAGE&, &bigportraits/esctemplate.tex& ),
Asset( &ATLAS&, &bigportraits/esctemplate.xml& ),Asset( &IMAGE&, &images/map_icons/esctemplate.tex& ),Asset( &ATLAS&, &images/map_icons/esctemplate.xml& ),Asset( &IMAGE&, &images/avatars/avatar_esctemplate.tex& ),
Asset( &ATLAS&, &images/avatars/avatar_esctemplate.xml& ),Asset( &IMAGE&, &images/avatars/avatar_ghost_esctemplate.tex& ),
Asset( &ATLAS&, &images/avatars/avatar_ghost_esctemplate.xml& ),}--一些预设置的内容。前面说过了,modmain的运行环境是独立于游戏的,要调用游戏的变量/常量,就需要GLOBAL声明。local require = GLOBAL.requirelocal STRINGS = GLOBAL.STRINGS-- 人物选择界面的字符串STRINGS.CHARACTER_TITLES.esctemplate = &The SampleCharacter& --人物的头衔,就是选择界面头上那一串文字STRINGS.CHARACTER_NAMES.esctemplate = &Esc& --人物的名字STRINGS.CHARACTER_DESCRIPTIONS.esctemplate = &*Perk 1\n*Perk2\n*Perk 3& --人物的描述,\n为换行符号,最多填三行。STRINGS.CHARACTER_QUOTES.esctemplate =&\&Quote\&& --人物的格言 -- 人物的特别话语,就是在检查物品,攻击怪物之类的活动时会说的话。STRINGS.CHARACTERS.ESCTEMPLATE = require&speech_esctemplate&--话语文件的名字,保存在scipts文件夹下。如果没有的话,可以用默认的speech_wilson -- 人物在游戏里的名字,与前面显示在选人界面的不同,这个是在游戏里显示的。STRINGS.NAMES.ESCTEMPLATE = &Esc& -- 其他人点到这个人物时会说的话,根据不同的状态说不同的话。STRINGS.CHARACTERS.GENERIC.DESCRIBE.ESCTEMPLATE ={GENERIC = &It&#39;sEsc!&,ATTACKER = &That Esclooks shifty...&,MURDERER =&Murderer!&,REVIVER = &Esc, friend ofghosts.&,GHOST = &Esc could use aheart.&,} --添加小地图图标AddMinimapAtlas(&images/map_icons/esctemplate.xml&) -- 添加人物到游戏中,第一个是人物的名字,第二个是性别,男为male,女为female,无性可以不填。AddModCharacter(&esctemplate&,&FEMALE&)
人物的Prefab文件部分:local MakePlayerCharacter = require &prefabs/player_common&--读取游戏里创建人物的文件player_common的信息,--需要注意的是,MakePlayerCharacter函数,单机和联机不同,单机只有一个fn,而联机有common_postinit,和master_postinit,前者是说要主机、客机都要执行的,后者是只在主机上执行的。对没有编程基础的人来说,要判断这个是比较困难的,只需要知道,大部分时候,全部写在主机执行的部分是没错的。除了像地图图标之类的,需要客机也接收的信息才会写在客机执行部分。还有某些特殊的情况,比如按键触发的,也需要些在客机执行里,否则客机无法执行按键触发)--MakePlayerCharacter本身是内置了Prefab的,实际上人物创建是也是一个Prefab的创建,但官方把很多常用的内容都打包起来了,我们只需要在官方的基础上添加自己的内容,节约了我们编写代码的时间。local assets = { --一系列的材质文件,注意你自己的文件添加在最下面。
Asset(&ANIM&, &anim/player_basic.zip& ),
Asset(&ANIM&, &anim/player_idles_shiver.zip& ),
Asset(&ANIM&, &anim/player_actions.zip& ),
Asset(&ANIM&, &anim/player_actions_axe.zip& ),
Asset(&ANIM&, &anim/player_actions_pickaxe.zip& ),
Asset(&ANIM&, &anim/player_actions_shovel.zip& ),
Asset(&ANIM&, &anim/player_actions_blowdart.zip& ),
Asset(&ANIM&, &anim/player_actions_eat.zip& ),
Asset(&ANIM&, &anim/player_actions_item.zip& ),
Asset(&ANIM&, &anim/player_actions_uniqueitem.zip& ),
Asset(&ANIM&, &anim/player_actions_bugnet.zip& ),
Asset(&ANIM&, &anim/player_actions_fishing.zip& ),
Asset(&ANIM&, &anim/player_actions_boomerang.zip& ),
Asset(&ANIM&, &anim/player_bush_hat.zip& ),
Asset(&ANIM&, &anim/player_attacks.zip& ),
Asset(&ANIM&, &anim/player_idles.zip& ),
Asset(&ANIM&, &anim/player_rebirth.zip& ),
Asset(&ANIM&, &anim/player_jump.zip& ),
Asset(&ANIM&, &anim/player_amulet_resurrect.zip& ),
Asset(&ANIM&, &anim/player_teleport.zip& ),
Asset(&ANIM&, &anim/wilson_fx.zip& ),
Asset(&ANIM&, &anim/player_one_man_band.zip& ),
Asset( &ANIM&,&anim/shadow_hands.zip& ),
Asset(&SOUND&, &sound/sfx.fsb& ),
Asset(&SOUND&, &sound/wilson.fsb& ),
Asset(&ANIM&, &anim/beard.zip& ),
Asset(&ANIM&, &anim/esctemplate.zip& ),---这就是我们要自己添加的材质,比如说人物的图像以及一些特殊的动画都添加在这下面,上面的部分请不要动。
Asset(&ANIM&, &anim/ghost_esctemplate_build.zip& ),}--在定义这个人物时,会用到的prefab,比如说你想给人物在某些时候添加prefab特效,就需要把那个特效的名字填在这里local prefabs = {} -- 开局物品,注意,如果要给多个同一物品,需要多次填写,同上,需要用逗号隔开。local start_inv = {} -- 当这个人物恢复成人的时候执行这个函数local function onbecamehuman(inst)
--设置人物的移动和跑动速度(在道路上的时候)
ponents.locomotor.walkspeed= 4
ponents.locomotor.runspeed= 6end -- 当读取游戏或者生成这个人物的时候执行这个函数local function onload(inst)
inst:ListenForEvent(&ms_respawnedfromghost&, onbecamehuman) 监听从幽灵状态复活成人的事件,一旦监听到就触发onbecamehuman
if notinst:HasTag(&playerghost&) then
onbecamehuman(inst)
-- 这个函数会在主机和客机上都执行,标签可以添在这里local common_postinit = function(inst)
--添加小地图图标
inst.MiniMapEntity:SetIcon(&esctemplate.tex& )end -- 这个函数只在主机上执行,大多数组件都添加在这里local master_postinit = function(inst)
--选择你的人物的声音(可以选择自己导入的,关于声音的导入请参考klei论坛的教程)
inst.soundsname= &willow&
--如果选择韦伯或者女武神的声音,就需要添加这一条,去掉前面的--
--inst.talker_path_override = &dontstarve_DLC001/characters/&
--设置人物的初始三围
ponents.health:SetMaxHealth(150)
ponents.hunger:SetMax(150)
ponents.sanity:SetMax(200)
--设置伤害系数
bat.damagemultiplier = 1
--设置饥饿倍率
ponents.hunger.hungerrate=1*TUNING.WILSON_HUNGER_RATE
--设置读取存档和新生成人物时执行的函数,用于保存信息等,是中级的内容,此处不讲解。
inst.OnLoad = onload
inst.OnNewSpawn = onloadend--返回MakePlayerCharacter,完成人物创建。return MakePlayerCharacter(&esctemplate&, prefabs, assets, common_postinit,master_postinit, start_inv) 第三章完。
支持,收藏了慢慢学
好厉害    ------为什么选择你的会是区区的我呢?
本来我还想做一个人物MOD,后来看了你的攻略贴之后。特别是函数2字,我整个人都go die了
有什么相关的软件(编程的,制作图片的tex,xml)?
mod教程贴必须顶,另外问问能不能转载,还有,希望你来饥荒mod制作吧
这种帖子多一点就太好了,很多人眼里贴吧就是小学生盖楼扯淡的根据地,然而我觉得获取有用资源的时候还是贴吧高效。支持。
贴吧热议榜
使用签名档&&
保存至快速回贴}

我要回帖

更多关于 很少有人知道 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信