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

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

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

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

> Правила форума

Этот раздел, как вы могли заметить по названию, предназначен для решения вопросов по поводу уже существующих модов и плагинов.
Пожалуйста, если у вас проблема с написанием плагина, не путайте этот раздел с разделом по скриптингу.
Для поиска плагинов и модов существует соответствующий раздел.

Название темы должно соответствовать содержанию. Темы с названием типа "Помогите", "Вопрос", "парни подскажите..." - будут удалены.
Все темы, не относящиеся к "Вопросам по модам и плагинам", будут удалены или перемещены в соответствующий раздел.

Правила оформления темы:
1. Помимо заголовка не забудьте верно сформулировать свой вопрос.
2. Выложите исходник (в тег кода + ) или ссылку на плагин который вызывает у вас вопросы.
3. Выложите лог с ошибками (если имеется) под спойлер

Amx gag steaid -> ip

Статус пользователя mysubcult
сообщение 24.11.2013, 20:35
Сообщение #1
Стаж: 12 лет

Сообщений: 382
Благодарностей: 28
Полезность: 86

Народ, короче я понял, что это бесполезно просто просить, поэтому поступаю проще. Есть плагин amxgag, затыкает по steamid, нужно чтоб затыкал по ip. ПЛАЧУ. Цену называйте сами.
Прикрепленный файл  amx_gag.sma ( 42,06 килобайт ) Кол-во скачиваний: 12
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Fred Perry
сообщение 24.11.2013, 20:37
Сообщение #2


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

Стаж: 16 лет

Сообщений: 6594
Благодарностей: 2370
Полезность: 813

Если ты платишь, то тему создал не в том разделе.


You become responsible, forever, for what you have tamed
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя mysubcult
сообщение 24.11.2013, 22:04
Сообщение #3
Стаж: 12 лет

Сообщений: 382
Благодарностей: 28
Полезность: 86

Мне тут подсказали проще рещение, в дпрото изменить:
Код
# for p.47 clients that do not support unique id generation (default is STEAM_ID_LAN [8] )
cid_NoSteam47 = 8

# for p.48 clients that do not support unique id generation (default is VALVE_ID_LAN [10] )
cid_NoSteam48 = 10

Я же могу это изменить на что-то, чтобы всем выдавался нормальный стимид, по которому amx gag сможет работать и затыкать всех? И это никак не отразиться на посещаемости? Все так же смогут заходить?

т.е. как я понял, вместо 8 и 10 выставить значение равному 1? Это поможет?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя proff_q
сообщение 24.11.2013, 22:20
Сообщение #4
Стаж: 14 лет

Сообщений: 357
Благодарностей: 263
Полезность: 804

Код:
#include <amxmodx>
#include <amxmisc>
#include <engine>

#define DEFAULT_TIME 600.0

enum (<<= 1)
{
GAG_CHAT = 1,
GAG_TEAMSAY,
GAG_VOICE
}

enum _:GagData
{
GAG_USERIP[16],
GAG_TIME,
GAG_START,
GAG_FLAGS
}

new g_szIp[33][16]
new g_iThinker, g_iGagged
new bool:g_bColoredMenus, Trie:g_tArrayPos, Array:g_aGagData
new g_iMenuOption[33], g_iMenuPosition[33], g_iMenuPlayers[33][32]

public plugin_init()
{
register_plugin("AMXX Gag", "1.3", "xPaw & Exolent")

register_clcmd("say", "CmdSay")
register_clcmd("say_team", "CmdTeamSay")

register_concmd("amx_gag", "CmdGagPlayer", ADMIN_KICK, "<nick or #userid> <time> <a|b|c>")
register_concmd("amx_ungag", "CmdUnGagPlayer", ADMIN_KICK, "<nick or #userid")

register_concmd("amx_gagmenu", "CmdGagMenu", ADMIN_KICK, "- displays gag menu")

register_menucmd(register_menuid("Gag Menu"), 1023, "ActionGagMenu")
register_message(get_user_msgid("SayText"), "MessageSayText")

g_tArrayPos = TrieCreate()
g_aGagData = ArrayCreate(GagData)

g_bColoredMenus = bool:colored_menus()


new szClassname[] = "gag_thinker"

g_iThinker = create_entity("info_target")
entity_set_string(g_iThinker, EV_SZ_classname, szClassname)

register_think(szClassname, "FwdThink")
}

public plugin_end()
{
TrieDestroy(g_tArrayPos)
ArrayDestroy(g_aGagData)
}

public client_putinserver(id)
{
get_user_ip(id, g_szIp[id], 15, 1)

if(CheckGagFlag(id, GAG_VOICE))
set_speak(id, SPEAK_MUTED)
}

public client_disconnect(id)
{
if(TrieKeyExists(g_tArrayPos, g_szIp[id]))
{
new szName[32]
get_user_name(id, szName, 31)

new iPlayers[32], iNum, iPlayer
get_players(iPlayers, iNum, "ch")

for(new i; i < iNum; i++)
{
iPlayer = iPlayers[i]

if(get_user_flags(iPlayer) & ADMIN_KICK)
client_print(iPlayer, print_chat, "[AMXX] Gagged player ^"%s<%s>^" has disconnected!", szName, g_szIp[id])
}
}

g_szIp[id][0] = '^0'
}

public client_infochanged(id)
{
if(!CheckGagFlag(id, (GAG_CHAT | GAG_TEAMSAY)))
return

static const name[] = "name"

static szNewName[32], szOldName[32]
get_user_info(id, name, szNewName, 31)
get_user_name(id, szOldName, 31)

if(!equal(szNewName, szOldName))
{
client_print(id, print_chat, "[AMXX] Gagged players cannot change their names!")

set_user_info(id, name, szOldName)
}
}

public MessageSayText(iMsgId, iDest, iReceiver)
{
static const Cstrike_Name_Change[] = "#Cstrike_Name_Change"

static szMessage[sizeof(Cstrike_Name_Change) + 1]
get_msg_arg_string(2, szMessage, sizeof(szMessage) - 1)

if(equal(szMessage, Cstrike_Name_Change))
{
static szName[32], id
for(new i = 3; i <= 4; i++)
{
get_msg_arg_string(i, szName, 31)

id = get_user_index(szName)

if(is_user_connected(id))
{
if(CheckGagFlag(id, (GAG_CHAT | GAG_TEAMSAY)))
return PLUGIN_HANDLED

break
}
}
}

return PLUGIN_CONTINUE
}

public FwdThink(iEntity)
{
if(!g_iGagged)
return

new Float:fGametime
fGametime = get_gametime()

new data[GagData], id, szName[32]
for(new i = 0; i < g_iGagged; i++)
{
ArrayGetArray(g_aGagData, i, data)

if((Float:data[GAG_START] + Float:data[GAG_TIME] - 0.5) <= fGametime)
{
id = find_player("d", data[GAG_USERIP])

if(is_user_connected(id)) {
get_user_name(id, szName, 31)

client_print(0, print_chat, "[AMXX] Player ^"%s^" is no longer gagged.", szName)
}

DeleteGag(i)

i--
}
}

if(!g_iGagged)
return

new Float:flNextTime = 999999.9
for(new i = 0; i < g_iGagged; i++)
{
ArrayGetArray(g_aGagData, i, data)

flNextTime = floatmin(flNextTime, Float:data[GAG_START] + Float:data[GAG_TIME])
}

entity_set_float(iEntity, EV_FL_nextthink, flNextTime)
}

public CmdSay(id)
return CheckSay(id, 0)

public CmdTeamSay(id)
return CheckSay(id, 1)

CheckSay(id, bTeam)
{
static iArrayPos
if(TrieGetCell(g_tArrayPos, g_szIp[id], iArrayPos))
{
static data[GagData]
ArrayGetArray(g_aGagData, iArrayPos, data)

static const iFlags[] = {GAG_CHAT, GAG_TEAMSAY}

if(data[GAG_FLAGS] & iFlags[bTeam])
{
static const szTeam[][] = {"", " team"}
client_print(id, print_center, "** You are gagged from%s chat! **", szTeam[bTeam])

PrintLeftTime(id, Float:data[GAG_TIME], Float:data[GAG_START])

return PLUGIN_HANDLED
}
}

return PLUGIN_CONTINUE
}

PrintLeftTime(id, Float:flGagTime, Float:flGaggedAt)
{
new szInfo[32], iLen, iTime = floatround((flGaggedAt + flGagTime) - get_gametime()), iMinutes = iTime / 60, iSeconds = iTime % 60

if(iMinutes > 0)
iLen = formatex(szInfo, 31, "%i minute%s", iMinutes, iMinutes == 1 ? "" : "s")
if(iSeconds > 0)
formatex(szInfo[iLen], 31 - iLen, "%s%i second%s", iLen ? " and " : "", iSeconds, iSeconds == 1 ? "" : "s")

client_print(id, print_chat, "[AMXX] %s left before your ungag!", szInfo)
}

public CmdGagPlayer(id, iLevel, iCid)
{
if(!cmd_access(id, iLevel, iCid, 2))
{
console_print(id, "Flags: a - Chat | b - Team Chat | c - Voice communications")

return PLUGIN_HANDLED
}

new szArg[32]
read_argv(1, szArg, 31)

new iPlayer = cmd_target(id, szArg, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS)

if(!iPlayer)
return PLUGIN_HANDLED

new szName[20]
get_user_name(iPlayer, szName, 19)

if(TrieKeyExists(g_tArrayPos, g_szIp[iPlayer]))
{
console_print(id, "User ^"%s^" is already gagged!", szName)

return PLUGIN_HANDLED
}

new szFlags[4], Float:flGagTime
read_argv(2, szArg, 31)

// No time entered
if(!szArg[0])
{
flGagTime = DEFAULT_TIME

formatex(szFlags, 3, "abc")
}
else
{
// Seconds entered
if(is_str_num(szArg))
{
flGagTime = floatstr(szArg)

if(flGagTime > 86400.0)
flGagTime = 86400.0
}
else
{
console_print(id, "The value must be in seconds!")

return PLUGIN_HANDLED
}

read_argv(3, szArg, 31)

// No flag entered
if(!szArg[0])
formatex(szFlags, 3, "abc")
else
formatex(szFlags, 3, szArg)
}

new iFlags = read_flags(szFlags)

new data[GagData]
data[GAG_START] = _:get_gametime()
data[GAG_TIME] = _:flGagTime
data[GAG_FLAGS] = iFlags
copy(data[GAG_USERIP], 15, g_szIp[iPlayer])

TrieSetCell(g_tArrayPos, g_szIp[iPlayer], g_iGagged)
ArrayPushArray(g_aGagData, data)

new szFrom[64]

if(iFlags & GAG_CHAT)
formatex(szFrom, 63, "say")

if(iFlags & GAG_TEAMSAY)
{
if(!szFrom[0])
formatex(szFrom, 63, "say_team")
else
format(szFrom, 63, "%s / say_team", szFrom)
}

if(iFlags & GAG_VOICE)
{
set_speak(iPlayer, SPEAK_MUTED)

if(!szFrom[0])
formatex(szFrom, 63, "voicecomm")
else
format(szFrom, 63, "%s / voicecomm", szFrom)
}

g_iGagged++

new Float:flGametime = get_gametime(), Float:flNextThink
flNextThink = entity_get_float(g_iThinker, EV_FL_nextthink)

if(!flNextThink || flNextThink > (flGametime + flGagTime))
entity_set_float(g_iThinker, EV_FL_nextthink, flGametime + flGagTime)

new szInfo[32], szAdmin[20], iTime = floatround(flGagTime), iMinutes = iTime / 60, iSeconds = iTime % 60
get_user_name(id, szAdmin, 19)

if(!iMinutes)
formatex(szInfo, 31, "%i second%s", iSeconds, iSeconds == 1 ? "" : "s")
else
formatex(szInfo, 31, "%i minute%s", iMinutes, iMinutes == 1 ? "" : "s")

show_activity(id, szAdmin, "Has gagged %s from speaking for %s! (%s)", szName, szInfo, szFrom)

console_print(id, "You have gagged ^"%s^" (%s) !", szName, szFrom)

log_amx("Gag: ^"%s<%s>^" has gagged ^"%s<%s>^" for %i minutes. (%s)", szAdmin, g_szIp[id], szName, g_szIp[iPlayer], floatround(flGagTime / 60), szFrom)

return PLUGIN_HANDLED
}

public CmdUnGagPlayer(id, iLevel, iCid)
{
if(!cmd_access(id, iLevel, iCid, 2))
return PLUGIN_HANDLED

new szArg[32]
read_argv(1, szArg, 31)

if(equali(szArg, "@all"))
{
if(!g_iGagged)
{
console_print(id, "No gagged players!")

return PLUGIN_HANDLED
}

while(g_iGagged) DeleteGag(0) // Excellent by Exolent

if(entity_get_float(g_iThinker, EV_FL_nextthink) > 0.0)
entity_set_float(g_iThinker, EV_FL_nextthink, 0.0)

console_print(id, "You have ungagged all players!")

new szAdmin[32]
get_user_name(id, szAdmin, 31)

show_activity(id, szAdmin, "Has ungagged all players.")

log_amx("UnGag: ^"%s<%s>^" has ungagged all players.", szAdmin, g_szIp[id])

return PLUGIN_HANDLED
}

new iPlayer = cmd_target(id, szArg, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS)

if(!iPlayer)
return PLUGIN_HANDLED

new szName[32]
get_user_name(iPlayer, szName, 31)

new iArrayPos
if(!TrieGetCell(g_tArrayPos, g_szIp[iPlayer], iArrayPos))
{
console_print(id, "User ^"%s^" is not gagged!", szName)

return PLUGIN_HANDLED
}

DeleteGag(iArrayPos)

new szAdmin[32]
get_user_name(id, szAdmin, 31)

show_activity(id, szAdmin, "Has ungagged %s.", szName)

console_print(id, "You have ungagged ^"%s^" !", szName)

log_amx("UnGag: ^"%s<%s>^" has ungagged ^"%s<%s>^"", szAdmin, g_szIp[id], szName, g_szIp[iPlayer])

return PLUGIN_HANDLED
}

public ActionGagMenu(id, iKey)
{

switch(iKey)
{
case 7:
{
DisplayGagMenu(id, g_iMenuPosition[id])
}
case 8: DisplayGagMenu(id, ++g_iMenuPosition[id])
case 9: DisplayGagMenu(id, --g_iMenuPosition[id])
default:
{
new iPlayer = g_iMenuPlayers[id][g_iMenuPosition[id] * 9 + iKey]

new szName[32]
get_user_name(iPlayer, szName, 31)

if(TrieKeyExists(g_tArrayPos, g_szIp[iPlayer ]))
{
client_cmd(id, "amx_ungag %s", szName)
}
else
{
client_cmd(id, "amx_gag %s", szName)
DisplayGagMenu(id, g_iMenuPosition[id])
}
}
}
}

DisplayGagMenu(id, iPosition)
{
if(iPosition < 0)
{
arrayset( g_iMenuPlayers[ id ], 0, 32)
return
}

new iPlayers[32], iNum, iCount, szMenu[512], iPlayer, iFlags, szName[32]
get_players(iPlayers, iNum, "ch")

new iStart = iPosition * 7

if( iStart >= iNum )
iStart = iPosition = g_iMenuPosition[ id ] = 0

new iEnd = iStart + 7, iKeys = MENU_KEY_0 | MENU_KEY_8
new iLen = formatex( szMenu, 511, g_bColoredMenus ? "\rGag Menu\R%i/%i\w^n^n" : "Gag Menu %i %i^n^n", iPosition + 1, (iNum / 7 + ( (iNum % 7) ? 1 : 0 )))

if(iEnd > iNum) iEnd = iNum

for(new i = iStart; i < iEnd; ++i)
{
iPlayer = iPlayers[i]
iFlags = get_user_flags( iPlayer)
get_user_name(iPlayer, szName, 31)

if(iPlayer != id && iFlags & ADMIN_IMMUNITY)
{
++iCount

if(g_bColoredMenus)
iLen += formatex(szMenu[iLen], 511 - iLen, "\d%i. %s^n", iCount, szName)
else
iLen += formatex(szMenu[iLen], 511 - iLen, "#. %s^n", szName)
}
else
{
iKeys |= (1 << iCount)
++iCount

iLen += formatex(szMenu[iLen], 511 - iLen, g_bColoredMenus ? "\r%i.\w %s\y%s\r%s^n" : "%i. %s%s%s^n", iCount, szName, TrieKeyExists(g_tArrayPos, g_szIp[iPlayer]) ? " GAGGED" : "", (~iFlags & ADMIN_USER ? " *" : ""))
}
}

g_iMenuPlayers[id] = iPlayers

if(iEnd != iNum)
{
formatex(szMenu[iLen], 511 - iLen, g_bColoredMenus ? "^n\r9.\w More...^n\r0.\w %s" : "^n9. More...^n0. %s", iPosition ? "Back" : "Exit")
iKeys |= MENU_KEY_9
}
else
formatex(szMenu[iLen], 511 - iLen, g_bColoredMenus ? "^n\r0.\w %s" : "^n0. %s", iPosition ? "Back" : "Exit")

show_menu(id, iKeys, szMenu, -1, "Gag Menu")
}

public CmdGagMenu(id, iLevel, iCid)
{
if( !cmd_access( id, iLevel, iCid, 1 ) )
{
return PLUGIN_HANDLED;
}

g_iMenuOption[ id ] = 0
arrayset( g_iMenuPlayers[ id ], 0, 32 )

DisplayGagMenu( id, g_iMenuPosition[ id ] = 0 )

return PLUGIN_HANDLED
}

CheckGagFlag(const id, const iFlag)
{
static iArrayPos
if(TrieGetCell(g_tArrayPos, g_szIp[id], iArrayPos))
{
new data[GagData]
ArrayGetArray(g_aGagData, iArrayPos, data)

return (data[GAG_FLAGS] & iFlag)
}

return 0
}

DeleteGag(iArrayPos)
{
static data[GagData]
ArrayGetArray(g_aGagData, iArrayPos, data)

if(data[GAG_FLAGS] & GAG_VOICE)
{
new iPlayer = find_player("d", data[GAG_USERIP])
if(is_user_connected(iPlayer))
set_speak(iPlayer, SPEAK_NORMAL)
}

TrieDeleteKey(g_tArrayPos, data[GAG_USERIP])
ArrayDeleteItem(g_aGagData, iArrayPos)
g_iGagged--

for(new i = iArrayPos; i < g_iGagged; i++)
{
ArrayGetArray(g_aGagData, i, data)
TrieSetCell(g_tArrayPos, data[GAG_USERIP], i)
}
}


Отредактировал: proff_q, - 25.11.2013, 0:00
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Temkqa
сообщение 24.11.2013, 22:29
Сообщение #5


Стаж: 15 лет

Сообщений: 314
Благодарностей: 125
Полезность: 532

Цитата(mysubcult @ 24.11.2013, 22:35) *
Народ, короче я понял, что это бесполезно просто просить, поэтому поступаю проще. Есть плагин amxgag, затыкает по steamid, нужно чтоб затыкал по ip. ПЛАЧУ. Цену называйте сами.

Так сложно на форуме поискать? https://c-s.net.ua/forum/topic557s0.html?start=0

Цитата(mysubcult @ 25.11.2013, 0:04) *
Я же могу это изменить на что-то, чтобы всем выдавался нормальный стимид, по которому amx gag сможет работать и затыкать всех? И это никак не отразиться на посещаемости? Все так же смогут заходить?

т.е. как я понял, вместо 8 и 10 выставить значение равному 1? Это поможет?

Там надо ставить значение 5, но заходить смогут не все.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя mysubcult
сообщение 24.11.2013, 22:31
Сообщение #6
Стаж: 12 лет

Сообщений: 382
Благодарностей: 28
Полезность: 86

Цитата(proff_q @ 25.11.2013, 0:20) *
Код:
#include <amxmodx>
#include <amxmisc>
#include <engine>

#define DEFAULT_TIME 300.0 // In Seconds

enum (<<= 1)
{
GAG_CHAT = 1,
GAG_TEAMSAY,
GAG_VOICE
}

enum _:GagData
{
GAG_USERIP[16],
GAG_TIME,
GAG_START,
GAG_FLAGS
}

new g_szIp[33][16]
new g_iThinker, g_iGagged
new bool:g_bColoredMenus, Trie:g_tArrayPos, Array:g_aGagData, Array:g_aGagTimes
new g_iMenuOption[33], g_iMenuPosition[33], g_iMenuPlayers[33][32]

public plugin_init()
{
register_plugin("AMXX Gag", "1.3", "xPaw & Exolent")

register_clcmd("say", "CmdSay")
register_clcmd("say_team", "CmdTeamSay")

register_concmd("amx_gag", "CmdGagPlayer", ADMIN_KICK, "<nick or #userid> <time> <a|b|c>")
register_concmd("amx_ungag", "CmdUnGagPlayer", ADMIN_KICK, "<nick or #userid")

register_concmd("amx_gagmenu", "CmdGagMenu", ADMIN_KICK, "- displays gag menu")
register_srvcmd("amx_gag_times", "CmdSetBanTimes")

register_menucmd(register_menuid("Gag Menu"), 1023, "ActionGagMenu")
register_message(get_user_msgid("SayText"), "MessageSayText")

g_tArrayPos = TrieCreate()
g_aGagData = ArrayCreate(GagData)

g_aGagTimes = ArrayCreate()
g_bColoredMenus = bool:colored_menus()

// Gag times for the gag menu (amx_gagmenu)
// Default values: 60 300 600 1800 3600 7200 86400

// Load up standart times
ArrayPushCell(g_aGagTimes, 60);
ArrayPushCell(g_aGagTimes, 300);
ArrayPushCell(g_aGagTimes, 600);
ArrayPushCell(g_aGagTimes, 1800);
ArrayPushCell(g_aGagTimes, 3600);
ArrayPushCell(g_aGagTimes, 7200);
ArrayPushCell(g_aGagTimes, 86400);


new szClassname[] = "gag_thinker"

g_iThinker = create_entity("info_target")
entity_set_string(g_iThinker, EV_SZ_classname, szClassname)

register_think(szClassname, "FwdThink")
}

public CmdSetBanTimes()
{
new iArgs = read_argc()

if(iArgs <= 1)
{
server_print("Usage: amx_gag_times <time1> [time2] [time3] ...")
return;
}

ArrayClear(g_aGagTimes)

new szBuffer[32], iTime
for(new i = 1; i < iArgs; i++)
{
read_argv( i, szBuffer, 31)
iTime = str_to_num(szBuffer)
if( iTime > 86400 ){
server_print("[AMXX GAG] Time more then 86400 is not allowed!")
continue;
}
ArrayPushCell( g_aGagTimes, iTime )
}
}
public plugin_end()
{
TrieDestroy(g_tArrayPos)
ArrayDestroy(g_aGagData)
ArrayDestroy(g_aGagTimes)
}

public client_putinserver(id)
{
get_user_ip(id, g_szIp[id], 15, 1)

if(CheckGagFlag(id, GAG_VOICE))
set_speak(id, SPEAK_MUTED)
}

public client_disconnect(id)
{
if(TrieKeyExists(g_tArrayPos, g_szIp[id]))
{
new szName[32]
get_user_name(id, szName, 31)

new iPlayers[32], iNum, iPlayer
get_players(iPlayers, iNum, "ch")

for(new i; i < iNum; i++)
{
iPlayer = iPlayers[i]

if(get_user_flags(iPlayer) & ADMIN_KICK)
client_print(iPlayer, print_chat, "[AMXX] Gagged player ^"%s<%s>^" has disconnected!", szName, g_szIp[id])
}
}

g_szIp[id][0] = '^0'
}

public client_infochanged(id)
{
if(!CheckGagFlag(id, (GAG_CHAT | GAG_TEAMSAY)))
return

static const name[] = "name"

static szNewName[32], szOldName[32]
get_user_info(id, name, szNewName, 31)
get_user_name(id, szOldName, 31)

if(!equal(szNewName, szOldName))
{
client_print(id, print_chat, "[AMXX] Gagged players cannot change their names!")

set_user_info(id, name, szOldName)
}
}

public MessageSayText(iMsgId, iDest, iReceiver)
{
static const Cstrike_Name_Change[] = "#Cstrike_Name_Change"

static szMessage[sizeof(Cstrike_Name_Change) + 1]
get_msg_arg_string(2, szMessage, sizeof(szMessage) - 1)

if(equal(szMessage, Cstrike_Name_Change))
{
static szName[32], id
for(new i = 3; i <= 4; i++)
{
get_msg_arg_string(i, szName, 31)

id = get_user_index(szName)

if(is_user_connected(id))
{
if(CheckGagFlag(id, (GAG_CHAT | GAG_TEAMSAY)))
return PLUGIN_HANDLED

break
}
}
}

return PLUGIN_CONTINUE
}

public FwdThink(iEntity)
{
if(!g_iGagged)
return

new Float:fGametime
fGametime = get_gametime()

new data[GagData], id, szName[32]
for(new i = 0; i < g_iGagged; i++)
{
ArrayGetArray(g_aGagData, i, data)

if((Float:data[GAG_START] + Float:data[GAG_TIME] - 0.5) <= fGametime)
{
id = find_player("d", data[GAG_USERIP])

if(is_user_connected(id)) {
get_user_name(id, szName, 31)

client_print(0, print_chat, "[AMXX] Player ^"%s^" is no longer gagged.", szName)
}

DeleteGag(i)

i--
}
}

if(!g_iGagged)
return

new Float:flNextTime = 999999.9
for(new i = 0; i < g_iGagged; i++)
{
ArrayGetArray(g_aGagData, i, data)

flNextTime = floatmin(flNextTime, Float:data[GAG_START] + Float:data[GAG_TIME])
}

entity_set_float(iEntity, EV_FL_nextthink, flNextTime)
}

public CmdSay(id)
return CheckSay(id, 0)

public CmdTeamSay(id)
return CheckSay(id, 1)

CheckSay(id, bTeam)
{
static iArrayPos
if(TrieGetCell(g_tArrayPos, g_szIp[id], iArrayPos))
{
static data[GagData]
ArrayGetArray(g_aGagData, iArrayPos, data)

static const iFlags[] = {GAG_CHAT, GAG_TEAMSAY}

if(data[GAG_FLAGS] & iFlags[bTeam])
{
static const szTeam[][] = {"", " team"}
client_print(id, print_center, "** You are gagged from%s chat! **", szTeam[bTeam])

PrintLeftTime(id, Float:data[GAG_TIME], Float:data[GAG_START])

return PLUGIN_HANDLED
}
}

return PLUGIN_CONTINUE
}

PrintLeftTime(id, Float:flGagTime, Float:flGaggedAt)
{
new szInfo[32], iLen, iTime = floatround((flGaggedAt + flGagTime) - get_gametime()), iMinutes = iTime / 60, iSeconds = iTime % 60

if(iMinutes > 0)
iLen = formatex(szInfo, 31, "%i minute%s", iMinutes, iMinutes == 1 ? "" : "s")
if(iSeconds > 0)
formatex(szInfo[iLen], 31 - iLen, "%s%i second%s", iLen ? " and " : "", iSeconds, iSeconds == 1 ? "" : "s")

client_print(id, print_chat, "[AMXX] %s left before your ungag!", szInfo)
}

public CmdGagPlayer(id, iLevel, iCid)
{
if(!cmd_access(id, iLevel, iCid, 2))
{
console_print(id, "Flags: a - Chat | b - Team Chat | c - Voice communications")

return PLUGIN_HANDLED
}

new szArg[32]
read_argv(1, szArg, 31)

new iPlayer = cmd_target(id, szArg, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS)

if(!iPlayer)
return PLUGIN_HANDLED

new szName[20]
get_user_name(iPlayer, szName, 19)

if(TrieKeyExists(g_tArrayPos, g_szIp[iPlayer]))
{
console_print(id, "User ^"%s^" is already gagged!", szName)

return PLUGIN_HANDLED
}

new szFlags[4], Float:flGagTime
read_argv(2, szArg, 31)

// No time entered
if(!szArg[0])
{
flGagTime = DEFAULT_TIME

formatex(szFlags, 3, "abc")
}
else
{
// Seconds entered
if(is_str_num(szArg))
{
flGagTime = floatstr(szArg)

if(flGagTime > 86400.0)
flGagTime = 86400.0
}
else
{
console_print(id, "The value must be in seconds!")

return PLUGIN_HANDLED
}

read_argv(3, szArg, 31)

// No flag entered
if(!szArg[0])
formatex(szFlags, 3, "abc")
else
formatex(szFlags, 3, szArg)
}

new iFlags = read_flags(szFlags)

new data[GagData]
data[GAG_START] = _:get_gametime()
data[GAG_TIME] = _:flGagTime
data[GAG_FLAGS] = iFlags
copy(data[GAG_USERIP], 15, g_szIp[iPlayer])

TrieSetCell(g_tArrayPos, g_szIp[iPlayer], g_iGagged)
ArrayPushArray(g_aGagData, data)

new szFrom[64]

if(iFlags & GAG_CHAT)
formatex(szFrom, 63, "say")

if(iFlags & GAG_TEAMSAY)
{
if(!szFrom[0])
formatex(szFrom, 63, "say_team")
else
format(szFrom, 63, "%s / say_team", szFrom)
}

if(iFlags & GAG_VOICE)
{
set_speak(iPlayer, SPEAK_MUTED)

if(!szFrom[0])
formatex(szFrom, 63, "voicecomm")
else
format(szFrom, 63, "%s / voicecomm", szFrom)
}

g_iGagged++

new Float:flGametime = get_gametime(), Float:flNextThink
flNextThink = entity_get_float(g_iThinker, EV_FL_nextthink)

if(!flNextThink || flNextThink > (flGametime + flGagTime))
entity_set_float(g_iThinker, EV_FL_nextthink, flGametime + flGagTime)

new szInfo[32], szAdmin[20], iTime = floatround(flGagTime), iMinutes = iTime / 60, iSeconds = iTime % 60
get_user_name(id, szAdmin, 19)

if(!iMinutes)
formatex(szInfo, 31, "%i second%s", iSeconds, iSeconds == 1 ? "" : "s")
else
formatex(szInfo, 31, "%i minute%s", iMinutes, iMinutes == 1 ? "" : "s")

show_activity(id, szAdmin, "Has gagged %s from speaking for %s! (%s)", szName, szInfo, szFrom)

console_print(id, "You have gagged ^"%s^" (%s) !", szName, szFrom)

log_amx("Gag: ^"%s<%s>^" has gagged ^"%s<%s>^" for %i minutes. (%s)", szAdmin, g_szIp[id], szName, g_szIp[iPlayer], floatround(flGagTime / 60), szFrom)

return PLUGIN_HANDLED
}

public CmdUnGagPlayer(id, iLevel, iCid)
{
if(!cmd_access(id, iLevel, iCid, 2))
return PLUGIN_HANDLED

new szArg[32]
read_argv(1, szArg, 31)

if(equali(szArg, "@all"))
{
if(!g_iGagged)
{
console_print(id, "No gagged players!")

return PLUGIN_HANDLED
}

while(g_iGagged) DeleteGag(0) // Excellent by Exolent

if(entity_get_float(g_iThinker, EV_FL_nextthink) > 0.0)
entity_set_float(g_iThinker, EV_FL_nextthink, 0.0)

console_print(id, "You have ungagged all players!")

new szAdmin[32]
get_user_name(id, szAdmin, 31)

show_activity(id, szAdmin, "Has ungagged all players.")

log_amx("UnGag: ^"%s<%s>^" has ungagged all players.", szAdmin, g_szIp[id])

return PLUGIN_HANDLED
}

new iPlayer = cmd_target(id, szArg, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS)

if(!iPlayer)
return PLUGIN_HANDLED

new szName[32]
get_user_name(iPlayer, szName, 31)

new iArrayPos
if(!TrieGetCell(g_tArrayPos, g_szIp[iPlayer], iArrayPos))
{
console_print(id, "User ^"%s^" is not gagged!", szName)

return PLUGIN_HANDLED
}

DeleteGag(iArrayPos)

new szAdmin[32]
get_user_name(id, szAdmin, 31)

show_activity(id, szAdmin, "Has ungagged %s.", szName)

console_print(id, "You have ungagged ^"%s^" !", szName)

log_amx("UnGag: ^"%s<%s>^" has ungagged ^"%s<%s>^"", szAdmin, g_szIp[id], szName, g_szIp[iPlayer])

return PLUGIN_HANDLED
}

public CmdGagMenu(id, iLevel, iCid)
{
if(!cmd_access(id, iLevel, iCid, 1))
return PLUGIN_HANDLED

g_iMenuOption[id] = 0
arrayset(g_iMenuPlayers[id], 0, 32)

DisplayGagMenu(id, g_iMenuPosition[id] = 0)

return PLUGIN_HANDLED
}

public ActionGagMenu(id, iKey)
{

switch(iKey)
{
case 7:
{
++g_iMenuOption[id]
g_iMenuOption[id] %= ArraySize(g_aGagTimes)
DisplayGagMenu(id, g_iMenuPosition[id])
}
case 8: DisplayGagMenu(id, ++g_iMenuPosition[id])
case 9: DisplayGagMenu(id, --g_iMenuPosition[id])
default:
{
new iPlayer = g_iMenuPlayers[id][g_iMenuPosition[id] * 7 + iKey]
new szName[32]
get_user_name(iPlayer, szName, 31)

if(TrieKeyExists(g_tArrayPos, g_szIp[iPlayer ]))
{
client_cmd(id, "amx_ungag %s", szName)
}
else
{
client_cmd(id, "amx_gag %s", szName)
DisplayGagMenu(id, g_iMenuPosition[id])
}
}
}
}

DisplayGagMenu(id, iPosition)
{
if(iPosition < 0)
{
arrayset( g_iMenuPlayers[ id ], 0, 32)
return
}

new iPlayers[32], iNum, iCount, szMenu[512], iPlayer, iFlags, szName[32]
get_players(iPlayers, iNum, "ch")

new iStart = iPosition * 7

if( iStart >= iNum )
iStart = iPosition = g_iMenuPosition[ id ] = 0

new iEnd = iStart + 7, iKeys = MENU_KEY_0 | MENU_KEY_8
new iLen = formatex( szMenu, 511, g_bColoredMenus ? "\rGag Menu\R%i/%i\w^n^n" : "Gag Menu %i %i^n^n", iPosition + 1, (iNum / 7 + ( (iNum % 7) ? 1 : 0 )))

if(iEnd > iNum) iEnd = iNum

for(new i = iStart; i < iEnd; ++i)
{
iPlayer = iPlayers[i]
iFlags = get_user_flags( iPlayer)
get_user_name(iPlayer, szName, 31)

if(iPlayer != id && iFlags & ADMIN_IMMUNITY)
{
++iCount

if(g_bColoredMenus)
iLen += formatex(szMenu[iLen], 511 - iLen, "\d%i. %s^n", iCount, szName)
else
iLen += formatex(szMenu[iLen], 511 - iLen, "#. %s^n", szName)
}
else
{
iKeys |= (1 << iCount)
++iCount

iLen += formatex(szMenu[iLen], 511 - iLen, g_bColoredMenus ? "\r%i.\w %s\y%s\r%s^n" : "%i. %s%s%s^n", iCount, szName, TrieKeyExists(g_tArrayPos, g_szIp[iPlayer]) ? " GAGGED" : "", (~iFlags & ADMIN_USER ? " *" : ""))
}
}

g_iMenuPlayers[id] = iPlayers

new iSeconds = ArrayGetCell(g_aGagTimes, g_iMenuOption[id])
new iTime = iSeconds / 60

iLen += formatex(szMenu[iLen], 511 - iLen, g_bColoredMenus ? "^n\r8.\w Gag for\y %i\w %s^n" : "^n8. Gag for %i %s^n", (iSeconds > 60 ? iTime : iSeconds), (iSeconds > 60 ? "minutes" : "seconds"))
if(iEnd != iNum)
{
formatex(szMenu[iLen], 511 - iLen, g_bColoredMenus ? "^n\r9.\w More...^n\r0.\w %s" : "^n9. More...^n0. %s", iPosition ? "Back" : "Exit")
iKeys |= MENU_KEY_9
}
else
formatex(szMenu[iLen], 511 - iLen, g_bColoredMenus ? "^n\r0.\w %s" : "^n0. %s", iPosition ? "Back" : "Exit")

show_menu(id, iKeys, szMenu, -1, "Gag Menu")
}


CheckGagFlag(const id, const iFlag)
{
static iArrayPos
if(TrieGetCell(g_tArrayPos, g_szIp[id], iArrayPos))
{
new data[GagData]
ArrayGetArray(g_aGagData, iArrayPos, data)

return (data[GAG_FLAGS] & iFlag)
}

return 0
}

DeleteGag(iArrayPos)
{
static data[GagData]
ArrayGetArray(g_aGagData, iArrayPos, data)

if(data[GAG_FLAGS] & GAG_VOICE)
{
new iPlayer = find_player("d", data[GAG_USERIP])
if(is_user_connected(iPlayer))
set_speak(iPlayer, SPEAK_NORMAL)
}

TrieDeleteKey(g_tArrayPos, data[GAG_USERIP])
ArrayDeleteItem(g_aGagData, iArrayPos)
g_iGagged--

for(new i = iArrayPos; i < g_iGagged; i++)
{
ArrayGetArray(g_aGagData, i, data)
TrieSetCell(g_tArrayPos, data[GAG_USERIP], i)
}
}

Спасибо, но этот вариант уже рассматривал, там меню глючное, и после перезахода человек - мут с него слетает.

Цитата(Temkqa @ 25.11.2013, 0:29) *
Так сложно на форуме поискать? https://c-s.net.ua/forum/topic557s0.html?start=0


Там надо ставить значение 5, но заходить смогут не все.

Уже искал, по вашей ссылке - там нет меню. Мне важно наличие меню.
А что если я значения укажу там равное 3? Смогут заходить все и я смогу всем мут давать?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 24.11.2013, 23:39
Сообщение #7
Стаж: 14 лет
Город: Moscow

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

Цитата(mysubcult @ 25.11.2013, 0:31) *
А что если я значения укажу там равное 3? Смогут заходить все и я смогу всем мут давать?

Да. Но тогда для таких
Цитата(mysubcult @ 25.11.2013, 0:31) *
после перезахода человек - мут с него слетает.

Ну, не просто перезахода, конечно, а после смены IP. Если вам это не критично - получится гаг по IP бесплатно)
А если критично - старые сборки на сервере нужно запретить или ограничить. Тогда дополнительные преимущества в практически полном отсутствии обходов банов и стата по SteamID, а не по никам.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя proff_q
сообщение 25.11.2013, 0:00
Сообщение #8
Стаж: 14 лет

Сообщений: 357
Благодарностей: 263
Полезность: 804

Цитата(mysubcult @ 24.11.2013, 23:31) *
Спасибо, но этот вариант уже рассматривал, там меню глючное, и после перезахода человек - мут с него слетает.


Уже искал, по вашей ссылке - там нет меню. Мне важно наличие меню.
А что если я значения укажу там равное 3? Смогут заходить все и я смогу всем мут давать?

Какой вы благодарный. Если бы вы внимательно пригляделись, то меню я поправил, а так же после реконнекта ничего не слетает.
Правда выбор времени в меню я не смог починить, так как пришлось бы все переписывать, а это нудно и никому не нужно, сейчас гаг стоит на 10 минут, думаю больше или меньше не пригодится, а если и пригодится, то ручками ручками.
Код:
#include <amxmodx>
#include <amxmisc>
#include <engine>

#define DEFAULT_TIME 600.0

enum (<<= 1)
{
GAG_CHAT = 1,
GAG_TEAMSAY,
GAG_VOICE
}

enum _:GagData
{
GAG_USERIP[16],
GAG_TIME,
GAG_START,
GAG_FLAGS
}

new g_szIp[33][16]
new g_iThinker, g_iGagged
new bool:g_bColoredMenus, Trie:g_tArrayPos, Array:g_aGagData
new g_iMenuOption[33], g_iMenuPosition[33], g_iMenuPlayers[33][32]

public plugin_init()
{
register_plugin("AMXX Gag", "1.3", "xPaw & Exolent")

register_clcmd("say", "CmdSay")
register_clcmd("say_team", "CmdTeamSay")

register_concmd("amx_gag", "CmdGagPlayer", ADMIN_KICK, "<nick or #userid> <time> <a|b|c>")
register_concmd("amx_ungag", "CmdUnGagPlayer", ADMIN_KICK, "<nick or #userid")

register_concmd("amx_gagmenu", "CmdGagMenu", ADMIN_KICK, "- displays gag menu")

register_menucmd(register_menuid("Gag Menu"), 1023, "ActionGagMenu")
register_message(get_user_msgid("SayText"), "MessageSayText")

g_tArrayPos = TrieCreate()
g_aGagData = ArrayCreate(GagData)

g_bColoredMenus = bool:colored_menus()


new szClassname[] = "gag_thinker"

g_iThinker = create_entity("info_target")
entity_set_string(g_iThinker, EV_SZ_classname, szClassname)

register_think(szClassname, "FwdThink")
}

public plugin_end()
{
TrieDestroy(g_tArrayPos)
ArrayDestroy(g_aGagData)
}

public client_putinserver(id)
{
get_user_ip(id, g_szIp[id], 15, 1)

if(CheckGagFlag(id, GAG_VOICE))
set_speak(id, SPEAK_MUTED)
}

public client_disconnect(id)
{
if(TrieKeyExists(g_tArrayPos, g_szIp[id]))
{
new szName[32]
get_user_name(id, szName, 31)

new iPlayers[32], iNum, iPlayer
get_players(iPlayers, iNum, "ch")

for(new i; i < iNum; i++)
{
iPlayer = iPlayers[i]

if(get_user_flags(iPlayer) & ADMIN_KICK)
client_print(iPlayer, print_chat, "[AMXX] Gagged player ^"%s<%s>^" has disconnected!", szName, g_szIp[id])
}
}

g_szIp[id][0] = '^0'
}

public client_infochanged(id)
{
if(!CheckGagFlag(id, (GAG_CHAT | GAG_TEAMSAY)))
return

static const name[] = "name"

static szNewName[32], szOldName[32]
get_user_info(id, name, szNewName, 31)
get_user_name(id, szOldName, 31)

if(!equal(szNewName, szOldName))
{
client_print(id, print_chat, "[AMXX] Gagged players cannot change their names!")

set_user_info(id, name, szOldName)
}
}

public MessageSayText(iMsgId, iDest, iReceiver)
{
static const Cstrike_Name_Change[] = "#Cstrike_Name_Change"

static szMessage[sizeof(Cstrike_Name_Change) + 1]
get_msg_arg_string(2, szMessage, sizeof(szMessage) - 1)

if(equal(szMessage, Cstrike_Name_Change))
{
static szName[32], id
for(new i = 3; i <= 4; i++)
{
get_msg_arg_string(i, szName, 31)

id = get_user_index(szName)

if(is_user_connected(id))
{
if(CheckGagFlag(id, (GAG_CHAT | GAG_TEAMSAY)))
return PLUGIN_HANDLED

break
}
}
}

return PLUGIN_CONTINUE
}

public FwdThink(iEntity)
{
if(!g_iGagged)
return

new Float:fGametime
fGametime = get_gametime()

new data[GagData], id, szName[32]
for(new i = 0; i < g_iGagged; i++)
{
ArrayGetArray(g_aGagData, i, data)

if((Float:data[GAG_START] + Float:data[GAG_TIME] - 0.5) <= fGametime)
{
id = find_player("d", data[GAG_USERIP])

if(is_user_connected(id)) {
get_user_name(id, szName, 31)

client_print(0, print_chat, "[AMXX] Player ^"%s^" is no longer gagged.", szName)
}

DeleteGag(i)

i--
}
}

if(!g_iGagged)
return

new Float:flNextTime = 999999.9
for(new i = 0; i < g_iGagged; i++)
{
ArrayGetArray(g_aGagData, i, data)

flNextTime = floatmin(flNextTime, Float:data[GAG_START] + Float:data[GAG_TIME])
}

entity_set_float(iEntity, EV_FL_nextthink, flNextTime)
}

public CmdSay(id)
return CheckSay(id, 0)

public CmdTeamSay(id)
return CheckSay(id, 1)

CheckSay(id, bTeam)
{
static iArrayPos
if(TrieGetCell(g_tArrayPos, g_szIp[id], iArrayPos))
{
static data[GagData]
ArrayGetArray(g_aGagData, iArrayPos, data)

static const iFlags[] = {GAG_CHAT, GAG_TEAMSAY}

if(data[GAG_FLAGS] & iFlags[bTeam])
{
static const szTeam[][] = {"", " team"}
client_print(id, print_center, "** You are gagged from%s chat! **", szTeam[bTeam])

PrintLeftTime(id, Float:data[GAG_TIME], Float:data[GAG_START])

return PLUGIN_HANDLED
}
}

return PLUGIN_CONTINUE
}

PrintLeftTime(id, Float:flGagTime, Float:flGaggedAt)
{
new szInfo[32], iLen, iTime = floatround((flGaggedAt + flGagTime) - get_gametime()), iMinutes = iTime / 60, iSeconds = iTime % 60

if(iMinutes > 0)
iLen = formatex(szInfo, 31, "%i minute%s", iMinutes, iMinutes == 1 ? "" : "s")
if(iSeconds > 0)
formatex(szInfo[iLen], 31 - iLen, "%s%i second%s", iLen ? " and " : "", iSeconds, iSeconds == 1 ? "" : "s")

client_print(id, print_chat, "[AMXX] %s left before your ungag!", szInfo)
}

public CmdGagPlayer(id, iLevel, iCid)
{
if(!cmd_access(id, iLevel, iCid, 2))
{
console_print(id, "Flags: a - Chat | b - Team Chat | c - Voice communications")

return PLUGIN_HANDLED
}

new szArg[32]
read_argv(1, szArg, 31)

new iPlayer = cmd_target(id, szArg, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS)

if(!iPlayer)
return PLUGIN_HANDLED

new szName[20]
get_user_name(iPlayer, szName, 19)

if(TrieKeyExists(g_tArrayPos, g_szIp[iPlayer]))
{
console_print(id, "User ^"%s^" is already gagged!", szName)

return PLUGIN_HANDLED
}

new szFlags[4], Float:flGagTime
read_argv(2, szArg, 31)

// No time entered
if(!szArg[0])
{
flGagTime = DEFAULT_TIME

formatex(szFlags, 3, "abc")
}
else
{
// Seconds entered
if(is_str_num(szArg))
{
flGagTime = floatstr(szArg)

if(flGagTime > 86400.0)
flGagTime = 86400.0
}
else
{
console_print(id, "The value must be in seconds!")

return PLUGIN_HANDLED
}

read_argv(3, szArg, 31)

// No flag entered
if(!szArg[0])
formatex(szFlags, 3, "abc")
else
formatex(szFlags, 3, szArg)
}

new iFlags = read_flags(szFlags)

new data[GagData]
data[GAG_START] = _:get_gametime()
data[GAG_TIME] = _:flGagTime
data[GAG_FLAGS] = iFlags
copy(data[GAG_USERIP], 15, g_szIp[iPlayer])

TrieSetCell(g_tArrayPos, g_szIp[iPlayer], g_iGagged)
ArrayPushArray(g_aGagData, data)

new szFrom[64]

if(iFlags & GAG_CHAT)
formatex(szFrom, 63, "say")

if(iFlags & GAG_TEAMSAY)
{
if(!szFrom[0])
formatex(szFrom, 63, "say_team")
else
format(szFrom, 63, "%s / say_team", szFrom)
}

if(iFlags & GAG_VOICE)
{
set_speak(iPlayer, SPEAK_MUTED)

if(!szFrom[0])
formatex(szFrom, 63, "voicecomm")
else
format(szFrom, 63, "%s / voicecomm", szFrom)
}

g_iGagged++

new Float:flGametime = get_gametime(), Float:flNextThink
flNextThink = entity_get_float(g_iThinker, EV_FL_nextthink)

if(!flNextThink || flNextThink > (flGametime + flGagTime))
entity_set_float(g_iThinker, EV_FL_nextthink, flGametime + flGagTime)

new szInfo[32], szAdmin[20], iTime = floatround(flGagTime), iMinutes = iTime / 60, iSeconds = iTime % 60
get_user_name(id, szAdmin, 19)

if(!iMinutes)
formatex(szInfo, 31, "%i second%s", iSeconds, iSeconds == 1 ? "" : "s")
else
formatex(szInfo, 31, "%i minute%s", iMinutes, iMinutes == 1 ? "" : "s")

show_activity(id, szAdmin, "Has gagged %s from speaking for %s! (%s)", szName, szInfo, szFrom)

console_print(id, "You have gagged ^"%s^" (%s) !", szName, szFrom)

log_amx("Gag: ^"%s<%s>^" has gagged ^"%s<%s>^" for %i minutes. (%s)", szAdmin, g_szIp[id], szName, g_szIp[iPlayer], floatround(flGagTime / 60), szFrom)

return PLUGIN_HANDLED
}

public CmdUnGagPlayer(id, iLevel, iCid)
{
if(!cmd_access(id, iLevel, iCid, 2))
return PLUGIN_HANDLED

new szArg[32]
read_argv(1, szArg, 31)

if(equali(szArg, "@all"))
{
if(!g_iGagged)
{
console_print(id, "No gagged players!")

return PLUGIN_HANDLED
}

while(g_iGagged) DeleteGag(0) // Excellent by Exolent

if(entity_get_float(g_iThinker, EV_FL_nextthink) > 0.0)
entity_set_float(g_iThinker, EV_FL_nextthink, 0.0)

console_print(id, "You have ungagged all players!")

new szAdmin[32]
get_user_name(id, szAdmin, 31)

show_activity(id, szAdmin, "Has ungagged all players.")

log_amx("UnGag: ^"%s<%s>^" has ungagged all players.", szAdmin, g_szIp[id])

return PLUGIN_HANDLED
}

new iPlayer = cmd_target(id, szArg, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS)

if(!iPlayer)
return PLUGIN_HANDLED

new szName[32]
get_user_name(iPlayer, szName, 31)

new iArrayPos
if(!TrieGetCell(g_tArrayPos, g_szIp[iPlayer], iArrayPos))
{
console_print(id, "User ^"%s^" is not gagged!", szName)

return PLUGIN_HANDLED
}

DeleteGag(iArrayPos)

new szAdmin[32]
get_user_name(id, szAdmin, 31)

show_activity(id, szAdmin, "Has ungagged %s.", szName)

console_print(id, "You have ungagged ^"%s^" !", szName)

log_amx("UnGag: ^"%s<%s>^" has ungagged ^"%s<%s>^"", szAdmin, g_szIp[id], szName, g_szIp[iPlayer])

return PLUGIN_HANDLED
}

public ActionGagMenu(id, iKey)
{

switch(iKey)
{
case 7:
{
DisplayGagMenu(id, g_iMenuPosition[id])
}
case 8: DisplayGagMenu(id, ++g_iMenuPosition[id])
case 9: DisplayGagMenu(id, --g_iMenuPosition[id])
default:
{
new iPlayer = g_iMenuPlayers[id][g_iMenuPosition[id] * 9 + iKey]

new szName[32]
get_user_name(iPlayer, szName, 31)

if(TrieKeyExists(g_tArrayPos, g_szIp[iPlayer ]))
{
client_cmd(id, "amx_ungag %s", szName)
}
else
{
client_cmd(id, "amx_gag %s", szName)
DisplayGagMenu(id, g_iMenuPosition[id])
}
}
}
}

DisplayGagMenu(id, iPosition)
{
if(iPosition < 0)
{
arrayset( g_iMenuPlayers[ id ], 0, 32)
return
}

new iPlayers[32], iNum, iCount, szMenu[512], iPlayer, iFlags, szName[32]
get_players(iPlayers, iNum, "ch")

new iStart = iPosition * 7

if( iStart >= iNum )
iStart = iPosition = g_iMenuPosition[ id ] = 0

new iEnd = iStart + 7, iKeys = MENU_KEY_0 | MENU_KEY_8
new iLen = formatex( szMenu, 511, g_bColoredMenus ? "\rGag Menu\R%i/%i\w^n^n" : "Gag Menu %i %i^n^n", iPosition + 1, (iNum / 7 + ( (iNum % 7) ? 1 : 0 )))

if(iEnd > iNum) iEnd = iNum

for(new i = iStart; i < iEnd; ++i)
{
iPlayer = iPlayers[i]
iFlags = get_user_flags( iPlayer)
get_user_name(iPlayer, szName, 31)

if(iPlayer != id && iFlags & ADMIN_IMMUNITY)
{
++iCount

if(g_bColoredMenus)
iLen += formatex(szMenu[iLen], 511 - iLen, "\d%i. %s^n", iCount, szName)
else
iLen += formatex(szMenu[iLen], 511 - iLen, "#. %s^n", szName)
}
else
{
iKeys |= (1 << iCount)
++iCount

iLen += formatex(szMenu[iLen], 511 - iLen, g_bColoredMenus ? "\r%i.\w %s\y%s\r%s^n" : "%i. %s%s%s^n", iCount, szName, TrieKeyExists(g_tArrayPos, g_szIp[iPlayer]) ? " GAGGED" : "", (~iFlags & ADMIN_USER ? " *" : ""))
}
}

g_iMenuPlayers[id] = iPlayers

if(iEnd != iNum)
{
formatex(szMenu[iLen], 511 - iLen, g_bColoredMenus ? "^n\r9.\w More...^n\r0.\w %s" : "^n9. More...^n0. %s", iPosition ? "Back" : "Exit")
iKeys |= MENU_KEY_9
}
else
formatex(szMenu[iLen], 511 - iLen, g_bColoredMenus ? "^n\r0.\w %s" : "^n0. %s", iPosition ? "Back" : "Exit")

show_menu(id, iKeys, szMenu, -1, "Gag Menu")
}

public CmdGagMenu(id, iLevel, iCid)
{
if( !cmd_access( id, iLevel, iCid, 1 ) )
{
return PLUGIN_HANDLED;
}

g_iMenuOption[ id ] = 0
arrayset( g_iMenuPlayers[ id ], 0, 32 )

DisplayGagMenu( id, g_iMenuPosition[ id ] = 0 )

return PLUGIN_HANDLED
}

CheckGagFlag(const id, const iFlag)
{
static iArrayPos
if(TrieGetCell(g_tArrayPos, g_szIp[id], iArrayPos))
{
new data[GagData]
ArrayGetArray(g_aGagData, iArrayPos, data)

return (data[GAG_FLAGS] & iFlag)
}

return 0
}

DeleteGag(iArrayPos)
{
static data[GagData]
ArrayGetArray(g_aGagData, iArrayPos, data)

if(data[GAG_FLAGS] & GAG_VOICE)
{
new iPlayer = find_player("d", data[GAG_USERIP])
if(is_user_connected(iPlayer))
set_speak(iPlayer, SPEAK_NORMAL)
}

TrieDeleteKey(g_tArrayPos, data[GAG_USERIP])
ArrayDeleteItem(g_aGagData, iArrayPos)
g_iGagged--

for(new i = iArrayPos; i < g_iGagged; i++)
{
ArrayGetArray(g_aGagData, i, data)
TrieSetCell(g_tArrayPos, data[GAG_USERIP], i)
}
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: