| Дата поста: |
В теме: |
За сообщение: |
Спасибо сказали: |
| 23.8.2015, 20:05 |
Yet Another Voteban
|
Finalls, пробуй [attachment=35367:yet_anot...v1.52_m2.zip] |
Finalls |
| 23.8.2015, 15:55 |
Yet Another Voteban
|
Finalls, нужно было вставлять перед скобкой } на 612 строке |
Finalls |
| 23.8.2015, 0:37 |
Set_user_health
|
soneekk, флаг b в функции get_players получает индекс только мертвых игроков.
Fred Perry, можно, так как функция get_players изменяет им значение. |
Fred Perry, soneekk |
| 22.8.2015, 18:12 |
SameID
|
floricus, соль не защищает от одинаковых authid на сервере. Если злоумышленник будет знать реальный authid жертвы, то он сможет его подменить и в итоге получится дубль.
KPOCT, ничего страшного, попробуй тогда такой вариант. Насчет BanIP fakes, не знаю, не видел его. Код:
#include <amxmodx>
#define PLUGIN "Anti Double AuthID" #define VERSION "0.2" #define AUTHOR "Fintok!"
#define MAX_PLAYERS 32
new bool:g_bIsPlayer[MAX_PLAYERS + 1] new g_szAuthIDs[MAX_PLAYERS + 1][35] new Trie:g_tAuthIDs
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR)
g_tAuthIDs = TrieCreate() }
public client_putinserver(id) { if(!(g_bIsPlayer[id] = bool:(!is_user_bot(id) && !is_user_hltv(id)))) return
get_user_authid(id, g_szAuthIDs[id], charsmax(g_szAuthIDs[]))
if(!is_valid_authid(g_szAuthIDs[id])) return
if(!TrieKeyExists(g_tAuthIDs, g_szAuthIDs[id])) TrieSetCell(g_tAuthIDs, g_szAuthIDs[id], id) else server_cmd("kick #%i ^"На сервере уже есть игрок с этим SteamID^"", get_user_userid(id)) }
public client_disconnect(id) { if(!g_bIsPlayer[id]) return
static iUserId TrieGetCell(g_tAuthIDs, g_szAuthIDs[id], iUserId)
if(iUserId == id) TrieDeleteKey(g_tAuthIDs, g_szAuthIDs[id])
g_szAuthIDs[id][0] = '^0' }
public plugin_end() TrieDestroy(g_tAuthIDs)
stock is_valid_authid(const szAuthID[]) { static const szAuthIDs[][] = { "STEAM_ID_LAN", "STEAM_ID_PENDING", "VALVE_ID_LAN", "VALVE_ID_PENDING", "STEAM_666:88:666" }
for(new i = 0; i <= charsmax(szAuthIDs); i++) { if(equali(szAuthID, szAuthIDs[i])) return false } return true } |
Puwok, Solo, TarikYuzkiv |
| 7.8.2015, 0:16 |
Плагин: Самый умный
|
Bloo, там все гораздо проще, парсинг текста из файла осуществяется в переменную размером всего 64 символа. |
Bloo |
| 1.8.2015, 17:38 |
Новое форматирование строки
|
kolobok1, не работает, потому что по стандарту в меню всего 7 пунктов, а пункты 8 - назад, 9 - дальше, 0 - выход. Так что надо делить на 7, а не на 8. А в данном случае нужно делить на 6, так как добавляется сразу 2 пункта, Имя игрока и Время Замени в последнем коде который предложил voed Код:
if((i+1 % 8) == 0) ---> Код:
if(!((i+1) % 6)) |
Lena1978, voed |
| 1.8.2015, 15:37 |
помогите удалить функцию с плагина
|
bbuzzy, замени в коде Код:
id = (i + 1); switch(_:cs_get_user_team(id))
---> Код:
id = (i + 1);
if(get_user_flags(id) & ADMIN_IMMUNITY) continue;
switch(_:cs_get_user_team(id)) |
bbuzzy |
| 1.8.2015, 11:57 |
помогите удалить функцию с плагина
|
bbuzzy, пробуй Код:
#include <amxmodx> #include <cstrike>
#define TIME_VALID_ADD 15.0 // Длительность защиты игрока от плагина, когда он только зашёл на сервер. #define TIME_SPECT_CHECK 30.0 // Интервал между проверками зрителей, чем меньше значение, тем больше нагрузка на сервер. #define MIN_PLAYERS_CHECK 20 // Минимальное количество игроков, когда включается функция проверки зрителей. #pragma semicolon 1
#define MSG_SEND_AUDIO 100
#define TASK_VALID_ADD 759846 #define TASK_SPECT_CHECK 645986 #define BIT_VALID(%1,%2) ((%1) & (1 << ((%2) - 1))) #define BIT_ADD(%1,%2) ((%1) |= (1 << ((%2) - 1))) #define BIT_SUB(%1,%2) ((%1) &= ~(1 << ((%2) - 1))) #define BIT_NOT_VALID(%1,%2) (~(%1) & (1 << ((%2) - 1))) #define _BIT_VALID(%1,%2) ((%1) & (1 << (%2))) #define _BIT_ADD(%1,%2) ((%1) |= (1 << (%2))) #define _BIT_SUB(%1,%2) ((%1) &= ~(1 << (%2))) #define _BIT_NOT_VALID(%1,%2) (~(%1) & (1 << (%2)))
new g_iBitClientValid; new g_iMaxPlayers; public plugin_init() { register_plugin("Afk Control", "0.1 Final", "Freedo.m"); register_menucmd(register_menuid("Afk Menu"), 1, "Handle_AfkMenu"); g_iMaxPlayers = get_maxplayers(); set_task(TIME_SPECT_CHECK, "SpectatorCheck", TASK_SPECT_CHECK, _, _, "b"); } public client_putinserver(id) { if(is_user_bot(id) || is_user_hltv(id)) return; set_task(TIME_VALID_ADD, "ClientValidAdd", id+TASK_VALID_ADD); } public client_disconnect(id) { if(task_exists(id+TASK_VALID_ADD)) remove_task(id+TASK_VALID_ADD); if(task_exists(id)) remove_task(id); BIT_SUB(g_iBitClientValid, id); } public ClientValidAdd(id) { id -= TASK_VALID_ADD; BIT_ADD(g_iBitClientValid, id); }
public SpectatorCheck() { if(get_playersnum() < MIN_PLAYERS_CHECK) return; new id; for(new i; i < g_iMaxPlayers; i++) { if(_BIT_VALID(g_iBitClientValid, i)) { id = (i + 1); switch(_:cs_get_user_team(id)) { case 0: AfkPunishment(id); case 3: { Show_AfkMenu(id); SendAudio(id, "events/tutor_msg.wav"); set_task(10.0, "AfkPunishment", id); } } } } } public Show_AfkMenu(id) { new szMenu[256], iLen = formatex(szMenu, charsmax(szMenu), "\y[AFK-spectr] Вы наблюдаете за игрой?^nЕсли Вы не АФК нажмите 1.^nУ Вас 10 сек. для ответа.^n^n"); formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y1. \wДа! Я не АФК!"); return show_menu(id, 1, szMenu, 10, "Afk Menu"); }
public Handle_AfkMenu(id) { remove_task(id); return PLUGIN_HANDLED; }
public AfkPunishment(id) { server_cmd("kick #%d Вы были кикнуты из-за нахождения в зрителях.", get_user_userid(id)); }
stock SendAudio(id, szDirSound[]) { message_begin(MSG_ONE_UNRELIABLE, MSG_SEND_AUDIO, _, id); write_byte(id); write_string(szDirSound); write_short(100); message_end(); } |
bbuzzy |
| 28.7.2015, 19:42 |
Нубские вопросы по скриптингу
|
Пора бы уже выучить операции сравнения и логические операции, а то так дело далеко не уйдет. Код < — Меньше > — Больше == — Равно != — Не равно >= — Больше либо равно => — Меньше либо равно && — Логическое И || — Логическое ИЛИ ! — Логическое НЕ (Отрицание) Цитата(LaFA @ 28.7.2015, 19:09)  Нужно чтобы функция не работала, если за кт живо 2 человека. Код:
if(fnGetAliveCTsR() != 2) Код:
fnGetAliveCTsR() { static iPlayers[32], iNum
get_players(iPlayers, iNum, "ae", "CT") return iNum } |
LaFA |
| 18.7.2015, 14:36 |
/me только после смерти...
|
ncux0Zz, достаточно убрать из кода возврат функции return PLUGIN_HANDLED Код return PLUGIN_HANDLED - Плагин остановит операцию, т.е. заблокирует пересылку функции в движок return PLUGIN_CONTINUE - Плагин продолжит работать, т.е. не будет блокировать пересылку функции в движок Код:
public cmdMe(id) { if (!SayMe) { client_print(id, print_chat, "%L", id, "DISABLED_MSG") return PLUGIN_HANDLED } if (is_user_alive(id)) { client_print(id, print_chat, "Вы не можете использовать ^"/me^" пока живы.") return PLUGIN_HANDLED }
format_kill_vinfo(id, 0, g_sBuffer) client_print(id, print_chat, "* %s", g_sBuffer) return PLUGIN_CONTINUE } |
ncux0Zz |
| 18.7.2015, 14:01 |
Деньги. Глобальный FAQ.
|
Bloo, Цитата На данный момент на стороне оператора Мегафон фиксируется сбой в доставке sms подтверждений. Проблема уже взята в работу и специалисты делают всё возможное для того, чтобы устранить её как можно скорее. |
A1on3, Bloo |
| 17.7.2015, 15:21 |
Золотой дигл и НЕ-граната
|
Fullserver, мне вот интересно, и как же это будет работать? Код:
#define m_bitsDamageType 76
#define DMG_GRENADE (1<<24)
!(m_bitsDamageType & DMG_GRENADE)
|
Fullserver, Lena1978, Stimul1 |
| 16.7.2015, 14:13 |
Золотой дигл и НЕ-граната
|
Lena1978, в исходнике замени функцию fw_TakeDamage на Код:
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type) { if(attacker != inflictor || !is_valid_player(attacker) || victim == attacker || damage_type & DMG_HEGRENADE) return HAM_IGNORED
if((get_user_weapon(attacker) == CSW_DEAGLE) && g_HasDg[attacker]) { SetHamParamFloat(4, damage * get_pcvar_float(cvar_dmgmultiplier)) return HAM_HANDLED } return HAM_IGNORED } |
Lena1978, Safety1st |
| 10.7.2015, 15:16 |
Квест на ключики от анти-читов.
|
1716, ахаха, сильно, загадка для детей не умеющих считать Ответ 4 кружочка  |
Bloo |
| 8.7.2015, 14:23 |
Yet Another Voteban
|
ThePhoenix, скорее всего что-то ты не так сделал, ну да ладно. [attachment=34341:yet_anot..._voteban.sma] |
kenZZo, ThePhoenix |
| 7.7.2015, 14:26 |
Yet Another Voteban
|
ThePhoenix, Строка 499 Код:
new menu[ 256 ], len, keys = MENU_KEY_1 + MENU_KEY_2 + MENU_KEY_3 + MENU_KEY_4 ---> Код:
new menu[ 256 ], len, keys = MENU_KEY_5 + MENU_KEY_6 Строка 518 Код:
if( key == 4 ) ---> Код:
if( key == 5 ) Ланг файл Код:
VOTEBAN_MENU_NO_YES = \w1. Нет^n2. Нет^n3. Нет^n4. \rДа ---> Код:
VOTEBAN_MENU_NO_YES = \w5. \rДа^n\w6. Нет Вставить между 36-37 строкой Код:
g_pcvar_vip_access, Вставить между 84-85 строкой Код:
g_pcvar_vip_access = register_cvar( "yav_vip_access", "m" ) Строка 630 Код:
new user_flags, flags[ 2 ][ 23 ], temp[ 190 ] ---> Код:
new user_flags, flags[ 3 ][ 23 ], temp[ 190 ] Строка 642 Код:
get_pcvar_string( g_pcvar_admin_access, flags[ 0 ], 22 ) get_pcvar_string( g_pcvar_time_access, flags[ 1 ], 22 ) ---> Код:
get_pcvar_string( g_pcvar_admin_access, flags[ 0 ], 22 ) get_pcvar_string( g_pcvar_vip_access, flags[ 1 ], 22 ) get_pcvar_string( g_pcvar_time_access, flags[ 2 ], 22 ) Добавить после 649 строки Код:
if(flags[ 1 ][ 0 ] && !(user_flags & read_flags( flags[ 1 ] ) ) ) { format( temp, charsmax( temp ), "^1[^4%s^1] %L", MSGS_PREFIX, id, "VOTEBAN_ONLY_VIP" ) yav_print_color( id, temp ) return 0 } Строка 658 Код:
if( flags[ 1 ][ 0 ] && ( user_flags & read_flags( flags[ 1 ] ) ) ) ---> Код:
if( flags[ 2 ][ 0 ] && ( user_flags & read_flags( flags[ 2 ] ) ) ) Добавить в ланг файл Код:
VOTEBAN_ONLY_VIP = Вотебан доступен только VIP игрокам! |
kenZZo, Safety1st, tenb63rus, ThePhoenix |
| 1.7.2015, 15:38 |
Меню: пункты на другой странице
|
Fraig, да, именно так Проверка на 2 флага: Код:
if(get_user_flags(id) & (ADMIN_IMMUNITY | ADMIN_BAN)) |
Fraig |
| 1.7.2015, 15:29 |
Меню: пункты на другой странице
|
Fraig, дальше по порядку добавляй пункты и указывай их номера в функции, вторая страница добавиться автоматически. з.ы. не нужно цитировать большие сообщения Ах да забыл, нужно еще указывать номер пункта в menu_additem Код:
menu_additem(AdminMenu, "Обнулить счет", 1) menu_additem(AdminMenu, "Меню бонусов", 2) |
Fraig |
| 1.7.2015, 15:11 |
Меню: пункты на другой странице
|
Fraig, Код:
public admin_menu(id, menu, item) { if(item == MENU_EXIT) return PLUGIN_HANDLED
new szData[6], szName[64], iAccess, iCallback menu_item_getinfo(menu, item, iAccess, szData, charsmax(szData), szName, charsmax(szName), iCallback)
new iKey = str_to_num(szData) switch(iKey) { case 1: client_cmd(id,"say /rs") case 2: client_cmd(id,"say /anew") case 3: client_cmd(id,"say /reply") case 4: client_cmd(id,"say /warn") case 5: client_cmd(id,"amx_mute2") case 6: client_cmd(id,"amx_kickmenu") case 7: client_cmd(id,"amx_ssmenu") case 8: client_cmd(id,"fb_menu") case 9: client_cmd(id,"amx_votemapmenu") } return PLUGIN_HANDLED } |
Fraig |
| 25.6.2015, 17:00 |
SHOWKEYS (help)
|
medusa, что бы сообщения не накладывались, нужно использовать очистку каналов. Т.е. перед отправкой нового сообщения нужно отправить 8 пустых сообщений, метод конечно ватный, но других вариантов вроде бы нет Код:
public send_dhudmsg(id) { clear_dhudmsg(id)
set_dhudmessage(0, 255, 0, -1.0, -1.0, 2, 1.0, 1.0, 0.1, 1.0, false) show_dhudmessage(id, "Мое сообщение") }
stock clear_dhudmsg(id) { for(new i = 0; i < 8; i++) show_dhudmessage(id, "") } |
Bloo, medusa |
|