Leya 发表于 2008-8-24 04:43:45

Friends_talk 多种语音通讯模式


/***************************************************************************************
*amxmodx插件 amxmodx 1.71 测试通过
* 设置多种语音通讯模式的插件
* Friends_talk.sma
* 来源: http://cs-friends.com.cn

* 作者:iG_os,version 0.2.16 2006-6-24 22:00

参数:friends_talk 1(默认) //0=sv_alltalk 0
         //1=sv_alltalk 1
         //2=活的队伍通信,死的听所有人声音
         //3=同队伍(死&活)都能通信,观察者听所有人声音(适合比赛用)
amx命令:
amx_friends_talk (0-3)临时更改语音模式,功能同上
adminspeak      (打开/关闭)管理员发言模式,在任何模式下管理员都能和其他玩家通信
***************************************************************************************/

#define PLUGIN"Friends_Talk"
#define VERSION "0.2.16"
#define AUTHOR"iG_os"

#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fun>

new g_talkMODE
new g_MAXPLAYERS
new g_adminspeak = {false,...}

//=0模式,队伍语音 = sv_alltalk 0
public player_listen_default()
{
   for (new id = 1; id <= g_MAXPLAYERS; id++)
   if (is_user_connected(id))
   if (!g_adminspeak) //排除admin语音设置
      set_speak(id, SPEAK_NORMAL) //id 恢复正常模式
   set_cvar_num( "sv_alltalk",0 )
}

//=1模式,设置 id 与所有人相互通话 = sv_alltalk 1
public player_listen_all()
{
/*
for (new id = 1; id <= g_MAXPLAYERS; id++)
if (is_user_connected(id))
   if (!g_adminspeak) //排除admin语音设置
    set_speak(id, SPEAK_NORMAL) //id 恢复正常模式
*/
   set_cvar_num( "sv_alltalk",1 )
}

//=2模式,设置活得 id 与同队人语音,死得 id 听所有人声音
public player_listen_team(id)
{
   if( !is_user_connected(id) ) return
   if (g_adminspeak) return //排除admin语音设置
   new team = get_user_team(id)
   if ( (team==1 || team==2) && is_user_alive(id) ) //id 是 T or CT 并且是活的
   {
      set_speak(id,SPEAK_NORMAL) //活得恢复默认
   }
   else
   {
      set_speak(id, SPEAK_LISTENALL) //死的听所有
   }
}

//=3模式,设置id与T,CT同队(活的与死的)相互可以通话声音
public player_listen_teamall(id)
{
   if ( !is_user_connected(id) ) return
   if (g_adminspeak) return //排除admin语音设置
   new team = get_user_team(id)
   if ( team!=1 && team!=2 ) //id 不是 T or CT
   {
      set_speak(id, SPEAK_LISTENALL) //观察者听所有
      return
   }
   for( new other = 1;other<=g_MAXPLAYERS;other++)
   {
      if (is_user_connected(other))
      if (!g_adminspeak)//排除admin语音设置
      if (other!=id)
      if (team==get_user_team(other)) //other 与 id 同队
      {
         set_client_listen(id,other,1)//id 听到 other
         set_client_listen(other,id,1)//other 听到 id
      }
      else
      {
         set_client_listen(id,other,0) //id 与 other 相互屏蔽声音
      }
   }
}

public player_spawn(id)
{
   new param
   param = id
   set_task(0.3,"player_reset",123+id,param,1)
   return PLUGIN_CONTINUE
}

public player_reset(param[])
{
   new id = param
   if (g_adminspeak) return
   switch (g_talkMODE)
   {
      case 2: player_listen_team(id)
      case 3: player_listen_teamall(id)
   }
}

public death_event()
{
   new param
   param = read_data(2)
   set_task(0.3,"player_reset",123+param,param,1)
   return PLUGIN_CONTINUE
}

public joined_team()
{
   new Arg1,name
   read_logargv(0,Arg1,63)
   parse_loguser (Arg1, name, 31)
   new id = get_user_index (name)
   new param
   param = id
   set_task(7.0,"show_msg",565656+id,param,1)
   set_task(0.3,"player_reset",123+id,param,1)
   return PLUGIN_CONTINUE
}

public client_putinserver(id)
{
   new param
   param = id
   set_task(0.3,"player_reset",123+id,param,1)
   return PLUGIN_CONTINUE
}

public eRestart()
{
   switch (g_talkMODE)
   {
      case 0: player_listen_default()
      case 1: player_listen_all()
      case 2:
      {
         set_cvar_num( "sv_alltalk",0 ) //sv_alltalk 0 必须要设为 0 才生效
         for (new id = 1; id <= g_MAXPLAYERS; id++)
         player_listen_team(id)
      }
      case 3:
      {
         set_cvar_num( "sv_alltalk",0 ) //sv_alltalk 0 必须要设为 0 才生效
         for (new id = 1; id <= g_MAXPLAYERS; id++)
         player_listen_teamall(id)
      }
   }
   return PLUGIN_CONTINUE
}

public talkset(id,level,cid)
{
   if (!cmd_access(id,level,cid,2))
      return PLUGIN_HANDLED
   new arg
   read_argv(1,arg,2)
   new res = str_to_num(arg)
   if (res<0 || res>3)
      return PLUGIN_HANDLED

   g_talkMODE = res
   new name
   get_user_name (id, name,31)
   new msg
   format(msg,255,"^x01<^x03 %s^x01> ^x04改变语音模式",name)
   color_text_all(id,msg)

   new param
   param = 0
   show_msg(param)
   eRestart()
   log_amx("[%s] change friends_talk %d", name,g_talkMODE)
   return PLUGIN_CONTINUE
}

public show_msg(param[])
{
   new id = param
   new msg
   switch (g_talkMODE)
   {
      case 0: //队伍通话 sv_alltalk 0
         format(msg,255,"^x01<^x04 cs-friends.com.cn 语音模式^x01 > ^x03队伍通话 sv_alltalk 0")
      case 1: //所有人相互通话 sv_alltalk 1
         format(msg,255,"^x01<^x04 cs-friends.com.cn 语音模式^x01 > ^x03所有人相互通话 sv_alltalk 1")
      case 2: //同队活人之间相互通话,所有死亡人相互通话,并听见活着人说话模式
         format(msg,255,"^x01<^x04 cs-friends.com.cn 语音模式^x01 > ^x03同队活人相互通话,所有死亡人相互通话,并听见活人说话")
      case 3: //同队人之间死活都相互通话模式
         format(msg,255,"^x01<^x04 cs-friends.com.cn 语音模式^x01 > ^x03同队人死活都相互通话模式,观察者听见所有人说话模式")
   }
   if (id==0) color_text_all(id,msg)
   else color_text_one(id,msg)
}

public admin_speak(id,level,cid)
{
   if (!cmd_access(id,level,cid,1))
      return PLUGIN_HANDLED
   new msg
   if (!g_adminspeak)
   {
      g_adminspeak = true
      set_speak(id, SPEAK_LISTENALL+SPEAK_ALL) //id 听,说所有
      format(msg,255,"^x01<^x04管理员通话模式^x01> ^x03打开")
   }
   else
   {
      g_adminspeak = false
      new param
      param = id
      set_task(0.1,"player_reset",123+id,param,1)
      format(msg,255,"^x01<^x04管理员通话模式^x01> ^x03关闭")
   }
   color_text_all(id,msg)
   return PLUGIN_CONTINUE
}

public color_text_all(id,msg[])
{
   message_begin(MSG_ALL, get_user_msgid("SayText"), {0,0,0}, id)
   write_byte(id)
   write_string(msg)
   message_end()
}
public color_text_one(id,msg[])
{
   message_begin(MSG_ONE, get_user_msgid("SayText"), {0,0,0}, id)
   write_byte(id)
   write_string(msg)
   message_end()
}

public plugin_init()
{
   register_plugin(PLUGIN,VERSION,AUTHOR)
   register_event("ResetHUD", "player_spawn", "be")
   register_event("DeathMsg", "death_event", "a")
   register_event("TextMsg","eRestart","a","2&#Game_C","2&#Game_w")
   register_logevent("joined_team", 3, "1=joined team") //"2=SPECTATOR" //"2=CT" //"2=TERRORIST"
   
   register_concmd("adminspeak", "admin_speak", ADMIN_RESERVATION, "Admin speak is on/off")
   register_concmd("amx_friends_talk","talkset",ADMIN_RESERVATION,"(0-3) Set friends_talk mode")
   register_cvar("friends_talk","1")

   g_talkMODE = get_cvar_num("friends_talk")
   g_MAXPLAYERS = get_maxplayers()
   return PLUGIN_CONTINUE
}

daredevil 发表于 2009-1-29 23:56:36

同队伍(死&活)都能通信,观察者听所有人声音(适合比赛用)
无效果。。
页: [1]
查看完整版本: Friends_talk 多种语音通讯模式