[关闭]
@longfei 2017-01-01T01:42:01.000000Z 字数 1850 阅读 2358

动作实战

本文介绍如何向游戏中添加新动作。
在实践之前推荐阅读我写的动作详解,以了解动作的基本概念。

用到的MOD API:

实例下载

Don'tStarve ModAPI实战 Mod教程


添加动作

下面以给人物添加一个徒手砍树的动作为例子
t0.bmp-233.2kB
t2.bmp-128.1kB

流程

  1. 编写一个动作 - 设置id,名字,触发效果
  2. 注册这个动作 - 让游戏知道有这个动作存在
  3. 将动作与组件绑定 - 设定动作的触发的条件
  4. 将动作与state绑定 - 设定动作触发时播放的动画

下面分别编写各部分代码,按顺序拼接起来写在modmain.lua里。

预定义

在下面会需要使用一些游戏中全局变量,这些全局变量在modmain的运行环境中不存在,需要从GLOBAL表中获取,预定义好,否则会报nil错误。

  1. local ACTIONS = GLOBAL.ACTIONS
  2. local ActionHandler = GLOBAL.ActionHandler

编写动作

  1. local id = "PUNCHTREE" --必须大写,动作会被加入到ACTIONS表中,key就是id
  2. local name = "徒手砍树" --随意,会在游戏中能执行动作时,显示出动作的名字
  3. local fn = function(act) -- 动作触发的函数。传入的是一个BufferedAction对象。可以通过它直接调用动作的执行者,目标,具体的动作内容等等,详情请查看bufferedaction.lua文件,也可以参考actions.lua里各个actionfn
  4. if act.target.components.workable ~= nil and
  5. act.target.components.workable:CanBeWorked() and
  6. act.target.components.workable.action == ACTIONS.CHOP then
  7. act.target.components.workable:WorkedBy(act.doer,1)
  8. return true
  9. end
  10. end

注册动作

  1. AddAction(id,name,fn) -- 将上面编写的内容传入MOD API,添加动作

绑定组件

在这里需要动一动脑筋。选择要和哪个组件进行绑定,绑定成什么类型,设定怎样的条件可以触发动作,全凭个人喜好。

  1. local type = "SCENE" -- 设置动作绑定的类型
  2. local component = "workable" -- 设置动作绑定的组件
  3. local testfn = function(inst, doer, actions, right) -- 设置动作的检测函数,如果满足条件,就向人物的动作可执行表中加入某个动作。right表示是否是右键动作。
  4. if inst:HasTag("CHOP_workable") and doer:HasTag("player") then
  5. table.insert(actions, ACTIONS.PUNCHTREE)
  6. end
  7. end
  8. AddComponentAction(type, component, testfn)

绑定state

在联机版中添加新动作需要对wilson和wilson_cient两个sg都进行state绑定。

此处选择的state最好是整个执行过程中某个阶段带有inst:PerformBufferedAction()语句的。这条语句是触发动作的fn用的。如果整个state里没有这句,则动作的fn是不会触发的,也就不会达到你预期的效果。

推荐使用的官方state: dostandingaction,doshortaction,dolongaction,dojostleaction

除此之外你也可以自行编写state,自己控制播放什么动画,何时触发动作的fn等等。需要注意的是主机端和客机端在这上面的代码是有区别,具体请参考官方的代码。

  1. local state = "dojostleaction" -- 设定要绑定的state
  2. AddStategraphActionHandler("wilson",ActionHandler(ACTIONS.PUNCHTREE, state))
  3. AddStategraphActionHandler("wilson_client",ActionHandler(ACTIONS.PUNCHTREE,state))
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注