Ru-MaNGOS

Вернуться   Ru-MaNGOS > Документация > Новичкам

Важная информация

Новичкам Информация для всех новичков, новичкам рекомендуется задавать свои вопросы здесь

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.05.2010, 16:45   #1
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию Вывод системного сообщения в игре

Пытаюсь прикрутить вывод читеров в виде системки к патчу "Relaxed anticheat" отсюда http://getmangos.com/community/showthread.php?3625
но не выходит заставить его выводить ник и тип чита в сообщение.
Задумка такова: читер был замечен античитом несколько раз - появляется системка
"Cheater detected. Nickname: блаблабла. Cheat type: Fly Hack."
Так сказать для запугивания, сами знаете как многие игроки относятся к читерам это наказание порой хуже бана
но на деле же выходит такое
"Cheater detected. Nickname: %s. Cheat type: %s."
видать к стандартному анонсу просто так не привязать... в различных выводах сообщений в мир я ещё не очень освоился, нужна подсказка...
вот код
Код:
diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp
index 84a89a3..1ba1291 100644
--- a/src/game/MovementHandler.cpp
+++ b/src/game/MovementHandler.cpp
@@ -32,6 +32,7 @@
 #include "InstanceSaveMgr.h"
 #include "ObjectMgr.h"
 #include "World.h"
+#include "Language.h"
 
 //#define __ANTI_DEBUG__
 
@@ -208,6 +209,8 @@ bool WorldSession::Anti__CheatOccurred(uint32 CurTime,const char* Reason,float S
     if (GetPlayer()->m_anti_alarmcount > sWorld.GetMvAnticheatAlarmCount())
     {
         Anti__ReportCheat(Reason,Speed,Op,Val1,Val2/*,MvInfo*/);
+        if (sWorld.GetMvAnticheatAnnounce())
+            sWorld.SendWorldText(LANG_SYSTEMMESSAGE,"Cheater detected. Nickname: %s. Cheat type: %s.",GetPlayer()->GetName(),Reason);
         return true;
     }
     return false;
diff --git a/src/game/World.cpp b/src/game/World.cpp
index 3ca86c3..3722b2b 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -519,6 +519,7 @@ void World::LoadConfigSettings(bool reload)
     // movement anticheat
     m_MvAnticheatEnable                     = sConfig.GetBoolDefault("Anticheat.Movement.Enable",false);
     m_MvAnticheatKick                       = sConfig.GetBoolDefault("Anticheat.Movement.Kick",false);
+    m_MvAnticheatAnnounce                   = sConfig.GetBoolDefault("Anticheat.Movement.Announce",false);
     m_MvAnticheatAlarmCount                 = (uint32)sConfig.GetIntDefault("Anticheat.Movement.AlarmCount", 5);
     m_MvAnticheatAlarmPeriod                = (uint32)sConfig.GetIntDefault("Anticheat.Movement.AlarmTime", 5000);
     m_MvAntiCheatBan                        = (unsigned char)sConfig.GetIntDefault("Anticheat.Movement.BanType",0);
diff --git a/src/game/World.h b/src/game/World.h
index 332189d..a2a476d 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -577,6 +577,7 @@ class World
         //movement anticheat enable flag
         inline bool GetMvAnticheatEnable()             {return m_MvAnticheatEnable;}
         inline bool GetMvAnticheatKick()               {return m_MvAnticheatKick;}
+        inline bool GetMvAnticheatAnnounce()           {return m_MvAnticheatAnnounce;}
         inline uint32 GetMvAnticheatAlarmCount()       {return m_MvAnticheatAlarmCount;}
         inline uint32 GetMvAnticheatAlarmPeriod()      {return m_MvAnticheatAlarmPeriod;}
         inline unsigned char GetMvAnticheatBan()       {return m_MvAntiCheatBan;}
@@ -682,6 +683,7 @@ class World
         //movement anticheat enable flag
         bool m_MvAnticheatEnable;
         bool m_MvAnticheatKick;
+        bool m_MvAnticheatAnnounce;
         uint32 m_MvAnticheatAlarmCount;
         uint32 m_MvAnticheatAlarmPeriod;
         unsigned char m_MvAntiCheatBan;
diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in
index 8e46ce0..ec8e66c 100644
--- a/src/mangosd/mangosd.conf.dist.in
+++ b/src/mangosd/mangosd.conf.dist.in
@@ -1607,6 +1607,11 @@ CharDelete.KeepDays = 30
 #        Default: 0 - off
 #                 1 - on
 #
+#    Anticheat.Movement.Announce
+#        Enable Announce cheater
+#        Default: 0 - off
+#                 1 - on
+#
 #    Anticheat.Movement.BanType
 #        Enable Ban cheater
 #        Default: 0 - off
@@ -1637,6 +1642,7 @@ Anticheat.Movement.AlarmCount = 5
 Anticheat.Movement.AlarmTime = 5000
 Anticheat.Movement.Kill = 0
 Anticheat.Movement.Kick = 0
+Anticheat.Movement.Announce = 0
 Anticheat.Movement.BanType = 0
 Anticheat.Movement.BanTime = "1m"
 Anticheat.Movement.MaxXYT = 0.04
Insider42 вне форума   Ответить с цитированием
Старый 02.05.2010, 17:16   #2
MaS0n
Модератор
 
Регистрация: 09.03.2010
Адрес: dev/null
Сообщений: 126
Сказал(а) спасибо: 44
Поблагодарили 111 раз(а) в 47 сообщениях
MaS0n Скоро придёт к известностиMaS0n Скоро придёт к известности
Отправить сообщение для MaS0n с помощью ICQ
По умолчанию

Код:
void World::SendWorldText(int32 string_id, ...)
Код:
sWorld.SendWorldText(свой string_id, GetPlayer()->GetName(), Reason);
LANG_SYSTEMMESSAGE - это string id из mangos_string и стандартный систем мессадж, нужно написать свою строку в mangos_string(там же задается и цвет сообщения), задать enum в Language.h и вписать в код
MaS0n вне форума   Ответить с цитированием
Старый 02.05.2010, 18:06   #3
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Вот так вышло
Код:
diff --git a/src/game/Language.h b/src/game/Language.h
index 63d22c7..b95e0d0 100644
--- a/src/game/Language.h
+++ b/src/game/Language.h
@@ -853,6 +853,7 @@ enum MangosStrings
     //                                    10000-10999
 
     // Use for custom patches             11000-11999
+    LANG_ANNOUNCE_CHEAT                 = 11000,
 
     // NOT RESERVED IDS                   12000-1999999999
     // `db_script_string` table index     2000000000-2000009999 (MIN_DB_SCRIPT_STRING_ID-MAX_DB_SCRIPT_STRING_ID)
diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp
index 84a89a3..94c20fc 100644
--- a/src/game/MovementHandler.cpp
+++ b/src/game/MovementHandler.cpp
@@ -32,6 +32,7 @@
 #include "InstanceSaveMgr.h"
 #include "ObjectMgr.h"
 #include "World.h"
+#include "Language.h"
 
 //#define __ANTI_DEBUG__
 
@@ -208,6 +209,8 @@ bool WorldSession::Anti__CheatOccurred(uint32 CurTime,const char* Reason,float S
     if (GetPlayer()->m_anti_alarmcount > sWorld.GetMvAnticheatAlarmCount())
     {
         Anti__ReportCheat(Reason,Speed,Op,Val1,Val2/*,MvInfo*/);
+        if (sWorld.GetMvAnticheatAnnounce())
+            sWorld.SendWorldText(LANG_ANNOUNCE_CHEAT, GetPlayer()->GetName(), Reason);
         return true;
     }
     return false;
diff --git a/src/game/World.cpp b/src/game/World.cpp
index 3ca86c3..3722b2b 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -519,6 +519,7 @@ void World::LoadConfigSettings(bool reload)
     // movement anticheat
     m_MvAnticheatEnable                     = sConfig.GetBoolDefault("Anticheat.Movement.Enable",false);
     m_MvAnticheatKick                       = sConfig.GetBoolDefault("Anticheat.Movement.Kick",false);
+    m_MvAnticheatAnnounce                   = sConfig.GetBoolDefault("Anticheat.Movement.Announce",false);
     m_MvAnticheatAlarmCount                 = (uint32)sConfig.GetIntDefault("Anticheat.Movement.AlarmCount", 5);
     m_MvAnticheatAlarmPeriod                = (uint32)sConfig.GetIntDefault("Anticheat.Movement.AlarmTime", 5000);
     m_MvAntiCheatBan                        = (unsigned char)sConfig.GetIntDefault("Anticheat.Movement.BanType",0);
diff --git a/src/game/World.h b/src/game/World.h
index 332189d..a2a476d 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -577,6 +577,7 @@ class World
         //movement anticheat enable flag
         inline bool GetMvAnticheatEnable()             {return m_MvAnticheatEnable;}
         inline bool GetMvAnticheatKick()               {return m_MvAnticheatKick;}
+        inline bool GetMvAnticheatAnnounce()           {return m_MvAnticheatAnnounce;}
         inline uint32 GetMvAnticheatAlarmCount()       {return m_MvAnticheatAlarmCount;}
         inline uint32 GetMvAnticheatAlarmPeriod()      {return m_MvAnticheatAlarmPeriod;}
         inline unsigned char GetMvAnticheatBan()       {return m_MvAntiCheatBan;}
@@ -682,6 +683,7 @@ class World
         //movement anticheat enable flag
         bool m_MvAnticheatEnable;
         bool m_MvAnticheatKick;
+        bool m_MvAnticheatAnnounce;
         uint32 m_MvAnticheatAlarmCount;
         uint32 m_MvAnticheatAlarmPeriod;
         unsigned char m_MvAntiCheatBan;
diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in
index 8e46ce0..ec8e66c 100644
--- a/src/mangosd/mangosd.conf.dist.in
+++ b/src/mangosd/mangosd.conf.dist.in
@@ -1607,6 +1607,11 @@ CharDelete.KeepDays = 30
 #        Default: 0 - off
 #                 1 - on
 #
+#    Anticheat.Movement.Announce
+#        Enable Announce cheater
+#        Default: 0 - off
+#                 1 - on
+#
 #    Anticheat.Movement.BanType
 #        Enable Ban cheater
 #        Default: 0 - off
@@ -1637,6 +1642,7 @@ Anticheat.Movement.AlarmCount = 5
 Anticheat.Movement.AlarmTime = 5000
 Anticheat.Movement.Kill = 0
 Anticheat.Movement.Kick = 0
+Anticheat.Movement.Announce = 0
 Anticheat.Movement.BanType = 0
 Anticheat.Movement.BanTime = "1m"
 Anticheat.Movement.MaxXYT = 0.04
Код:
DELETE FROM `mangos_string` WHERE `entry` = 11000;
INSERT INTO `mangos_string` VALUES (11000, '|cffff0000[Anticheat]: Cheater detected. Nickname: %s. Cheat type: %s.|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '|cffff0000[Античит]: Читер обнаружен. Имя: %s. Тип чита: %s.|r');
работает, но как-то странно, долго молчит молчит, а потом разом строчек 10 выдает о читере :/ но я думаю это проблема где-то в самом патче

Как можно сделать чтобы выводилось лишь 1 раз? Какой-нибудь там таймер не дающий выводить чаще чем раз в промежуток времени...

Последний раз редактировалось Insider42; 02.05.2010 в 18:08.
Insider42 вне форума   Ответить с цитированием
Старый 03.05.2010, 07:44   #4
wk23
Пользователь
 
Регистрация: 11.03.2010
Адрес: Спб
Сообщений: 35
Сказал(а) спасибо: 5
Поблагодарили 10 раз(а) в 8 сообщениях
wk23 На верном пути
По умолчанию

в Anti__ReportCheat обнуляйте счетчик предупреждний GetPlayer()->m_anti_alarmcount = 0

или же условие измените, но правильным мне кажется обнулять алармкаунт
Код:
+        if (sWorld.GetMvAnticheatAnnounce() && GetPlayer()->m_anti_alarmcount == (sWorld.GetMvAnticheatAlarmCount()+1) )
wk23 вне форума   Ответить с цитированием
Старый 04.05.2010, 14:26   #5
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от wk23 Посмотреть сообщение
в Anti__ReportCheat обнуляйте счетчик предупреждний GetPlayer()->m_anti_alarmcount = 0

или же условие измените, но правильным мне кажется обнулять алармкаунт
Код:
+        if (sWorld.GetMvAnticheatAnnounce() && GetPlayer()->m_anti_alarmcount == (sWorld.GetMvAnticheatAlarmCount()+1) )
я бы предпочел уже существующие счетчики не трогать и добавить новый свой, только как?
Insider42 вне форума   Ответить с цитированием
Старый 08.05.2010, 14:42   #6
selector
Пользователь
 
Аватар для selector
 
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
selector На верном пути
По умолчанию

небольшые "хотелки" для античита и для будущей реализации анонсера:

1. Конфиг на каждый вид чита(возможность включать/отключать логирование/наказание отдельно). нечто вида:
waterwalk.log = 0
waterwalk.Enable = 1
waterwalk.ann = 0
telehack.log = 1
telehack.enable = 0
telehack.ann =1
....

2. Установить ограничение на карты(сделать выбор карт на которых античит не будет срабатывать, как для vmaps)
selector вне форума   Ответить с цитированием
Старый 09.05.2010, 10:38   #7
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

"какой вид чита он будет логировать/обрабатывать" уже сделано тут http://getmangos.com/community/showt...l=1#post113593

Также на getmangos.com подали очень хорошую идею - выводить сообщения всем ГМ онлайн вместо системки. Как это можно реализовать?
Insider42 вне форума   Ответить с цитированием
Старый 09.05.2010, 10:45   #8
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

World.h
Код:
         void SendZoneMessage(uint32 zone, WorldPacket *packet, WorldSession *self = 0, uint32 team = 0);
         void SendZoneText(uint32 zone, const char *text, WorldSession *self = 0, uint32 team = 0);
         void SendServerMessage(ServerMessageType type, const char *text = "", Player* player = NULL);
+        void SendSecuredWorldText(AccountTypes minsec, int32 string_id, ...);
World.cpp
Код:
/// Send a System Message to all players with security >= minsec
void World::SendSecuredWorldText(AccountTypes minsec, int32 string_id, ...)
{
    va_list ap;
    va_start(ap, string_id);

    MaNGOS::WorldWorldTextBuilder wt_builder(string_id, &ap);
    MaNGOS::LocalizedPacketListDo<MaNGOS::WorldWorldTextBuilder> wt_do(wt_builder);
    for(SessionMap::iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
    {
        if(!itr->second || !itr->second->GetPlayer() || !itr->second->GetPlayer()->IsInWorld() || itr->second->GetSecurity() < minsec )
            continue;

        wt_do(itr->second->GetPlayer());
    }

    va_end(ap);
}
LordJZ вне форума   Ответить с цитированием
Старый 24.06.2010, 11:19   #9
KaraPUZ
Гость
 
Сообщений: n/a
По умолчанию

Подскажите,а где можно найти таблицу цветов,ато в html только 6 знаков,а тут 8.
Заранее спс.
  Ответить с цитированием
Старый 24.06.2010, 11:49   #10
Lightunit
Пользователь
 
Регистрация: 09.03.2010
Сообщений: 66
Сказал(а) спасибо: 120
Поблагодарили 9 раз(а) в 7 сообщениях
Lightunit На верном пути
По умолчанию

http://getmangos.com/wiki/Colors
Lightunit вне форума   Ответить с цитированием
Старый 24.06.2010, 23:07   #11
tempura
Forum bot
 
Аватар для tempura
 
Регистрация: 01.02.2010
Адрес: пусто
Сообщений: 841
Сказал(а) спасибо: 286
Поблагодарили 418 раз(а) в 190 сообщениях
Записей в дневнике: 60
tempura отключил(а) отображение уровня репутации
По умолчанию

Цитата:
Сообщение от KaraPUZ Посмотреть сообщение
Подскажите,а где можно найти таблицу цветов,ато в html только 6 знаков,а тут 8.
Заранее спс.
гыгыгы...

Первые две буквы-цифры - альфа-канал, кажется?
__________________
Совершенно безопасен для людей, обладающих хотя бы некоторыми минимальными зачатками интеллекта, и способными строить причинно-следственные цепочки.
tempura вне форума   Ответить с цитированием
Старый 26.06.2010, 13:25   #12
Inn04ka
Дево4ка снайпер
 
Аватар для Inn04ka
 
Регистрация: 08.02.2010
Сообщений: 103
Сказал(а) спасибо: 46
Поблагодарили 25 раз(а) в 13 сообщениях
Записей в дневнике: 1
Inn04ka Реально хороший человекInn04ka Реально хороший человекInn04ka Реально хороший человекInn04ka Реально хороший человекInn04ka Реально хороший человек
Отправить сообщение для Inn04ka с помощью Skype™
По умолчанию

Кажется, мне тоже, перекрещиваюсь и кажется снова...
__________________
Inn04ka вне форума   Ответить с цитированием
Ответ


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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[fix 0.12] вывод в таблицу character_stats Chipleo Принятые патчи 1 21.04.2010 12:13
Сообщения при касте спелла 2764 virusav Баг-репорты 0 07.03.2010 21:46


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


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot