|
Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/
|
amx_gagip (проблема с "ungag time")
|
|
| L3X | Дата: Среда, 28.03.2007, 11:46:51 | Сообщение # 1 |
 Лейтенант
Группа: Скриптеры
Сообщений: 60
Статус: Не в сети
| Сколько не искал но найти плагин который бы блокировал чат пермаментом, либо же не сбрасывал значения после смены карты(рестарта сервера), мне не удалось. Решил написать сам. В итоге получились некоторые казусы. Первоначально сделал только блокировку чата по IP. Который заносится в отдельный файл.(Идея со внесением данных в файл была взята с Voicecomm от EKS). Как только решу некоторые проблемы с плагином, думаю добавлю блокировку и по SteamID. Плагин без проблем блокирует и заносит в список IP, но как только добавил переменную блокировки чата на время при разблокировке появилась проблема. Допустим блокировка чата на 20сек. как только этот период времени проходит чат нормализиется, но с файла IP не удаляется. В дальнейшем после смены карты, либо рестарта сервера чат снова блокирется. Вторая проблема, как сделать разблок\блокировку не только по ID или Name, но и по IP? Думаю данный плагин будет необходим не только мне. Вот сам плагин(в коде есть некоторые разделения, я делал их для себя и так-как плагин не готов удалять их пока не стал):
Сообщение отредактировал L3X - Среда, 28.03.2007, 12:09:21 |
| |
|
|
| slogic | Дата: Среда, 28.03.2007, 11:52:41 | Сообщение # 2 |
|
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| Предлагаю использовать вместо файла nvault. Там хранится время изменения каждого ключа. В кач-ве ключа выступает IP адрес. Посмотри .inc, если что непонятно, справшивай.
Сообщение отредактировал slogic - Среда, 28.03.2007, 11:52:57 |
| |
|
|
| L3X | Дата: Среда, 28.03.2007, 12:05:22 | Сообщение # 3 |
 Лейтенант
Группа: Скриптеры
Сообщений: 60
Статус: Не в сети
| Так и хочется ответить что не понятно все, ибо я им не пользовался ни разу. Есть ли плагины в которых он используется посмотреть вообще как он работает. Либо с моим что нибудь решить можно? Переделывать все заного мягко говоря сил уже нету. --------------------------------------------------------------------------------------------------------- Меня скорее всего будет интерисовать вопрос - почему до сих пор никто не написал подобных плагинов. Ведь спрос то на него был большой судя по постам "офф" форума.
Сообщение отредактировал L3X - Среда, 28.03.2007, 12:08:08 |
| |
|
|
| slogic | Дата: Среда, 28.03.2007, 12:24:22 | Сообщение # 4 |
|
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| nVault - это аналог словаря/хэша. Каждая запись состоит из двух элементов: ключ и его значение. У данного вида словаря еще есть и timestamp - время последнего изменения ключа. В твоем случае в качестве значения ключа может выступать время, на которое забанен игрок. Как работать с nvault. Обязательная | Code | #include <amxmodx> #include <nvault> new g_hDic public plugin_cfg() { g_hDic = nvault_open("amx_gagip") // открыть наш словарь if(g_hDic < 0) log_amx("Unable to open nVault") } public plugin_end() { if(g_hDic >= 0) nvault_close(g_hDic) // закрыть словарь (просто хороший тон) } | А в самом коде: | Code | new sIP[] = "xxx.xxx.xxx.xxx" // это для примера new iBanTime = 600 // добавить или обновить существующий ключ nvault_set(g_hDic, sIP, iBanTime) // получить значение ключа целого типа new iTime iTime = nvault_get(g_hDic, sIP) // получить значение ключа дробного типа new Float:fTime nvault_get(g_hDic, sIP, fTime) // получить значение ключа строкового типа new sTemp[10] nvault_get(g_hDic, sIP, sTemp, sizeof(sTemp)-1) // удалить ключ nvault_remove(g_hDic, sIP) // поиск существующег ключа а также чтение времени последнего обновления значения и самого значение new iResult new iTimeStamp iResult = nvault_lookup(g_hDic, sIP, sTemp, sizeof(sTemp)-1, iTimeStamp) if(!iResult) log_amx("Ключ %s не найден", sIP) |
Сообщение отредактировал slogic - Среда, 28.03.2007, 12:25:39 |
| |
|
|
| slogic | Дата: Среда, 28.03.2007, 12:37:16 | Сообщение # 5 |
|
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| | Quote (L3X) | | Меня скорее всего будет интерисовать вопрос - почему до сих пор никто не написал подобных плагинов. | Либо каждый делает себе в берлогу, либо те, у кого берлоги нет, просто в нем не заинтересованы. ЗЫ. По поводу timespamp. Когда надо будет провеять, забанен ли игрок по IP или его надо разбанить, но ты долежн прочитать текущее время сервера: с пом. time() и date() функций. А потом их надо привести к формату timestamp. Пока не скажу как. Это единственная загвозда. Надо посмотреть как в UNIX timestamp формируется. timestamp - это кол-во секунд, прошедших с 1.01.1970 00:00.
Сообщение отредактировал slogic - Среда, 28.03.2007, 12:44:37 |
| |
|
|
| VEN | Дата: Среда, 28.03.2007, 13:55:20 | Сообщение # 6 |
|
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| В таком случае, мог бы ему подсказать, чтобы юзал get_systime().
|
| |
|
|
| L3X | Дата: Среда, 28.03.2007, 14:09:15 | Сообщение # 7 |
 Лейтенант
Группа: Скриптеры
Сообщений: 60
Статус: Не в сети
| Я всеж постараюсь добить этим путем. Переписывать снова уже нет желания. В этом то все работает кроме одного. После тайминга не чистит файл с данными. Либо тогда уже буду пользоваться только пермаментом Но все равно спс.
Сообщение отредактировал L3X - Среда, 28.03.2007, 14:10:14 |
| |
|
|
| slogic | Дата: Среда, 28.03.2007, 15:54:25 | Сообщение # 8 |
|
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| | Quote (VEN) | | В таком случае, мог бы ему подсказать, чтобы юзал get_systime(). | А я не знал про существование этой функции. Я в time.inc смотрел и в core.inc.
|
| |
|
|
| L3X | Дата: Среда, 28.03.2007, 17:46:06 | Сообщение # 9 |
 Лейтенант
Группа: Скриптеры
Сообщений: 60
Статус: Не в сети
| 2VEN: Может сможешь чем помочь? Вышеописанное предложение это конечно хорошо, но я в этом два по пять. МОжет оно было бы и проще изначально, но не сейчас. Учитывая, то что я новичек - для меня все это дремучий лес. slogic'ом было предложен вот этот код: | Quote (slogic) | это функция проверки строки, что она содержит ip адрес | //Это всего лишь пример[код не оригинальный, а урезанный] | Code | #include <regex> bool:isIP(const ip[]) { static RegeX:res static iRet new sErr[1] res = regex_match(ip, "\d+\.\d+\.\d+\.\d+(|\:\d+)", iRet, sErr, 0) if(!res) return false return true } | В итоге получилось: | Code | bool:isIP(const ip[]) { static RegeX:res static iRet new sErr[1] res = regex_match(ip, "\d+\.\d+\.\d+\.\d+(|\:\d+)", iRet, sErr, 0) if(!res) return false return true } public amx_gag(id,level,cid) { if (!cmd_access(id,level,cid,3)) return PLUGIN_HANDLED new arg[32] isIP(arg) read_argv(1,arg,31) new player = cmd_target(id,arg,1) if (!player) return PLUGIN_HANDLED gag[player] = true return PLUGIN_HANDLED } | При попытке вписать IP вместо (id, nick ) ничего не вышло. Я бы даже закрыл глаза на тайминг. Но как можно удалить из списка IP если этого игрока в данный момент нет на сервере? Либо ИП бы уже выступал в роли строкового параменра в результате которого производился бы поисх в файле и если данные находились то происходило удаление этой строки(В роле строки выступает IP). Я даже незнаю что еще можно придумать. Ведь банить пермаментом т.к. неполучается сделать с таймингом, а потом не имея возможности разбанить даже если известен ИП, но этого человека в данный момент нет в игре, мягко говоря не серьезно. Допустим если человек банится на 2 недели, то от этого плагина уже нет толку. ВЫручайте. Как можно дописать уже существующий код? Я конечно понимаю что на это надо время, подожду без проблем. P.S. Да вот такой вот я нудный 
Сообщение отредактировал L3X - Среда, 28.03.2007, 17:48:47 |
| |
|
|
| slogic | Дата: Среда, 28.03.2007, 19:42:21 | Сообщение # 10 |
|
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| | Quote (L3X) | isIP(arg) read_argv(1,arg,31) | Мда. Как бы так сказать... Ты вообще понимашь как выполняется программа, что такое алгоритм и что такое логика? Что такое блоки, и что такое условный переход? Область видимости переменных? Ты просто упираешься головой в стенку, а не дорабатываешь плагин. | Quote (L3X) | | Но как можно удалить из списка IP если этого игрока в данный момент нет на сервере? | Да никак, если заранее об этом не подумать. А думать надо было до того как писать/дописывать плагин. Теперь надо переделывать. VEN, давай, теперь ты помоги ему Может не все потеряно.
|
| |
|
|
| L3X | Дата: Четверг, 29.03.2007, 11:46:07 | Сообщение # 11 |
 Лейтенант
Группа: Скриптеры
Сообщений: 60
Статус: Не в сети
| | Quote (slogic) | | Мда. Как бы так сказать... | Я дурак... | Quote (slogic) | | Ты вообще понимашь как выполняется программа, что такое алгоритм и что такое логика? Что такое блоки, и что такое условный переход? Область видимости переменных? | В общих чертах да. 2-й курс как ни как, хотя там мало чему могут научить. Но не будем отходить от темы.Добавлено (2007-03-29, 11:46 Am) ---------------------------------------------
| Quote (VEN) | | но, как я понял из беседы, ты не собираешься менять метод, следовательно, тут мы не сходимся. | Это обнадежывает. Я сделал как смог, вернее как понял. Я же не пошу написать за меня плагин с нуля. Может у меня как раз таки эффективный способ? Если там действительно все так безнадежно... Код то никто не смотрел.
|
| |
|
|
| VEN | Дата: Четверг, 29.03.2007, 12:14:37 | Сообщение # 12 |
|
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| | Quote | | но с файла IP не удаляется | Вообще твой способ абсолютно технически неверен. set_task тебе тут не помощник. Ты должен указывать в файле не только адрес, но и на сколько(до какого времени) ты банишь адрес. Из соображений производительности осуществлять запись в файл следует только единожды, например в plugin_end. А до этого кэшировать/держать время и адреса в памяти (в массивах). Engine функции ты не используешь, поэтому инклудить engine нет смысла.
|
| |
|
|
| VEN | Дата: Четверг, 29.03.2007, 12:26:18 | Сообщение # 13 |
|
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| Т.е. вкратце метод следующий: Загружаешь адреса/время из файла в массивы. При заходе клиента на сервер кэшируешь его адрес в массив (при выходе удаляешь). При попытке клиента что-либо сказать, проверяешь наличие его адреса (который был кэширован) в массиве забаненых адресов. Если нашел, сверяешь время - если время бана не истекло, "затыкаешь" клиента, если истекло, удаляешь адрес из массива забаненых адресов. При бане адреса/клиента проверяешь, нет ли такого адреса в массиве. Если есть, перезаписываешь время бана, если нет, вписываешь адрес/время в пустой/истекший адрес/время. В plugin_end удаляешь старый файл банов и записываешь новый. Не записывай пустые/истекшие баны. В качестве времени используй get_systime().
Сообщение отредактировал VEN - Четверг, 29.03.2007, 12:31:30 |
| |
|
|
| slogic | Дата: Четверг, 29.03.2007, 12:29:01 | Сообщение # 14 |
|
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| L3X, займись плагинами попроще. А этот я доделаю, как только по работе нагрузка уменьшится.
|
| |
|
|
| 1c3_1k | Дата: Пятница, 30.03.2007, 13:54:06 | Сообщение # 15 |
 Лейтенант
Группа: Пользователи
Сообщений: 75
Статус: Не в сети
| slogic так ты доделал? если да то выложи плз...
|
| |
|
|
 | AMX Mod X Russian Community © 2006-2026  |  |
|
| |