3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 侠客前传 | 刺客信条 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 26293|回复: 42
打印 上一主题 下一主题

[MOD专区] 【饥荒MOD教程】原创好少,难道太难了吗?我来添把火!!

  [复制链接]

41

主题

2407

帖子

2902

积分

游戏达人

Rank: 7Rank: 7Rank: 7

贡献度
277
金元
17540
积分
2902
精华
4
注册时间
2011-8-6
QQ
跳转到指定楼层
主题
发表于 2013-5-15 01:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 slxc920113 于 2013-5-16 20:32 编辑

1. 首先科普一下lua这种脚本语言
Lua 是一个小巧的脚本语言。作者是巴西人。该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。
Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。
一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。
参考文献:

2.  一些使用lua语言的游戏
《愤怒的小鸟》中关卡文件,一代以后的文件已经加密了,无法直接用文本编辑器打开,需要转码。
《战神的挑战2》中data文件,http://bbs.3dmgame.com/Puzzle_Quest_2,数据包直接用zip压缩,解压即可看到。
大量网页游戏的数据库文件,这就不举例。

3.  lua基本语法
熟悉C/C++java等各种其他语言的请无视之……基本一样。
一、数据类型
和javascript、perl等脚本语言一样,Lua是动态类型语言,变量不要类型定义。
Lua有8种数据类型:nilbooleannumberstringuserdatafunctionthreadtable
  nil代表无、空值,等价于C语言中的nullVB中的empt
  Boolean代表关系运算中的布尔值,值为truefalse,在一些其他语言中也写成0或非0
  Number代表实数,可以是整型、长整型、浮点型……
  String代表字符型,即常说的文本类型。和python一样, Lua中字符串是不可以修改的,只能生成新的字符串。转义字符、ASCII码和C语言完全一样。
  Function是函数,不解释。
  Userdatathread暂时用不到,请无视之……
二、表达式
  算术运算符:+ - * / ^ (加减乘除幂)
  关系运算符:<  >  <= >=  ==  ~=返回结果为false或者true
  逻辑运算符:and  or  not(不认识这个的向小学老师忏悔去……)
  连接运算符:print("Hello" .. "World")    -->Hello World。注意“..”的前后要加空格。
  表的构造(即数组):和C语言不同的是,lua的数组是从1而不是0开始数的。
例如:days = {"Sunday", "Monday","Tuesday", "Wednesday", "Thursday","Friday", "Saturday"}
print(days[4])        --> Wednesda

三、语法
  赋值:a = "hello".. "world"
  局部变量:local  i = 1
  结构语句:
if 条件 then 命令 end;  
if条件then命令else命令end;   
if 条件then命令elseif 条件 then 命令else 命令end;
while 条件do 命令; end;
repeat命令; until 条件;
for var=初始值,结束值,步长 do命令 end
还有一种遍历for,不好简单表示,会拿具体的函数说明。
break语句用来退出当前循
return用来从函数返回结果
4.  具体的MOD教程开始了,请注意听讲哦……
先看官方给的sample,好吧,允许我吐槽一下,从来没见过比这个更简单的官方MOD教程。
--[[
***************************************************************
Created by: JamieCheng
Date: February 20,2013
Description: Samplemod that shows how to:
       - add post init functions for prefabs,components, simulation
       - edit tuning values
       - create your own component
***************************************************************
]]--
解释:--[[*******]]--里面的都是注释,这种格式代表多行注释,不知道神马叫做注释的自行度娘。
--special post-initfunction for Wilson
解释:--*****也是注释,这种格式表示单行注释,就是从--开始到本行结束都是注释内容。
functionwilsonpostinit(inst)
定义了一个名叫wilsonpostinit的函数,变量inst,至于什么是inst,估计表示当前对象吧。
       print "hello wilson init!"
输出hello wilson init!,就像Hello World一样吧,好经典。
       --halve wilson's max hunger oninitialization
看注释的意思是在初始化的时候修改威尔逊的最大饥饿值。
       inst.components.hunger:SetMax(TUNING.WILSON_HUNGER*0.5)
将对象instcomponents中的hunger的值设置为TURNINGWILSON_HUNGER的值的0.5倍。表达有点奇怪,确实不好说明,”.”表示的是节点,这儿components.hunger表示data\scripts \components\hunger.lua文件,TUNING.WILSON_HUNGER表示data\scripts\turning.lua文件中WILSON_HUNGER = 150,--stomach size这一句。
       --add your owncomponent, defined in mods/[yourmodname]/scripts/components/myowncomponent.lua
上面注释的意思就是,添加自定义component的方法,把文件丢到mods/[你的mod文件夹]/scripts/components/[自定义的文件].lua
       inst:AddComponent("myowncomponent")
为当前对象添加一个名叫“myowncomponent”的Component
functiongamepostinit()
       print "hello game init!"
       --if you want to load your own prefabs,this is where you'd do it
       --TheSim: LoadPrefabDefs(MODROOT.."prefabs.xml")
这是说明添加物品的方法,具体例子以后介绍。
end
--override specifictuning values here!
TUNING.WILSON_HUNGER = 50
这个是修改TUNING文件中的值,TUNING文件中保存了大量初始定义值,通过上面这中格式进行修改

MOD实例说明:

第一类:覆盖型,就是data中的文件进行修改,然后放到mod文件夹下的相同根目录。

举个例子,more_harvest,论坛里面有收获10个蔬菜,一锅煮10个,都是这一类。
具体制作过程:
1. 在mod文件夹下新建一个文件夹,比如more_harvest,这也是你的mod的名称。
2. 然后找到需要修改的文件,直接先拷贝过来。data\scripts\ components\ crop.lua,打开看一下,发现一个函数function Crop:Harvest(harvester),游戏的函数命名习惯很好,直接从字面上了解意义:Crop下面的Harvest子函数,(收获粮食)。
function Crop:Harvest(harvester)--注意变量是harvester,就是说这个函数只作用于采集者
    if self.maturedthen--如果self(指作物)成熟了,然后
                    local product = SpawnPrefab(self.product_prefab)--刷出将当前作物代表的prefab物品,赋值给局部变量product
            harvester.components.inventory:GiveItem(product)为采集者的inventory中添加物品,因为inventory属于components的子文件,所以必须写成harvester.components.inventory
         ProfileStatsAdd("grown_"..product.prefab)
         self.matured =false--后面一系列文件是清除对象,就是已经收获了,全部清零
         self.growthpercent = 0
         self.product_prefab= nil
         self.grower.components.grower:RemoveCrop(self.inst)
         self.grower = nil
         return true
     end
end
3.开始修改,比如需要一次收获10
harvester.components.inventory:GiveItem(product)这句多运行几遍,那么就多获得几次物品
比如改成:local num = 1
           for num = 1,10 do
           harvester.components.inventory:GiveItem(SpawnPrefab(self.product_prefab))
          end
表示循环运行10
当然最笨的办法,直接把harvester.components.inventory:GiveItem(SpawnPrefab(self.product_prefab))复制粘贴十遍
再比如,无限收获次数。
self.matured= false
self.growthpercent= 0
self.product_prefab = nil
self.grower.components.grower: RemoveCrop(self.inst)
self.grower = nil
这几句全部无效化,改成注释,就是在前面添加”--”
--self.matured= false
--self.growthpercent= 0
--self.product_prefab = nil
--self.grower.components.grower: RemoveCrop(self.inst)
--self.grower = nil
4. 注册MOD,在文件夹下创建modmain.lua文件,随便写点注释。
5. 安装MOD,别告诉我你不会……
Ps:那个一锅煮10个和这个原理一模一样,可以自己尝试修改。

我再举一个其他的例子,笼中的鸟儿。文件scripts\prefabs\ birdcage.lua
第一个函数:
local function ShouldAcceptItem(inst, item)
       local seed_name =string.lower(item.prefab .. "_seeds")--这个很有意思哦,种子名称(seed_name)赋值为物品名称(item.prefab)加上seeds,还记得前面说的,”..”是连接符。
       local can_accept =item.components.edible and (Prefabs[seed_name] or item.prefab =="seeds" or item.components.edible.foodtype == "MEAT") --这儿是决定鸟儿吃什么,首先得是可食的(item.components.edible),并且必须是种子(包括有种子的粮食)或肉。
       if item.prefab =="egg" or item.prefab == "bird_egg" or item.prefab =="rottenegg" or item.prefab == "monstermeat" then
              can_accept =false
       end--然后进一步,如果符合上面的情况之后,物品是蛋、鸟蛋、臭鸡蛋、怪物肉的话,不接受(can_accept= false
       return can_accept
end
如果把这些条件修改了,比如if之后到end无效化,那么鸟儿就可以吃蛋、鸟蛋、臭鸡蛋、怪物肉,
如果再进一步,把local can_accept = item.components.edible and(Prefabs[seed_name] or item.prefab == "seeds" oritem.components.edible.foodtype == "MEAT")改成local can_accept =item.components.edible那么鸟儿就什么都吃
如果再进一步,直接--local can_accept……(无效化),天哪,那是饕餮吗?真不挑食。

后面一个函数
local function OnGetItemFromPlayer(inst, giver, item)
    ifitem.components.edible then
              localseed_name = string.lower(item.prefab .. "_seeds")
              localcan_accept = Prefabs[seed_name] or item.prefab == "seeds" oritem.components.edible.foodtype == "MEAT"
              if can_acceptthen--上面这部分和前面一样哦
                     inst.AnimState: PlayAnimation("peck")
                     inst.AnimState: PushAnimation("peck")
                     inst.AnimState: PushAnimation("peck")
                     inst.AnimState: PushAnimation("hop")--这四句是动作,不用管
                     inst.AnimState: PushAnimation("idle_bird",true)
                         inst: DoTaskInTime(60*FRAMES, function()
                         ifitem.components.edible.foodtype == "MEAT" then--如果吃的是肉,下蛋
                                   inst.components.lootdropper:SpawnLootPrefab("bird_egg")
                            else
                                if Prefabs[seed_name] then--如果吃的是种子或蔬菜
                                       localnum_seeds = math.random(2)--种子数目,随机数0-2
                                       fork = 1, num_seeds do
                                             inst.components.lootdropper:SpawnLootPrefab(seed_name)--拉出种子
                                       end
                                          ifmath.random() < .5 then
                                                 inst.components.lootdropper:SpawnLootPrefab("seeds")
                                          end
                                else
                                          inst.components.lootdropper:SpawnLootPrefab("seeds")
                                end
                            end
                  end)
              end
    end
end
修改:
如果要鸟儿多下几个蛋,比如10个,修改nst.components.lootdropper:SpawnLootPrefab("bird_egg")方法和前面收获10个一样
如果要鸟儿拉10颗种子,local num_seeds = math.random(2)改成local num_seeds = 10
貌似大家对MOD这种影响平衡的东东不感冒,算了……

评分

4

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏25
回复

使用道具 举报

0

主题

66

帖子

105

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1050
积分
105
精华
0
注册时间
2013-4-30
舒服的沙发
发表于 2013-5-15 01:57 | 只看该作者
不难是不难可是就是懒,直接回复下载多省事~
回复 支持 反对

使用道具 举报

0

主题

2192

帖子

2418

积分

游戏达人

Rank: 7Rank: 7Rank: 7

贡献度
173
金元
17264
积分
2418
精华
0
注册时间
2009-6-3
硬硬的板凳
发表于 2013-5-15 07:28 | 只看该作者
谢谢分享!
回复 支持 反对

使用道具 举报

22

主题

802

帖子

672

积分

超级玩家

Rank: 5Rank: 5

贡献度
38
金元
5204
积分
672
精华
0
注册时间
2009-7-19
冰凉的地板
发表于 2013-5-15 08:50 | 只看该作者
是没什么需要,影响平衡性的东西不想搞,我主要对资源重生有需要,现在在玩冒险模式,什么mod都不装。
回复 支持 反对

使用道具 举报

4

主题

63

帖子

120

积分

中级玩家

Rank: 3Rank: 3

贡献度
4
金元
1038
积分
120
精华
0
注册时间
2013-4-20
5#
发表于 2013-5-15 12:54 | 只看该作者
这个必须要顶啊
回复 支持 反对

使用道具 举报

10

主题

594

帖子

418

积分

高级玩家

Rank: 4

贡献度
10
金元
3779
积分
418
精华
0
注册时间
2011-4-20
6#
发表于 2013-5-15 17:09 | 只看该作者
没学过语言的看得脑瓜生疼
回复 支持 反对

使用道具 举报

26

主题

1313

帖子

1205

积分

游戏狂人

Rank: 6Rank: 6

贡献度
61
金元
9614
积分
1205
精华
0
注册时间
2009-9-24
7#
发表于 2013-5-15 17:43 | 只看该作者
LZ你手打的啊  真牛逼!!
回复 支持 反对

使用道具 举报

5

主题

1748

帖子

1938

积分

游戏狂人

Rank: 6Rank: 6

贡献度
158
金元
13058
积分
1938
精华
0
注册时间
2008-8-17
8#
发表于 2013-5-15 23:26 | 只看该作者
真心谢谢lz的分享了~最起码不会那么一抹黑什么都不知道了~正在学习中~
回复 支持 反对

使用道具 举报

4

主题

226

帖子

222

积分

中级玩家

Rank: 3Rank: 3

贡献度
9
金元
1861
积分
222
精华
0
注册时间
2009-11-28
9#
发表于 2013-5-16 14:15 | 只看该作者
有没有关于各种载入点、回调函数,事件以及访问域方面的资料。
回复 支持 反对

使用道具 举报

41

主题

2407

帖子

2902

积分

游戏达人

Rank: 7Rank: 7Rank: 7

贡献度
277
金元
17540
积分
2902
精华
4
注册时间
2011-8-6
QQ
10#
 楼主| 发表于 2013-5-16 20:25 | 只看该作者
kasor 发表于 2013-5-16 14:15
有没有关于各种载入点、回调函数,事件以及访问域方面的资料。

script文件夹,不包括子文件夹下的很多都是了,但是修改的话,可能影响很大,还容易出错。
比如main.lua、action.lua、worldgen_main.lua
回复 支持 反对

使用道具 举报

4

主题

226

帖子

222

积分

中级玩家

Rank: 3Rank: 3

贡献度
9
金元
1861
积分
222
精华
0
注册时间
2009-11-28
11#
发表于 2013-5-16 21:07 | 只看该作者
本帖最后由 kasor 于 2013-5-16 21:18 编辑
slxc920113 发表于 2013-5-16 20:25
script文件夹,不包括子文件夹下的很多都是了,但是修改的话,可能影响很大,还容易出错。
比如main.lua ...

我不是想改这些内容,我只是想知道具体怎么查和怎么做。
比如我目前的问题包括这些:

1 从哪里查询某事物的载入函数,形如monsterPrefabPostInit wallPrefabPostInit 我想知道初始化载入函数有哪些 虽然我现在知道了很多,但是都是从各种mod的代码中分析出来的,按理来说应该有一个文件对这些载入点做了定义,暂时没找到。
2 访问域,如何确定一个lua文件的访问域以及其中的变量的访问域,因为我最近在组合mod的时候发现有些情况下不能访问GLOBAL.下的函数,而且自己写全局变量试了几种写法都不成功(我企图在mod间传值)
3 回调函数的具体做法,比如workable.lua中如何定义一个working事件的调用
4 如何自定义事件,这个问题我一直没找到例子。
回复 支持 反对

使用道具 举报

88

主题

3915

帖子

3516

积分

游戏精英

Rank: 8Rank: 8

贡献度
226
金元
26118
积分
3516
精华
0
注册时间
2009-4-15
12#
发表于 2013-5-17 01:33 | 只看该作者
...看的眼晕。
看了上面的完全没有能力改什么。只想TXT加减个什么简单命令。
回复 支持 反对

使用道具 举报

53

主题

1689

帖子

2771

积分

游戏达人

Rank: 7Rank: 7Rank: 7

贡献度
50
金元
25707
积分
2771
精华
0
注册时间
2011-7-8
13#
发表于 2013-5-17 15:02 | 只看该作者
这游戏MOD的API有吗?
回复 支持 反对

使用道具 举报

1

主题

233

帖子

200

积分

中级玩家

Rank: 3Rank: 3

贡献度
3
金元
1883
积分
200
精华
0
注册时间
2010-4-9
14#
发表于 2013-5-21 22:28 | 只看该作者
这尼玛必须有啊,准备做个汽车,有美工联系我
回复 支持 反对

使用道具 举报

0

主题

22

帖子

12

积分

新手玩家

Rank: 1

贡献度
0
金元
715
积分
12
精华
0
注册时间
2012-8-14
15#
发表于 2013-5-22 01:12 | 只看该作者
感谢楼主,学习了
回复 支持 反对

使用道具 举报

1

主题

21

帖子

77

积分

初级玩家

Rank: 2

贡献度
1
金元
730
积分
77
精华
0
注册时间
2012-2-8
16#
发表于 2013-6-3 18:45 | 只看该作者
相当nice
回复 支持 反对

使用道具 举报

17

主题

1129

帖子

1721

积分

游戏狂人

Rank: 6Rank: 6

贡献度
202
金元
9027
积分
1721
精华
1
注册时间
2011-11-30
17#
发表于 2013-6-4 16:26 | 只看该作者
不知楼主还在不在啊,我想修改wx-78机器人在下雨时San掉率*4

在WX-78的LUA里定义Sanity.lua的function Sanity:Recalc(dt),变成inst.components.sanity:Recalc(dt),这个DT不像定义血量那样简单,不知道怎么设定额,求教

以下是完整的sanity文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

7

主题

492

帖子

599

积分

高级玩家

Rank: 4

贡献度
26
金元
4949
积分
599
精华
0
注册时间
2009-10-27
18#
发表于 2013-6-24 18:50 | 只看该作者
已经收藏,感谢分享
回复 支持 反对

使用道具 举报

0

主题

27

帖子

14

积分

新手玩家

Rank: 1

贡献度
0
金元
735
积分
14
精华
0
注册时间
2013-5-8
19#
发表于 2013-6-28 16:17 | 只看该作者
技术贴必须顶
回复 支持 反对

使用道具 举报

1

主题

141

帖子

164

积分

中级玩家

Rank: 3Rank: 3

贡献度
1
金元
1601
积分
164
精华
0
注册时间
2011-1-4
20#
发表于 2013-7-4 15:25 | 只看该作者
高森,看不到
回复 支持 反对

使用道具 举报

0

主题

323

帖子

275

积分

高级玩家

Rank: 4

贡献度
0
金元
2746
积分
275
精华
0
注册时间
2011-8-11
21#
发表于 2013-7-6 13:49 | 只看该作者
谢谢分享、、
回复 支持 反对

使用道具 举报

0

主题

323

帖子

275

积分

高级玩家

Rank: 4

贡献度
0
金元
2746
积分
275
精华
0
注册时间
2011-8-11
22#
发表于 2013-7-6 19:54 | 只看该作者
谢谢分享  求继续 、、
回复 支持 反对

使用道具 举报

4

主题

580

帖子

412

积分

高级玩家

Rank: 4

贡献度
4
金元
3962
积分
412
精华
0
注册时间
2011-9-8
23#
发表于 2013-7-6 19:57 | 只看该作者
计算机专业的路过。。。
回复 支持 反对

使用道具 举报

4

主题

295

帖子

352

积分

高级玩家

Rank: 4

贡献度
4
金元
3359
积分
352
精华
0
注册时间
2013-1-25
24#
发表于 2013-7-6 20:35 | 只看该作者
好东西 刘明
回复 支持 反对

使用道具 举报

6

主题

373

帖子

502

积分

高级玩家

Rank: 4

贡献度
6
金元
4775
积分
502
精华
0
注册时间
2013-1-19
25#
发表于 2013-7-26 10:25 | 只看该作者
哇唔   自己试着做一个
回复 支持 反对

使用道具 举报

0

主题

73

帖子

94

积分

初级玩家

Rank: 2

贡献度
13
金元
1016
积分
94
精华
0
注册时间
2013-7-26
26#
发表于 2013-8-3 14:11 | 只看该作者
技术贴顶dddddd
回复 支持 反对

使用道具 举报

0

主题

57

帖子

106

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1055
积分
106
精华
0
注册时间
2013-9-4
27#
发表于 2013-10-16 17:38 | 只看该作者
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

11

帖子

68

积分

初级玩家

Rank: 2

贡献度
0
金元
680
积分
68
精华
0
注册时间
2013-1-13
28#
发表于 2013-10-23 19:52 | 只看该作者
好强啊,这是逼我学习的节奏啊!我对电脑的了解全部来源于游戏
回复 支持 反对

使用道具 举报

0

主题

23

帖子

12

积分

新手玩家

Rank: 1

贡献度
0
金元
720
积分
12
精华
0
注册时间
2013-11-26
29#
发表于 2013-11-26 23:35 | 只看该作者
MOD什么的屌爆了,MOD制作学习中,期待吧!远离伸手党中向大神靠近
回复 支持 反对

使用道具 举报

0

主题

23

帖子

12

积分

新手玩家

Rank: 1

贡献度
0
金元
720
积分
12
精华
0
注册时间
2013-11-26
30#
发表于 2013-11-27 00:40 | 只看该作者

MOD什么的屌爆了,MOD制作学习中,期待吧!远离伸手党中向大神靠近
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|咖绿茵|求知网|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2024-4-20 03:26 , Processed in 0.152865 second(s), 46 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表