Просмотр полной версии : [Mod] Anti-Farming (разработка)
Мод для MaNGOS: AntiFarm.
Данный мод не позволяет "сливать" хонор с помощью игрока-болванки (ч/р второе окно).
В случае обнаружения потенциального "сливера" - обнуляет ему весь хонор и выкидывает из игры (эти же действия происходят с игроком-болванкой).
Система реагирует в том случае, если игрок убивает подряд одну и ту же цель более 9 раз за 10 минут. В случае, если превышается время реагирования - все счётчики обнуляются и сканирование начинается заного.
Патч подогнан под последнюю ревизию чистого MaNGOS (rev. 9851).
Insider42
29.04.2010, 17:36
P.s. Время ожидание у спирит хилера у меня снято.
Тогда зачем изобретать велосипед?
Можно кастовать на игрока http://ru.wowhead.com/spell=2479 после реса (везде, за исключением бг и инстов)
Insider42
29.04.2010, 21:35
Можно кастовать на игрока http://ru.wowhead.com/spell=2479 после реса (везде, за исключением бг и инстов)
Обходится "право-кликом" на баф. Просто будет больше геммора двухоконщикам
Обходится "право-кликом" на баф. Просто будет больше геммора двухоконщикам
Можно сделать, чтобы он считался дебафом
Спасибо за идеи всем, но перед о мной стоит конкретная задача. Я пытаюсь сделать так, чтобы метод слива хонора не просто не работал, а чтобы за него ещё и наказание давалось (например бан).
Я сейчас соберу ядро в этом варианте и гляну что выйдет. Примерно я представляю будущие проблемы, но хочу это видеть в деле.
Тоже поступила такая жалоба. Выдача бана/кика-это неправильно.
Надо, чтобы при убийстве одной и той же цели (читайте-игрока) 2ой раз давало в 2 раза меньше хонора, в 3ий- в 4 раза, более 3х- вообще не давало, и чтобы всё это действовало в течение 30 минут
Пытался реализовать через получение гуид игрока и помещением его в массив, ничего не получилось.
Insider42
30.04.2010, 09:40
Надо, чтобы при убийстве одной и той же цели (читайте-игрока) 2ой раз давало в 2 раза меньше хонора, в 3ий- в 4 раза, более 3х- вообще не давало, и чтобы всё это действовало в течение 30 минут
Так это уже было в одном из патчей близов и работало в мангосе, копайте исходники старых ревизий.
Так это уже было в одном из патчей близов и работало в мангосе, копайте исходники старых ревизий.
Насколько старых?
Null,
Кстати говоря, на офе эта система и сейчас присутствует, но начинает работать только после определенного количества убийств. А на ОЛО вообще за убийство цели в течении 3 минут после ее первого убийства не дается хонор.
P.S. Null, ревизия 5711. Если сильно надо - могу отобрать у одного хорошего человека аналогичный патч к последним ревизиям.
А на ОЛО вообще за убийство цели в течении 3 минут после ее первого убийства не дается хонор.
Может используется какая-то аура/спелл для этого?
Может используется какая-то аура/спелл для этого?Да, используется, но номер спелла не дам. Потом сбегаю на озеро и посмотрю...
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 окок). Эти несколько "нехороших" человек качают хонор убивая одного по очереди. Проверку стоит сделать.
Реализовать у меня почти получилось, проблема в том, что нужно реализовать таймер (на примере 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:
Не обессудьте, если не так понял, в чем вам именно требовалась помощь...
Я имел ввиду обнуление счетчика через нн"ое кол-во времени
if(getMSTimeDiff(GetPlayer()->m_anti_lastalarmtime,CurTime) > sWorld.GetMvAnticheatAlarmPeriod())
Данный мод не распространяется на БГ?
Например на том-же ВСГ можно убить явно больше 9раз за 10мин одного и того же чара(все мы знаем, что иногда бывают ПРО с одной стороны и нубы с другой).
Если игрок создал пати(в 3,5,10 окок). Эти несколько "нехороших" человек качают хонор убивая одного по очереди. Проверку стоит сделать.
Тут идёт подсчёт не "сколько раз одного и того же игрока убили за 10 минут", а "сколько раз одного и того же игрока убили подряд без убийств других целей"
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:
Проверить тоже к сожалению не могу, вариант, не вариант, но хоть что то...
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:
Проверить тоже к сожалению не могу, вариант, не вариант, но хоть что то...
Еее, вот он, заветный таймер! :)
Спасибо большущее, вроде собирается. Пойду проверю. :)
Еще предлагаю немного локализировать сис сообщение, меняем кодировку на utf-8 без BOM и:
- ChatHandler(killer->GetSession()).PSendSysMessage("%s, you a fool! bye-bye!", killer->GetName());
+ ChatHandler(killer->GetSession()).PSendSysMessage("%s, Дурачье! Всего хорошего...", killer->GetName());
:pardon:
Да не за что, хочу помочь чем умею :thank_you: мне ведь и самому не помешает эта система, в рабочем виде, отпишите пожалуйста о результате, буду ждать :lazy:
Да не за что, хочу помочь чем умею :thank_you: мне ведь и самому не помешает эта система, в рабочем виде, отпишите пожалуйста о результате, буду ждать :lazy:
Обязательно! :)
Возможно, даже сегодня смогу это сделать. :to_clue:
Еще предлагаю немного локализировать сис сообщение, меняем кодировку на 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()) =)
Возможно некоторые решат подстроить патч под себя, а менять всякий раз в исходниках и компилить не каждый захочет... Конечно возможно, что я ошибаюсь...
Не корректно написал, правильно:
"Еще предлагаю немного локализировать сис сообщение, преобразуем кодировку у 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, я решил время держать не в константе. Переменную определять в начале функции а уже изменять ей значение только при обнулённых счётчиках.
Кода я поудалял много, добавил таймер. Собрал...Вы не поверите, работает! :)
Я зашёл в 2 окна и начал сливать хонор (бонально - коммандой die), после 10 смертей, мне, как и было запланированно, написалось в чат сообщение мол я такой-сякой сливер паршивый, выкинуло и меня и мою жертву. Когда я зашёл - хонор обнулился и я был мёртв. Идеально! :) После чего попробывал убивать жертву с большим промежутком времени (более 1 минуты за одно убийство) - всё опять гладко, меня не выкинуло при 15 убийств.
Завтра весь день буду занят, вечером соберу код в один патч-файл и выложу.
Это очень радует, жду не дождусь кода :friends:
После чего попробывал убивать жертву с большим промежутком времени (более 1 минуты за одно убийство) - всё опять гладко, меня не выкинуло при 15 убийств.
Что-то мне подсказывает, что делать временные промежутки смогут и фармеры... Всего минуту. Или я чего-то не понял?
И что будет, если убить 9 раз подряд жертву, потом сделать паузу больше минуты (глотнуть чая/сходить в туалет/etc) и снова вернуться к своему "бравому" делу?
Что-то мне подсказывает, что делать временные промежутки смогут и фармеры... Всего минуту. Или я чего-то не понял?
И что будет, если убить 9 раз подряд жертву, потом сделать паузу больше минуты (глотнуть чая/сходить в туалет/etc) и снова вернуться к своему "бравому" делу?
Предыдущие убийства сохраняются не минуту, а 10 минут.
Обойти можно будет если убить 9 раз подряд жертву (в принципе, минуты за 3 спокойно) и после этого 7+ минут отдыхать.
Система не реагирует если убивать подряд одну и ту же цель с промежутком чуть более 1 минуты (А такой расклад очень не продуктивен, т.к. 1 килл/мин это очень долго и практически не отличается от БГ. Следовательно смысла сливерам не будет подвергать себя опасности наказания (как минимум - обнуления хонора)).
Так же есть задумка создать таблицу в БД и каждый раз при обнаружении потенциального сливера заносить туда его аккаунт. При дальнейшей активности слива (скажем, от 3 раз) с этого аккаунта - давать бан.
Всё доделал, проверил, почистил.
Подогнан под последнюю ревизию чистого мангоса (rev. 9851).
Я наконец научился создавать patch-файлы для гита! =)))
Очень прошу почистить тему.
Здравствуйте, спасибо за патч, но когда и как вызов функции?
Спасибо и простите за мой язык, но я французский, я использую Google клевета.
Прошу прощения :)
Файл изменил.
Так и знал, что что-нибудь, да забуду! :)
Всё доделал, проверил, почистил.
Подогнан под последнюю ревизию чистого мангоса (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;
Если после 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 ревы точно.
До 2.4.0 на оффе была система под названием Honor Diminishing, принцип работы такой же как и у других диминишингов. А в 2.4.0 ее дропнули, близы заявили в блу посте, мол, мы научились отслеживать сливщиков и эта система более не нужна => дропнули в мангосе. А для некоторых случаев а-ля диминишинг были созданы ауры
Система эта чистый сервер-сайд, так что при желании можно восстановить
vBulletin® v3.8.4, Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot