|
发表于 2008-4-18 15:56:32
|
显示全部楼层
|阅读模式
来自 中国–广东–深圳–福田区
- // plugin's main information
- #define PLUGIN_NAME "Anti Silent Run"
- #define PLUGIN_VERSION "0.1.2"
- #define PLUGIN_AUTHOR "VEN"
- #include <amxmodx> //包含 amxmode.inc 文件
- #include <fakemeta> //包含 fakemeta.inc文件
- #define MAX_CLIENTS 32 //宏定义 用max_clients 代替 32
- new Float:g_view_ofs[MAX_CLIENTS + 1][3] //定义全局浮点型二维数组 g_view_ofs[33][3] 个人理解它是一个存放视觉偏移量的二维数组
- #define VEC_VIEW 17.0 //初始高度为 17.0 不知理解是否正确
- #define VEC_DUCK_VIEW 12.0 //蹲下高度为 12.0 不知理解是否正确
- new const g_player_hull[] = { //不知是什么意思.请大虾帮忙解释一下.
- HULL_HUMAN,
- HULL_HEAD
- }
- //初始化插件
- public plugin_init() {
- register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR) //注册插件 其中的三个参数在宏定义时已经有定义过了.
- register_forward(FM_PlayerPreThink, "fwPlayerPreThink") //注册消息响应函数...函数名为fwPlayerPreThink
- register_forward(FM_PlayerPostThink, "fwPlayerPostThink") //注册消息响应函数...函数名为fwPlayerPostThink
- }
- public fwPlayerPreThink(id) {
- if (!is_user_alive(id) || !(pev(id, pev_button) & IN_DUCK)) //如果ID为id的玩家死亡状态 或 获取到ID为id玩家的按钮与IN_DUCK(理解为蹲键)不符
- return FMRES_IGNORED //这里的返回值不理解!应该是忽略掉还是直接返回?
- pev(id, pev_view_ofs, g_view_ofs[id]) //返回视觉偏移量的值
- return FMRES_HANDLED
- }
- public fwPlayerPostThink(id) {
- //当ID为id玩家的视觉偏移量 不等于 17.0 或 玩家死亡状态 或 玩家的按钮与IN_DUCK(理解为蹲键)不符 或 第四个条件不明白是什么意思
- //这里为什么一定要g_view_ofs[id][2] 而不是 g_view_ofs[id][0]或g_view_ofs[id][1]??
- if (g_view_ofs[id][2] != VEC_VIEW || !is_user_alive(id) || !(pev(id, pev_button) & IN_DUCK) || pev(id, pev_fuser2))
- return FMRES_IGNORED
- pev(id, pev_view_ofs, g_view_ofs[id]) //返回视觉偏移量的值
- if (g_view_ofs[id][2] != VEC_DUCK_VIEW)
- return FMRES_IGNORED
- static Float:vec1[3], Float:vec2[3], Float:size_z //定义两个浮点型数组,一个浮点型变量
- pev(id, pev_size, vec1) //返回vec1的大小?理解是否正确?
- size_z = vec1[2] //将vec1[2]的值赋给size_z...此时size_z == 0 ?是否正确?
- pev(id, pev_origin, vec1) //返回vect1的初始值?理解是否正确?
-
- //下面代码应该是这个插件的关键,但是小弟就完全不能理解了,请大虾帮忙!
- vec2[0] = vec1[0]
- vec2[1] = vec1[1]
- vec2[2] = -9999.0
- engfunc(EngFunc_TraceHull, vec1, vec2, IGNORE_MONSTERS, g_player_hull[!!(pev(id, pev_flags) & FL_DUCKING)], id, 0)
- get_tr2(0, TR_vecEndPos, vec2)
- if (vec1[2] - vec2[2] > size_z)
- return FMRES_IGNORED
- pev(id, pev_velocity, vec1)
- vec1[0] = 0.0
- vec1[1] = 0.0
- set_pev(id, pev_velocity, vec1)
- return FMRES_HANDLED
- }
复制代码 在各位大虾的帮助和提供的文档下,对编写插件有一点信心了.现在手头上拿到了一份朋友写的源码,让我看.但是小弟的能力实在有限,翻了N多文档,网上搜了很多资料,但是还是有很多地方不能理解.所以现在把源码COPY上来了.希望有好心的大虾帮忙看一下(我把我自己能看懂的代码全写上了注释,其中可能也有不对的地方,请大虾们指出.)
这个插件的作用是一个防止把蹲键绑定在鼠标上的,但是我还是不太理解为什么可以做到!!给各位添麻烦了... |
|