饥荒新手吧 关注:10,557贴子:49,722

7—10【教程】饥荒代码编写

取消只看楼主收藏回复

教你如何编写饥荒代码,有兴趣的来看看
不定时更


IP属地:江苏来自Android客户端1楼2014-07-10 17:22回复
    我正在组织言辞,看看从哪儿说起


    IP属地:江苏来自Android客户端4楼2014-07-10 17:52
    回复
      首先,我们要知道,饥荒是由lua语言写的
      如果你想仔细的了解lua,可以自行百度<<lua程序设计>>(只要你看的懂……)
      其实,饥荒的语言挺容易懂得的,根本不用这么高级的东东


      IP属地:江苏来自Android客户端5楼2014-07-10 18:00
      回复
        lua里一切都是变量,变量的类型有许多,但有三个较为特殊的:true,false,nil
        true表示真,说明什么是对的、有用的,在饥荒里就是说这个功能有用。
        false,即假,于true相对
        nil的用法表示删除此变量,就像没有用过一样


        IP属地:江苏来自Android客户端6楼2014-07-10 18:19
        收起回复
          举几个变量的例子
          ———1
          .牛醒着也可剪牛毛
          用记事本打开游戏目录\data\scripts\prefabs\beefalo文件,将下列内容:
          inst.components.beard.canshavetest = function() if not inst.components.sleeper:IsAsleep() then return false, "AWAKEBEEFALO" end return true end--这里的false表示牛醒时不能剪牛毛
          替换为:
          inst.components.beard.canshavetest = function() if not inst.components.sleeper:IsAsleep() then return true, "AWAKEBEEFALO" end return true end--第一个true表示牛醒着也可以剪牛毛
          ————2
          制造石墙的代码
          Recipe("wall_stone_item", {Ingredient("cutstone", 2)}, RECIPETABS.TOWN, TECH.SCIENCE_TWO,nil,nil,nil,6)--nil就没有的值,空值。最后一个6表示一次造6个。
          通常(别的物品)这个6是没有的就像这样(陷阱) Recipe("trap", {Ingredient("twigs", 2),Ingredient("cutgrass", 6)}, RECIPETABS.SURVIVAL, TECH.NONE),于是,这里被自动写入nil
          但并不是说明造不出陷阱,lua中nil不等于0


          IP属地:江苏来自Android客户端7楼2014-07-10 18:43
          回复
            看懂了不,如果看懂了,接下来进逻辑运算;没有的话我继续讲


            IP属地:江苏来自Android客户端8楼2014-07-10 18:45
            收起回复
              接下来讲逻辑运算,这些是运算符号
              <小于 >大于 ==等于 <=小于或等于 >=大于或等于 ~=不等于 +加 -减 *乘 /除 ^幂
              相信只要你的数学不是体育老师教的,应该能看懂
              逻辑运算也有特殊的:and, or
              从左往右,and求false,true求true
              饥荒里常用它们作控制语句,或赋值,例子见下楼


              IP属地:江苏来自Android客户端11楼2014-07-11 20:51
              收起回复
                —————1
                1<2
                2>1
                1==1
                1~=2
                ……
                —————2
                a and b,如果a为真,则看b
                a or b,如果a为假,则看b


                IP属地:江苏来自Android客户端12楼2014-07-11 21:01
                回复
                  —————3
                  这是眼睛炮台里的一句,赋予眼睛炮台攻击目标
                  local function retargetfn(inst)
                  local newtarget = FindEntity(inst, 20, function(guy)
                  return guy.components.combat and --敌人在攻击而且满足CanTarget
                  inst.components.combat:CanTarget(guy) and
                  (guy.components.combat.target == GetPlayer() or GetPlayer().components.combat.target == guy)--怪物的攻击目标是主角或主角攻击目标是怪物
                  end)
                  return newtarget
                  end


                  IP属地:江苏来自Android客户端13楼2014-07-11 21:13
                  收起回复
                    —————4
                    not guy:AddTag("monst")
                    把这句加例3进去就是不攻击有怪物属性的生物


                    IP属地:江苏来自Android客户端14楼2014-07-11 21:26
                    收起回复
                      看懂了不,如果看懂了,接下来讲控制语句;没有的话我继续讲


                      IP属地:江苏来自Android客户端15楼2014-07-11 21:30
                      收起回复
                        饥荒里主要有2种控制语句
                        if,for
                        if的格式有好几种
                        #if 条件 then 功能 end--如果条件满足,那么使用功能
                        #if 条件 then 功能1 else 功能2 end--如果条件满足,使用功能1,否则使用功能2
                        #if 条件1 then 功能1 elseif 条件2 then 功能2…… end--如果满足条件1使用功能1,如果没满足条件1且满足条件2则使用功能2……
                        #if 条件1 then 功能1 elseif 条件2 then 功能2……else 功能 end--如果满足条件1使用功能1,如果没满足条件1且满足条件2则使用功能2……如果都没有满足使用功能
                        for是循环变量,格式
                        #for 要变量的值=初始值,终点值,步进值 do 功能 end--作用见例子,我实在无法用语言表达


                        IP属地:江苏来自Android客户端17楼2014-07-12 09:13
                        收起回复
                          —————1
                          先发给你们一个简单的例子
                          (print是输出的意思)
                          if 1+1=2 then print(true) end
                          if 1+1=2 then print(true) else print(false) end
                          if 1+1=2 then print(true) elseif 1+2=2 then print(false) end
                          if 1+1=2 then print(true) elseif 1+2=3 then print(true) else print(false) end
                          for i = 1,10,2 do print(i) end


                          IP属地:江苏来自Android客户端18楼2014-07-12 09:22
                          回复
                            ——————2
                            这是关于wes气球的代码
                            inst:AddComponent("balloonmaker")
                            inst:DoTaskInTime(0, function() if not GetPlayer() or GetPlayer().prefab ~= "wes" then inst:Remove() end end)--如果不是主角或主角不是wes,那么气球消失
                            这就是为什么别的主角用外挂召唤气球出不来的原因


                            IP属地:江苏来自Android客户端19楼2014-07-12 09:33
                            回复
                              —————3
                              这是易宁修改中的收割者里的一段代码
                              local function HearPanFlute(inst, musician, instrument)
                              local pos = Vector3(inst.Transform:GetWorldPosition())
                              local ents = TheSim:FindEntities(pos.x,pos.y,pos.z, 30)
                              for k,v in pairs(ents) do--对于k来说,v在ents的的范围里,那么
                              if v.components.pickable and v.prefab ~= "flower" then--如果v能够被采摘,且不是花,那么
                              v.components.pickable:Pick(GetPlayer())--东西采摘给主角
                              end
                              if v.components.crop then
                              v.components.crop:Harvest(GetPlayer())
                              end
                              end
                              end


                              IP属地:江苏来自Android客户端20楼2014-07-12 09:38
                              收起回复