搜索
查看: 8895|回复: 18

[AMXX 带源码] OooH_闪光插件rsdtt斑竹最终修正版含原码

[复制链接]
发表于 2011-8-17 13:18:51 | 显示全部楼层 |阅读模式 来自 中国–山东
本帖最后由 zhaojian0733 于 2011-8-21 00:20 编辑

OooH_Team_Flashed报错,大师来帮忙
就是闪到队友扣钱 多少次以后就禁止闪光

斑竹 大师们 帮忙看看
L 08/17/2011 - 12:27:53: Start of error session.
L 08/17/2011 - 12:27:53: Info (map "de_dust2") (file "addons/amxmodx/logs/error_20110817.log")
L 08/17/2011 - 12:27:53: [AMXX] Displaying debug trace (plugin "OooH_Team_Flashed.amxx")

L 08/17/2011 - 12:28:52: [AMXX] Displaying debug trace (plugin "OooH_Team_Flashed.amxx")
L 08/17/2011 - 12:28:52: [AMXX] Run time error 4: index out of bounds
L 08/17/2011 - 12:28:52: [AMXX]    [0] OooH_Team_Flashed.sma::save_stats (line 229)
L 08/17/2011 - 12:28:52: [AMXX]    [1] OooH_Team_Flashed.sma::fw_FM_EmitSound (line 164)



下面是插件代码:

/*
   插件:OooH Team Flashed 被队友闪到时,闪光为红色
   作者:PooHoo@老友记
   来源:http://cs-friends.com.cn
   [2007/11/20], CS/CZ 3329+, AMXX 1.76, 测试通过

   附言:
*/

感谢原作者创作
特别感谢rsdtt斑竹修正有new db_playerFlash[33]
经观察应该是溢出问题,将这里改为
new db_playerFlash[100] 的错误

现上传一下 完美版 给各位网友分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注个册吧

×
 楼主| 发表于 2011-8-17 13:20:12 | 显示全部楼层 来自 中国–山东
register_event("CurWeapon","eWeaponChange","be")//没收闪光
        gMaxPlayers    = get_maxplayers()
       
        db_slot_i = gMaxPlayers+1
}

public fw_FM_EmitSound(entity, channel, const sample[], Float:volume, Float:attenuation, fFlags, pitch)
{
        if(!get_pcvar_num(pTeamFlashed))
                return FMRES_IGNORED
       
        // 闪光?
        if(!equali(sample, FLASHSOUND[0]) && !equali(sample, FLASHSOUND[1]))
                return FMRES_IGNORED
       
        static flashed, Float:time, name[32], flasher, team, teamnum,g_punishmoney,msg[168]
        flashed = 0
        teamnum = 0  //初始化闪到队友的人数
        flasher = pev(entity, pev_iuser3)
        team    = pev(entity, pev_iuser4)
        time    = get_gametime()
        get_user_name(flasher, name, 31)
       
        g_punishmoney = get_cvar_num("sl_punishmoney")
       
        if (is_user_connected(flasher))
        {
                for(new id=1; id<=gMaxPlayers; id++)
                {
                        if (is_user_connected(id) && PLAYER[id][GameTime]==time && team==get_user_team(id) && flasher!=id && is_user_alive(id) ){
                               
                                if(is_player_in_buyzone(id)&& z_teamFlash && is_player_in_buyzone(flasher))//在购买区域,购时间的范围内!在基地乱丢闪光并闪到在基地的队友!
                                {
                                        if(is_user_alive(flasher))
                                        {
                                                user_kill(flasher);//处死
                                                ryu_set_money(flasher,0,1)//没收全部金钱
                                                format(msg,sizeof msg - 1,"^x04[基地故意闪光]::^x03%s^x01在基地恶意扔闪光,已被^x04吊死^x01!!!,并^x04没收个人所有财产",name)
                                                client_color(0, id, msg)
                                                return FMRES_HANDLED
                                        }                       
                                }else if(ryu_get_money(flasher) >= g_punishmoney){       
                                        format(msg,sizeof msg - 1,"^x04[^x03队友闪光提示^x04]::^x01队友 ^x03%s ^x01闪到你,赔偿你精神损失费^x04[^x03$%d^x04]",name,g_punishmoney)
                                        client_color(id, id, msg)
                                        client_cmd(id, "q3/hit" )
                                        ryu_set_money(id,ryu_get_money(id)+g_punishmoney,1)
                                        ryu_set_money(flasher,ryu_get_money(flasher) - g_punishmoney,1)
                                       
                                }else{
                                        format(msg,sizeof msg - 1,"^x04[^x03队友闪光提示^x04]::^x01队友^x03 %s,^x01可他好穷啊!连 ^x04[$%d^x04] ^x01都赔不起,扁他...!",name,g_punishmoney)
                                        client_color(id, id, msg)
                                        user_slap(flasher,8,1)
                                        client_cmd(id, "spk q3/hit" )
                                }
                                flashed = 1               
                                teamnum++ //闪到队友的累计
                        }
                        save_stats(flasher)
                }
               
                if (flashed)
                {
                        // 这个闪光的人 flasher 通知或惩罚他
                        if (playerFlash[flasher] >= get_pcvar_num(g_team_flashnum) ){  
                               
                                g_playerFlash[flasher] = true                                           
                                format(msg,sizeof msg - 1,"^x04[^x03队友闪光处罚^x04]:^x01你因闪到队友超过^x04[^x03%d^x04]^x01次,当前地图已^x03禁止你使用闪光弹",get_pcvar_num(g_team_flashnum))
                                client_color(flasher, flasher, msg)
                                client_cmd(flasher, "spk q3/hit" )
                                save_stats(flasher)                                       
                                return FMRES_HANDLED
                        }
                        else if(ryu_get_money(flasher) >= g_punishmoney){
                        format(msg,sizeof msg - 1,"^x04[^x03队友闪光处罚^x04]:^x01闪到^x04[^x03%d^x04]^x01个队友,赔偿^x03精神损失费^x04[^x03$%d^x04][^x01禁闪次数:^x03%d^x01次^x04/^x01此次是第^x03%d^x01次^x04]",teamnum,g_punishmoney*teamnum,get_pcvar_num(g_team_flashnum),playerFlash[flasher]+1)
                        client_color(flasher, flasher, msg)
                        }
                        else{
                        format(msg,sizeof msg - 1,"^x04[^x03队友闪光处罚^x04]:^x01闪到^x04[^x03%d^x04]^x01个队友,有钱赔钱,^x03没钱一人一拳^x04[^x01禁闪次数:^x03%d^x01次^x04/^x01此次是第^x03%d^x01次^x04]",teamnum,get_pcvar_num(g_team_flashnum),playerFlash[flasher]+1)
                        client_color(flasher, flasher, msg)
                        ryu_set_money(flasher,0,1)
                        }
                        client_cmd(flasher, "spk q3/hit" )
                        playerFlash[flasher]++                       
                }
        }
        return FMRES_IGNORED
}


public client_putinserver(id)
{               
               
        load_stats(id)
       
}


public eNewRound(){
       
        z_teamFlash=true
        set_task(get_cvar_float("mp_buytime")*60+get_cvar_float("mp_freezetime"),"set_cvar")
}
public set_cvar()
{
        z_teamFlash=false;
}
//防止用户断开后,之前记录的闪光闪到队友次数为0了
save_stats(id)
{
        static name[64]
        get_user_name(id, name, sizeof name - 1)
       
       
        if (db_name[id][0] && !equal(name, db_name[id]))
        {
                if (db_slot_i >= sizeof db_name)
                        db_slot_i = gMaxPlayers+1
                       
                if ( !is_user_connected(id))
                     return;
               
                copy(db_name[db_slot_i], 63, db_name[id])
                db_playerFlash[db_slot_i] = db_playerFlash[id]
                db_slot_i++
        }
       
        copy(db_name[id], 63, name)
        db_playerFlash[id] = playerFlash[id]  
}

//载入之前保存的数据!
load_stats(id)
{
        static name[64], i
        get_user_name(id, name, sizeof name - 1)
       
        for (i = 0; i < sizeof db_name; i++)
        {
                if (equal(name, db_name[i]))
                {
                        playerFlash[id] = db_playerFlash[i];
                        if(playerFlash[id] >= get_pcvar_num(g_team_flashnum))
                        {
                                g_playerFlash[id] = true       
                        }
                        return;
                }
        }
}

// 记录被闪的人的闪光信息
public event_ScreenFade(id)
{
        PLAYER[id][GameTime] = _:get_gametime()
        PLAYER[id][Duration] = read_data(1)
        PLAYER[id][HoldTime] = read_data(2)
        PLAYER[id][FadeType] = read_data(3)
        PLAYER[id][Alpha]    = read_data(7)
}

// 记录仍雷人的信息
public grenade_throw(id, entity, WpnID)
{
        if (WpnID == CSW_FLASHBANG)
        {
                set_pev(entity, pev_iuser3, id)                 // 这个雷是谁的
                set_pev(entity, pev_iuser4, get_user_team(id))  // 他的队伍是?
        }
}


public HookBuyFlash(id)
{
        if(!z_teamFlash && !is_player_in_buyzone(id))//购买时间内,购买区域内
                return PLUGIN_HANDLED
       
        if( get_pcvar_num(pTeamFlashed) && g_playerFlash[id])       
        {
                client_print(id, print_center, "当前地图你闪到队友超过 %d 次,服务器禁止你购买闪光弹",get_pcvar_num(g_team_flashnum))         
                return PLUGIN_HANDLED
        }
        return PLUGIN_CONTINUE
       
}
public eAmmoX(id)
{
        new clip, ammo
        new wpnid = get_user_weapon(id, clip, ammo)
       
        if ( wpnid == CSW_FLASHBANG && g_playerFlash[id] && get_pcvar_num(pTeamFlashed))
        {       
                client_print(id, print_center, "当前地图你闪到队友超过 %d 次,服务器禁止你购买和使用闪光弹",get_pcvar_num(g_team_flashnum))
                return PLUGIN_HANDLED
        }       
        return PLUGIN_CONTINUE       
}
public eWeaponChange(id)
{
        new wpnid = read_data(2)
       
        if ( wpnid == CSW_FLASHBANG && g_playerFlash[id] && get_pcvar_num(pTeamFlashed))
        {       
                client_print(id, print_center, "当前地图你闪到队友超过 %d 次,服务器没收你的闪光弹",get_pcvar_num(g_team_flashnum))
                fm_set_user_bpammo(id,CSW_FLASHBANG,0)
                return PLUGIN_HANDLED
        }
        return PLUGIN_CONTINUE
}
// Set User BP Ammo
stock fm_set_user_bpammo(id, weapon, amount)
{
        static offset
       
        switch(weapon)
        {
                case CSW_AWP: offset = OFFSET_AWM_AMMO;
                case CSW_SCOUT,CSW_AK47,CSW_G3SG1: offset = OFFSET_SCOUT_AMMO;
                case CSW_M249: offset = OFFSET_PARA_AMMO;
                case CSW_M4A1,CSW_FAMAS,CSW_AUG,CSW_SG550,CSW_GALI,CSW_SG552: offset = OFFSET_FAMAS_AMMO;
                case CSW_M3,CSW_XM1014: offset = OFFSET_M3_AMMO;
                case CSW_USP,CSW_UMP45,CSW_MAC10: offset = OFFSET_USP_AMMO;
                case CSW_FIVESEVEN,CSW_P90: offset = OFFSET_FIVESEVEN_AMMO;
                case CSW_DEAGLE: offset = OFFSET_DEAGLE_AMMO;
                case CSW_P228: offset = OFFSET_P228_AMMO;
                case CSW_GLOCK18,CSW_MP5NAVY,CSW_TMP,CSW_ELITE: offset = OFFSET_GLOCK_AMMO;
                case CSW_FLASHBANG: offset = OFFSET_FLASH_AMMO;
                case CSW_HEGRENADE: offset = OFFSET_HE_AMMO;
                case CSW_SMOKEGRENADE: offset = OFFSET_SMOKE_AMMO;
                case CSW_C4: offset = OFFSET_C4_AMMO;
                default: return;
        }
       
        set_pdata_int(id, offset, amount, 5);
}


stock ryu_set_money(id,money,flash=0)
{
        set_pdata_int(id,OFFSET_CSMONEY,money,5);
        
        message_begin(MSG_ONE,get_user_msgid("Money"),{0,0,0},id);
        write_long(money);
        write_byte(flash);
        message_end();
}

stock ryu_get_money(id)
{
        return get_pdata_int(id,OFFSET_CSMONEY,5);
}

public client_color(playerid, colorid, msg[])
{
        message_begin(playerid?MSG_ONE:MSG_ALL,get_user_msgid("SayText"),_,playerid)
        write_byte(colorid)
        write_string(msg)
        message_end()
}
回复

使用道具 举报

发表于 2011-8-17 13:26:52 | 显示全部楼层 来自 中国–广东–清远
把整个文件发上来,你这样发窝不知道你哪行出错了
回复

使用道具 举报

发表于 2011-8-17 13:29:19 | 显示全部楼层 来自 中国–广东–清远
应该是出在保存信息的环节上,如果没必要保存闪光次数可以用这个就可以了
  1. /*
  2.    插件:OooH Team Flashed 被队友闪到时,闪光为红色
  3.    作者:PooHoo@老友记
  4.    来源:http://cs-friends.com.cn
  5.    [2007/11/20], CS/CZ 3329+, AMXX 1.76, 测试通过

  6.    功能:
  7.       当被队友闪到时,闪光为红色,被敌人或自己闪不改原有设置,依然是白色

  8.    说明:
  9.       team_flashed "1" // 插件开关(默认1)

  10.    附言:
  11.       这个插件,难就难在如何确定被闪时,这个闪光是谁扔的?
  12.       判断方法有好多种,在官方论坛里有几个关于闪光的插件
  13.       “No Team Flash”“Team Flash Snitch”。。等等
  14.       但处理方法不理想,不能100%正确判断扔雷的人。
  15.       我使用不同的处理方法,准确判断扔闪光的人100%有效。

  16.       正确获得扔雷的人后,我们可以修改扩展一下功能:
  17.       1,惩罚闪队友的人(掉血,扣金钱,没收武器。。)
  18.       2,进行计数,闪队友N次后,踢出,处死
  19.       3,去掉队友的闪光,
  20.       4,禁止他再购买或使用闪光弹
  21.       5,等等。。。
  22.       注意:如果惩罚过度,会激化玩家之间的矛盾,需谨慎。
  23. */

  24. #include <amxmodx>
  25. #include <fakemeta>
  26. #include <csx>

  27. // 被队友闪后的颜色(R, G, B)
  28. new const COLOR[3]={255, 50, 50} // 红色

  29. enum FLASH{
  30.    Float:GameTime,
  31.    Duration,
  32.    HoldTime,
  33.    FadeType,
  34.    Alpha
  35. }
  36. new PLAYER[33][FLASH]

  37. new pTeamFlashed
  38. new gMsgScreenFade
  39. new gMaxPlayers

  40. new const FLASHSOUND[2][]={
  41. "weapons/flashbang-1.wav",
  42. "weapons/flashbang-2.wav"
  43. }

  44. public plugin_init()
  45. {
  46.    register_plugin("OooH Team Flashed", "1.0", "PooHoo@cs-friends.com.cn")

  47.    register_forward(FM_EmitSound, "fw_FM_EmitSound")
  48.    register_event("ScreenFade", "event_ScreenFade", "be", "4=255", "5=255", "6=255", "7>199")

  49.    pTeamFlashed   = register_cvar("team_flashed", "1")
  50.    gMsgScreenFade = get_user_msgid("ScreenFade")
  51.    gMaxPlayers    = get_maxplayers()
  52. }

  53. public fw_FM_EmitSound(entity, channel, const sample[], Float:volume, Float:attenuation, fFlags, pitch)
  54. {
  55.    if(!get_pcvar_num(pTeamFlashed))
  56.       return FMRES_IGNORED

  57.    // 闪光?
  58.    if(!equali(sample, FLASHSOUND[0]) && !equali(sample, FLASHSOUND[1]))
  59.       return FMRES_IGNORED

  60.    static flashed, Float:time, name[32], flasher, team
  61.    flashed = 0
  62.    flasher = pev(entity, pev_iuser3)
  63.    team    = pev(entity, pev_iuser4)
  64.    time    = get_gametime()
  65.    get_user_name(flasher, name, 31)

  66.    if (is_user_connected(flasher))
  67.    {
  68.       for(new id=1; id<=gMaxPlayers; id++)
  69.       {
  70.          // 如果这个闪光闪到队友,改变其闪光颜色
  71.          if (is_user_connected(id)
  72.             && PLAYER[id][GameTime]==time
  73.             && team==get_user_team(id)
  74.             && flasher!=id)
  75.          {
  76.             client_print(id, print_chat, "OooH, 队友[%s] 闪到你了", name)
  77.             FlashedEvent(id, PLAYER[id][Duration], PLAYER[id][HoldTime], PLAYER[id][FadeType], COLOR[0], COLOR[1], COLOR[2], PLAYER[id][Alpha])
  78.             flashed = 1
  79.          }
  80.       }

  81.       if (flashed)
  82.       {
  83.          // 这个闪光的人 flasher 通知或惩罚他
  84.          client_print(flasher, print_chat, "OH NO, 老兄,你闪到队友了,要注意哦...")

  85.          // 添加其他惩罚代码。。。
  86.          
  87.          
  88.       }
  89.    }

  90.    return FMRES_IGNORED
  91. }

  92. // 记录被闪的人的闪光信息
  93. public event_ScreenFade(id)
  94. {
  95.    PLAYER[id][GameTime] = _:get_gametime()
  96.    PLAYER[id][Duration] = read_data(1)
  97.    PLAYER[id][HoldTime] = read_data(2)
  98.    PLAYER[id][FadeType] = read_data(3)
  99.    PLAYER[id][Alpha]    = read_data(7)
  100. }

  101. // 记录仍雷人的信息
  102. public grenade_throw(id, entity, WpnID)
  103. {
  104.    if (WpnID == CSW_FLASHBANG)
  105.    {
  106.       set_pev(entity, pev_iuser3, id)                 // 这个雷是谁的
  107.       set_pev(entity, pev_iuser4, get_user_team(id))  // 他的队伍是?
  108.    }
  109. }

  110. // 发送闪光效果
  111. stock FlashedEvent(id, iDuration, iHoldTime, iFadeType, iRed, iGreen, iBlue, iAlpha)
  112. {
  113.    message_begin(MSG_ONE, gMsgScreenFade, {0,0,0}, id)
  114.    write_short(iDuration)   // Duration
  115.    write_short(iHoldTime)   // Hold time
  116.    write_short(iFadeType)   // Fade type
  117.    write_byte (iRed)        // Red
  118.    write_byte (iGreen)      // Green
  119.    write_byte (iBlue)       // Blue
  120.    write_byte (iAlpha)      // Alpha
  121.    message_end()
  122. }


复制代码
回复

使用道具 举报

 楼主| 发表于 2011-8-17 17:24:04 | 显示全部楼层 来自 中国–山东–枣庄
4# rsdtt


请问大侠 这个可以设置比如 闪了队友5次了就不能买用闪光了即使他重新再进一次服务器又开始重新计算5次呢?

我不要求他闪了队友5次后从此不能在买用闪光 而只要要保留在当前开放的服务器信息里,因为我每天都要重新服务器的 这样他能够得以恢复就可以
回复

使用道具 举报

 楼主| 发表于 2011-8-17 17:30:31 | 显示全部楼层 来自 中国–山东–枣庄
我还是想记录次数啊 不然不差钱的VIP岂不是可以狂闪别人了,或者钱被扣光了就重新进一下服务器,就又有16000了啊 ,我就是想约束一下乱扔闪光的人,他要是不会扔就别让他扔,他只顾自己的乱扔别人弄的老是白。。
如果不好找漏洞那就请 大师帮我看看会不会因为这个漏洞而导致插件不能运行或者对服务器稳定有什么影响吗
如果影响不大 我就忍了 这个作者毕竟是2007年创作的,估计人家早就不研究这个了。。。
回复

使用道具 举报

发表于 2011-8-17 20:40:16 | 显示全部楼层 来自 中国–广东–清远
你把源码打包上来,你这样我不知道具体哪一行有问题
回复

使用道具 举报

 楼主| 发表于 2011-8-19 22:41:58 | 显示全部楼层 来自 中国–山东
本帖最后由 zhaojian0733 于 2011-8-21 00:08 编辑

7# rsdtt


好的 谢谢大师 我现在服务器就这一个插件报错误 其他都很好了。。麻烦你多费心

回复

使用道具 举报

 楼主| 发表于 2011-8-19 22:49:41 | 显示全部楼层 来自 中国–山东
7# rsdtt


再次感谢!
回复

使用道具 举报

发表于 2011-8-20 10:56:03 | 显示全部楼层 来自 中国–四川–成都
期待R版的完美源码,呵呵。。。
回复

使用道具 举报

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

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