· 8 years ago · Feb 15, 2018, 02:00 PM
1From 450b9acb563f80b054419b61f230567de6e19894 Mon Sep 17 00:00:00 2001
2From: LordPsyan <realmsofwarcraft@gmail.com>
3Date: Sun, 28 Jan 2018 21:40:01 -0500
4Subject: [PATCH] 2018_01_27-Fake_Players
5
6---
7 .../Fake_Players/characters.fake_players.sql | 36 +++++++++++++++++++++
8 src/server/game/Entities/Player/Player.cpp | 4 +++
9 src/server/game/Handlers/ChatHandler.cpp | 9 ++++++
10 src/server/game/Handlers/MiscHandler.cpp | 37 +++++++++++++++++++++-
11 src/server/game/Miscellaneous/Language.h | 2 +-
12 src/server/game/World/World.cpp | 1 +
13 src/server/game/World/World.h | 1 +
14 src/server/worldserver/worldserver.conf.dist | 8 +++++
15 8 files changed, 96 insertions(+), 2 deletions(-)
16 create mode 100644 sql/LordPsyan-Patches/Fake_Players/characters.fake_players.sql
17
18diff --git a/sql/LordPsyan-Patches/Fake_Players/characters.fake_players.sql b/sql/LordPsyan-Patches/Fake_Players/characters.fake_players.sql
19new file mode 100644
20index 0000000..b404528
21--- /dev/null
22+++ b/sql/LordPsyan-Patches/Fake_Players/characters.fake_players.sql
23@@ -0,0 +1,36 @@
24+/*
25+SQLyog Enterprise - MySQL GUI v8.18
26+MySQL - 5.1.66-0+squeeze1 : Database - lithathrad_characters
27+*********************************************************************
28+*/
29+
30+/*!40101 SET NAMES utf8 */;
31+
32+/*!40101 SET SQL_MODE=''*/;
33+
34+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
35+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
36+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
37+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
38+/*Table structure for table `characters_fake` */
39+
40+DROP TABLE IF EXISTS `characters_fake`;
41+
42+CREATE TABLE `characters_fake` (
43+ `name` varchar(36) NOT NULL,
44+ `race` mediumint(3) NOT NULL DEFAULT '0',
45+ `class` mediumint(3) NOT NULL DEFAULT '0',
46+ `level` mediumint(3) NOT NULL DEFAULT '0',
47+ `zone` mediumint(9) NOT NULL DEFAULT '0',
48+ `gender` mediumint(3) NOT NULL DEFAULT '0',
49+ `online` mediumint(3) NOT NULL DEFAULT '0'
50+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
51+
52+/*Data for the table `characters_fake` */
53+
54+insert into `characters_fake`(`name`,`race`,`class`,`level`,`zone`,`gender`,`online`) values ('Drikish',10,8,80,22,0,2),('Sovelis',1,1,75,11,0,2),('Cuddles',10,2,99,37,0,2),('Epiasdv',8,4,80,1,0,2),('Mac',5,4,80,44,0,2),('Tiesto',8,6,80,15,0,2),('Ihavfacebook',11,7,80,44,1,2),('Mimik',10,4,80,24,0,2),('Deadmau',5,4,99,36,0,2),('Smoosh',8,1,80,29,0,2),('Shadowcrest',4,4,80,24,1,2),('Lolol',4,5,75,30,1,2),('Prox',11,1,80,28,1,2),('Rovip',10,4,80,13,0,2),('Ryan',10,8,80,17,0,2),('Holysmite',1,2,80,24,0,2),('Airagon',10,2,80,36,0,2),('Fracture',5,1,80,4,0,2),('Supershen',10,2,80,14,1,2),('Jana',2,4,75,41,0,2),('Gamm',2,1,75,35,0,2),('Emoarchie',10,8,80,2,0,2),('Melia',10,2,75,4,1,2),('Balu',6,11,75,10,0,2),('Jabari',2,1,75,5,0,2),('Sinan',10,2,75,6,0,2),('Shisha',10,4,75,9,1,2),('Killbill',1,4,75,8,0,2),('Gaby',4,11,75,12,1,2),('Fallen',4,4,75,37,0,2),('Druidita',6,11,75,47,0,2),('Pigolo',6,11,75,22,0,2),('Saga',10,2,75,22,0,2),('Deadmask',10,2,75,41,0,2),('Assasincz',4,4,75,41,0,2),('Petracz',1,4,75,28,1,2),('Aleks',10,2,75,20,0,2),('Cazadormen',4,4,75,14,1,2),('Kireth',1,2,75,9,1,2),('Liesma',1,1,75,5,1,2),('Tyller',1,1,75,46,0,2),('Astrabutaz',1,2,75,13,0,2),('Carlita',7,8,75,26,1,2),('beanie',10,2,80,40,0,2),('Nergal',10,3,75,22,0,2),('Smikis',10,5,75,39,0,2),('Peperoma',11,2,75,30,0,2),('May',1,2,75,32,1,2),('Keyadis',8,7,75,47,0,2),('Preatorian',10,2,75,29,0,2),('Mitza',1,9,75,1,0,2),('Keedor',10,2,75,21,0,2),('Kekw',4,3,75,1,1,2),('Wark',1,2,75,42,0,2),('Barrabus',10,2,75,6,0,2),('Malodetehepy',4,11,75,1,0,2),('Dranati',10,2,75,40,0,2),('Sorin',2,1,75,36,0,2),('Resan',4,4,75,18,0,2),('Silverhilt',1,1,75,31,1,2),('Chirica',10,2,75,2,0,2),('Trias',10,8,75,16,0,2),('Prdo',5,1,75,22,0,2),('Guten',8,7,75,36,0,2),('Sonsia',4,3,75,48,1,2),('Smikiss',10,4,75,37,0,2),('Ledy',4,1,75,34,1,2),('Rymar',5,4,75,9,0,2),('Rokass',5,1,75,38,0,2),('Waisha',10,3,75,11,1,2),('Xenon',4,1,75,16,0,2),('Palanoski',1,2,75,6,0,2),('Helona',6,11,75,47,1,2),('Skalons',2,1,75,14,0,2),('Zazlock',5,9,75,31,0,2),('Zazk',6,7,75,20,0,2),('Ezekiel',10,9,75,12,0,2),('Deiv',10,8,75,1,0,2),('Crashwar',5,1,75,16,0,2),('Bandaid',5,5,75,28,0,2),('Hunterherbie',4,3,75,3,0,2),('Cheesebeard',3,1,90,4,0,2),('Phin',7,8,75,3,0,2),('Prig',10,5,75,48,0,2),('Eraevel',10,5,75,28,1,2),('Bourne',5,4,75,47,0,2),('Twoogi',5,8,75,48,0,2),('Devon',5,4,76,6,0,2),('Ledystar',1,2,75,29,1,2),('Frostie',10,8,75,25,1,2),('Kie',5,4,99,38,0,2),('Reios',1,2,75,16,0,2),('Zero',4,4,75,30,0,2),('Wuk',2,1,75,1,0,2),('Sylvaediir',4,3,75,21,0,2),('Kansetsu',11,2,75,10,0,2),('Makura',11,2,75,44,1,2),('Demonia',11,2,75,17,1,2),('Stonebull',6,11,75,50,0,2),('Marianus',10,2,75,50,0,2);
55+
56+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
57+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
58+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
59+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
60diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
61index 88e4432..2736fd4 100644
62--- a/src/server/game/Entities/Player/Player.cpp
63+++ b/src/server/game/Entities/Player/Player.cpp
64@@ -1299,6 +1299,10 @@ void Player::Update(uint32 p_time)
65 // m_nextSave reset in SaveToDB call
66 SaveToDB();
67 TC_LOG_DEBUG("entities.player", "Player::Update: Player '%s' (%s) saved", GetName().c_str(), GetGUID().ToString().c_str());
68+ // If Fake WHO List system on then change player position with every SavePlayer Interval (usually 15min)
69+ if (sWorld->getBoolConfig(CONFIG_FAKE_WHO_LIST))
70+ CharacterDatabase.PExecute("UPDATE characters_fake SET zone = (FLOOR(50 * RAND()) + 1) WHERE online>1");
71+ CharacterDatabase.PExecute("UPDATE characters_fake SET level=level+1 WHERE online>1 AND level<5");
72 }
73 else
74 m_nextSave -= p_time;
75diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp
76index e0207f6..6b6e596 100644
77--- a/src/server/game/Handlers/ChatHandler.cpp
78+++ b/src/server/game/Handlers/ChatHandler.cpp
79@@ -324,8 +324,17 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
80 Player* receiver = ObjectAccessor::FindConnectedPlayerByName(to);
81 if (!receiver || (lang != LANG_ADDON && !receiver->isAcceptWhispers() && receiver->GetSession()->HasPermission(rbac::RBAC_PERM_CAN_FILTER_WHISPERS) && !receiver->IsInWhisperWhiteList(sender->GetGUID())))
82 {
83+ // If Fake WHO List system on then show player DND
84+ if (sWorld->getBoolConfig(CONFIG_FAKE_WHO_LIST))
85+ {
86+ sWorld->SendWorldText(LANG_NOT_WHISPER);
87+ return;
88+ }
89+ else
90+ {
91 SendPlayerNotFoundNotice(to);
92 return;
93+ }
94 }
95 if (!sender->IsGameMaster() && sender->getLevel() < sWorld->getIntConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ) && !receiver->IsInWhisperWhiteList(sender->GetGUID()))
96 {
97diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
98index 763dc7e..c8beaa8 100644
99--- a/src/server/game/Handlers/MiscHandler.cpp
100+++ b/src/server/game/Handlers/MiscHandler.cpp
101@@ -54,6 +54,7 @@
102 #include <cstdarg>
103 #include <zlib.h>
104
105+
106 void WorldSession::HandleRepopRequestOpcode(WorldPacket& recvData)
107 {
108 TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_REPOP_REQUEST Message");
109@@ -345,7 +346,39 @@ void WorldSession::HandleWhoOpcode(WorldPacket& recvData)
110 ++displayCount;
111 }
112
113- data.put(0, displayCount); // insert right count, count displayed
114+ if (sWorld->getBoolConfig(CONFIG_FAKE_WHO_LIST) && displayCount < 49)
115+ {
116+ // Fake players on WHO LIST 0, 1, 2, 3, 4, 5
117+ QueryResult result = CharacterDatabase.Query("SELECT name,race,class,level,zone,gender FROM characters_fake WHERE online>1 AND level > 3");
118+ if (result)
119+ {
120+ do
121+ {
122+ Field *fields = result->Fetch();
123+
124+ std::string pname = fields[0].GetString(); // player name
125+ std::string gname; // guild name
126+ uint32 lvl = fields[3].GetUInt32(); // player level
127+ uint32 class_ = fields[2].GetUInt32(); // player class
128+ uint32 race = fields[1].GetUInt32(); // player race
129+ uint32 pzoneid = fields[4].GetUInt32(); // player zone id
130+ uint8 gender = fields[5].GetUInt8(); // player gender
131+
132+ data << pname; // player name
133+ data << gname; // guild name
134+ data << uint32(lvl); // player level
135+ data << uint32(class_); // player class
136+ data << uint32(race); // player race
137+ data << uint8(gender); // player gender
138+ data << uint32(pzoneid); // player zone id
139+
140+ if ((++matchCount) == 49)
141+ break;
142+ } while (result->NextRow());
143+ }
144+ }
145+
146+ data.put(0, matchCount); // insert right count, count displayed
147 data.put(4, matchCount); // insert right count, count of matches
148
149 SendPacket(&data);
150@@ -503,6 +536,7 @@ void WorldSession::HandleStandStateChangeOpcode(WorldPacket& recvData)
151 _player->SetStandState(animstate);
152 }
153
154+
155 void WorldSession::HandleBugOpcode(WorldPacket& recvData)
156 {
157 uint32 suggestion, contentlen, typelen;
158@@ -1024,6 +1058,7 @@ void WorldSession::HandleInspectHonorStatsOpcode(WorldPacket& recvData)
159
160 Player* player = ObjectAccessor::GetPlayer(*_player, guid);
161
162+
163 if (!player)
164 {
165 TC_LOG_DEBUG("network", "MSG_INSPECT_HONOR_STATS: No player found from %s", guid.ToString().c_str());
166diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
167index 2a488fa..c57e1ba 100644
168--- a/src/server/game/Miscellaneous/Language.h
169+++ b/src/server/game/Miscellaneous/Language.h
170@@ -1202,7 +1202,7 @@ enum TrinityStrings
171 // 24
172 // 25
173 // 26
174- // 27
175+ LANG_NOT_WHISPER = 12001,
176 // 28
177 // 29
178 // 30
179diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
180index 0174e11..1be15c3 100644
181--- a/src/server/game/World/World.cpp
182+++ b/src/server/game/World/World.cpp
183@@ -788,6 +788,7 @@ void World::LoadConfigSettings(bool reload)
184 m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD] = sConfigMgr->GetBoolDefault("AllowTwoSide.Interaction.Guild", false);
185 m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION] = sConfigMgr->GetBoolDefault("AllowTwoSide.Interaction.Auction", false);
186 m_bool_configs[CONFIG_ALLOW_TWO_SIDE_TRADE] = sConfigMgr->GetBoolDefault("AllowTwoSide.Trade", false);
187+ m_bool_configs[CONFIG_FAKE_WHO_LIST] = sConfigMgr->GetBoolDefault("Fake.WHO.List", true);
188 m_int_configs[CONFIG_STRICT_PLAYER_NAMES] = sConfigMgr->GetIntDefault ("StrictPlayerNames", 0);
189 m_int_configs[CONFIG_STRICT_CHARTER_NAMES] = sConfigMgr->GetIntDefault ("StrictCharterNames", 0);
190 m_int_configs[CONFIG_STRICT_PET_NAMES] = sConfigMgr->GetIntDefault ("StrictPetNames", 0);
191diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
192index c0cb58f..327c2e5 100644
193--- a/src/server/game/World/World.h
194+++ b/src/server/game/World/World.h
195@@ -100,6 +100,7 @@ enum WorldBoolConfigs
196 CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD,
197 CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION,
198 CONFIG_ALLOW_TWO_SIDE_TRADE,
199+ CONFIG_FAKE_WHO_LIST,
200 CONFIG_ALL_TAXI_PATHS,
201 CONFIG_INSTANT_TAXI,
202 CONFIG_INSTANCE_IGNORE_LEVEL,
203diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
204index 99a3f46..585146f 100644
205--- a/src/server/worldserver/worldserver.conf.dist
206+++ b/src/server/worldserver/worldserver.conf.dist
207@@ -1562,6 +1562,14 @@ AllowTwoSide.Interaction.Auction = 0
208
209 AllowTwoSide.Trade = 0
210
211+# Fake.WHO.List
212+# Add fake players to fill in WHO LIST (who is online list, "O" button) if there is less then
213+# 49 real players online.
214+# Default: 1 (disabled)
215+# 0 (enabled)
216+
217+Fake.WHO.List = 1
218+
219 #
220 # TalentsInspecting
221 # Description: Allow/disallow inspecting other characters' talents.
222--
2232.8.4