· 9 years ago · Jan 09, 2017, 10:14 PM
1From a859754e4771de11b976f8046be0808d62ddf43b Mon Sep 17 00:00:00 2001
2From: LordPsyan <realmsofwarcraft@gmail.com>
3Date: Sat, 28 Nov 2015 09:41:01 -0600
4Subject: [PATCH] 2015_11_28-Fake_Players
5
6---
7 .../Fake_Players/characters.fake_players.sql | 40 +++++++++++
8 .../Fake_Players/world.fake_players.sql | 2 +
9 .../Database/Implementation/CharacterDatabase.cpp | 5 ++
10 .../Database/Implementation/CharacterDatabase.h | 5 ++
11 src/server/game/Entities/Player/Player.cpp | 7 ++
12 src/server/game/Guilds/Guild.cpp | 25 +++++++
13 src/server/game/Handlers/ChatHandler.cpp | 10 ++-
14 src/server/game/Handlers/GroupHandler.cpp | 12 +++-
15 src/server/game/Handlers/MiscHandler.cpp | 80 +++++++++++++++++++++-
16 src/server/game/Miscellaneous/Language.h | 2 +-
17 src/server/game/World/World.cpp | 4 ++
18 src/server/game/World/World.h | 4 +-
19 src/server/worldserver/worldserver.conf.dist | 10 +++
20 13 files changed, 201 insertions(+), 5 deletions(-)
21 create mode 100644 sql/TrinityCore-Patches/Fake_Players/characters.fake_players.sql
22 create mode 100644 sql/TrinityCore-Patches/Fake_Players/world.fake_players.sql
23
24diff --git a/sql/TrinityCore-Patches/Fake_Players/characters.fake_players.sql b/sql/TrinityCore-Patches/Fake_Players/characters.fake_players.sql
25new file mode 100644
26index 0000000..0b4bf14
27--- /dev/null
28+++ b/sql/TrinityCore-Patches/Fake_Players/characters.fake_players.sql
29@@ -0,0 +1,40 @@
30+CREATE TABLE IF NOT EXISTS `characters_fake` (
31+ `name` varchar(36) NOT NULL,
32+ `race` mediumint(3) NOT NULL DEFAULT '0',
33+ `class` mediumint(3) NOT NULL DEFAULT '0',
34+ `level` mediumint(3) NOT NULL DEFAULT '0',
35+ `zone` mediumint(9) NOT NULL DEFAULT '0',
36+ `gender` mediumint(3) NOT NULL DEFAULT '0',
37+ `online` datetime NOT NULL,
38+ `lastup` datetime NOT NULL,
39+ UNIQUE KEY `name` (`name`),
40+ KEY `level` (`level`),
41+ KEY `online` (`online`),
42+ KEY `lastup` (`lastup`)
43+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
44+
45+INSERT INTO `characters_fake` (`name`, `race`, `class`, `level`, `zone`, `gender`, `online`, `lastup`) VALUES
46+('Drikish', 2, 8, 3, 22, 0, '2014-08-08 19:16:00', '2014-08-08 16:22:37'),
47+('Sovelis', 3, 4, 5, 20, 0, '2014-08-08 21:27:44', '2014-08-08 16:22:37'),
48+('Cuddles', 10, 2, 5, 31, 1, '2014-08-08 14:14:01', '2014-08-08 16:22:37'),
49+('Epiasdv', 10, 2, 5, 45, 0, '2014-08-08 21:15:47', '2014-08-08 16:22:37'),
50+('Mac', 1, 1, 4, 32, 1, '2014-08-08 11:51:35', '2014-08-08 18:19:40'),
51+('Tiesto', 5, 1, 3, 23, 0, '2014-08-08 14:29:51', '2014-08-08 16:22:37'),
52+('Ihavfacebook', 10, 2, 3, 18, 0, '2014-08-08 04:24:43', '2014-08-08 23:49:06'),
53+('Mimik', 1, 2, 3, 22, 1, '2014-08-08 12:45:17', '2014-08-08 15:56:40'),
54+('Deadmau', 1, 1, 6, 6, 1, '2014-08-08 05:43:07', '2014-08-08 16:22:37'),
55+('Smoosh', 3, 2, 3, 15, 1, '2014-08-08 21:15:13', '2014-08-08 16:22:37'),
56+('Shadowcrest', 4, 3, 5, 3, 1, '2014-08-08 13:09:17', '2014-08-08 15:07:46'),
57+('Prox', 5, 1, 3, 22, 0, '2014-08-08 06:12:15', '2014-08-08 16:22:37'),
58+('Rovip', 4, 11, 3, 1, 0, '2014-08-08 21:23:45', '2014-08-08 15:02:50'),
59+('Ryan', 1, 2, 6, 40, 0, '2014-08-08 04:50:43', '2014-08-08 16:22:37'),
60+('Holysmite', 4, 1, 4, 43, 0, '2014-08-08 17:54:05', '2014-08-08 19:59:12'),
61+('Airagon', 6, 11, 1, 45, 0, '2014-08-08 11:46:37', '2014-08-08 20:18:07'),
62+('Fracture', 5, 9, 5, 45, 0, '2014-08-08 22:02:27', '2014-08-08 14:35:01'),
63+('Supershen', 3, 5, 2, 39, 0, '2014-08-08 10:15:35', '2014-08-08 17:53:00'),
64+('Jana', 2, 1, 2, 11, 0, '2014-08-08 03:03:05', '2014-08-08 14:10:08'),
65+('Gamm', 6, 11, 3, 38, 1, '2014-08-08 15:51:15', '2014-08-08 13:15:21'),
66+('Emoarchie', 8, 4, 5, 5, 0, '2014-08-08 13:17:54', '2014-08-08 18:13:53'),
67+('Melia', 5, 6, 57, 12, 0, '2014-08-08 09:21:15', '2014-08-08 16:22:37'),
68+('Balu', 4, 4, 5, 42, 1, '2014-08-08 08:06:03', '2014-08-08 14:25:07'),
69+('Jabari', 10, 2, 3, 25, 0, '2014-08-08 09:11:53', '2014-08-08 16:22:37');
70diff --git a/sql/TrinityCore-Patches/Fake_Players/world.fake_players.sql b/sql/TrinityCore-Patches/Fake_Players/world.fake_players.sql
71new file mode 100644
72index 0000000..c1be608
73--- /dev/null
74+++ b/sql/TrinityCore-Patches/Fake_Players/world.fake_players.sql
75@@ -0,0 +1,2 @@
76+DELETE FROM `trinity_string` WHERE `entry` = 12001;
77+INSERT INTO `trinity_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (12001, 'Message: "Do not disturb".', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'Сообщение: "Не беспокоить".');
78diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp
79index 9bd2398..dba815b 100644
80--- a/src/server/database/Database/Implementation/CharacterDatabase.cpp
81+++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp
82@@ -22,6 +22,11 @@ void CharacterDatabaseConnection::DoPrepareStatements()
83 if (!m_reconnecting)
84 m_stmts.resize(MAX_CHARACTERDATABASE_STATEMENTS);
85
86+ PrepareStatement(FAKE_CHAR_SEL_RACE_BY_NAME, "SELECT race FROM characters_fake WHERE name = ?", CONNECTION_SYNCH);
87+ PrepareStatement(FAKE_CHAR_SEL_RACE_BY_NAME_IS_ONLINE, "SELECT race FROM characters_fake WHERE HOUR(online) BETWEEN HOUR(NOW()) AND (HOUR(NOW()) + ?) AND name = ?", CONNECTION_SYNCH);
88+ PrepareStatement(FAKE_CHAR_ONLINE, "SELECT name,race,class,level,zone,gender FROM characters_fake WHERE HOUR(online) BETWEEN HOUR(NOW()) AND (HOUR(NOW()) + ?)", CONNECTION_SYNCH);
89+ PrepareStatement(FAKE_CHAR_ONLINE_SEARCH, "SELECT name,race,class,level,zone,gender FROM characters_fake WHERE HOUR(online) BETWEEN HOUR(NOW()) AND (HOUR(NOW()) + ?) AND name = ?", CONNECTION_SYNCH);
90+
91 PrepareStatement(CHAR_DEL_QUEST_POOL_SAVE, "DELETE FROM pool_quest_save WHERE pool_id = ?", CONNECTION_ASYNC);
92 PrepareStatement(CHAR_INS_QUEST_POOL_SAVE, "INSERT INTO pool_quest_save (pool_id, quest_id) VALUES (?, ?)", CONNECTION_ASYNC);
93 PrepareStatement(CHAR_DEL_NONEXISTENT_GUILD_BANK_ITEM, "DELETE FROM guild_bank_item WHERE guildid = ? AND TabId = ? AND SlotId = ?", CONNECTION_ASYNC);
94diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h
95index 2f6827b..437d0ec 100644
96--- a/src/server/database/Database/Implementation/CharacterDatabase.h
97+++ b/src/server/database/Database/Implementation/CharacterDatabase.h
98@@ -29,6 +29,11 @@ enum CharacterDatabaseStatements
99 name for a suiting suffix.
100 */
101
102+ FAKE_CHAR_SEL_RACE_BY_NAME,
103+ FAKE_CHAR_SEL_RACE_BY_NAME_IS_ONLINE,
104+ FAKE_CHAR_ONLINE,
105+ FAKE_CHAR_ONLINE_SEARCH,
106+
107 CHAR_DEL_QUEST_POOL_SAVE,
108 CHAR_INS_QUEST_POOL_SAVE,
109 CHAR_DEL_NONEXISTENT_GUILD_BANK_ITEM,
110diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
111index f146d82..cd86502 100644
112--- a/src/server/game/Entities/Player/Player.cpp
113+++ b/src/server/game/Entities/Player/Player.cpp
114@@ -1463,6 +1463,13 @@ void Player::Update(uint32 p_time)
115 // m_nextSave reset in SaveToDB call
116 SaveToDB();
117 TC_LOG_DEBUG("entities.player", "Player '%s' (GUID: %u) saved", GetName().c_str(), GetGUID().GetCounter());
118+
119+ // If Fake WHO List system on then change player position with every SavePlayer Interval (usually 15min)
120+ if (sWorld->getBoolConfig(CONFIG_FAKE_WHO_LIST))
121+ {
122+ CharacterDatabase.PExecute("UPDATE characters_fake SET zone = (FLOOR(50 * RAND()) + 1)");
123+ CharacterDatabase.PExecute("UPDATE characters_fake SET level = level+1, lastup = NOW() WHERE level < 80 AND lastup < (NOW() - INTERVAL %u HOUR) AND HOUR(online) BETWEEN HOUR(NOW()) AND (HOUR(NOW()) + %u)", sWorld->getIntConfig(CONFIG_FAKE_WHO_LEVELUP_INTERVAL), sWorld->getIntConfig(CONFIG_FAKE_WHO_ONLINE_INTERVAL));
124+ }
125 }
126 else
127 m_nextSave -= p_time;
128diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
129index d2fcad5..61dd663 100644
130--- a/src/server/game/Guilds/Guild.cpp
131+++ b/src/server/game/Guilds/Guild.cpp
132@@ -1516,6 +1516,31 @@ void Guild::HandleInviteMember(WorldSession* session, std::string const& name)
133 Player* pInvitee = ObjectAccessor::FindPlayerByName(name);
134 if (!pInvitee)
135 {
136+ if (sWorld->getBoolConfig(CONFIG_FAKE_WHO_LIST))
137+ {
138+ PreparedStatement* fake = CharacterDatabase.GetPreparedStatement(FAKE_CHAR_SEL_RACE_BY_NAME_IS_ONLINE);
139+ fake->setUInt32(0, sWorld->getIntConfig(CONFIG_FAKE_WHO_ONLINE_INTERVAL));
140+ fake->setString(1, name);
141+ PreparedQueryResult fakeresult = CharacterDatabase.Query(fake);
142+
143+ if (fakeresult)
144+ {
145+ Field* fields = fakeresult->Fetch();
146+ uint32 team = Player::TeamForRace(fields[0].GetUInt8());
147+
148+ if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && team != session->GetPlayer()->GetTeam())
149+ {
150+ SendCommandResult(session, GUILD_COMMAND_INVITE, ERR_GUILD_NOT_ALLIED, name);
151+ }
152+ else
153+ {
154+ ChatHandler(session->GetPlayer()->GetSession()).PSendSysMessage(LANG_FAKE_NOT_DISTURB);
155+ }
156+
157+ return;
158+ }
159+ }
160+
161 SendCommandResult(session, GUILD_COMMAND_INVITE, ERR_GUILD_PLAYER_NOT_FOUND_S, name);
162 return;
163 }
164diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp
165index e9c3cea..3dc889b 100644
166--- a/src/server/game/Handlers/ChatHandler.cpp
167+++ b/src/server/game/Handlers/ChatHandler.cpp
168@@ -293,7 +293,15 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
169 Player* receiver = ObjectAccessor::FindConnectedPlayerByName(to);
170 if (!receiver || (lang != LANG_ADDON && !receiver->isAcceptWhispers() && receiver->GetSession()->HasPermission(rbac::RBAC_PERM_CAN_FILTER_WHISPERS) && !receiver->IsInWhisperWhiteList(sender->GetGUID())))
171 {
172- SendPlayerNotFoundNotice(to);
173+ // If Fake WHO List system on then show player DND
174+ if (sWorld->getBoolConfig(CONFIG_FAKE_WHO_LIST))
175+ {
176+ ChatHandler(sender->GetSession()).PSendSysMessage(LANG_FAKE_NOT_DISTURB);
177+ }
178+ else
179+ {
180+ SendPlayerNotFoundNotice(to);
181+ }
182 return;
183 }
184 if (!sender->IsGameMaster() && sender->getLevel() < sWorld->getIntConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ) && !receiver->IsInWhisperWhiteList(sender->GetGUID()))
185diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp
186index 30764fe..ef3b3f0 100644
187--- a/src/server/game/Handlers/GroupHandler.cpp
188+++ b/src/server/game/Handlers/GroupHandler.cpp
189@@ -32,6 +32,9 @@
190 #include "WorldPacket.h"
191 #include "WorldSession.h"
192
193+#include "Chat.h"
194+#include "Language.h"
195+
196 class Aura;
197
198 /* differeces from off:
199@@ -78,7 +81,14 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData)
200 // no player
201 if (!player)
202 {
203- SendPartyResult(PARTY_OP_INVITE, membername, ERR_BAD_PLAYER_NAME_S);
204+ if (sWorld->getBoolConfig(CONFIG_FAKE_WHO_LIST))
205+ {
206+ ChatHandler(_player->GetSession()).PSendSysMessage(LANG_FAKE_NOT_DISTURB);
207+ }
208+ else
209+ {
210+ SendPartyResult(PARTY_OP_INVITE, membername, ERR_BAD_PLAYER_NAME_S);
211+ }
212 return;
213 }
214
215diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
216index 6dcd324..2d7be38 100644
217--- a/src/server/game/Handlers/MiscHandler.cpp
218+++ b/src/server/game/Handlers/MiscHandler.cpp
219@@ -182,6 +182,9 @@ void WorldSession::HandleWhoOpcode(WorldPacket& recvData)
220 uint32 zoneids[10]; // 10 is client limit
221 std::string player_name, guild_name;
222
223+ bool searchBool = false;
224+ std::string searchName;
225+
226 recvData >> level_min; // maximal player level, default 0
227 recvData >> level_max; // minimal player level, default 100 (MAX_LEVEL)
228 recvData >> player_name; // player name, case sensitive...
229@@ -221,6 +224,9 @@ void WorldSession::HandleWhoOpcode(WorldPacket& recvData)
230
231 wstrToLower(str[i]);
232
233+ searchBool = true;
234+ searchName = temp.c_str();
235+
236 TC_LOG_DEBUG("network", "String %u: %s", i, temp.c_str());
237 }
238
239@@ -355,7 +361,45 @@ void WorldSession::HandleWhoOpcode(WorldPacket& recvData)
240 ++displaycount;
241 }
242
243- data.put(0, displaycount); // insert right count, count displayed
244+ if (sWorld->getBoolConfig(CONFIG_FAKE_WHO_LIST) && displaycount < 49)
245+ {
246+ //const char fake_players_db = (searchBool ? FAKE_CHAR_ONLINE_SEARCH : FAKE_CHAR_ONLINE);
247+ PreparedStatement* fake = CharacterDatabase.GetPreparedStatement(searchBool ? FAKE_CHAR_ONLINE_SEARCH : FAKE_CHAR_ONLINE);
248+
249+ fake->setUInt32(0, sWorld->getIntConfig(CONFIG_FAKE_WHO_ONLINE_INTERVAL));
250+ if (searchBool)
251+ fake->setString(1, searchName);
252+
253+ PreparedQueryResult fakeresult = CharacterDatabase.Query(fake);
254+ if (fakeresult)
255+ {
256+ do
257+ {
258+ Field *fields = fakeresult->Fetch();
259+
260+ std::string pname = fields[0].GetString(); // player name
261+ std::string gname; // guild name
262+ uint32 lvl = fields[3].GetUInt32(); // player level
263+ uint32 class_ = fields[2].GetUInt32(); // player class
264+ uint32 race = fields[1].GetUInt32(); // player race
265+ uint32 pzoneid = fields[4].GetUInt32(); // player zone id
266+ uint8 gender = fields[5].GetUInt8(); // player gender
267+
268+ data << pname; // player name
269+ data << gname; // guild name
270+ data << uint32(lvl); // player level
271+ data << uint32(class_); // player class
272+ data << uint32(race); // player race
273+ data << uint8(gender); // player gender
274+ data << uint32(pzoneid); // player zone id
275+
276+ if ((++matchcount) == 49)
277+ break;
278+ } while (fakeresult->NextRow());
279+ }
280+ }
281+
282+ data.put(0, matchcount);
283 data.put(4, matchcount); // insert right count, count of matches
284
285 SendPacket(&data);
286@@ -540,6 +584,26 @@ void WorldSession::HandleAddFriendOpcode(WorldPacket& recvData)
287 TC_LOG_DEBUG("network", "WORLD: %s asked to add friend : '%s'",
288 GetPlayer()->GetName().c_str(), friendName.c_str());
289
290+ if (sWorld->getBoolConfig(CONFIG_FAKE_WHO_LIST))
291+ {
292+ PreparedStatement* fake = CharacterDatabase.GetPreparedStatement(FAKE_CHAR_SEL_RACE_BY_NAME);
293+ fake->setString(0, friendName);
294+ PreparedQueryResult fakeresult = CharacterDatabase.Query(fake);
295+
296+ if (fakeresult)
297+ {
298+ Field* fields = fakeresult->Fetch();
299+ uint32 team = Player::TeamForRace(fields[0].GetUInt8());
300+
301+ if (GetPlayer()->GetTeam() != team && !HasPermission(rbac::RBAC_PERM_TWO_SIDE_ADD_FRIEND))
302+ sSocialMgr->SendFriendStatus(_player, FRIEND_ENEMY, false, false);
303+ else
304+ ChatHandler(_player->GetSession()).PSendSysMessage(LANG_FAKE_NOT_DISTURB);
305+
306+ return;
307+ }
308+ }
309+
310 PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUID_RACE_ACC_BY_NAME);
311
312 stmt->setString(0, friendName);
313@@ -630,6 +694,20 @@ void WorldSession::HandleAddIgnoreOpcode(WorldPacket& recvData)
314 TC_LOG_DEBUG("network", "WORLD: %s asked to Ignore: '%s'",
315 GetPlayer()->GetName().c_str(), ignoreName.c_str());
316
317+ if (sWorld->getBoolConfig(CONFIG_FAKE_WHO_LIST))
318+ {
319+ PreparedStatement* fake = CharacterDatabase.GetPreparedStatement(FAKE_CHAR_SEL_RACE_BY_NAME_IS_ONLINE);
320+ fake->setUInt32(0, sWorld->getIntConfig(CONFIG_FAKE_WHO_ONLINE_INTERVAL));
321+ fake->setString(1, ignoreName.c_str());
322+ PreparedQueryResult fakeresult = CharacterDatabase.Query(fake);
323+
324+ if (fakeresult)
325+ {
326+ ChatHandler(_player->GetSession()).PSendSysMessage(LANG_FAKE_NOT_DISTURB);
327+ return;
328+ }
329+ }
330+
331 PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUID_BY_NAME);
332
333 stmt->setString(0, ignoreName);
334diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
335index 7106320..6c0e366 100644
336--- a/src/server/game/Miscellaneous/Language.h
337+++ b/src/server/game/Miscellaneous/Language.h
338@@ -1233,7 +1233,7 @@ enum TrinityStrings
339 // 24
340 // 25
341 // 26
342- // 27
343+ LANG_FAKE_NOT_DISTURB = 12001,
344 // 28
345 // 29
346 // 30
347diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
348index 76f841f..f05b95f 100644
349--- a/src/server/game/World/World.cpp
350+++ b/src/server/game/World/World.cpp
351@@ -685,6 +685,10 @@ void World::LoadConfigSettings(bool reload)
352 m_int_configs[CONFIG_STRICT_CHARTER_NAMES] = sConfigMgr->GetIntDefault ("StrictCharterNames", 0);
353 m_int_configs[CONFIG_STRICT_PET_NAMES] = sConfigMgr->GetIntDefault ("StrictPetNames", 0);
354
355+ m_bool_configs[CONFIG_FAKE_WHO_LIST] = sConfigMgr->GetBoolDefault("Fake.WHO.List", false);
356+ m_int_configs[CONFIG_FAKE_WHO_ONLINE_INTERVAL] = sConfigMgr->GetIntDefault("Fake.WHO.Online.Interval", 5);
357+ m_int_configs[CONFIG_FAKE_WHO_LEVELUP_INTERVAL] = sConfigMgr->GetIntDefault("Fake.WHO.LevelUp.Interval", 2);
358+
359 m_int_configs[CONFIG_MIN_PLAYER_NAME] = sConfigMgr->GetIntDefault ("MinPlayerName", 2);
360 if (m_int_configs[CONFIG_MIN_PLAYER_NAME] < 1 || m_int_configs[CONFIG_MIN_PLAYER_NAME] > MAX_PLAYER_NAME)
361 {
362diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
363index 600bd79..9c281b2 100644
364--- a/src/server/game/World/World.h
365+++ b/src/server/game/World/World.h
366@@ -175,7 +175,7 @@ enum WorldBoolConfigs
367 // 12
368 // 13
369 // 14
370- // 15
371+ CONFIG_FAKE_WHO_LIST,
372 // 16
373 // 17
374 // 18
375@@ -382,6 +382,8 @@ enum WorldIntConfigs
376 CONFIG_CHARDELETE_HEROIC_MIN_LEVEL,
377 CONFIG_AUTOBROADCAST_CENTER,
378 CONFIG_AUTOBROADCAST_INTERVAL,
379+ CONFIG_FAKE_WHO_ONLINE_INTERVAL,
380+ CONFIG_FAKE_WHO_LEVELUP_INTERVAL,
381 CONFIG_MAX_RESULTS_LOOKUP_COMMANDS,
382 CONFIG_DB_PING_INTERVAL,
383 CONFIG_PRESERVE_CUSTOM_CHANNEL_DURATION,
384diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
385index 43afe08..b832785 100644
386--- a/src/server/worldserver/worldserver.conf.dist
387+++ b/src/server/worldserver/worldserver.conf.dist
388@@ -3448,6 +3448,16 @@ PacketSpoof.BanDuration = 86400
389 #
390 ###################################################################################################
391
392+# Fake.WHO.List
393+# Add fake players to fill in WHO LIST (who is online list, "O" button) if there is less then
394+# 49 real players online
395+# Default: 0 (disabled)
396+# 1 (enabled)
397+
398+Fake.WHO.List = 0
399+Fake.WHO.Online.Interval = 5
400+Fake.WHO.LevelUp.Interval = 2
401+
402 #
403 # Prepatch by LordPsyan.
404 # See http://www.realmsofwarcraft.com/bb for forums and information.
405--
4062.1.4