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

插件模块(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 的浮点变量

注册事件

什么是事件

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

比如:

  • 开枪
  • 装填子弹
  • 掏出武器
  • 新的一局
  • 复活
  • 死亡
  • 造成伤害
  • 子弹击中墙壁
  • …(省略)

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

怎么注册事件

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

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

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

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

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

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

返回以及返回值

什么是返回

返回是一种很常见的代码,在代码中是return这样的代码

他的作用是,不在当前函数中继续往下执行

示例:

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

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

返回值是什么

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

示例:

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

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

例子:返回值错误的写法

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

这样这个函数在编译器编译的时候就会报告返回值不统一的错误,导致插件无法编译

GameTime游戏时间

获取Time

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

我们可以用

1
get_gametime()

来获取游戏所经过的时间

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

get_gametime()的返回值是浮点

我们可以获取到现在的游戏经过时间

配合client_print来写的话会变成下面这样

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

存储Time

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

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

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

1
SaveTime[id] = get_gametime()

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

1
SaveTime = get_gametime()

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

判断以及使用Time

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

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

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

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

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

示例Time

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

参考文献

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