團隊語音控制插件

Home Home
引用 | 編輯 Show!
2008-09-08 11:46
樓主
推文 x1
應大家的需求,特發布此插件:

插件名稱:團隊語音控制插件
插件作者:Rulzy
Web URL :http://bbs.covert.cn/

命令說明:
amx_mute <name or #userid>靜音某玩家麥克風
amx_unmute <name or #userid>取消靜音某玩家麥克風

參數說明:
amx_teamtalk 0|1 (默認:1)是否開啟此插件的語音控制功能
amx_talkhint 0|1|2 (默認:1)提示類型:0-關閉, 1-HUD, 2-聊天區
amx_talktime數據值(默認:0)語音控制的一個時間參數,詳細說明見後。

參數amx_talktime說明:
當amx_talktime為0時,隊友間總是可以互相聽到講話(當然,要求參數amx_teamtalk不為零,下同)
當amx_talktime為正數時,玩家死亡後的amx_talktime秒內,活著的隊友可以聽到其講話,超過這個時間則活著的隊友聽不到其講話了
主要用於:當玩家剛死亡時,可以給活著的隊友報點,又可以避免一直講話而影響活著的隊友發揮
當amx_talktime為負數時,玩家死亡後的|amx_talktime|秒內,活著的隊友聽不到其講話,超過這個時間則活著的隊友可以聽到其講話
主要用於:當玩家剛死亡時,避免玩家報點,但時間過後可以通話,可用於戰術指揮,訓練時感覺比較有用

注意,參數sv_alltalk必須為0,否則此插件功能不會生效。

/*
插件名称:团队语音控制插件
插件作者:Rulzy
Web URL :http://bbs.covert.cn/


命令说明:
     amx_mute <name or #userid>      静音某玩家麦克风
     amx_unmute <name or #userid>      取消静音某玩家麦克风
参数说明:
     amx_teamtalk 0|1      (默认:1)是否开启此插件的语音控制功能
     amx_talkhint 0|1|2      (默认:1)提示类型:0-关闭, 1-HUD, 2-聊天区
     amx_talktime 整数值      (默认:0)语音控制的一个时间参数,详细说明见后。

     参数 amx_talktime 说明:
           当 amx_talktime 为 0 时,队友间总是可以互相听到讲话(当然,要求参数amx_teamtalk不为零,下同)
           当 amx_talktime 为正数时,玩家死亡后的amx_talktime秒内,
                       活着的队友可以听到其讲话,超过这个时间则活着的队友听不到其讲话了
                       主要用于:当玩家刚死亡时,可以给活着的队友报点,又可以避免一直讲话而影响活着的队友发挥
           当 amx_talktime 为负数时,玩家死亡后的 |amx_talktime| 秒内,
                       活着的队友听不到其讲话,超过这个时间则活着的队友可以听到其讲话
                       主要用于:当玩家刚死亡时,避免玩家报点,但时间过后可以通话,可用于战术指挥,训练时感觉比较有用
                             
     注意,参数 sv_alltalk 必须为0,否则此插件功能不会生效。


--------------------------------------------------------------------------------------------------------------


*/

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <cstrike>

new g_player_muted[33]
new Float: g_player_deathtime[33]
new p_teamtalk, p_talktime, p_talkhint

public plugin_init()
{
     register_plugin("Team Talk", "1.2", "Rulzy");
     register_forward(FM_Voice_SetClientListening, "fm_voice_forward")
     register_clcmd("amx_mute", "cmdMute", ADMIN_KICK, "<name or #userid> - Mute player's Microphone");
     register_clcmd("amx_unmute", "cmdUnMute", ADMIN_KICK, "<name or #userid> - UnMute player's Microphone");
     
     p_teamtalk = register_cvar("amx_teamtalk", "1");
     p_talktime = register_cvar("amx_talktime", "0");
     p_talkhint = register_cvar("amx_talkhint", "1");
     
     register_event("DeathMsg", "eDeathMsg", "a");
     
}

public eDeathMsg()
{
     new victim = read_data(2);
     if(!is_user_connected(victim)) return PLUGIN_CONTINUE;
     g_player_deathtime[victim] = get_gametime();
     if(get_cvar_num("sv_alltalk")) return PLUGIN_CONTINUE;
     if(!get_pcvar_num(p_teamtalk)) return PLUGIN_CONTINUE;
     if(g_player_muted[victim] && get_user_flags(victim)&ADMIN_IMMUNITY==0) //如果此人被禁止讲话
           return PLUGIN_CONTINUE;
     if(!get_pcvar_num(p_talkhint))
           return PLUGIN_CONTINUE;
     new talktime = get_pcvar_num(p_talktime);
     talktime = talktime>0?talktime:-talktime;
     new param[3]
     param[0] = victim;
     param[1] = talktime;
     ShowHint(param);
     return PLUGIN_CONTINUE;
}

public ShowHint(param[])
{
     if(get_cvar_num("sv_alltalk")) return PLUGIN_CONTINUE;
     if(!get_pcvar_num(p_teamtalk)) return PLUGIN_CONTINUE;
     new id = param[0];
     new talktime = get_pcvar_num(p_talktime);
     new timeleft = param[1];
     new HintMsg[256];
     new talkhint = get_pcvar_num(p_talkhint);
     if(talkhint==1)
     {
           if(is_user_alive(id))
           {
                 format(HintMsg, 255, "你已经出生, 现在你可以与你的队友正常语音通话");
                 timeleft = 0;
           }else if(talktime==0){
                 format(HintMsg, 255, "你挂了, 但你仍然可以与你的队友语音通话");
           }else if(talktime>0){
                 if(timeleft==0)
                       format(HintMsg, 255, "时间到, 你现在不能跟活着的队友通话了", timeleft);
                 else
                       format(HintMsg, 255, "你挂了, 但 %d 秒内你仍然可以与活着的队友通话", timeleft);
           }else{
                 if(timeleft==0)
                       format(HintMsg, 255, "你现在可以跟活着的队友通话了", timeleft);
                 else
                       format(HintMsg, 255, "你挂了, %d 秒后你可与活着的队友通话", timeleft);
           }
           set_hudmessage(255, 196, 196, -1.0, 0.73, 0, 0.0, 3.0, 0.0, 0.0, 1)
           show_hudmessage(id, HintMsg)
     }else if (talkhint==2){
           if(is_user_alive(id))
           {
                 format(HintMsg, 255, "^x04【语音控制】^x01你已经出生, 现在你可以与你的队友正常语音通话。");
                 timeleft = 0;
           }else if(talktime==0){
                 format(HintMsg, 255, "^x04【语音控制】^x01你挂了, 但你仍然可以与你的队友语音通话。");
           }else if(talktime>0){
                 if(timeleft==0)
                       format(HintMsg, 255, "^x04【语音控制】^x01时间到, 你现在不能跟活着的队友通话了。", timeleft);
                 else
                       format(HintMsg, 255, "^x04【语音控制】^x01你挂了, 但 %d 秒内你仍然可以与活着的队友通话。", timeleft);
           }else{
                 if(timeleft==0)
                       format(HintMsg, 255, "^x04【语音控制】^x01你现在可以跟活着的队友通话了。", timeleft);
                 else
                       format(HintMsg, 255, "^x04【语音控制】^x01你挂了, %d 秒后你可与活着的队友通话。", timeleft);
           }
           client_color(id, id, HintMsg);
     }
     if(timeleft>0)
     {
           param[1]=timeleft-1;
           set_task(1.0, "ShowHint", 0, param, 2);
     }
     return PLUGIN_CONTINUE;
}

public fm_voice_forward(receiver, sender, listen)
{
     if(receiver==sender) return FMRES_IGNORED;
     new alltalk = get_cvar_num("sv_alltalk");
     if(alltalk) return FMRES_IGNORED;
     if(!get_pcvar_num(p_teamtalk)) return FMRES_IGNORED;
     if(!is_user_connected(receiver) || !is_user_connected(sender))
           return FMRES_IGNORED;
     if(g_player_muted[sender] && get_user_flags(sender)&ADMIN_IMMUNITY==0) //如果此人被禁止讲话
     {
           engfunc(EngFunc_SetClientListening, receiver, sender, 0);
           return FMRES_SUPERCEDE;
     }
     new CsTeams:rt=cs_get_user_team(receiver);
     new CsTeams:st=cs_get_user_team(sender);
     if(rt==CS_TEAM_UNASSIGNED || rt==CS_TEAM_SPECTATOR)      //观察员可以听到所有人讲话
     {
           engfunc(EngFunc_SetClientListening, receiver, sender, 1);
           return FMRES_SUPERCEDE;
     }
     if(rt==st){ //如果是队友间讲话
           if(is_user_alive(sender)) //活着的队友讲话,队友都可以听到
           {
                 engfunc(EngFunc_SetClientListening, receiver, sender, 1);
                 return FMRES_SUPERCEDE;
           }
           //死亡的队友讲话,分两种情况
           if(!is_user_alive(receiver)) //一:死亡的队友可以听到死亡的队友讲话(包括两者都是观察员的情况)
           {
                 engfunc(EngFunc_SetClientListening, receiver, sender, 1);
                 return FMRES_SUPERCEDE;
           }
           //二:如果讲话者是死的,听话者是活的,则根据参数和死亡时间来区分
           new talktime = get_pcvar_num(p_talktime);
           if(talktime == 0)
           {
                 engfunc(EngFunc_SetClientListening, receiver, sender, 1); //总可以听到队友讲话
                 return FMRES_SUPERCEDE;
           }
           new Float:gametime = get_gametime();
           if(talktime>0){ //队友死亡后多少秒内活着的队友可以听到,可用于报点,但可防止时间过后影响活着的队友发挥
                 if(gametime-g_player_deathtime[sender]>talktime)//如果当前时间-最后死亡时间>指定的时间,则活的队友听不到讲话
                 {
                       engfunc(EngFunc_SetClientListening, receiver, sender, 0);
                 }else{                                          //否则(当前时间-最后死亡时间<=指定的时间),活的队友可听到讲话
                       engfunc(EngFunc_SetClientListening, receiver, sender, 1);
                 }
           }else{ //队友死亡后多少秒内活着的队友听不到,可防止报点,但这个时间过后可以进行战术指挥
                 talktime = - talktime; //取绝对值
                 if(gametime-g_player_deathtime[sender]>talktime)//如果当前时间-最后死亡时间>指定的时间,则活的队友可听到讲话
                 {
                       engfunc(EngFunc_SetClientListening, receiver, sender, 1);
                 }else{                                          //否则(当前时间-最后死亡时间<=指定的时间),活的队友听不到讲话
                       engfunc(EngFunc_SetClientListening, receiver, sender, 0);
                 }
           }
     }else{ //否则听不到讲话(不是队友,也不是观察员)
           engfunc(EngFunc_SetClientListening, receiver, sender, 0);
     }
     
     return FMRES_SUPERCEDE;
}

public client_connect(id)
{
     g_player_muted[id] = 0;
     g_player_deathtime[id] = get_gametime();
}

public cmdMute(id, level, cid)
{
     if(!cmd_access(id, level, cid, 2))
           return PLUGIN_HANDLED;
     new name[32];
     read_argv(1, name, 31);
     new target = cmd_target(id, name, 1);
     if(!target) return PLUGIN_HANDLED;
     g_player_muted[target] = 1
     return PLUGIN_HANDLED;
}

public cmdUnMute(id, level, cid)
{
     if(!cmd_access(id, level, cid, 2))
           return PLUGIN_HANDLED;
     new name[32];
     read_argv(1, name, 31);
     new target = cmd_target(id, name, 0);
     if(!target) return PLUGIN_HANDLED;
     g_player_muted[target] = 0
     return PLUGIN_HANDLED;
}

stock client_color(playerid,colorid,msg[])
{
     message_begin(playerid?MSG_ONE:MSG_ALL, get_user_msgid("SayText"), {0,0,0}, playerid)
     write_byte(colorid)
     write_string(msg)
     message_end()
}

/* UTF-8 func by www.DT-Club.net */

本帖包含附件
檔名: zip teamtalk.rar   (2022-06-09 14:07 / 13 KB)  
下載次數:181


獻花 x1
引用 | 編輯 a034759441
2008-09-09 16:33
1樓
  
感覺好像沒甚麼用耶 表情

在考慮一下好了 表情

獻花 x0
引用 | 編輯 lixiangideal
2008-10-15 13:58
2樓
  
这个不错,但是我提个建议,有没有高手可以根据我的建议改一下

建议就是活着的隊友听不到死了的队友的说话;如果不是隊友,就不能通話;觀察員可以聽到所有人說話

獻花 x0
引用 | 編輯 Show!
2009-02-02 18:44
3樓
  
更新了

獻花 x0
引用 | 編輯 A8153906
2009-03-01 18:36
4樓
  
摁....

就怕有小白濫用麥克風><"

獻花 x0
引用 | 編輯 修乂雯
2009-05-26 00:48
5樓
  
不知道好不好用..

下次再來研究吧XD"

給你推推

獻花 x0
引用 | 編輯 qaz885566
2010-03-14 17:46
6樓
  
試用看看 先

獻花 x0
引用 | 編輯 aids6828
2010-07-06 20:34
7樓
  
先來試用看看反正這東西是免錢的 謝謝大大分享

獻花 x0
引用 | 編輯 chanpikmay20
2010-09-17 21:57
8樓
  
支持支持
不知道是什麼
我下載來試試吧

獻花 x0
引用 | 編輯 a220873963
2010-12-19 12:47
9樓
  
看不懂耶..

獻花 x0
引用 | 編輯 hinson
2011-03-06 14:02
10樓
  
我下載來試試吧

獻花 x0
引用 | 編輯 SixNine
2011-03-12 18:22
11樓
  
看起來就是很不錯的樣子
可惜少了繁化

獻花 x0
引用 | 編輯 zxzyman
2011-06-06 14:15
12樓
  
打TP可以使用吧...

怕被偷聽

獻花 x0
引用 | 編輯 l384261160
2012-05-18 00:32
13樓
  
很實用的一個插件!

獻花 x0
引用 | 編輯 asd17931
2012-09-19 20:28
14樓
  
這是簡體字的
看不懂 表情

獻花 x0
引用 | 編輯 r4903820
2014-02-08 14:41
15樓
  
我裝上去
可是好像沒反應
不知道是什麼原因?表情

獻花 x0