@sogouwap
2018-01-02T08:52:34.000000Z
字数 3318
阅读 6549
前言
本教程由小灰编写。
我们的QQ群:139659650
点击上面列表中的
LV
改变学习等级。
这个教程学习下来需要多少时间?
你需要花一些时间直到你掌握它,并且每天都要坚持编写代码。根据理解力的不同,需要的时间也不一样(三个月,六个月,或一个星期)
我需要准备什么样的系统来实践?
你需要 Windows 7~10 或者 Windows XP 系统。
这个是插件的基础模块。必须注册不然插件无法编译
FakeMeta模块可以为我们写插件做出许多帮助,他可以 设置或获取游戏中数据,以便我们进行修改或添加
Hamsandwich 是一个多功能的模块,主要提供事件注册
引擎模块,一般不常用(不推荐使用,因为这个模块的代码比较难记)
Fun模块,很多插件都会见到使用他的身影,他可以为 初学者 提供不太复杂的代码。
比如修改生命值,修改重力,设定/取消 无敌模式 等效果。
但是 以上 都可以通过 fakemeta 来一举拿下。
所以 fun 模块 只是提供一个方便初学者修改游戏数据的模块
在代码中会见到 [ ]
包含起来的部分,这个地方就叫数组
示例:
new abc[33] //数组最大值是33
浮点值也就是带小数点的值(比如 : 123.0
, 521.5
)
对于代码来说。
变量前面有 Float:
这样的就是浮点值(又叫 浮点变量
)
示例:
new Float:abc //声明一个名字叫 abc 的浮点变量
在游戏中会有无数的事件。
比如
- 开枪
- 装填子弹
- 掏出武器
- 新的一局
- 复活
- 死亡
- 造成伤害
- 子弹击中墙壁
...(省略)
这些都是事件,可以通过 hamsandwich
来勾住,以实现我们下一步的目的
对于插件来说,不同的模块注册方法也不同
fakemeta
模块,事件的注册方法是:
register_forward(事件名, "触发什么函数")
hamsandwich
模块,事件的注册方法是:
RegisterHam(事件名, "为了什么实体注册", "触发什么函数")
注意:
一些特殊的事件
是fakemeta
或hamsandwich
不能兼容注册的
比如:复活事件
只能由hamsandwich
模块中的事件注册
但玩家思考,用Hamsandwich
和FakeMeta
模块中的事件都可以注册
返回是一种很常见的代码,在代码中是 return
这样的代码
他的作用是,不在当前函数中继续往下执行
示例:
public test(id)
{
if(abc > 0) return //如果abc变量的值大于0,那么返回不在该函数中继续往下执行
client_print(id, print_chat, "Hello World")
}
如上表示, 当 abc
变量 >
0 的时候,就会返回。所以下面的 client_print
内容,就不会在游戏中显示出来
返回值是一种特殊的传递方法。他一般是在 return
后面接上一些英文代码或者数字
示例:
public test(id)
{
if(abc > 0) return 1
return 0
}
请注意:
返回值使用不当会造成插件无法编译,主要的原因是其中一个return
后面没有接上应有的返回值,而函数中其他的return
后面都有返回值,这种情况下会出现无法编译
例子:返回值错误的写法
public test(id)
{
if(abc > 0) return
return 0
}
这样这个函数在 `编译器` 编译的时候就会报告 `返回值不统一` 的错误,导致插件无法编译
当我们想知道游戏经过了多长时间的时候,我们应该怎么办呢
我们可以用
get_gametime()
来获取游戏所经过的时间
提示:
和现实中的时间略有不同。例如游戏中运行15分钟
通过get_gametime()
就会得到返回值900.0
get_gametime() 的返回值是浮点
我们可以获取到现在的游戏经过时间
配合 client_print
来写的话会变成下面这样
client_print(id, print_chat, "GameTime: %.2f", get_gametime() )
当我们知道游戏时间是做什么的了,那么怎么来用它呢。
我们会在很多地方用到这个 get_gametime()
特别是一些计算复杂的插件中
那么怎么来利用呢?我们可以配合之前学的 数组
来存储他
SaveTime[id] = get_gametime()
这样可以给单独的一个玩家存储时间,也可以像下面这样为全局
存储一个时间,他不针对某一个玩家
SaveTime = get_gametime()
提示:
数组的变量名字可以随意更改
,你自己记得出就行
当我们学会如何获取
游戏时间后,现在我们可以尝试来为他加点判断来使用
它
1. if( SaveTime[id] < get_gametime())
2. if( SaveTime[id] > get_gametime())
3. if( SaveTime[id] <= get_gametime())
4. if( SaveTime[id] >= get_gametime())
上面这样的一些判断,分别意味着
如果存储的时间
小于当前游戏时间
如果存储的时间大于当前游戏时间
如果存储的时间小于等于
当前游戏时间
如果存储的时间大于等于
当前游戏时间代码写法注意
<=(大于等于)
和>=(小于等于)
总是=
号在右边,如果把=
号写到了左边,如=<
、=>
这样的两种情况均无法被编译器
成功编译。
#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, " < 小于 当前游戏时间")
}
}