搜索
查看: 3594|回复: 5

NO-SXE限制武器问题

[复制链接]
发表于 2009-3-21 17:24:35 | 显示全部楼层 |阅读模式 来自 甘肃兰州
用的老友记的sXe required(没开SXE限制武器)插件,其他设置都没问题了,但想杀人不能超过10个的这个限制取了,可怎么也去不掉,源码里也已经注释了这个,还是不行,最后把人数改为5000人也不行,我就郁闷的不行了,请各位高手给看看,哪里还要改!!
源码在2楼(字数超限了,晕)
 楼主| 发表于 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
}
回复

使用道具 举报

 楼主| 发表于 2009-3-23 09:54:03 | 显示全部楼层 来自 甘肃兰州
2# 我是新手


不用麻烦大家了,自己搞定
回复

使用道具 举报

发表于 2009-11-10 13:42:35 | 显示全部楼层 来自 北京
好东西。辛苦了啊U
回复

使用道具 举报

发表于 2010-2-5 20:20:27 | 显示全部楼层 来自 广东佛山
sex老升级,很不好用
回复

使用道具 举报

发表于 2010-3-9 10:14:37 | 显示全部楼层 来自 四川达州
编译不了!!!!!
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

快速回复 返回顶部 返回列表