AMX MOD X
Четверг, 01.01.2026, 14:13:50



Приветствую Вас Гость | RSS
[ Главная ] [ amx_gagip (проблема с "ungag time") - AMX Mod X Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/

  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: slogic, AlMod  
amx_gagip (проблема с "ungag time")
L3XДата: Среда, 28.03.2007, 11:46:51 | Сообщение # 1
Лейтенант
Группа: Скриптеры
Сообщений: 60
Репутация: 2
Статус: Не в сети
Сколько не искал но найти плагин который бы блокировал чат пермаментом, либо же не сбрасывал значения после смены карты(рестарта сервера), мне не удалось.
Решил написать сам. В итоге получились некоторые казусы.
Первоначально сделал только блокировку чата по IP. Который заносится в отдельный файл.(Идея со внесением данных в файл была взята с Voicecomm от EKS). Как только решу некоторые проблемы с плагином, думаю добавлю блокировку и по SteamID.

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

Вторая проблема, как сделать разблок\блокировку не только по ID или Name, но и по IP?

Думаю данный плагин будет необходим не только мне.

Вот сам плагин(в коде есть некоторые разделения, я делал их для себя и так-как плагин не готов удалять их пока не стал):

Прикрепления: 53336255.rar (11.9 Kb)


Сообщение отредактировал L3X - Среда, 28.03.2007, 12:09:21
 
slogicДата: Среда, 28.03.2007, 11:52:41 | Сообщение # 2
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Предлагаю использовать вместо файла nvault. Там хранится время изменения каждого ключа. В кач-ве ключа выступает IP адрес. Посмотри .inc, если что непонятно, справшивай.

Сообщение отредактировал slogic - Среда, 28.03.2007, 11:52:57
 
L3XДата: Среда, 28.03.2007, 12:05:22 | Сообщение # 3
Лейтенант
Группа: Скриптеры
Сообщений: 60
Репутация: 2
Статус: Не в сети
Так и хочется ответить что не понятно все, ибо я им не пользовался ни разу.
Есть ли плагины в которых он используется посмотреть вообще как он работает. Либо с моим что нибудь решить можно? Переделывать все заного мягко говоря сил уже нету.
---------------------------------------------------------------------------------------------------------

Меня скорее всего будет интерисовать вопрос - почему до сих пор никто не написал подобных плагинов. Ведь спрос то на него был большой судя по постам "офф" форума.

Сообщение отредактировал L3X - Среда, 28.03.2007, 12:08:08
 
slogicДата: Среда, 28.03.2007, 12:24:22 | Сообщение # 4
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
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
Репутация: 47
Статус: Не в сети
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
Репутация: 45
Статус: Не в сети
В таком случае, мог бы ему подсказать, чтобы юзал get_systime().
 
L3XДата: Среда, 28.03.2007, 14:09:15 | Сообщение # 7
Лейтенант
Группа: Скриптеры
Сообщений: 60
Репутация: 2
Статус: Не в сети
Я всеж постараюсь добить этим путем. Переписывать снова уже нет желания. В этом то все работает кроме одного. После тайминга не чистит файл с данными. Либо тогда уже буду пользоваться только пермаментом smile
Но все равно спс.


Сообщение отредактировал L3X - Среда, 28.03.2007, 14:10:14
 
slogicДата: Среда, 28.03.2007, 15:54:25 | Сообщение # 8
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Quote (VEN)
В таком случае, мог бы ему подсказать, чтобы юзал get_systime().

А я не знал про существование этой функции. Я в time.inc смотрел и в core.inc.
 
L3XДата: Среда, 28.03.2007, 17:46:06 | Сообщение # 9
Лейтенант
Группа: Скриптеры
Сообщений: 60
Репутация: 2
Статус: Не в сети
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. Да вот такой вот я нудный smile

Сообщение отредактировал L3X - Среда, 28.03.2007, 17:48:47
 
slogicДата: Среда, 28.03.2007, 19:42:21 | Сообщение # 10
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Quote (L3X)
isIP(arg)
read_argv(1,arg,31)

Мда. Как бы так сказать... Ты вообще понимашь как выполняется программа, что такое алгоритм и что такое логика? Что такое блоки, и что такое условный переход? Область видимости переменных?

Ты просто упираешься головой в стенку, а не дорабатываешь плагин.

Quote (L3X)
Но как можно удалить из списка IP если этого игрока в данный момент нет на сервере?

Да никак, если заранее об этом не подумать. А думать надо было до того как писать/дописывать плагин. Теперь надо переделывать.

VEN, давай, теперь ты помоги ему biggrin Может не все потеряно.

 
L3XДата: Четверг, 29.03.2007, 11:46:07 | Сообщение # 11
Лейтенант
Группа: Скриптеры
Сообщений: 60
Репутация: 2
Статус: Не в сети
Quote (slogic)
Мда. Как бы так сказать...

Я дурак...
Quote (slogic)
Ты вообще понимашь как выполняется программа, что такое алгоритм и что такое логика? Что такое блоки, и что такое условный переход? Область видимости переменных?

В общих чертах да. 2-й курс как ни как, хотя там мало чему могут научить.
Но не будем отходить от темы.

Добавлено (2007-03-29, 11:46 Am)
---------------------------------------------
Quote (VEN)
но, как я понял из беседы, ты не собираешься менять метод, следовательно, тут мы не сходимся.

Это обнадежывает. cool

Я сделал как смог, вернее как понял. Я же не пошу написать за меня плагин с нуля.
Может у меня как раз таки эффективный способ? smile
Если там действительно все так безнадежно...
Код то никто не смотрел.

 
VENДата: Четверг, 29.03.2007, 12:14:37 | Сообщение # 12
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Репутация: 45
Статус: Не в сети
Quote
но с файла IP не удаляется
Вообще твой способ абсолютно технически неверен. set_task тебе тут не помощник. Ты должен указывать в файле не только адрес, но и на сколько(до какого времени) ты банишь адрес.

Из соображений производительности осуществлять запись в файл следует только единожды, например в plugin_end. А до этого кэшировать/держать время и адреса в памяти (в массивах).

Engine функции ты не используешь, поэтому инклудить engine нет смысла.

 
VENДата: Четверг, 29.03.2007, 12:26:18 | Сообщение # 13
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Репутация: 45
Статус: Не в сети
Т.е. вкратце метод следующий:

Загружаешь адреса/время из файла в массивы.

При заходе клиента на сервер кэшируешь его адрес в массив (при выходе удаляешь).

При попытке клиента что-либо сказать, проверяешь наличие его адреса (который был кэширован) в массиве забаненых адресов. Если нашел, сверяешь время - если время бана не истекло, "затыкаешь" клиента, если истекло, удаляешь адрес из массива забаненых адресов.

При бане адреса/клиента проверяешь, нет ли такого адреса в массиве. Если есть, перезаписываешь время бана, если нет, вписываешь адрес/время в пустой/истекший адрес/время.

В plugin_end удаляешь старый файл банов и записываешь новый. Не записывай пустые/истекшие баны.

В качестве времени используй get_systime().

Сообщение отредактировал VEN - Четверг, 29.03.2007, 12:31:30
 
slogicДата: Четверг, 29.03.2007, 12:29:01 | Сообщение # 14
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
L3X, займись плагинами попроще. А этот я доделаю, как только по работе нагрузка уменьшится.
 
1c3_1kДата: Пятница, 30.03.2007, 13:54:06 | Сообщение # 15
Лейтенант
Группа: Пользователи
Сообщений: 75
Репутация: 2
Статус: Не в сети
slogic так ты доделал? если да то выложи плз...
 
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

AMX Mod X Russian Community © 2006-2026