Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Запросы (http://mangos.ytdb.ru/forumdisplay.php?f=7)
-   -   [Mod] Anti-Farming (разработка) (http://mangos.ytdb.ru/showthread.php?t=877)

Hantet 29.04.2010 16:14

[Mod] Anti-Farm
 
Вложений: 1
Мод для MaNGOS: AntiFarm.

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

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

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

Insider42 29.04.2010 17:36

Цитата:

Сообщение от Hantet (Сообщение 5313)
P.s. Время ожидание у спирит хилера у меня снято.

Тогда зачем изобретать велосипед?

zergtmn 29.04.2010 17:58

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

Insider42 29.04.2010 21:35

Цитата:

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

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

zergtmn 29.04.2010 22:21

Цитата:

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

Можно сделать, чтобы он считался дебафом

Hantet 30.04.2010 02:13

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

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

Null 30.04.2010 09:09

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

Insider42 30.04.2010 09:40

Цитата:

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

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

Null 30.04.2010 10:59

Цитата:

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

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

LordJZ 30.04.2010 12:12

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

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

KiriX 30.04.2010 12:28

Цитата:

Сообщение от LordJZ (Сообщение 5367)
А на ОЛО вообще за убийство цели в течении 3 минут после ее первого убийства не дается хонор.

Может используется какая-то аура/спелл для этого?

LordJZ 30.04.2010 13:00

Цитата:

Сообщение от KiriX (Сообщение 5369)
Может используется какая-то аура/спелл для этого?

Да, используется, но номер спелла не дам. Потом сбегаю на озеро и посмотрю...

Hantet 30.04.2010 13:30

Цитата:

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

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

LordJZ, отбери пожалуйста :).
Я вот порылся сейчас в исходниках 5711 (привет, SVN). Нашёл в Player.cpp какие-то зачатки этого мода (всего одну переменную). Продолжу только вечером.

selector 30.04.2010 21:21

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

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

Lawliet 30.04.2010 21:31

Вложений: 1
Цитата:

Сообщение от Hantet (Сообщение 5313)
Реализовать у меня почти получилось, проблема в том, что нужно реализовать таймер (на примере ScriptDev2 скриптов у меня не получилось).

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

PHP код:

+    uint32 Anti_TeleTimeDiff=plMover time(NULL) - plMover->Anti__GetLastTeleTime() : time(NULL);
+    static const 
uint32 Anti_TeleTimeIgnoreDiff=sWorld.GetMvAnticheatIgnoreAfterTeleport();
+    if (
plMover && (plMover->m_transport == 0) && sWorld.GetMvAnticheatEnable() &&
+        
GetPlayer()->GetSession()->GetSecurity() <= sWorld.GetMvAnticheatGmLevel() &&
+        
GetPlayer()->GetMotionMaster()->GetCurrentMovementGeneratorType()!=FLIGHT_MOTION_TYPE &&
+        
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

Цитата:

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

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

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

Lawliet 01.05.2010 00:39

Test-Patch
 
Player.cpp

PHP код:

        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

PHP код:

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

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

Hantet 01.05.2010 00:41

Цитата:

Сообщение от Lawliet (Сообщение 5405)
Player.cpp

PHP код:

        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

PHP код:

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

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

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

Lawliet 01.05.2010 00:43

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

PHP код:

-        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

Цитата:

Сообщение от Lawliet (Сообщение 5408)
Да не за что, хочу помочь чем умею :thank_you: мне ведь и самому не помешает эта система, в рабочем виде, отпишите пожалуйста о результате, буду ждать :lazy:

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

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

Lawliet 01.05.2010 01:13

Идея
 
Цитата:

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

PHP код:

-        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

Цитата:

Сообщение от Lawliet (Сообщение 5410)
Не корректно написал, правильно:
"Еще предлагаю немного локализировать сис сообщение, преобразуем кодировку у 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

Цитата:

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

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

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

Dragon 03.05.2010 22:58

Цитата:

Сообщение от Hantet (Сообщение 5419)
После чего попробывал убивать жертву с большим промежутком времени (более 1 минуты за одно убийство) - всё опять гладко, меня не выкинуло при 15 убийств.

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

Hantet 04.05.2010 00:13

Цитата:

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

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

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

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

Hantet 08.05.2010 23:24

Вложений: 1
Всё доделал, проверил, почистил.
Подогнан под последнюю ревизию чистого мангоса (rev. 9851).


09.05.2010 15:37

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

Hantet 09.05.2010 16:28

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

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

xex 10.05.2010 00:55

Цитата:

Сообщение от Hantet (Сообщение 5953)
Всё доделал, проверил, почистил.
Подогнан под последнюю ревизию чистого мангоса (rev. 9851).

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

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

-   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):
PHP код:

   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

Цитата:

Сообщение от Hantet (Сообщение 5377)
LordJZ, отбери пожалуйста :).
Я вот порылся сейчас в исходниках 5711 (привет, SVN). Нашёл в Player.cpp какие-то зачатки этого мода (всего одну переменную). Продолжу только вечером.

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

MaS0n 08.09.2010 08:57

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

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


Текущее время: 21:05. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS