|
Новичкам Информация для всех новичков, новичкам рекомендуется задавать свои вопросы здесь |
|
Опции темы | Поиск в этой теме | Опции просмотра |
02.05.2010, 16:45 | #1 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
Вывод системного сообщения в игре
Пытаюсь прикрутить вывод читеров в виде системки к патчу "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 |
02.05.2010, 17:16 | #2 |
Модератор
|
Код:
void World::SendWorldText(int32 string_id, ...) Код:
sWorld.SendWorldText(свой string_id, GetPlayer()->GetName(), Reason); |
02.05.2010, 18:06 | #3 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
Вот так вышло
Код:
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'); Как можно сделать чтобы выводилось лишь 1 раз? Какой-нибудь там таймер не дающий выводить чаще чем раз в промежуток времени... Последний раз редактировалось Insider42; 02.05.2010 в 18:08. |
03.05.2010, 07:44 | #4 |
Пользователь
Регистрация: 11.03.2010
Адрес: Спб
Сообщений: 35
Сказал(а) спасибо: 5
Поблагодарили 10 раз(а) в 8 сообщениях
|
в Anti__ReportCheat обнуляйте счетчик предупреждний GetPlayer()->m_anti_alarmcount = 0
или же условие измените, но правильным мне кажется обнулять алармкаунт Код:
+ if (sWorld.GetMvAnticheatAnnounce() && GetPlayer()->m_anti_alarmcount == (sWorld.GetMvAnticheatAlarmCount()+1) ) |
04.05.2010, 14:26 | #5 | |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
Цитата:
|
|
08.05.2010, 14:42 | #6 |
Пользователь
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
|
небольшые "хотелки" для античита и для будущей реализации анонсера:
1. Конфиг на каждый вид чита(возможность включать/отключать логирование/наказание отдельно). нечто вида: waterwalk.log = 0 waterwalk.Enable = 1 waterwalk.ann = 0 telehack.log = 1 telehack.enable = 0 telehack.ann =1 .... 2. Установить ограничение на карты(сделать выбор карт на которых античит не будет срабатывать, как для vmaps) |
09.05.2010, 10:38 | #7 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
"какой вид чита он будет логировать/обрабатывать" уже сделано тут http://getmangos.com/community/showt...l=1#post113593
Также на getmangos.com подали очень хорошую идею - выводить сообщения всем ГМ онлайн вместо системки. Как это можно реализовать? |
09.05.2010, 10:45 | #8 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
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, ...); Код:
/// 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); } |
24.06.2010, 11:19 | #9 |
Гость
Сообщений: n/a
|
Подскажите,а где можно найти таблицу цветов,ато в html только 6 знаков,а тут 8.
Заранее спс. |
24.06.2010, 11:49 | #10 |
Пользователь
Регистрация: 09.03.2010
Сообщений: 66
Сказал(а) спасибо: 120
Поблагодарили 9 раз(а) в 7 сообщениях
|
|
24.06.2010, 23:07 | #11 | |
Forum bot
Регистрация: 01.02.2010
Адрес: пусто
Сообщений: 841
Сказал(а) спасибо: 286
Поблагодарили 418 раз(а) в 190 сообщениях
Записей в дневнике: 60
|
Цитата:
Первые две буквы-цифры - альфа-канал, кажется?
__________________
Совершенно безопасен для людей, обладающих хотя бы некоторыми минимальными зачатками интеллекта, и способными строить причинно-следственные цепочки. |
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[fix 0.12] вывод в таблицу character_stats | Chipleo | Принятые патчи | 1 | 21.04.2010 12:13 |
Сообщения при касте спелла 2764 | virusav | Баг-репорты | 0 | 07.03.2010 21:46 |