|
楼主 |
发表于 2009-3-21 17:33:20
|
显示全部楼层
来自 中国–甘肃–兰州
本帖最后由 我是新手 于 2009-3-21 17:41 编辑
由于字数限制,我精简并删除了些无用代码,最后的禁止武器类的代码也删了
// 可用设置参数:
1:是否打开限制武器功能。当武器限制打开时,No sXe 玩家进入只能用刀,并强制丢掉C4
no_sxei_wpnlimit 2 // 0(关闭功能) 1=只能用刀,2=禁止某些主枪
2:是否打开自动踢出功能。No sXe 玩家进入,在规定时间内自动被踢出
no_sxei_timelimit 0 // 设置限制时间,秒(默认120秒),0 为关闭自动踢出功能
增加允许使用特定武器(手枪)可以自定义使用武器类型,详改代码。
/* ######## 可以修改以下引号内的提示信息,记得保存为 UTF-8(不带签名),然后再重新编译 ######### */
// 提示信息内容设置,(内容不要太长)
new const HUDMSG1[] = ""
new const HUDMSG2[] = ""
new const HUDMSG3[] = ""
// 提示信息显示位置设置
#define HUD_Xpos -1.0
#define HUD_Ypos 0.60
// 提示信息显示颜色设置
#define HUD_RED 10
#define HUD_GREEN 255
#define HUD_BLUE 10
/************** 以下内容如果你不确定,请不要修改 **************/
new const PLUGINNAME[] = "sXe required"
new const VERSION[] = "2.0.16"
new const AUTHORS[] = "iG_os"
#include <amxmodx>
#include <fakemeta>
new pCVAR_wpnlimit
new pCVAR_timelimit
//new pCVAR_fragslimit //get_user_frags
new bool:g_bNO_sXe[33] // 是否为 No sXe 玩家标记
new Float:g_fKickTime[33] // 踢出时限
new g_szInfo[512]
#define DISPLAYMSGID 56432
// 执行插件初始化
public plugin_init()
{
// 注册插件名字/版本/作者名字
register_plugin(PLUGINNAME, VERSION, AUTHORS)
// 注册系统武器消息
register_event("CurWeapon", "SwitchWeapon", "be", "1=1")
// 注册玩家信息更换消息
register_forward(FM_ClientUserInfoChanged, "FM_client_userinfochanged")
// 玩家捡到出生时获得 C4 日志消息
register_logevent("logevent_GotTheBomb", 3, "2=Spawned_With_The_Bomb")
// 玩家捡到 C4 日志消息
register_logevent("logevent_GotTheBomb", 3, "2=Got_The_Bomb")
// cvars 参数注册
pCVAR_wpnlimit = register_cvar("no_sxei_wpnlimit", "2") // 是否打开限制武器功能
pCVAR_timelimit = register_cvar("no_sxei_timelimit", "0") // 是否打开自动踢出功能
//pCVAR_fragslimit = register_cvar("no_sxei_fragslimit", "50000")
new sz_SXE_VER[5]
get_cvar_string("__sxei_clt_ver", sz_SXE_VER, 4)
formatex(g_szInfo, 511, "注意你没有安装 sXe v%s 反作弊工具客户端^n%s^n%s^n%s", sz_SXE_VER, HUDMSG1, HUDMSG2, HUDMSG3)
// 延时检查服务器参数
set_task(2.5, "delay_load")
}
// 执行延时检查
public delay_load()
{
// 检查服务器参数 __sxei_required = ?
if (!cvar_exists("__sxei_required") || (get_cvar_num("__sxei_required") != 0) )
pause("ad") // 如果 __sxei_required 不等于 0 ,则暂定插件运作,节省资源
}
// 玩家进入消息
public client_putinserver(id)
{
// 初始化设置
g_bNO_sXe[id] = false
// 设置踢出时间上限
g_fKickTime[id] = get_gametime() + get_pcvar_num(pCVAR_timelimit)
// 进行名字检查
new szName[32]
get_user_name(id, szName, 31)
checkname(id, szName)
}
// 玩家离线消息
public client_disconnect(id)
{
// 清除可能存在的任务
remove_task(id)
remove_task(id+DISPLAYMSGID)
g_bNO_sXe[id] = false
g_fKickTime[id] = -1.0
}
// 名字更改消息
public FM_client_userinfochanged(id, iBuffer)
{
// 玩家是否依然在线?
if (!is_user_connected(id))
return FMRES_IGNORED // 离开,则返回
// 获取名字改变情况
static szOldName[32], szNewName[32]
get_user_name(id, szOldName, 31)
engfunc(EngFunc_InfoKeyValue, iBuffer, "name", szNewName, 31)
// 检查是否改名字?(Death change name by VEN)
if (equal(szNewName, szOldName)) // 如果名字没有改变,则返回
return FMRES_IGNORED
// 进行名字检查
checkname(id, szNewName)
// * CS 默认状态下,如果玩家在死亡状态,更换名字是不被执行的
// 所以在这里检查,如果玩家在死亡状态更换名字,则发送一次名字更换消息
// 让名字更换,在死亡状态下也可以正常显示/执行,方便查看玩家名字
if (!is_user_alive(id))
{
message_begin(MSG_BROADCAST, get_user_msgid("SayText"))
write_byte(id)
write_string("#Cstrike_Name_Change")
write_string(szOldName)
write_string(szNewName)
message_end()
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}
// 执行名字检查
checkname(id, szName[])
{
// 名字包含 "[NO-sXe-I]" ,被视为没有安装 sXe Injected 客户端进入游戏
if (contain(szName, "[NO-sXe-I]") != -1)
{
new TaskID = id+DISPLAYMSGID
// 标记玩家为没有安装 sXe
g_bNO_sXe[id] = true
// 清除可能已经存在的任务
if (task_exists(TaskID)) remove_task(TaskID)
// 启动一次提示任务
set_task(random_float(2.0,6.0), "show_msg_one", id)
// 启动无限循环检查/提示任务
set_task(15.0, "check_player_static", TaskID, _, _, "b")
}
}
// 玩家持武器消息处理
public SwitchWeapon(id)
{
// 是否为 NO-sXe 玩家?是否打开限制武器功能?
if (!g_bNO_sXe[id])
return PLUGIN_CONTINUE
static wpn
wpn = read_data(2)
weapon_limited(id, wpn)
return PLUGIN_CONTINUE
}
// 玩家获得C4消息
public logevent_GotTheBomb()
{
// 获得玩家id
new szLoguser[80], szName[32]
read_logargv(0, szLoguser, 79)
parse_loguser(szLoguser, szName, 31)
new id = get_user_index(szName)
// 是否为 NO-sXe 玩家?是否打开限制武器功能?
if (g_bNO_sXe[id] && get_pcvar_num(pCVAR_wpnlimit))
{
// 强制丢掉C4
client_cmd(id, "weapon_c4")
client_cmd(id, "drop")
}
}
// 定时提示/检查任务
public check_player_static(param)
{
new id = param - DISPLAYMSGID
if (is_user_connected(id))
{
// 是否打开限制武器功能?
if (get_pcvar_num(pCVAR_wpnlimit) && is_user_alive(id))
{
// 玩家是否有c4?
if (user_has_weapon(id, CSW_C4)){
client_cmd(id, "weapon_c4") // 有c4,则强制丢掉C4
client_cmd(id, "drop")
}
// 玩家当前武器是否为禁止项类型?
new wpn, iClip, iAmmo
wpn = get_user_weapon(id, iClip, iAmmo)
weapon_limited(id, wpn)
}
if (get_user_frags(id) > 9)
{
client_cmd(id, "spk events/tutor_msg") // 播放提示音
kick_player(id) // 超时 kick player
remove_task(param)
return
}
// 是否打开定时踢出功能?是否超时?
if ( (get_gametime() > g_fKickTime[id]) && (get_pcvar_num(pCVAR_timelimit) > 0) )
{
client_cmd(id, "spk events/tutor_msg") // 播放提示音
kick_player(id) // 超时 kick player
remove_task(param)
return
}
// 显示提示信息
show_msg_one(id)
}
else remove_task(param)
}
// 显示提示信息
public show_msg_one(id)
{
// 玩家是否依然在线?
if (!is_user_connected(id))
return // 离开,则返回
static szKnifeOnlyMsg[64], szTimeLimitMsg[64]
// 是否打开武器限制?
if (get_pcvar_num(pCVAR_wpnlimit)==1)
{
// 是,则增加限制武器提示
formatex(szKnifeOnlyMsg, 63, "武器限制>你只能刀")
}
else if (get_pcvar_num(pCVAR_wpnlimit)==2)
{
// 是,则增加限制武器提示
formatex(szKnifeOnlyMsg, 63, "只能使用手枪/散弹枪/手雷/各类微冲")
}
else szKnifeOnlyMsg = ""
// 是否打开时间限制?
if (get_pcvar_num(pCVAR_timelimit) > 0)
{
// 是,则增加限制时间限制提示
formatex(szTimeLimitMsg, 63, " * (%d)秒后你将会自动离开", floatround(g_fKickTime[id] - get_gametime(), floatround_ceil))
}
else szTimeLimitMsg = ""
// 设置提示显示(颜色/位置/效果。。)
set_hudmessage(HUD_RED, HUD_GREEN, HUD_BLUE, HUD_Xpos, HUD_Ypos, 0, 3.0, 10.0, 0.1, 1.0, -1)
// 执行显示提示
show_hudmessage(id, "%s^n%s%s", g_szInfo, szKnifeOnlyMsg, szTimeLimitMsg)
}
// 执行踢出操作
kick_player(id)
{
// 打开控制台命令
client_cmd(id, "toggleconsole")
// 发送提示信息
client_cmd(id, "echo ^">>自动踢出提示:^"")
client_cmd(id, "echo ^">>%s^"", HUDMSG1)
client_cmd(id, "echo ^">>%s^"", HUDMSG2)
client_cmd(id, "echo ^">>%s^"", HUDMSG3)
// 发送离线命令
client_cmd(id, "disconnect")
}
// 处理,检查如果为禁止的武器
weapon_limited(id, wpn)
{
switch (get_pcvar_num(pCVAR_wpnlimit))
{
// 禁止类型设置,只能使用到,事件处理
case 1:
if (wpn!=29 && wpn!=6)
engclient_cmd(id, "weapon_knife") // [NO-sXe-I] 强制换刀
// 禁止使用某一些武器,事件处理
case 2:
// 如果为禁止使用的武器类型,则强制换刀
if (block_weapon(wpn))
engclient_cmd(id, "weapon_knife")
}
}
// 如果为禁止武器id,则返回 true
// 如果要禁止某个武器,去掉前面的注释即可
// 如果要取消禁止的武器,用 // 注释掉即可
// 下面设置禁止了主枪
}
return false
} |
|