PDA

Просмотр полной версии : [Mod] Anti-Farming (разработка)


Hantet
29.04.2010, 16:14
Мод для MaNGOS: AntiFarm.

Данный мод не позволяет "сливать" хонор с помощью игрока-болванки (ч/р второе окно).
В случае обнаружения потенциального "сливера" - обнуляет ему весь хонор и выкидывает из игры (эти же действия происходят с игроком-болванкой).

Система реагирует в том случае, если игрок убивает подряд одну и ту же цель более 9 раз за 10 минут. В случае, если превышается время реагирования - все счётчики обнуляются и сканирование начинается заного.

Патч подогнан под последнюю ревизию чистого MaNGOS (rev. 9851).

Insider42
29.04.2010, 17:36
P.s. Время ожидание у спирит хилера у меня снято.
Тогда зачем изобретать велосипед?

zergtmn
29.04.2010, 17:58
Можно кастовать на игрока http://ru.wowhead.com/spell=2479 после реса (везде, за исключением бг и инстов)

Insider42
29.04.2010, 21:35
Можно кастовать на игрока http://ru.wowhead.com/spell=2479 после реса (везде, за исключением бг и инстов)

Обходится "право-кликом" на баф. Просто будет больше геммора двухоконщикам

zergtmn
29.04.2010, 22:21
Обходится "право-кликом" на баф. Просто будет больше геммора двухоконщикам
Можно сделать, чтобы он считался дебафом

Hantet
30.04.2010, 02:13
Спасибо за идеи всем, но перед о мной стоит конкретная задача. Я пытаюсь сделать так, чтобы метод слива хонора не просто не работал, а чтобы за него ещё и наказание давалось (например бан).

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

Null
30.04.2010, 09:09
Тоже поступила такая жалоба. Выдача бана/кика-это неправильно.
Надо, чтобы при убийстве одной и той же цели (читайте-игрока) 2ой раз давало в 2 раза меньше хонора, в 3ий- в 4 раза, более 3х- вообще не давало, и чтобы всё это действовало в течение 30 минут
Пытался реализовать через получение гуид игрока и помещением его в массив, ничего не получилось.

Insider42
30.04.2010, 09:40
Надо, чтобы при убийстве одной и той же цели (читайте-игрока) 2ой раз давало в 2 раза меньше хонора, в 3ий- в 4 раза, более 3х- вообще не давало, и чтобы всё это действовало в течение 30 минут

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

Null
30.04.2010, 10:59
Так это уже было в одном из патчей близов и работало в мангосе, копайте исходники старых ревизий.

Насколько старых?

LordJZ
30.04.2010, 12:12
Null,
Кстати говоря, на офе эта система и сейчас присутствует, но начинает работать только после определенного количества убийств. А на ОЛО вообще за убийство цели в течении 3 минут после ее первого убийства не дается хонор.

P.S. Null, ревизия 5711. Если сильно надо - могу отобрать у одного хорошего человека аналогичный патч к последним ревизиям.

KiriX
30.04.2010, 12:28
А на ОЛО вообще за убийство цели в течении 3 минут после ее первого убийства не дается хонор.
Может используется какая-то аура/спелл для этого?

LordJZ
30.04.2010, 13:00
Может используется какая-то аура/спелл для этого?Да, используется, но номер спелла не дам. Потом сбегаю на озеро и посмотрю...

Hantet
30.04.2010, 13:30
Null,
Кстати говоря, на офе эта система и сейчас присутствует, но начинает работать только после определенного количества убийств. А на ОЛО вообще за убийство цели в течении 3 минут после ее первого убийства не дается хонор.

P.S. Null, ревизия 5711. Если сильно надо - могу отобрать у одного хорошего человека аналогичный патч к последним ревизиям.

LordJZ, отбери пожалуйста :).
Я вот порылся сейчас в исходниках 5711 (привет, SVN (http://mangos.svn.sourceforge.net/viewvc/mangos/trunk/?pathrev=5711)). Нашёл в Player.cpp какие-то зачатки этого мода (всего одну переменную). Продолжу только вечером.

selector
30.04.2010, 21:21
Данный мод не распространяется на БГ?
Например на том-же ВСГ можно убить явно больше 9раз за 10мин одного и того же чара(все мы знаем, что иногда бывают ПРО с одной стороны и нубы с другой).

Если игрок создал пати(в 3,5,10 окок). Эти несколько "нехороших" человек качают хонор убивая одного по очереди. Проверку стоит сделать.

Lawliet
30.04.2010, 21:31
Реализовать у меня почти получилось, проблема в том, что нужно реализовать таймер (на примере ScriptDev2 скриптов у меня не получилось).

Кусок кода взятый с Relaxed Anticheat:

+ uint32 Anti_TeleTimeDiff=plMover ? time(NULL) - plMover->Anti__GetLastTeleTime() : time(NULL);
+ static const uint32 Anti_TeleTimeIgnoreDiff=sWorld.GetMvAnticheatIgnor eAfterTeleport();
+ if (plMover && (plMover->m_transport == 0) && sWorld.GetMvAnticheatEnable() &&
+ GetPlayer()->GetSession()->GetSecurity() <= sWorld.GetMvAnticheatGmLevel() &&
+ GetPlayer()->GetMotionMaster()->GetCurrentMovementGeneratorType()!=FLIGHT_MOTION_T YPE &&
+ Anti_TeleTimeDiff>Anti_TeleTimeIgnoreDiff)
+ {
+ const uint32 CurTime=getMSTime();
+ if(getMSTimeDiff(GetPlayer()->m_anti_lastalarmtime,CurTime) > sWorld.GetMvAnticheatAlarmPeriod())
+ {
+ GetPlayer()->m_anti_alarmcount = 0;
+ }

Описание с конфига: Reset alarm-count after this milliseconds. (default 5000)

Думаю должно помочь, во вложении положил этот самый античит, реализация их таймера вполне подходит под ваши требования :secret:

Не обессудьте, если не так понял, в чем вам именно требовалась помощь...

Lawliet
30.04.2010, 21:34
Я имел ввиду обнуление счетчика через нн"ое кол-во времени

if(getMSTimeDiff(GetPlayer()->m_anti_lastalarmtime,CurTime) > sWorld.GetMvAnticheatAlarmPeriod())

Hantet
30.04.2010, 23:25
Данный мод не распространяется на БГ?
Например на том-же ВСГ можно убить явно больше 9раз за 10мин одного и того же чара(все мы знаем, что иногда бывают ПРО с одной стороны и нубы с другой).

Если игрок создал пати(в 3,5,10 окок). Эти несколько "нехороших" человек качают хонор убивая одного по очереди. Проверку стоит сделать.

Тут идёт подсчёт не "сколько раз одного и того же игрока убили за 10 минут", а "сколько раз одного и того же игрока убили подряд без убийств других целей"

Lawliet
01.05.2010, 00:39
Player.cpp

m_hasnosavekill = 0;
}
- if(m_haslimitkillonly > 9)
- //if(m_haslimitkillonly > 9 && timer < 600) вот как-то так, наверное.
+ const uint32 CurTime = getMSTime();
+ if(m_haslimitkillonly > 9)
+ killer->antifarm_lastkilltime = CurTime;
+
+ if(getMSTimeDiff(killer->antifarm_lastkilltime,CurTime) < 600)
{
ChatHandler(killer->GetSession()).PSendSysMessage("%s, you a fool! bye-bye!", killer->GetName());
killer->RemoveFromWorld();
dier->RemoveFromWorld();
}

//-**-//

////////////////////Rest System/////////////////////

+ //- Anti-Farm System
+ antifarm_lastkilltime = 0; //last kill time

Player.h

////////////////////Rest System/////////////////////

+ //- Anti-Farm System
+ uint32 antifarm_lastkilltime; //last kill time

Обещать, что это на 100% работоспособный вариант не могу :declare:
Проверить тоже к сожалению не могу, вариант, не вариант, но хоть что то...

Hantet
01.05.2010, 00:41
Player.cpp

m_hasnosavekill = 0;
}
- if(m_haslimitkillonly > 9)
- //if(m_haslimitkillonly > 9 && timer < 600) вот как-то так, наверное.
+ const uint32 CurTime = getMSTime();
+ if(m_haslimitkillonly > 9)
+ killer->antifarm_lastkilltime = CurTime;
+
+ if(getMSTimeDiff(killer->antifarm_lastkilltime,CurTime) < 600)
{
ChatHandler(killer->GetSession()).PSendSysMessage("%s, you a fool! bye-bye!", killer->GetName());
killer->RemoveFromWorld();
dier->RemoveFromWorld();
}

//-**-//

////////////////////Rest System/////////////////////

+ //- Anti-Farm System
+ antifarm_lastkilltime = 0; //last kill time

Player.h

////////////////////Rest System/////////////////////

+ //- Anti-Farm System
+ uint32 antifarm_lastkilltime; //last kill time

Обещать, что это на 100% работоспособный вариант не могу :declare:
Проверить тоже к сожалению не могу, вариант, не вариант, но хоть что то...

Еее, вот он, заветный таймер! :)
Спасибо большущее, вроде собирается. Пойду проверю. :)

Lawliet
01.05.2010, 00:43
Еще предлагаю немного локализировать сис сообщение, меняем кодировку на utf-8 без BOM и:

- ChatHandler(killer->GetSession()).PSendSysMessage("%s, you a fool! bye-bye!", killer->GetName());

+ ChatHandler(killer->GetSession()).PSendSysMessage("%s, Дурачье! Всего хорошего...", killer->GetName());

:pardon:

Lawliet
01.05.2010, 00:45
Да не за что, хочу помочь чем умею :thank_you: мне ведь и самому не помешает эта система, в рабочем виде, отпишите пожалуйста о результате, буду ждать :lazy:

Hantet
01.05.2010, 00:47
Да не за что, хочу помочь чем умею :thank_you: мне ведь и самому не помешает эта система, в рабочем виде, отпишите пожалуйста о результате, буду ждать :lazy:

Обязательно! :)

Возможно, даже сегодня смогу это сделать. :to_clue:

Lawliet
01.05.2010, 01:13
Еще предлагаю немного локализировать сис сообщение, меняем кодировку на utf-8 без BOM и:

- ChatHandler(killer->GetSession()).PSendSysMessage("%s, you a fool! bye-bye!", killer->GetName());

+ ChatHandler(killer->GetSession()).PSendSysMessage("%s, Дурачье! Всего хорошего...", killer->GetName());

:pardon:

Не корректно написал, правильно:
"Еще предлагаю немного локализировать сис сообщение, преобразуем кодировку у Player.cpp на utf-8 без BOM"

Еще предлагаю, если вариант рабочий, вынести временной коэффициент в конфиг:

if(getMSTimeDiff(killer->antifarm_lastkilltime,CurTime) < sWorld.GetFarmsTimerPeriod()) =)

Возможно некоторые решат подстроить патч под себя, а менять всякий раз в исходниках и компилить не каждый захочет... Конечно возможно, что я ошибаюсь...

Hantet
01.05.2010, 14:35
Не корректно написал, правильно:
"Еще предлагаю немного локализировать сис сообщение, преобразуем кодировку у Player.cpp на utf-8 без BOM"

Еще предлагаю, если вариант рабочий, вынести временной коэффициент в конфиг:

if(getMSTimeDiff(killer->antifarm_lastkilltime,CurTime) < sWorld.GetFarmsTimerPeriod()) =)

Возможно некоторые решат подстроить патч под себя, а менять всякий раз в исходниках и компилить не каждый захочет... Конечно возможно, что я ошибаюсь...

"А слона то мы и не заметили"...
Что писать в аргументах функции при её вызове? :)
Я нашёл там класс Victim, но что он точно значит и нужен ли именно он - вопрос. :pardon:

Сейчас пойду рыться, может найду что. Вообщем, отпишусь.


Add:
Так, я включил голову и понял единственную истину.
Victim - это тот, кого убили.
Victim->GetOwner() - это тот, кто убил.
По моему так. Сейчас пойду пересоберу.

-----
Add2:
Lawliet, я решил время держать не в константе. Переменную определять в начале функции а уже изменять ей значение только при обнулённых счётчиках.
Кода я поудалял много, добавил таймер. Собрал...Вы не поверите, работает! :)
Я зашёл в 2 окна и начал сливать хонор (бонально - коммандой die), после 10 смертей, мне, как и было запланированно, написалось в чат сообщение мол я такой-сякой сливер паршивый, выкинуло и меня и мою жертву. Когда я зашёл - хонор обнулился и я был мёртв. Идеально! :) После чего попробывал убивать жертву с большим промежутком времени (более 1 минуты за одно убийство) - всё опять гладко, меня не выкинуло при 15 убийств.

Завтра весь день буду занят, вечером соберу код в один патч-файл и выложу.

Lawliet
02.05.2010, 14:05
"Lawliet, я решил время держать не в константе. Переменную определять в начале функции а уже изменять ей значение только при обнулённых счётчиках.
Кода я поудалял много, добавил таймер. Собрал...Вы не поверите, работает! :)
Я зашёл в 2 окна и начал сливать хонор (бонально - коммандой die), после 10 смертей, мне, как и было запланированно, написалось в чат сообщение мол я такой-сякой сливер паршивый, выкинуло и меня и мою жертву. Когда я зашёл - хонор обнулился и я был мёртв. Идеально! :) После чего попробывал убивать жертву с большим промежутком времени (более 1 минуты за одно убийство) - всё опять гладко, меня не выкинуло при 15 убийств.

Завтра весь день буду занят, вечером соберу код в один патч-файл и выложу.

Это очень радует, жду не дождусь кода :friends:

Dragon
03.05.2010, 22:58
После чего попробывал убивать жертву с большим промежутком времени (более 1 минуты за одно убийство) - всё опять гладко, меня не выкинуло при 15 убийств.
Что-то мне подсказывает, что делать временные промежутки смогут и фармеры... Всего минуту. Или я чего-то не понял?
И что будет, если убить 9 раз подряд жертву, потом сделать паузу больше минуты (глотнуть чая/сходить в туалет/etc) и снова вернуться к своему "бравому" делу?

Hantet
04.05.2010, 00:13
Что-то мне подсказывает, что делать временные промежутки смогут и фармеры... Всего минуту. Или я чего-то не понял?
И что будет, если убить 9 раз подряд жертву, потом сделать паузу больше минуты (глотнуть чая/сходить в туалет/etc) и снова вернуться к своему "бравому" делу?

Предыдущие убийства сохраняются не минуту, а 10 минут.
Обойти можно будет если убить 9 раз подряд жертву (в принципе, минуты за 3 спокойно) и после этого 7+ минут отдыхать.

Система не реагирует если убивать подряд одну и ту же цель с промежутком чуть более 1 минуты (А такой расклад очень не продуктивен, т.к. 1 килл/мин это очень долго и практически не отличается от БГ. Следовательно смысла сливерам не будет подвергать себя опасности наказания (как минимум - обнуления хонора)).

Так же есть задумка создать таблицу в БД и каждый раз при обнаружении потенциального сливера заносить туда его аккаунт. При дальнейшей активности слива (скажем, от 3 раз) с этого аккаунта - давать бан.

Hantet
08.05.2010, 23:24
Всё доделал, проверил, почистил.
Подогнан под последнюю ревизию чистого мангоса (rev. 9851).

Я наконец научился создавать patch-файлы для гита! =)))
Очень прошу почистить тему.

Morphau
09.05.2010, 15:37
Здравствуйте, спасибо за патч, но когда и как вызов функции?
Спасибо и простите за мой язык, но я французский, я использую Google клевета.

Hantet
09.05.2010, 16:28
Прошу прощения :)
Файл изменил.

Так и знал, что что-нибудь, да забуду! :)

xex
10.05.2010, 00:55
Всё доделал, проверил, почистил.
Подогнан под последнюю ревизию чистого мангоса (rev. 9851).

Спасибо большое за патч!

Получил два краша, поэтому:

- if(GetTypeId() == TYPEID_PLAYER && uVictim->GetTypeId() == TYPEID_PLAYER)
+ if (!InBattleGround() && GetTypeId() == TYPEID_PLAYER && (uVictim) && uVictim->GetTypeId() == TYPEID_PLAYER)
HandleHasOneTargetForKill(uVictim->GetGUID(), GetGUID());


На всякий случай в void Player::HandleHasOneTargetForKill(uint64 pdier, uint64 pkiller):

Player *killer = sObjectMgr.GetPlayer(pkiller);
Player *dier = sObjectMgr.GetPlayer(pdier);

+ if (!killer || !dier)
+ return;

Mr.Grom
14.05.2010, 10:37
Если после 8 киллов будет релог, killer и dier таймер обнулится?

Lordronn
21.06.2010, 23:36
А почему не пойти по пути меньшего сопротивления?
Взять из базы с акками Ип и сравнить ИП того кто убил и того кого убили . Если одинаковые то бан.

Feel the Power
22.06.2010, 00:04
А как же люди, играющие с одного ип? Братья/сестры или люди с одного модема?

Lordronn
22.06.2010, 15:06
Тогда нужно брать ИП адреса убитого и убившего , и делать таймер , если в течении 10 минут они убили другого более 15 раз , и если они не на БГ , и если они не в рейдах(если рейд на столицу тогда реально убить одного и того же более 15 раз) то тогда бан

NeatElves
22.06.2010, 15:17
Чего вы к ип привязались, перечитайте свой пост вдумчиво, если разные - то убивайте на здоровье что-ли ? Просто без первой части(часть поста до первой запятой не имеет смысла)..))

blackmanos
08.09.2010, 04:10
LordJZ, отбери пожалуйста :).
Я вот порылся сейчас в исходниках 5711 (привет, SVN (http://mangos.svn.sourceforge.net/viewvc/mangos/trunk/?pathrev=5711)). Нашёл в Player.cpp какие-то зачатки этого мода (всего одну переменную). Продолжу только вечером.

Вообще-то в реве 5711 как раз таки систему ограничения на получение хонора удалили, она была по началу совестная с системой подсчета количество убитых игроков, и в 5711 ее снесли, а оставили только подсчет.
Появилась она в ядре гораздо раньше еще до 2864 ревы точно.

MaS0n
08.09.2010, 08:57
До 2.4.0 на оффе была система под названием Honor Diminishing, принцип работы такой же как и у других диминишингов. А в 2.4.0 ее дропнули, близы заявили в блу посте, мол, мы научились отслеживать сливщиков и эта система более не нужна => дропнули в мангосе. А для некоторых случаев а-ля диминишинг были созданы ауры

Система эта чистый сервер-сайд, так что при желании можно восстановить