请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册
查看: 1523|回复: 13

CS2D Lua 零基础入门教程

[复制链接]
发表于 2017-11-16 22:58:42 | 显示全部楼层 |阅读模式

马上注册,结实更多好友,浏览不受限制!

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

x
一.前言:
欢迎来到CS2D教程,这仅仅是一个Lua的基础教程,如果你想更加深入的了解你可以去http://www.lua.org了解更多[英文]
请持续关注这个帖子,Lua教程我会尽量写的通俗易懂,方便大家理解
二.介绍:
Lua是一个脚本语言,被应用于许多游戏里面,比如GMOD,而且这种语言清楚易懂,你不用花费很长时间就能轻松入门,要对自己有信心!
三.创建你的第一个Lua:
在创建之前你需要去知道一个东西:
1.你最好用Notepad++来编写Lua,事实也证明他是最好的编辑器之一
2.在CS2D执行Lua是在新建游戏->更多设置->mp_luaserver里面执行的,比如server.lua我们称它为触发Lua
这就相当于一个导火索,在这个导火索中你可以启动更多的Lua或者只执行这一个。

1.png
现在我们正式开始我们的第一个Lua:
在sys/lua文件夹下右键->新建一个文本文档,我们修改它的名字为cs2dcn.lua,再用Notepad++打开,你的第一个Lua就创建好了
要想知道它是否有用?
我们可以写入下面的代码测试一下,其中msg()里面的东西是在CS2D里面输出这段代码。
addhook('join','join')
        function join()
                msg('hello World')
        end

保存,执行触发Lua
2.png
是不是看到了hello World?
对的,你的Lua已经被CS2D识别并且执行了
四.变量

是不是对前面的一段代码很好奇?想了解为什么会这样?别急,我们先来讲讲变量。
变量其实很好理解,就是会变的数量,但是这个东西不止局限于数量,比如:

name='小明'
age='18'

在这里面,name就是一个变量,而age也是一个变量,不同的是,现在如果你想输出name,他已经不叫name了,而叫小明
如果你想使用这个量,那直接打name就好了,系统会自动把name代替成小明
我们做一个实验:

addhook('join','join')
    function join()
        name='Xiao ming'
        msg(name)
    end

3.png
是不是理解了,name已经成了xiao ming 了,因为我已经把变量name赋值成了Xiao Ming,在输出的时候他会name自动替换成Xiao Ming
当然,变量的赋值也是可以运算的,比如

addhook('join','join')
    function join()
        age=10+12
        msg(age)

输出的结果是22
但是你要注意,如果

age="10+12"

那么输出的将会是10+12,而不是24,这就是字符串和运算之间的区别,看有没有打引号
当然,变量之间也是可以运算的,
比如:

addhook('join','join')
        function join()
                age1=10
                age2=12
                msg(age1+age2)
        end

输出的将是22

除了变量之外,我们还需要认识一个东西叫做数组
比如:

boss={"小明","小张","小红"}

用{}括起来我们叫做数组,有什么用呢?我们做个试验:
addhook('join','join')
        function join()
                boss={'xiaoming','xiaozhang','xiaohong'}
                print(boss[1])
                print(boss[2])
                print(boss[3])
        end

这次为什么不用msg了呢?因为boss[]里面是一个数组,而不是字符串所以无法被识别,我们用print把他显示在控制台里面
4.png
是不是完整的显示出来了呢?没错,boss[]指定一个数组,而里面的顺序是指boss数组里面第几个,好好理解一下。
五.Function和Hook
恭喜你进入了本章中最重要的部分!
首先我要解释一下什么是Function和Hook
Function在Lua语言就是函数的意思,他执行一些函数命令,而Hook就是钩子的意思,他是CS2D预定义的几个变量,
而在我的理解里,Hook就是监听服务器里面玩家的作用来做出反应。现在你可能听不懂,但是没关系!


addhook('say','sayfunc')
    function sayfunc(id,text)
        msg('Player'..player(id,'name')..'said'..text)
    end

首先这个addHook包括两个部分,一个是say,一个是sayfunc
say也就是说的意思,是一个特殊的hook,sayfunc是一个function
如果有玩家在服务器里面说话了(也就是执行了说这个say这个动作),这个函数就会启动,也就是执行了sayfunc,所以后面的function sayfunc()就会启动
不但会启动,而且会给这个function两个东西,也就是给id和text赋了值,这时id会变成1,而text变成了id为1的玩家说的话
比如:一个玩家叫Tom,他说:今天你吃饭了吗?
这时,Hook检测到了,哦,有玩家说话了,兄弟们干活了!!!执行了一个叫sayfunc的函数(第一行作用)
谁说的?id为1的玩家,他就会把id这个变量赋值为1,说了什么?就会把text赋值为今天你吃饭了吗?(第二行作用)
我们看看第三行是什么意思?
msg是一个命令,是显示一个信息在每个玩家的屏幕上
'Player'为一个字符串,只会打印在你的屏幕上
..两个点是把字符串和变量连接起来的东西,也就是第一个Player和第二个Player(id,'name')
Player(id,'name')是一个CS2D的命令,会给一个信息关于这个玩具,第一个参数是一个玩家的id,第二个参数是你想知道玩家什么东西,name就是名字的意思
Player(id,'name')只会给你一个玩家的昵称,而不会给你id
..同样是一个连接符,把Player(id,'name')和字符串'said'连接起来
'said'为一个字符串,同样,也只会打印在屏幕上
text为一个变量,前面我们已经知道了,text已经被赋值为今天你吃饭了吗?
end为结束一个函数,也就是解除一个函数,也就是解除sayfunc这个函数 5.png
我们开始看下面一个例子

addhook('join','joinfunc')
    function joinfunc(id)
        msg('Welcome '..player(id,'name')..' Join Server')
    end

同样,先建立一个addhook,hook为join,也就是当玩家加入服务器时启动joinfunc这个函数
这个hook只会赋值一个变量,也就是id
这个hook的说明,借助百度翻译你会大概知道什么意思
http://www.cs2d.com/help.php?hookcat=all
6.png
第三行为输出的信息:欢迎某某某加入服务器.
看,是不是很简单?

六.循环和判定
循环主要是for和while循环,而判定一般是if
我们先从if说起,

if(变量1==变量2) then
    执行一个函数
end

我们还是拿代码举例

addhook('say','sayfunc')
    function sayfunc(id,text)
        if (text == 'hello') then
                msg('Player'..player(id,'name')..'said hello')
        end
    end


如果text为hello,if里面的函数才会执行,也就是在所有人的屏幕上打印出某某某玩家说了Hello,如果你说XD,则不会有任何显示
注意:
=为赋值
==为比较

numble=1
while(numble<10) do
        一个函数
end

while后面的括号为判定条件,如果numble小于10的话,他会一直执行下面的函数
但是有一个问题你必须注意,1是永远小于10的,这样的话下面的函数会一直执行,这样就会导致服务器卡顿而崩溃,所以我们必须设定一个条件让他能停下来

numble=1
while(numble<10) do
        numble=numble+1
end


每次numble都会递增1,这样当numble为11的时候就会自动停下来!


相比递增,我还是建议大家用for循环

for i=1,10,1 do
        一个函数
end


for后面的括号有三个参数,第一个是初始值1,第二个是当i=10的时候结束,第三个为每次i递增的值
看,这样是不是很方便?

addhook ("minute", "minutefunc")  --这个是每分钟执行一个的hook
function minutefunc() --因为每分钟并不能给你什么参数,所以括号一般为空
   for i = 1, 32, 1 do --for循环,我们使用32为结束循环,因为一个服务器最大人数为32个
      if (player(i, "exists")) then  --如果一个玩家的id存在的话,就会执行下面的函数
         msg2(i, "Hello, this script is a cs2dcn") --msg2有两个参数,第一个是id,第二个是你想告诉这个id玩家什么东西
      end --结束if
   end --结束for
end --结束function

最后我给大家布置一个作业,我如果想做一个管理员界面,只有我说!admin的时候msg出玩家某某某为管理员,改怎么做呢?
游客,如果您要查看本帖隐藏内容请回复



回复

使用道具 举报

发表于 2017-11-17 02:33:55 | 显示全部楼层
似乎cs原版也支持这种脚本,我玩cs制图也有一段时间,我们群里有人提到过
这个脚本能支持很多游戏吗
回复

使用道具 举报

 楼主| 发表于 2017-11-17 11:29:53 | 显示全部楼层
求生的兔 发表于 2017-11-17 02:33
似乎cs原版也支持这种脚本,我玩cs制图也有一段时间,我们群里有人提到过
这个脚本能支持很多游戏吗 ...

的确很多游戏支持
这是我在百度上找到的答案
https://www.zhihu.com/question/21717567
回复

使用道具 举报

发表于 2017-11-24 15:03:53 | 显示全部楼层
。。。。。。。。。
回复

使用道具 举报

发表于 2017-11-26 15:40:35 | 显示全部楼层
不是luaserver执行吗为何说是luamap?
回复

使用道具 举报

 楼主| 发表于 2017-11-26 16:43:31 | 显示全部楼层
bilibili-秦缺 发表于 2017-11-26 15:40
不是luaserver执行吗为何说是luamap?

已经改了,谢谢
回复

使用道具 举报

发表于 2017-11-26 17:14:05 | 显示全部楼层
倦意 发表于 2017-11-26 16:43
已经改了,谢谢

不谢。。。
但我这边有一个问题。。。
发帖子了。。。
回复

使用道具 举报

发表于 2017-11-29 17:22:21 | 显示全部楼层
eeeeeeeeeeeeeeeeee
回复

使用道具 举报

发表于 2017-12-19 00:20:58 | 显示全部楼层
呃,关于for循环这里
如果是这样
  1. if (i = 1,32,1) do
复制代码
会报错显示
  1. expected near (
复制代码

如果这样
  1. if i = 1,32,1 do
复制代码

则会正常执行,而网上说正常的lua执行for循环就如此,例如
  1. for var=exp1,exp2,exp3 do  
  2.     <执行体>  
  3. end  
复制代码



点评

嗯  发表于 2017-12-19 00:34
回复

使用道具 举报

发表于 2018-1-13 21:26:06 | 显示全部楼层
这游戏为玩家名字能设置成一样的,很坑爹
回复

使用道具 举报

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

本版积分规则