[关闭]
@sogouwap 2018-01-02T08:52:34.000000Z 字数 3318 阅读 5975

Lv.1 入门 — AMXX插件编写教程


前言

本教程由小灰编写。

标题

我们的QQ群:139659650

快速切换

点击上面列表中的 LV 改变学习等级。

常见问题

这个教程学习下来需要多少时间?
你需要花一些时间直到你掌握它,并且每天都要坚持编写代码。根据理解力的不同,需要的时间也不一样(三个月,六个月,或一个星期)

我需要准备什么样的系统来实践?

你需要 Windows 7~10 或者 Windows XP 系统。



一、插件模块(Modules)

AMXMODX

这个是插件的基础模块。必须注册不然插件无法编译

FakeMeta

FakeMeta模块可以为我们写插件做出许多帮助,他可以 设置或获取游戏中数据,以便我们进行修改或添加

Hamsandwich

Hamsandwich 是一个多功能的模块,主要提供事件注册

Engine

引擎模块,一般不常用(不推荐使用,因为这个模块的代码比较难记)

Fun

Fun模块,很多插件都会见到使用他的身影,他可以为 初学者 提供不太复杂的代码。
比如修改生命值,修改重力,设定/取消 无敌模式 等效果。
但是 以上 都可以通过 fakemeta 来一举拿下。 
所以 fun 模块 只是提供一个方便初学者修改游戏数据的模块

二、数组变量以及什么是浮点值

什么是数组?

在代码中会见到 [ ] 包含起来的部分,这个地方就叫数组

示例:

  1. new abc[33] //数组最大值是33

浮点是什么?

浮点值也就是带小数点的值(比如 : 123.0 , 521.5 )

对于代码来说。
变量前面有 Float: 这样的就是浮点值(又叫 浮点变量 )

示例:

  1. new Float:abc //声明一个名字叫 abc 的浮点变量

三、注册事件

3.1 什么是事件?

在游戏中会有无数的事件。

比如

  1. 开枪
  2. 装填子弹
  3. 掏出武器
  4. 新的一局
  5. 复活
  6. 死亡
  7. 造成伤害
  8. 子弹击中墙壁
    ...(省略)

这些都是事件,可以通过 hamsandwich 来勾住,以实现我们下一步的目的

3.2 怎么注册事件?

对于插件来说,不同的模块注册方法也不同

fakemeta 模块,事件的注册方法是:

  1. register_forward(事件名, "触发什么函数")

hamsandwich 模块,事件的注册方法是:

  1. RegisterHam(事件名, "为了什么实体注册", "触发什么函数")

注意:
一些特殊的 事件fakemetahamsandwich 不能兼容注册的
比如:复活事件 只能由 hamsandwich 模块中的事件注册
但玩家思考,用 HamsandwichFakeMeta 模块中的事件都可以注册

四、返回以及返回值

4.1 什么是返回?

返回是一种很常见的代码,在代码中是 return 这样的代码
他的作用是,不在当前函数中继续往下执行

示例:

  1. public test(id)
  2. {
  3. if(abc > 0) return //如果abc变量的值大于0,那么返回不在该函数中继续往下执行
  4. client_print(id, print_chat, "Hello World")
  5. }

如上表示, 当 abc 变量 > 0 的时候,就会返回。所以下面的 client_print 内容,就不会在游戏中显示出来

4.2 返回值是什么?

返回值是一种特殊的传递方法。他一般是在 return 后面接上一些英文代码或者数字

示例:

  1. public test(id)
  2. {
  3. if(abc > 0) return 1
  4. return 0
  5. }

请注意:
返回值使用不当会造成插件无法编译,主要的原因是其中一个 return 后面没有接上应有的返回值,而函数中其他的 return 后面都有返回值,这种情况下会出现无法编译

例子:返回值错误的写法

  1. public test(id)
  2. {
  3. if(abc > 0) return
  4. return 0
  5. }
这样这个函数在 `编译器` 编译的时候就会报告 `返回值不统一` 的错误,导致插件无法编译

五、GameTime 游戏时间

5.1 获取 Time

当我们想知道游戏经过了多长时间的时候,我们应该怎么办呢

我们可以用

  1. get_gametime()

来获取游戏所经过的时间

提示:
和现实中的时间略有不同。例如游戏中运行 15分钟
通过 get_gametime() 就会得到返回值 900.0

get_gametime() 的返回值是浮点

我们可以获取到现在的游戏经过时间
配合 client_print 来写的话会变成下面这样

  1. client_print(id, print_chat, "GameTime: %.2f", get_gametime() )

5.2 存储 Time

当我们知道游戏时间是做什么的了,那么怎么来用它呢。

我们会在很多地方用到这个 get_gametime() 特别是一些计算复杂的插件中

那么怎么来利用呢?我们可以配合之前学的 数组 来存储他

  1. SaveTime[id] = get_gametime()

这样可以给单独的一个玩家存储时间,也可以像下面这样为全局存储一个时间,他不针对某一个玩家

  1. SaveTime = get_gametime()

提示:
数组的变量名字可以随意更改,你自己记得出就行

判断以及使用 Time

当我们学会如何获取游戏时间后,现在我们可以尝试来为他加点判断来使用

  1. 1. if( SaveTime[id] < get_gametime())
  2. 2. if( SaveTime[id] > get_gametime())
  3. 3. if( SaveTime[id] <= get_gametime())
  4. 4. if( SaveTime[id] >= get_gametime())

上面这样的一些判断,分别意味着

如果存储的时间 小于当前游戏时间
如果存储的时间 大于当前游戏时间
如果存储的时间 小于等于 当前游戏时间
如果存储的时间 大于等于 当前游戏时间

代码写法注意
<=(大于等于)>=(小于等于) 总是 = 号在右边,如果把 = 号写到了左边,如 =<=> 这样的两种情况均无法被编译器成功编译。

5.3 示例 Time

  1. #include <amxmodx> //注册需要什么模块
  2. new Float:savetime[33] //新建全局数组(浮点)
  3. public plugin_init()
  4. {
  5. //注册插件基础信息("插件名字", "版本", "插件作者")
  6. register_plugin("GetTime", "1.0", "Hui")
  7. //获取当前游戏时间
  8. register_clcmd("say /get", "gettime_func")
  9. //存储当前游戏时间到 变量中
  10. register_clcmd("say /savetime", "savetime_func")
  11. //触发判断以让插件决定大于还是小于
  12. register_clcmd("say /else", "else_func")
  13. }
  14. public gettime_func(id)
  15. {
  16. client_print(id, print_chat, "现在时间是: %.2f", get_gametime() )
  17. }
  18. //存储当前时间到变量 `数组` 中
  19. public savetime_func(id)
  20. {
  21. //数组中存储 `get_gametime()` 所获取到的时间
  22. savetime[id] = get_gametime()
  23. }
  24. //判断数组中存储的时间是否大于当前游戏时间
  25. public else_func(id)
  26. {
  27. //如果存储变量中的时间 `大于` 当前游戏时间
  28. if(savetime[id] > get_gametime())
  29. {
  30. client_print(id, print_chat, " > 大于当前游戏时间")
  31. }
  32. if(savetime[id] < get_gametime())
  33. {
  34. client_print(id, print_chat, " < 小于 当前游戏时间")
  35. }
  36. }

Tutorial End -入门教程结束

你可以查看 上一章(初级) / 下一章(普通)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注