Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

4 страниц V   1 2 3 »

Voices Management

, Разделение голосового чата
Статус пользователя Bloo
сообщение 9.4.2014, 18:56
Сообщение #21


Стаж: 12 лет

Сообщений: 15547
Благодарностей: 6971
Полезность: 1206

Paxila,плагина естественно
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Paxila
сообщение 9.4.2014, 18:58
Сообщение #22


Стаж: 12 лет

Сообщений: 81
Благодарностей: 4
Полезность: < 0

Цитата(Bloo @ 9.4.2014, 18:56) *
Paxila,плагина естественно

А он уменя вообще не стои, вот я решил поставить так как, те кто умер много говорят
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 9.4.2014, 18:59
Сообщение #23


Стаж: 12 лет

Сообщений: 15547
Благодарностей: 6971
Полезность: 1206

Paxila, amxx какой версии?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Paxila
сообщение 9.4.2014, 19:01
Сообщение #24


Стаж: 12 лет

Сообщений: 81
Благодарностей: 4
Полезность: < 0

Цитата(etkins @ 9.4.2014, 18:56) *
sv_alltalk 1

у меня стоит это значение, я бы хотел сделать так чтобы ещё жевые не слышали мёртвых

Цитата(Bloo @ 9.4.2014, 18:59) *
Paxila, amxx какой версии?

AMX Mod X 1.8.1 RUS
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 9.4.2014, 19:44
Сообщение #25


Стаж: 12 лет

Сообщений: 15547
Благодарностей: 6971
Полезность: 1206

Paxila,
Код:
// Required admin access level
#define ADMIN_VOICE ADMIN_CHAT

// Delay before a connected player see the text announce
#define ANNOUNCE_TASK_DELAY 30.0

// Comment this out if you don't want that a "no sound" player can hear admins using +adminvoice
// All other player settings are respected whatever this is commented or not.
#define SUPER_ADMIN_PRIORITY

/* ** END OF EDITABLE ** */

/* Changelog
*
* v1.0.2 (04/19/08)
* -few code corrections
* -updated player spawn detection
* -added HLTV & BOT checks
*
* v1.0.1 (03/31/08)
* -added colored chat
* -added chat command /vm that display voices settings
* -inform new players about /vm command
* -display adminlisten status when toggle_adminlisten command is used
* -added support for amx_show_activity cvar on amx_(un)mute command
*
* v1.0.0 (03/26/08)
* First release
*
*/

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

#define VERSION "1.1.0"

#define MAX_PLAYERS 32

#define XO_PLAYER 5
#define m_iTeam 114
#define cs_get_user_team_index(%0) get_pdata_int(%0, m_iTeam, XO_PLAYER)

new g_iClientSettings[MAX_PLAYERS+1][2]
#define HasUserVoicesOn(%0) g_iClientSettings[%0][0]
#define HasUserMutedPlayer(%0,%1) g_iClientSettings[%0][1] & (1<<(%1-1))

new g_bitAdminListen
#define MarkAdminListening(%0) g_bitAdminListen |= 1<<(%0&31)
#define ClearAdminListening(%0) g_bitAdminListen &= ~(1<<(%0&31))
#define IsAdminListening(%0) ( g_bitAdminListen & 1<<(%0&31) )

new g_iAdminVoice
new g_bitInterAdminSpeek
#define MarkUserSpeakingToAdmins(%0) g_bitInterAdminSpeek |= 1<<(%0&31)
#define ClearUserSpeakingToAdmins(%0) g_bitInterAdminSpeek &= ~(1<<(%0&31))
#define IsUserSpeakingToAdmins(%0) ( g_bitInterAdminSpeek & 1<<(%0&31) )

new g_bitAdmins
#define MarkUserAdmin(%0) g_bitAdmins |= 1<<(%0&31)
#define ClearUserAdmin(%0) g_bitAdmins &= ~(1<<(%0&31))
#define IsUserAdmin(%0) ( g_bitAdmins & 1<<(%0&31) )

new Trie:g_tMutedPlayersIps
new g_bitMutedPlayers
#define MarkUserMuted(%0) g_bitMutedPlayers |= 1<<(%0&31)
#define ClearUserMuted(%0) g_bitMutedPlayers &= ~(1<<(%0&31))
#define IsUserMuted(%0) ( g_bitMutedPlayers & 1<<(%0&31) )

new const bitAllEnabled = (1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4)
new g_iReceiverStatus[5]

new g_iSayText
new g_pCvarAmxShowActivity, g_iShowActivityValue

public plugin_init()
{
register_plugin("Voices Management", VERSION, "ConnorMcLeod")
register_dictionary_colored("voicesmanagement.txt")
register_dictionary("common.txt")

register_forward(FM_Voice_SetClientListening, "SetClientListening")
register_event("VoiceMask", "Event_VoiceMask", "b")

register_clcmd("+adminvoice", "AdminCommand_VoiceOn")
register_clcmd("-adminvoice", "AdminCommand_VoiceOff")

register_clcmd("+interadminvoice", "AdminCommand_InterAdminOn")
register_clcmd("-interadminvoice", "AdminCommand_InterAdminOff")

register_clcmd("+adminlisten", "AdminCommand_ListenOn")
register_clcmd("-adminlisten", "AdminCommand_ListenOff")
register_clcmd("toggle_adminlisten", "AdminCommand_ListenToggle")

register_concmd("amx_mute", "AdminCommand_Mute", ADMIN_VOICE, "<name/#userid>")
register_concmd("amx_unmute", "AdminCommand_UnMute", ADMIN_VOICE, "<name/#userid>")

register_concmd("amx_set_vm_status", "ConCmd_SetStatus", ADMIN_CFG, "- <receiver> <flags>")

register_clcmd("say /vm", "ClientCommand_SayStatus")
register_clcmd("say_team /vm", "ClientCommand_SayStatus")
}

public plugin_cfg()
{
set_cvar_num("sv_alltalk", 1)
g_tMutedPlayersIps = TrieCreate()
g_iSayText = get_user_msgid("SayText")
g_pCvarAmxShowActivity = get_cvar_pointer("amx_show_activity")
}

public ConCmd_SetStatus(id, lvl, cid)
{
if( cmd_access(id, lvl, cid, 3) )
{
new szWho[2], szFlags[6]
read_argv(1, szWho, charsmax(szWho))
read_argv(2, szFlags, charsmax(szFlags))
g_iReceiverStatus[str_to_num(szWho)] = read_flags(szFlags)
}
return PLUGIN_HANDLED
}

public ClientCommand_SayStatus(id)
{
static const szMlKeys[][] = { "VM_SPECTATORS", "VM_DEAD_T", "VM_DEAD_CT", "VM_ALIVE_T", "VM_ALIVE_CT" }
new szHearable[256], n, bRemove, iStatus
for(new i, j; i<5; i++)
{
iStatus = g_iReceiverStatus[i]
bRemove = false
n = formatex(szHearable, charsmax(szHearable), "^4%L ^1%L : ", id, szMlKeys[i], id, "VM_CAN_HEAR")
if( !iStatus )
{
n += formatex(szHearable[n], charsmax(szHearable)-n, "^4%L", id, "VM_NOBODY")
}
else if( iStatus == bitAllEnabled )
{
n += formatex(szHearable[n], charsmax(szHearable)-n, "^4%L", id, "VM_EVERYBODY")
}
else
{
for(j=0; j<5; j++)
{
if( iStatus & 1<<j )
{
bRemove = true
n += formatex(szHearable[n], charsmax(szHearable)-n, "^3%L ^1| ", id, szMlKeys[j])
}
}
if( bRemove )
{
szHearable[n-3] = 0
}
}

col_mess(id, id, szHearable)
}
}

public taskAnnounce(id)
{
if( is_user_connected(id) )
{
col_mess(id, id, "%L", id, "VM_ANNOUCE")
}
}

public client_authorized(id)
{
UpdateAdminAccess(id)
}

public client_infochanged(id)
{
UpdateAdminAccess(id)
}

UpdateAdminAccess(id)
{
if( get_user_flags(id) & ADMIN_VOICE )
{
MarkUserAdmin(id)
}
else
{
ClearUserAdmin(id)
}
}

public client_putinserver(id)
{
ClearAdminListening(id)
ClearUserSpeakingToAdmins(id)

if(is_user_bot(id) || is_user_hltv(id))
return

new szIp[22]
get_user_ip(id, szIp, charsmax(szIp))

if( TrieKeyExists(g_tMutedPlayersIps, szIp) )
{
MarkUserMuted(id)
}
else
{
ClearUserMuted(id)
}

set_task(ANNOUNCE_TASK_DELAY, "taskAnnounce", id)
}

public client_disconnect(id)
{
if(g_iAdminVoice == id)
{
g_iAdminVoice = 0
}
}

public Event_VoiceMask(id)
{
g_iClientSettings[id][0] = read_data(1)
g_iClientSettings[id][1] = read_data(2)
}

public SetClientListening(iReceiver, iSender, bool:bListen)
{
if( !is_user_connected(iReceiver) || !is_user_connected(iSender) )
{
return FMRES_IGNORED
}

new bReturn = false
#if defined SUPER_ADMIN_PRIORITY
if(g_iAdminVoice)
{
bReturn = g_iAdminVoice == iSender
}

else if( !HasUserVoicesOn(iReceiver) || HasUserMutedPlayer(iReceiver,iSender) )
{
return FMRES_IGNORED
}
#else
if( !HasUserVoicesOn(iReceiver) || HasUserMutedPlayer(iReceiver,iSender) )
{
return FMRES_IGNORED
}

else if(g_iAdminVoice)
{
bReturn = g_iAdminVoice == iSender
}
#endif
else if(IsUserMuted(iSender))
{
/* bReturn = false */
}

else if( IsUserSpeakingToAdmins(iSender) )
{
bReturn = IsUserAdmin(iReceiver)
}

else if( IsAdminListening(iReceiver) )
{
bReturn = true
}

else
{
bReturn = ShouldReceiverHearSender(iReceiver, iSender)
}

engfunc(EngFunc_SetClientListening, iReceiver, iSender, bReturn)
forward_return(FMV_CELL, bReturn)
return FMRES_SUPERCEDE
}

bool:ShouldReceiverHearSender(iReceiver, iSender)
{
new iStatus, iTeam

iTeam = cs_get_user_team_index( iReceiver )
if( 1 <= iTeam <= 2 )
{
iStatus += iTeam
if( is_user_alive( iReceiver ) )
{
iStatus += 2
}
}

new bitHearable = g_iReceiverStatus[ iStatus ]
if( !bitHearable )
{
return false
}
else if( bitHearable & bitAllEnabled == bitAllEnabled )
{
return true
}

iStatus = 0
iTeam = cs_get_user_team_index( iSender )
if( 1 <= iTeam <= 2 )
{
iStatus += iTeam
if( is_user_alive( iSender ) )
{
iStatus += 2
}
}

return !!( bitHearable & 1<<iStatus )
}

public AdminCommand_ListenOn(id)
{
if( IsUserAdmin(id) )
{
MarkAdminListening(id)
}
return PLUGIN_HANDLED
}

public AdminCommand_ListenOff(id)
{
ClearAdminListening(id)
return PLUGIN_HANDLED
}

public AdminCommand_ListenToggle(id)
{
if( !IsUserAdmin(id) )
{
return PLUGIN_HANDLED
}

g_bitAdminListen ^= 1<<(id&31)

col_mess(id, id, "%L", id, "VM_LISTEN_STATUS", IsAdminListening(id) ? "ON" : "OFF")

return PLUGIN_HANDLED
}

public AdminCommand_VoiceOn(id)
{
if(!IsUserAdmin(id))
{
return PLUGIN_HANDLED
}

if(g_iAdminVoice)
{
col_mess(id, id, "%L", id, "VM_ALREADY_INUSE")
return PLUGIN_HANDLED
}

g_iAdminVoice = id

new szName[32]
get_user_name(id, szName, charsmax(szName))

new iPlayers[32], iNum, iPlayer
get_players(iPlayers, iNum, "ch")
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
col_mess(iPlayer, id, "%L", iPlayer, "VM_ADMIN_TALK", szName)
engfunc(EngFunc_SetClientListening, iPlayer, id, true)
}

client_cmd(id, "+voicerecord")

return PLUGIN_HANDLED
}

public AdminCommand_VoiceOff(id)
{
if( !IsUserAdmin(id) )
{
return PLUGIN_HANDLED
}

if(g_iAdminVoice != id)
{
client_cmd(id, "-voicerecord")
return PLUGIN_HANDLED
}

client_cmd(id, "-voicerecord")
g_iAdminVoice = 0
return PLUGIN_HANDLED
}

public AdminCommand_InterAdminOn(id)
{
if( !IsUserAdmin(id) )
{
return PLUGIN_HANDLED
}

MarkUserSpeakingToAdmins(id)
client_cmd(id, "+voicerecord")

new szName[32]
get_user_name(id, szName, charsmax(szName))

new iPlayers[32], iNum, iPlayer
get_players(iPlayers, iNum, "ch")
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
if( IsUserAdmin(iPlayer) )
{
col_mess(iPlayer, id, "%L", iPlayer, "VM_INTER_START", szName)
engfunc(EngFunc_SetClientListening, iPlayer, id, true)
}
else
{
engfunc(EngFunc_SetClientListening, iPlayer, id, false)
}

}

return PLUGIN_HANDLED
}

public AdminCommand_InterAdminOff(id)
{
if(!IsUserSpeakingToAdmins(id) )
return PLUGIN_HANDLED

ClearUserSpeakingToAdmins(id)
client_cmd(id, "-voicerecord")

new szName[32]
get_user_name(id, szName, charsmax(szName))

new iPlayers[32], iNum, iPlayer
get_players(iPlayers, iNum, "ch")
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
if( IsUserAdmin(iPlayer) )
{
col_mess(iPlayer, id, "%L", iPlayer, "VM_INTER_STOP", szName)
}
}

return PLUGIN_HANDLED
}

public AdminCommand_Mute(id, level, cid)
{
if( !cmd_access(id, level, cid, 2, true) )
{
return PLUGIN_HANDLED
}

new szPlayer[32]
read_argv(1, szPlayer, 31)
new iPlayer = cmd_target(id, szPlayer, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS)

if( !iPlayer )
{
return PLUGIN_HANDLED
}

if( IsUserAdmin(iPlayer) )
{
console_print(id, "%L", id, "VM_MUTE_ADMIN")
return PLUGIN_HANDLED
}

if( IsUserMuted(iPlayer) )
{
console_print(id, "%L", id, "VM_AR_MUTED")
return PLUGIN_HANDLED
}

new szIp[22]
get_user_ip(iPlayer, szIp, charsmax(szIp))
TrieSetCell(g_tMutedPlayersIps, szIp, 1)
MarkUserMuted(iPlayer)
console_print(id, "%L", id, "VM_MUTED")

if(g_pCvarAmxShowActivity && (g_iShowActivityValue = get_pcvar_num(g_pCvarAmxShowActivity)) )
{
new name[32], name2[32]
get_user_name(id, name, charsmax(name))
get_user_name(iPlayer, name2, charsmax(name2))
show_activity_col(id, name, name2, "VM_MUTE_ACTIVITY")
}
return PLUGIN_HANDLED
}

public AdminCommand_UnMute(id, level, cid)
{
if( !cmd_access(id, level, cid, 2, true) )
{
return PLUGIN_HANDLED
}

new szPlayer[32], iPlayer
read_argv(1, szPlayer, 31)
iPlayer = cmd_target(id, szPlayer, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS)

if( !iPlayer )
{
return PLUGIN_HANDLED
}

if( !IsUserMuted(iPlayer) )
{
console_print(id, "%L", id, "VM_NOT_MUTED")
return PLUGIN_HANDLED
}

ClearUserMuted(iPlayer)
new szIp[22]
get_user_ip(iPlayer, szIp, charsmax(szIp))
TrieDeleteKey(g_tMutedPlayersIps, szIp)
console_print(id, "%L", id, "VM_UNMUTED")

if(g_pCvarAmxShowActivity && (g_iShowActivityValue = get_pcvar_num(g_pCvarAmxShowActivity)) )
{
new name[32], name2[32]
get_user_name(id, name, charsmax(name))
get_user_name(iPlayer, name2, charsmax(name2))

show_activity_col(id, name, name2, "VM_UNMUTE_ACTIVITY")
}

return PLUGIN_HANDLED
}

col_mess(id, sender, fmt[], any:...)
{
new szMessage[192]
szMessage[0] = 0x01
vformat(szMessage[1], charsmax(szMessage)-1, fmt, 4)

message_begin(MSG_ONE_UNRELIABLE, g_iSayText, .player=id)
write_byte(sender)
write_string(szMessage)
message_end()
}

show_activity_col(id, name[], name2[], ML_KEY[])
{
new iPlayers[32], iNum, iPlayer
get_players(iPlayers, iNum, "ch")
switch( g_iShowActivityValue )
{
case 5: // hide name only to admins, show nothing to normal users
{
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
if (is_user_admin(iPlayer))
{
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L: %L", iPlayer, "ADMIN", iPlayer, ML_KEY, name2)
}
}
}
case 4: // show name only to admins, show nothing to normal users
{
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
if (is_user_admin(iPlayer))
{
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L ^3%s^1: %L", iPlayer, "ADMIN", name, iPlayer, ML_KEY, name2)
}
}
}
case 3: // show name only to admins, hide name from normal users
{
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
if( is_user_admin(iPlayer) )
{
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L ^3%s^1: %L", iPlayer, "ADMIN", name, iPlayer, ML_KEY, name2)
}
else
{
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L: %L", iPlayer, "ADMIN", iPlayer, ML_KEY, name2)
}
}
}
case 2: // show name to all
{
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L ^3%s^1: %L", iPlayer, "ADMIN", name, iPlayer, ML_KEY, name2)
}
}
case 1: // hide name to all
{
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L: %L", iPlayer, "ADMIN", iPlayer, ML_KEY, name2)
}
}
}
}

register_dictionary_colored(const filename[])
{
if( !register_dictionary(filename) )
{
return 0
}

new szFileName[192]
get_localinfo("amxx_datadir", szFileName, charsmax(szFileName))
format(szFileName, charsmax(szFileName), "%s/lang/%s", szFileName, filename)
new fp = fopen(szFileName, "rt")
if( !fp )
{
log_amx("Failed to open %s", szFileName)
return 0
}

new szBuffer[512], szLang[3], szKey[64], szTranslation[256], TransKey:iKey

while( !feof(fp) )
{
fgets(fp, szBuffer, charsmax(szBuffer))
trim(szBuffer)

if( szBuffer[0] == '[' )
{
strtok(szBuffer[1], szLang, charsmax(szLang), szBuffer, 1, ']')
}
else if( szBuffer[0] )
{
strbreak(szBuffer, szKey, charsmax(szKey), szTranslation, charsmax(szTranslation))
iKey = GetLangTransKey(szKey)
if( iKey != TransKey_Bad )
{
while( replace(szTranslation, charsmax(szTranslation), "!g", "^4") ){}
while( replace(szTranslation, charsmax(szTranslation), "!t", "^3") ){}
while( replace(szTranslation, charsmax(szTranslation), "!n", "^1") ){}
AddTranslation(szLang, iKey, szTranslation[2])
}
}
}

fclose(fp)
return 1
}

Влаги для настройки (Пример заполнения кваров ниже)
Цитата
Кто слышит :
0 : Наблюдатели
1 : Мертвы Т
2 : Мертвы СТ
3 : Живые Т
4 : Живые СТ

Кого слышат :
a : Наблюдатели
b : Мертвые Т
c : Мертвы СТ
d : Живые Т
e : Живые СТ

Код
amx_set_vm_status "0" "abcde"
amx_set_vm_status "1" "abcde"
amx_set_vm_status "2" "abcde"
amx_set_vm_status "3" "de"
amx_set_vm_status "4" "de"

Живые обеих команд слышат друг друга но не слышат мертвых и спектров, спектры и мертвые слышат всех.

Отредактировал: Bloo, - 10.4.2014, 8:21
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Paxila
сообщение 9.4.2014, 19:57
Сообщение #26


Стаж: 12 лет

Сообщений: 81
Благодарностей: 4
Полезность: < 0

Bloo, я сисьно не понемаю в скриптинге но чуток понемаю. Вот первое я вставел в .sma и начал кампелировать у меня не вышло выдало ошибку. А вот 2 код он для чего? если не трудно скинь пожалуйста уже готовый исходник

Отредактировал: Paxila, - 9.4.2014, 20:07
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 9.4.2014, 20:28
Сообщение #27


Стаж: 12 лет

Сообщений: 15547
Благодарностей: 6971
Полезность: 1206

Код:
// Required admin access level
#define ADMIN_VOICE ADMIN_CHAT

// Delay before a connected player see the text announce
#define ANNOUNCE_TASK_DELAY 30.0

// Comment this out if you don't want that a "no sound" player can hear admins using +adminvoice
// All other player settings are respected whatever this is commented or not.
#define SUPER_ADMIN_PRIORITY

/* ** END OF EDITABLE ** */

/* Changelog
*
* v1.0.2 (04/19/08)
* -few code corrections
* -updated player spawn detection
* -added HLTV & BOT checks
*
* v1.0.1 (03/31/08)
* -added colored chat
* -added chat command /vm that display voices settings
* -inform new players about /vm command
* -display adminlisten status when toggle_adminlisten command is used
* -added support for amx_show_activity cvar on amx_(un)mute command
*
* v1.0.0 (03/26/08)
* First release
*
*/

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

#define VERSION "1.1.0"

#define MAX_PLAYERS 32

#define XO_PLAYER 5
#define m_iTeam 114
#define cs_get_user_team_index(%0) get_pdata_int(%0, m_iTeam, XO_PLAYER)

new g_iClientSettings[MAX_PLAYERS+1][2]
#define HasUserVoicesOn(%0) g_iClientSettings[%0][0]
#define HasUserMutedPlayer(%0,%1) g_iClientSettings[%0][1] & (1<<(%1-1))

new g_bitAdminListen
#define MarkAdminListening(%0) g_bitAdminListen |= 1<<(%0&31)
#define ClearAdminListening(%0) g_bitAdminListen &= ~(1<<(%0&31))
#define IsAdminListening(%0) ( g_bitAdminListen & 1<<(%0&31) )

new g_iAdminVoice
new g_bitInterAdminSpeek
#define MarkUserSpeakingToAdmins(%0) g_bitInterAdminSpeek |= 1<<(%0&31)
#define ClearUserSpeakingToAdmins(%0) g_bitInterAdminSpeek &= ~(1<<(%0&31))
#define IsUserSpeakingToAdmins(%0) ( g_bitInterAdminSpeek & 1<<(%0&31) )

new g_bitAdmins
#define MarkUserAdmin(%0) g_bitAdmins |= 1<<(%0&31)
#define ClearUserAdmin(%0) g_bitAdmins &= ~(1<<(%0&31))
#define IsUserAdmin(%0) ( g_bitAdmins & 1<<(%0&31) )

new Trie:g_tMutedPlayersIps
new g_bitMutedPlayers
#define MarkUserMuted(%0) g_bitMutedPlayers |= 1<<(%0&31)
#define ClearUserMuted(%0) g_bitMutedPlayers &= ~(1<<(%0&31))
#define IsUserMuted(%0) ( g_bitMutedPlayers & 1<<(%0&31) )

new const bitAllEnabled = (1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4)
new g_iReceiverStatus[5]

new g_iSayText
new g_pCvarAmxShowActivity, g_iShowActivityValue

public plugin_init()
{
register_plugin("Voices Management", VERSION, "ConnorMcLeod")
register_dictionary_colored("voicesmanagement.txt")
register_dictionary("common.txt")

register_forward(FM_Voice_SetClientListening, "SetClientListening")
register_event("VoiceMask", "Event_VoiceMask", "b")

register_clcmd("+adminvoice", "AdminCommand_VoiceOn")
register_clcmd("-adminvoice", "AdminCommand_VoiceOff")

register_clcmd("+interadminvoice", "AdminCommand_InterAdminOn")
register_clcmd("-interadminvoice", "AdminCommand_InterAdminOff")

register_clcmd("+adminlisten", "AdminCommand_ListenOn")
register_clcmd("-adminlisten", "AdminCommand_ListenOff")
register_clcmd("toggle_adminlisten", "AdminCommand_ListenToggle")

register_concmd("amx_mute", "AdminCommand_Mute", ADMIN_VOICE, "<name/#userid>")
register_concmd("amx_unmute", "AdminCommand_UnMute", ADMIN_VOICE, "<name/#userid>")

register_concmd("amx_set_vm_status", "ConCmd_SetStatus", ADMIN_CFG, "- <receiver> <flags>")

register_clcmd("say /vm", "ClientCommand_SayStatus")
register_clcmd("say_team /vm", "ClientCommand_SayStatus")
}

public plugin_cfg()
{
set_cvar_num("sv_alltalk", 1)
g_tMutedPlayersIps = TrieCreate()
g_iSayText = get_user_msgid("SayText")
g_pCvarAmxShowActivity = get_cvar_pointer("amx_show_activity")
}

public ConCmd_SetStatus(id, lvl, cid)
{
if( cmd_access(id, lvl, cid, 3) )
{
new szWho[2], szFlags[6]
read_argv(1, szWho, charsmax(szWho))
read_argv(2, szFlags, charsmax(szFlags))
g_iReceiverStatus[str_to_num(szWho)] = read_flags(szFlags)
}
return PLUGIN_HANDLED
}

public ClientCommand_SayStatus(id)
{
static const szMlKeys[][] = { "VM_SPECTATORS", "VM_DEAD_T", "VM_DEAD_CT", "VM_ALIVE_T", "VM_ALIVE_CT" }
new szHearable[256], n, bRemove, iStatus
for(new i, j; i<5; i++)
{
iStatus = g_iReceiverStatus[i]
bRemove = false
n = formatex(szHearable, charsmax(szHearable), "^4%L ^1%L : ", id, szMlKeys[i], id, "VM_CAN_HEAR")
if( !iStatus )
{
n += formatex(szHearable[n], charsmax(szHearable)-n, "^4%L", id, "VM_NOBODY")
}
else if( iStatus == bitAllEnabled )
{
n += formatex(szHearable[n], charsmax(szHearable)-n, "^4%L", id, "VM_EVERYBODY")
}
else
{
for(j=0; j<5; j++)
{
if( iStatus & 1<<j )
{
bRemove = true
n += formatex(szHearable[n], charsmax(szHearable)-n, "^3%L ^1| ", id, szMlKeys[j])
}
}
if( bRemove )
{
szHearable[n-3] = 0
}
}

col_mess(id, id, szHearable)
}
}

public taskAnnounce(id)
{
if( is_user_connected(id) )
{
col_mess(id, id, "%L", id, "VM_ANNOUCE")
}
}

public client_authorized(id)
{
UpdateAdminAccess(id)
}

public client_infochanged(id)
{
UpdateAdminAccess(id)
}

UpdateAdminAccess(id)
{
if( get_user_flags(id) & ADMIN_VOICE )
{
MarkUserAdmin(id)
}
else
{
ClearUserAdmin(id)
}
}

public client_putinserver(id)
{
ClearAdminListening(id)
ClearUserSpeakingToAdmins(id)

if(is_user_bot(id) || is_user_hltv(id))
return

new szIp[22]
get_user_ip(id, szIp, charsmax(szIp))

if( TrieKeyExists(g_tMutedPlayersIps, szIp) )
{
MarkUserMuted(id)
}
else
{
ClearUserMuted(id)
}

set_task(ANNOUNCE_TASK_DELAY, "taskAnnounce", id)
}

public client_disconnect(id)
{
if(g_iAdminVoice == id)
{
g_iAdminVoice = 0
}
}

public Event_VoiceMask(id)
{
g_iClientSettings[id][0] = read_data(1)
g_iClientSettings[id][1] = read_data(2)
}

public SetClientListening(iReceiver, iSender, bool:bListen)
{
if( !is_user_connected(iReceiver) || !is_user_connected(iSender) )
{
return FMRES_IGNORED
}

new bReturn = false
#if defined SUPER_ADMIN_PRIORITY
if(g_iAdminVoice)
{
bReturn = g_iAdminVoice == iSender
}

else if( !HasUserVoicesOn(iReceiver) || HasUserMutedPlayer(iReceiver,iSender) )
{
return FMRES_IGNORED
}
#else
if( !HasUserVoicesOn(iReceiver) || HasUserMutedPlayer(iReceiver,iSender) )
{
return FMRES_IGNORED
}

else if(g_iAdminVoice)
{
bReturn = g_iAdminVoice == iSender
}
#endif
else if(IsUserMuted(iSender))
{
/* bReturn = false */
}

else if( IsUserSpeakingToAdmins(iSender) )
{
bReturn = IsUserAdmin(iReceiver)
}

else if( IsAdminListening(iReceiver) )
{
bReturn = true
}

else
{
bReturn = ShouldReceiverHearSender(iReceiver, iSender)
}

engfunc(EngFunc_SetClientListening, iReceiver, iSender, bReturn)
forward_return(FMV_CELL, bReturn)
return FMRES_SUPERCEDE
}

bool:ShouldReceiverHearSender(iReceiver, iSender)
{
new iStatus, iTeam

iTeam = cs_get_user_team_index( iReceiver )
if( 1 <= iTeam <= 2 )
{
iStatus += iTeam
if( is_user_alive( iReceiver ) )
{
iStatus += 2
}
}

new bitHearable = g_iReceiverStatus[ iStatus ]
if( !bitHearable )
{
return false
}
else if( bitHearable & bitAllEnabled == bitAllEnabled )
{
return true
}

iStatus = 0
iTeam = cs_get_user_team_index( iSender )
if( 1 <= iTeam <= 2 )
{
iStatus += iTeam
if( is_user_alive( iSender ) )
{
iStatus += 2
}
}

return !!( bitHearable & 1<<iStatus )
}

public AdminCommand_ListenOn(id)
{
if( IsUserAdmin(id) )
{
MarkAdminListening(id)
}
return PLUGIN_HANDLED
}

public AdminCommand_ListenOff(id)
{
ClearAdminListening(id)
return PLUGIN_HANDLED
}

public AdminCommand_ListenToggle(id)
{
if( !IsUserAdmin(id) )
{
return PLUGIN_HANDLED
}

g_bitAdminListen ^= 1<<(id&31)

col_mess(id, id, "%L", id, "VM_LISTEN_STATUS", IsAdminListening(id) ? "ON" : "OFF")

return PLUGIN_HANDLED
}

public AdminCommand_VoiceOn(id)
{
if(!IsUserAdmin(id))
{
return PLUGIN_HANDLED
}

if(g_iAdminVoice)
{
col_mess(id, id, "%L", id, "VM_ALREADY_INUSE")
return PLUGIN_HANDLED
}

g_iAdminVoice = id

new szName[32]
get_user_name(id, szName, charsmax(szName))

new iPlayers[32], iNum, iPlayer
get_players(iPlayers, iNum, "ch")
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
col_mess(iPlayer, id, "%L", iPlayer, "VM_ADMIN_TALK", szName)
engfunc(EngFunc_SetClientListening, iPlayer, id, true)
}

client_cmd(id, "+voicerecord")

return PLUGIN_HANDLED
}

public AdminCommand_VoiceOff(id)
{
if( !IsUserAdmin(id) )
{
return PLUGIN_HANDLED
}

if(g_iAdminVoice != id)
{
client_cmd(id, "-voicerecord")
return PLUGIN_HANDLED
}

client_cmd(id, "-voicerecord")
g_iAdminVoice = 0
return PLUGIN_HANDLED
}

public AdminCommand_InterAdminOn(id)
{
if( !IsUserAdmin(id) )
{
return PLUGIN_HANDLED
}

MarkUserSpeakingToAdmins(id)
client_cmd(id, "+voicerecord")

new szName[32]
get_user_name(id, szName, charsmax(szName))

new iPlayers[32], iNum, iPlayer
get_players(iPlayers, iNum, "ch")
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
if( IsUserAdmin(iPlayer) )
{
col_mess(iPlayer, id, "%L", iPlayer, "VM_INTER_START", szName)
engfunc(EngFunc_SetClientListening, iPlayer, id, true)
}
else
{
engfunc(EngFunc_SetClientListening, iPlayer, id, false)
}

}

return PLUGIN_HANDLED
}

public AdminCommand_InterAdminOff(id)
{
if(!IsUserSpeakingToAdmins(id) )
return PLUGIN_HANDLED

ClearUserSpeakingToAdmins(id)
client_cmd(id, "-voicerecord")

new szName[32]
get_user_name(id, szName, charsmax(szName))

new iPlayers[32], iNum, iPlayer
get_players(iPlayers, iNum, "ch")
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
if( IsUserAdmin(iPlayer) )
{
col_mess(iPlayer, id, "%L", iPlayer, "VM_INTER_STOP", szName)
}
}

return PLUGIN_HANDLED
}

public AdminCommand_Mute(id, level, cid)
{
if( !cmd_access(id, level, cid, 2, true) )
{
return PLUGIN_HANDLED
}

new szPlayer[32]
read_argv(1, szPlayer, 31)
new iPlayer = cmd_target(id, szPlayer, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS)

if( !iPlayer )
{
return PLUGIN_HANDLED
}

if( IsUserAdmin(iPlayer) )
{
console_print(id, "%L", id, "VM_MUTE_ADMIN")
return PLUGIN_HANDLED
}

if( IsUserMuted(iPlayer) )
{
console_print(id, "%L", id, "VM_AR_MUTED")
return PLUGIN_HANDLED
}

new szIp[22]
get_user_ip(iPlayer, szIp, charsmax(szIp))
TrieSetCell(g_tMutedPlayersIps, szIp, 1)
MarkUserMuted(iPlayer)
console_print(id, "%L", id, "VM_MUTED")

if(g_pCvarAmxShowActivity && (g_iShowActivityValue = get_pcvar_num(g_pCvarAmxShowActivity)) )
{
new name[32], name2[32]
get_user_name(id, name, charsmax(name))
get_user_name(iPlayer, name2, charsmax(name2))
show_activity_col(id, name, name2, "VM_MUTE_ACTIVITY")
}
return PLUGIN_HANDLED
}

public AdminCommand_UnMute(id, level, cid)
{
if( !cmd_access(id, level, cid, 2, true) )
{
return PLUGIN_HANDLED
}

new szPlayer[32], iPlayer
read_argv(1, szPlayer, 31)
iPlayer = cmd_target(id, szPlayer, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS)

if( !iPlayer )
{
return PLUGIN_HANDLED
}

if( !IsUserMuted(iPlayer) )
{
console_print(id, "%L", id, "VM_NOT_MUTED")
return PLUGIN_HANDLED
}

ClearUserMuted(iPlayer)
new szIp[22]
get_user_ip(iPlayer, szIp, charsmax(szIp))
TrieDeleteKey(g_tMutedPlayersIps, szIp)
console_print(id, "%L", id, "VM_UNMUTED")

if(g_pCvarAmxShowActivity && (g_iShowActivityValue = get_pcvar_num(g_pCvarAmxShowActivity)) )
{
new name[32], name2[32]
get_user_name(id, name, charsmax(name))
get_user_name(iPlayer, name2, charsmax(name2))

show_activity_col(id, name, name2, "VM_UNMUTE_ACTIVITY")
}

return PLUGIN_HANDLED
}

col_mess(id, sender, fmt[], any:...)
{
new szMessage[192]
szMessage[0] = 0x01
vformat(szMessage[1], charsmax(szMessage)-1, fmt, 4)

message_begin(MSG_ONE_UNRELIABLE, g_iSayText, .player=id)
write_byte(sender)
write_string(szMessage)
message_end()
}

show_activity_col(id, name[], name2[], ML_KEY[])
{
new iPlayers[32], iNum, iPlayer
get_players(iPlayers, iNum, "ch")
switch( g_iShowActivityValue )
{
case 5: // hide name only to admins, show nothing to normal users
{
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
if (is_user_admin(iPlayer))
{
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L: %L", iPlayer, "ADMIN", iPlayer, ML_KEY, name2)
}
}
}
case 4: // show name only to admins, show nothing to normal users
{
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
if (is_user_admin(iPlayer))
{
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L ^3%s^1: %L", iPlayer, "ADMIN", name, iPlayer, ML_KEY, name2)
}
}
}
case 3: // show name only to admins, hide name from normal users
{
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
if( is_user_admin(iPlayer) )
{
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L ^3%s^1: %L", iPlayer, "ADMIN", name, iPlayer, ML_KEY, name2)
}
else
{
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L: %L", iPlayer, "ADMIN", iPlayer, ML_KEY, name2)
}
}
}
case 2: // show name to all
{
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L ^3%s^1: %L", iPlayer, "ADMIN", name, iPlayer, ML_KEY, name2)
}
}
case 1: // hide name to all
{
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L: %L", iPlayer, "ADMIN", iPlayer, ML_KEY, name2)
}
}
}
}

register_dictionary_colored(const filename[])
{
if( !register_dictionary(filename) )
{
return 0
}

new szFileName[192]
get_localinfo("amxx_datadir", szFileName, charsmax(szFileName))
format(szFileName, charsmax(szFileName), "%s/lang/%s", szFileName, filename)
new fp = fopen(szFileName, "rt")
if( !fp )
{
log_amx("Failed to open %s", szFileName)
return 0
}

new szBuffer[512], szLang[3], szKey[64], szTranslation[256], TransKey:iKey

while( !feof(fp) )
{
fgets(fp, szBuffer, charsmax(szBuffer))
trim(szBuffer)

if( szBuffer[0] == '[' )
{
strtok(szBuffer[1], szLang, charsmax(szLang), szBuffer, 1, ']')
}
else if( szBuffer[0] )
{
strbreak(szBuffer, szKey, charsmax(szKey), szTranslation, charsmax(szTranslation))
iKey = GetLangTransKey(szKey)
if( iKey != TransKey_Bad )
{
while( replace(szTranslation, charsmax(szTranslation), "!g", "^4") ){}
while( replace(szTranslation, charsmax(szTranslation), "!t", "^3") ){}
while( replace(szTranslation, charsmax(szTranslation), "!n", "^1") ){}
AddTranslation(szLang, iKey, szTranslation[2])
}
}
}

fclose(fp)
return 1
}

Флаги для настройки (Пример заполнения кваров ниже)
Цитата
Кто слышит :
0 : Наблюдатели
1 : Мертвы Т
2 : Мертвы СТ
3 : Живые Т
4 : Живые СТ

Кого слышат :
a : Наблюдатели
b : Мертвые Т
c : Мертвы СТ
d : Живые Т
e : Живые СТ

Код
amx_set_vm_status "0" "abcde"
amx_set_vm_status "1" "abcde"
amx_set_vm_status "2" "abcde"
amx_set_vm_status "3" "de"
amx_set_vm_status "4" "de"

Живые обеих команд слышат друг друга но не слышат мертвых и спектров, спектры и мертвые слышат всех.

ps.gif Архив перезалил, забыл словарь.
Это кстати последняя рабочая версия для amxx 1.8.1-1.8.2
Следующие версии идут уже под 1.8.3

Отредактировал: Bloo, - 10.4.2014, 8:22
Прикрепленные файлы:
Прикрепленный файл  cstrike.zip ( 26,17 килобайт ) Кол-во скачиваний: 212
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 5 раз
   + Цитировать сообщение
Статус пользователя Paxila
сообщение 9.4.2014, 21:21
Сообщение #28


Стаж: 12 лет

Сообщений: 81
Благодарностей: 4
Полезность: < 0

Завтра всё устанавлю и проверю и отпешу как всё прошло, мой thank_you2.gif вам blush2.gif

Отредактировал: Paxila, - 9.4.2014, 21:22
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Paxila
сообщение 10.4.2014, 7:36
Сообщение #29


Стаж: 12 лет

Сообщений: 81
Благодарностей: 4
Полезность: < 0

Bloo, спасибо большое happy.gif работае нормально, краша не замечал покамесь ну если что отпешу give_rose.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 10.4.2014, 8:07
Сообщение #30
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Цитата(Bloo @ 9.4.2014, 22:28) *
Это кстати последняя рабочая версия для amxx 1.8.1-1.8.2
Следующие версии идут уже под 1.8.3

Bloo, а кто сделал эту версию? С ходу не нашёл её в официальном топике.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 10.4.2014, 8:17
Сообщение #31


Стаж: 12 лет

Сообщений: 15547
Благодарностей: 6971
Полезность: 1206

Developer, ConnorMcLeod, она глубоко в теме, он не обновляет первый пост почему то. Стр 6 вроде, я все по порядку с конца тыкал и нашел которая под 1.8.2-1.8.1 идет)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя X*CaHeK*X
сообщение 10.4.2014, 9:33
Сообщение #32
Стаж: 17 лет

Сообщений: 705
Благодарностей: 225
Полезность: 561

Цитата(Developer @ 10.4.2014, 12:07) *
Bloo, а кто сделал эту версию? С ходу не нашёл её в официальном топике.

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Safety1st
сообщение 10.4.2014, 9:43
Сообщение #33
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Цитата(X*CaHeK*X @ 10.4.2014, 11:33) *

Нет, это не она, но спасибо за попытку.

Цитата(Bloo @ 10.4.2014, 10:17) *
Developer, ConnorMcLeod, она глубоко в теме, он не обновляет первый пост почему то. Стр 6 вроде, я все по порядку с конца тыкал и нашел которая под 1.8.2-1.8.1 идет)

Хм...
Ну ладно, разберусь с множеством имеющихся версий позже, когда мне это потребуется)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 10.4.2014, 9:48
Сообщение #34


Стаж: 12 лет

Сообщений: 15547
Благодарностей: 6971
Полезность: 1206

X*CaHeK*X, эта версия как раз таки под 1.8.3, я же дал последнюю рабочую версию под 1.8.2-.1.8.1
Developer, мне честно лень опять ковырять этот топик)) Единственное вроде это должна быть предпоследняя выложенная версия.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя eone
сообщение 28.11.2014, 18:24
Сообщение #35
Стаж: 11 лет

Сообщений: 317
Благодарностей: 180
Полезность: 245

Установил плагин, выставил в amxx.cfg все точно как тут, но никто никого на сервере вообще не слышит, возможно ли такое из за плагина neygomona amxgag?
!
Не нужно цитировать большие посты целиком


Отредактировал: Bloo, - 28.11.2014, 18:35
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 28.11.2014, 18:35
Сообщение #36


Стаж: 12 лет

Сообщений: 15547
Благодарностей: 6971
Полезность: 1206

eone, если честно понятия не имею, проверьте, отключите гаг. Плагин брали с моего поста? AMXX какой версии?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя eone
сообщение 28.11.2014, 21:29
Сообщение #37
Стаж: 11 лет

Сообщений: 317
Благодарностей: 180
Полезность: 245

Да с вашего, Amx 1.8.2 откючал неугомона, все равно никто никого не слышит :) ну да ладно, Бог с ним :) alltalk 0 сойдет
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя adva
сообщение 19.2.2015, 1:26
Сообщение #38


Иконка группы

Стаж: 12 лет

Сообщений: 2543
Благодарностей: 1676
Полезность: 819

Меценат Меценат

интересно, а можно сделать так, что бы тот, кого убили имел право на инфу?
чтобы после убийства игроку давалось 5-10 сек на разговор, а потом он глушился..
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 19.2.2015, 7:59
Сообщение #39


Стаж: 12 лет

Сообщений: 15547
Благодарностей: 6971
Полезность: 1206

adva, делали тут где то такой, поищи на форуме.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ozmosis
сообщение 19.2.2015, 8:08
Сообщение #40


Стаж: 12 лет

Сообщений: 234
Благодарностей: 158
Полезность: 437

Цитата(Bloo @ 19.2.2015, 10:59) *
adva, делали тут где то такой, поищи на форуме.

Если про эту тему, то к сожалению не реализовано. Может проще (в плане реализации) дать возможность отправки 1 сообщения в чат "живым".
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
4 страниц V   1 2 3 »
 
Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: