· 9 years ago · Sep 29, 2016, 06:02 AM
1From 6f0f7ad72d993169976c70a649478c3a66d069a9 Mon Sep 17 00:00:00 2001
2From: Callmephil <phil19-94@hotmail.fr>
3Date: Tue, 15 Mar 2016 23:53:16 +0200
4Subject: [PATCH] Core/Fix :
5
6---
7 src/server/game/DungeonFinding/LFGMgr.cpp | 2 +-
8 src/server/game/Entities/Unit/Unit.cpp | 35 ++++++++++++++++++++---------------
9 src/server/game/World/World.cpp | 5 +----
10 3 files changed, 22 insertions(+), 20 deletions(-)
11
12diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
13index 0c05d11..6f3bb2f 100644
14--- a/src/server/game/DungeonFinding/LFGMgr.cpp
15+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
16@@ -2352,7 +2352,7 @@ void LFGMgr::SetLeader(uint64 gguid, uint64 leader)
17 void LFGMgr::SetTeam(uint64 guid, TeamId teamId)
18 {
19 if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP))
20- teamId; // @Not Sure About That TeamId is supposed to be uint8 Team = 0(@TrinityCore)
21+ teamId = TEAM_ALLIANCE; // @Not Sure About That TeamId is supposed to be uint8 Team = 0(@TrinityCore)
22
23 PlayersStore[guid].SetTeam(teamId);
24 }
25diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
26index 5d68d15..c20ddcd 100644
27--- a/src/server/game/Entities/Unit/Unit.cpp
28+++ b/src/server/game/Entities/Unit/Unit.cpp
29@@ -19194,31 +19194,36 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target)
30 // FG: pretend that OTHER players in own group are friendly ("blue")
31 else if (index == UNIT_FIELD_BYTES_2 || index == UNIT_FIELD_FACTIONTEMPLATE)
32 {
33- if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() && (this->GetTypeId() == TYPEID_PLAYER || this->GetTypeId() == TYPEID_UNIT || this->GetTypeId() == TYPEID_DYNAMICOBJECT)) // pussywizard
34+ if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
35 {
36- if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target)) // @Not Sure About that
37+ FactionTemplateEntry const* ft1 = GetFactionTemplateEntry();
38+ FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
39+ if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
40 {
41- FactionTemplateEntry const* ft1 = GetFactionTemplateEntry();
42- FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
43- if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
44- {
45- if (index == UNIT_FIELD_BYTES_2)
46- fieldBuffer << (m_uint32Values[index] & 0xFFFFF2FF); // clear UNIT_BYTE2_FLAG_PVP, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY
47- else
48- fieldBuffer << (uint32)target->getFaction();
49- }
50+ if (index == UNIT_FIELD_BYTES_2)
51+ // Allow targetting opposite faction in party when enabled in config
52+ fieldBuffer << (m_uint32Values[UNIT_FIELD_BYTES_2] & ((UNIT_BYTE2_FLAG_SANCTUARY /*| UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5*/) << 8)); // this flag is at uint8 offset 1 !!
53+ else
54+ // pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work)
55+ fieldBuffer << uint32(target->getFaction());
56 }
57 else
58 fieldBuffer << m_uint32Values[index];
59+ }// pussywizard / Callmephil
60+ else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
61+ (this->GetTypeId() == TYPEID_PLAYER || this->GetTypeId() == TYPEID_UNIT || this->GetTypeId() == TYPEID_DYNAMICOBJECT))
62+ {
63+ if (index == UNIT_FIELD_BYTES_2)
64+ fieldBuffer << (m_uint32Values[index] & 0xFFFFF2FF); // clear UNIT_BYTE2_FLAG_PVP, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY
65+ else
66+ fieldBuffer << (uint32)target->getFaction();
67 }
68- else
69- fieldBuffer << m_uint32Values[index];
70+ else
71+ fieldBuffer << m_uint32Values[index];
72 }
73 else
74- {
75 // send in current format (float as float, uint32 as uint32)
76 fieldBuffer << m_uint32Values[index];
77- }
78 }
79 }
80
81diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
82index a4c4bcb..6b57812 100644
83--- a/src/server/game/World/World.cpp
84+++ b/src/server/game/World/World.cpp
85@@ -692,10 +692,7 @@ void World::LoadConfigSettings(bool reload)
86 m_bool_configs[CONFIG_ALLOW_TWO_SIDE_WHO_LIST] = sConfigMgr->GetBoolDefault("AllowTwoSide.WhoList", false);
87 m_bool_configs[CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND] = sConfigMgr->GetBoolDefault("AllowTwoSide.AddFriend", false);
88 m_bool_configs[CONFIG_ALLOW_TWO_SIDE_TRADE] = sConfigMgr->GetBoolDefault("AllowTwoSide.trade", false);
89- m_int_configs[CONFIG_STRICT_PLAYER_NAMES] = sConfigMgr->GetIntDefault ("StrictPlayerNames", 0);
90- m_int_configs[CONFIG_STRICT_CHARTER_NAMES] = sConfigMgr->GetIntDefault ("StrictCharterNames", 0);
91- m_int_configs[CONFIG_STRICT_PET_NAMES] = sConfigMgr->GetIntDefault ("StrictPetNames", 0);
92-
93+
94 m_int_configs[CONFIG_MIN_PLAYER_NAME] = sConfigMgr->GetIntDefault ("MinPlayerName", 2);
95 if (m_int_configs[CONFIG_MIN_PLAYER_NAME] < 1 || m_int_configs[CONFIG_MIN_PLAYER_NAME] > MAX_PLAYER_NAME)
96 {
97--
98libgit2 0.22.2
99
100=========================================================================================================================
101
102 return;
103diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
104index 81227d6..872cd7d 100644
105--- a/src/server/game/Handlers/CharacterHandler.cpp
106+++ b/src/server/game/Handlers/CharacterHandler.cpp
107@@ -468,7 +468,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
108 }
109 }
110
111- bool allowTwoSideAccounts = !sWorld->IsPvPRealm() || true/*sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_ACCOUNTS)*/ || !AccountMgr::IsPlayerAccount(GetSecurity());
112+ bool allowTwoSideAccounts = !sWorld->IsPvPRealm() || sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_ACCOUNTS) || !AccountMgr::IsPlayerAccount(GetSecurity());
113 uint32 skipCinematics = sWorld->getIntConfig(CONFIG_SKIP_CINEMATICS);
114
115 _charCreateCallback.FreeResult();
116@@ -492,7 +492,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
117 bool haveSameRace = false;
118 uint32 heroicReqLevel = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_HEROIC_CHARACTER);
119 bool hasHeroicReqLevel = (heroicReqLevel == 0);
120- bool allowTwoSideAccounts = !sWorld->IsPvPRealm() || true/*sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_ACCOUNTS)*/ || !AccountMgr::IsPlayerAccount(GetSecurity());
121+ bool allowTwoSideAccounts = !sWorld->IsPvPRealm() || sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_ACCOUNTS) || !AccountMgr::IsPlayerAccount(GetSecurity());
122 uint32 skipCinematics = sWorld->getIntConfig(CONFIG_SKIP_CINEMATICS);
123
124 if (result)
125@@ -2327,18 +2327,24 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recvData)
126 }
127
128 // Reset guild
129- if (uint32 guildId = playerData->guildId)
130- if (Guild* guild = sGuildMgr->GetGuildById(guildId))
131- guild->DeleteMember(MAKE_NEW_GUID(lowGuid, 0, HIGHGUID_PLAYER), false, false, true);
132-
133- // Delete Friend List
134- stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_GUID);
135- stmt->setUInt32(0, lowGuid);
136- trans->Append(stmt);
137+ if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD))
138+ {
139+ if (uint32 guildId = playerData->guildId)
140+ if (Guild* guild = sGuildMgr->GetGuildById(guildId))
141+ guild->DeleteMember(MAKE_NEW_GUID(lowGuid, 0, HIGHGUID_PLAYER), false, false, true);
142+ }
143
144- stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_FRIEND);
145- stmt->setUInt32(0, lowGuid);
146- trans->Append(stmt);
147+ if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND))
148+ {
149+ // Delete Friend List
150+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_GUID);
151+ stmt->setUInt32(0, lowGuid);
152+ trans->Append(stmt);
153+
154+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_FRIEND);
155+ stmt->setUInt32(0, lowGuid);
156+ trans->Append(stmt);
157+ }
158
159 // Leave Arena Teams
160 Player::LeaveAllArenaTeams(guid);
161diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp
162index cee25fa..a9d6286 100644
163--- a/src/server/game/Handlers/ChatHandler.cpp
164+++ b/src/server/game/Handlers/ChatHandler.cpp
165@@ -165,25 +165,38 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recvData)
166 lang = LANG_UNIVERSAL;
167 else
168 {
169- switch (type)
170- {
171- case CHAT_MSG_PARTY:
172- case CHAT_MSG_PARTY_LEADER:
173- case CHAT_MSG_RAID:
174- case CHAT_MSG_RAID_LEADER:
175- case CHAT_MSG_RAID_WARNING:
176- specialMessageLimit = 35;
177- break;
178- case CHAT_MSG_GUILD:
179- case CHAT_MSG_OFFICER:
180- specialMessageLimit = 15;
181- break;
182- case CHAT_MSG_WHISPER:
183- if (sender->getLevel() >= 80)
184- specialMessageLimit = 15;
185- break;
186- }
187-
188+ // send in universal language in two side iteration allowed mode
189+ if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT))
190+ lang = LANG_UNIVERSAL;
191+ else
192+ {
193+ switch (type)
194+ {
195+ case CHAT_MSG_PARTY:
196+ case CHAT_MSG_PARTY_LEADER:
197+ case CHAT_MSG_RAID:
198+ case CHAT_MSG_RAID_LEADER:
199+ case CHAT_MSG_RAID_WARNING:
200+ // allow two side chat at group channel if two side group allowed
201+ if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP))
202+ lang = LANG_UNIVERSAL;
203+
204+ specialMessageLimit = 35;
205+ break;
206+ case CHAT_MSG_GUILD:
207+ case CHAT_MSG_OFFICER:
208+ // allow two side chat at guild channel if two side guild allowed
209+ if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD))
210+ lang = LANG_UNIVERSAL;
211+
212+ specialMessageLimit = 15;
213+ break;
214+ case CHAT_MSG_WHISPER:
215+ if (sender->getLevel() >= 80)
216+ specialMessageLimit = 15;
217+ break;
218+ }
219+ }
220 // but overwrite it by SPELL_AURA_MOD_LANGUAGE auras (only single case used)
221 Unit::AuraEffectList const& ModLangAuras = sender->GetAuraEffectsByType(SPELL_AURA_MOD_LANGUAGE);
222 if (!ModLangAuras.empty())
223@@ -335,7 +348,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recvData)
224 return;
225 }
226
227- if (senderIsPlayer && receiverIsPlayer)
228+ if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT) && senderIsPlayer && receiverIsPlayer)
229 if (GetPlayer()->GetTeamId() != receiver->GetTeamId())
230 {
231 SendWrongFactionNotice();
232diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp
233index 05ea230..b0863fc 100644
234--- a/src/server/game/Handlers/GroupHandler.cpp
235+++ b/src/server/game/Handlers/GroupHandler.cpp
236@@ -97,7 +97,7 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData)
237 }
238
239 // can't group with
240- if (!GetPlayer()->IsGameMaster() && GetPlayer()->GetTeamId() != player->GetTeamId())
241+ if (!GetPlayer()->IsGameMaster() && !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && GetPlayer()->GetTeamId() != player->GetTeamId())
242 {
243 SendPartyResult(PARTY_OP_INVITE, membername, ERR_PLAYER_WRONG_FACTION);
244 return;
245diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp
246index 63d3059..3e5e04e 100644
247--- a/src/server/game/Handlers/MailHandler.cpp
248+++ b/src/server/game/Handlers/MailHandler.cpp
249@@ -189,7 +189,7 @@ void WorldSession::HandleSendMail(WorldPacket & recvData)
250 ? receive->GetSession()->GetAccountId()
251 : sObjectMgr->GetPlayerAccountIdByGUID(rc);
252
253- if (/*!accountBound*/ GetAccountId() != rc_account && player->GetTeamId() != rc_teamId && AccountMgr::IsPlayerAccount(GetSecurity()))
254+ if (/*!accountBound*/ GetAccountId() != rc_account && !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_MAIL) && player->GetTeamId() != rc_teamId && AccountMgr::IsPlayerAccount(GetSecurity()))
255 {
256 player->SendMailResult(0, MAIL_SEND, MAIL_ERR_NOT_YOUR_TEAM);
257 return;
258diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
259index ba6c95b..cd0a585 100644
260--- a/src/server/game/Handlers/MiscHandler.cpp
261+++ b/src/server/game/Handlers/MiscHandler.cpp
262@@ -242,7 +242,7 @@ void WorldSession::HandleWhoOpcode(WorldPacket& recvData)
263
264 uint32 team = _player->GetTeamId();
265 uint32 security = GetSecurity();
266- //bool allowTwoSideWhoList = sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_WHO_LIST);
267+ bool allowTwoSideWhoList = sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_WHO_LIST);
268 uint32 gmLevelInWhoList = sWorld->getIntConfig(CONFIG_GM_LEVEL_IN_WHO_LIST);
269 uint32 displaycount = 0;
270
271@@ -257,7 +257,7 @@ void WorldSession::HandleWhoOpcode(WorldPacket& recvData)
272 if (AccountMgr::IsPlayerAccount(security))
273 {
274 // player can see member of other team only if CONFIG_ALLOW_TWO_SIDE_WHO_LIST
275- if (itr->second->GetTeamId() != team /* && !allowTwoSideWhoList*/)
276+ if (itr->second->GetTeamId() != team && !allowTwoSideWhoList)
277 continue;
278
279 // player can see MODERATOR, GAME MASTER, ADMINISTRATOR only if CONFIG_GM_IN_WHO_LIST
280@@ -544,7 +544,7 @@ void WorldSession::HandleAddFriendOpcode(WorldPacket & recv_data)
281 {
282 if (friendGuid == GetPlayer()->GetGUID())
283 friendResult = FRIEND_SELF;
284- else if (GetPlayer()->GetTeamId() != teamId && AccountMgr::IsPlayerAccount(GetSecurity()))
285+ else if (GetPlayer()->GetTeamId() != teamId && !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND) && AccountMgr::IsPlayerAccount(GetSecurity()))
286 friendResult = FRIEND_ENEMY;
287 else if (GetPlayer()->GetSocial()->HasFriend(guidLow))
288 friendResult = FRIEND_ALREADY;
289diff --git a/src/server/game/Handlers/PetitionsHandler.cpp b/src/server/game/Handlers/PetitionsHandler.cpp
290index f9a136a..0640d58 100644
291--- a/src/server/game/Handlers/PetitionsHandler.cpp
292+++ b/src/server/game/Handlers/PetitionsHandler.cpp
293@@ -435,7 +435,7 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket & recvData)
294 return;
295
296 // not let enemies sign guild charter
297- if (GetPlayer()->GetTeamId() != sObjectMgr->GetPlayerTeamIdByGUID(ownerGuid))
298+ if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && GetPlayer()->GetTeamId() != sObjectMgr->GetPlayerTeamIdByGUID(ownerGuid))
299 {
300 if (type != GUILD_CHARTER_TYPE)
301 SendArenaTeamCommandResult(ERR_ARENA_TEAM_INVITE_SS, "", "", ERR_ARENA_TEAM_NOT_ALLIED);
302diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp
303index 1aa78e1..f043ccf 100644
304--- a/src/server/game/Handlers/TradeHandler.cpp
305+++ b/src/server/game/Handlers/TradeHandler.cpp
306@@ -618,11 +618,11 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket)
307 return;
308 }
309
310- if (pOther->GetTeamId() !=_player->GetTeamId())
311- {
312- SendTradeStatus(TRADE_STATUS_WRONG_FACTION);
313- return;
314- }
315+ if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_TRADE) && pOther->GetTeamId() != _player->GetTeamId())
316+ {
317+ SendTradeStatus(TRADE_STATUS_WRONG_FACTION);
318+ return;
319+ }
320
321 if (!pOther->IsWithinDistInMap(_player, 10.0f, false))
322 {
323diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h
324index aad9e17..f2949ec 100644
325--- a/src/server/game/Instances/InstanceScript.h
326+++ b/src/server/game/Instances/InstanceScript.h
327@@ -192,6 +192,9 @@ class InstanceScript : public ZoneScript
328 // Cast spell on all players in instance
329 void DoCastSpellOnPlayers(uint32 spell);
330
331+ // Return wether server allow two side groups or not
332+ bool ServerAllowsTwoSideGroups() { return sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP); }
333+
334 virtual bool SetBossState(uint32 id, EncounterState state);
335 EncounterState GetBossState(uint32 id) const { return id < bosses.size() ? bosses[id].state : TO_BE_DECIDED; }
336 BossBoundaryMap const* GetBossBoundary(uint32 id) const { return id < bosses.size() ? &bosses[id].boundary : NULL; }
337diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
338index 6ad431c..a4c4bcb 100644
339--- a/src/server/game/World/World.cpp
340+++ b/src/server/game/World/World.cpp
341@@ -680,6 +680,21 @@ void World::LoadConfigSettings(bool reload)
342 m_int_configs[CONFIG_STRICT_CHARTER_NAMES] = sConfigMgr->GetIntDefault ("StrictCharterNames", 0);
343 m_int_configs[CONFIG_STRICT_CHANNEL_NAMES] = sConfigMgr->GetIntDefault ("StrictChannelNames", 0);
344 m_int_configs[CONFIG_STRICT_PET_NAMES] = sConfigMgr->GetIntDefault ("StrictPetNames", 0);
345+
346+ m_bool_configs[CONFIG_ALLOW_TWO_SIDE_ACCOUNTS] = sConfigMgr->GetBoolDefault("AllowTwoSide.Accounts", true);
347+ m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_CALENDAR]= sConfigMgr->GetBoolDefault("AllowTwoSide.Interaction.Calendar", false);
348+ m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT] = sConfigMgr->GetBoolDefault("AllowTwoSide.Interaction.Chat", false);
349+ m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL] = sConfigMgr->GetBoolDefault("AllowTwoSide.Interaction.Channel", false);
350+ m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP] = sConfigMgr->GetBoolDefault("AllowTwoSide.Interaction.Group", false);
351+ m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD] = sConfigMgr->GetBoolDefault("AllowTwoSide.Interaction.Guild", false);
352+ m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION] = sConfigMgr->GetBoolDefault("AllowTwoSide.Interaction.Auction", false);
353+ m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_MAIL] = sConfigMgr->GetBoolDefault("AllowTwoSide.Interaction.Mail", false);
354+ m_bool_configs[CONFIG_ALLOW_TWO_SIDE_WHO_LIST] = sConfigMgr->GetBoolDefault("AllowTwoSide.WhoList", false);
355+ m_bool_configs[CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND] = sConfigMgr->GetBoolDefault("AllowTwoSide.AddFriend", false);
356+ m_bool_configs[CONFIG_ALLOW_TWO_SIDE_TRADE] = sConfigMgr->GetBoolDefault("AllowTwoSide.trade", false);
357+ m_int_configs[CONFIG_STRICT_PLAYER_NAMES] = sConfigMgr->GetIntDefault ("StrictPlayerNames", 0);
358+ m_int_configs[CONFIG_STRICT_CHARTER_NAMES] = sConfigMgr->GetIntDefault ("StrictCharterNames", 0);
359+ m_int_configs[CONFIG_STRICT_PET_NAMES] = sConfigMgr->GetIntDefault ("StrictPetNames", 0);
360
361 m_int_configs[CONFIG_MIN_PLAYER_NAME] = sConfigMgr->GetIntDefault ("MinPlayerName", 2);
362 if (m_int_configs[CONFIG_MIN_PLAYER_NAME] < 1 || m_int_configs[CONFIG_MIN_PLAYER_NAME] > MAX_PLAYER_NAME)
363diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
364index bd6a611..d5a052f 100644
365--- a/src/server/game/World/World.h
366+++ b/src/server/game/World/World.h
367@@ -90,6 +90,17 @@ enum WorldBoolConfigs
368 CONFIG_ALLOW_PLAYER_COMMANDS,
369 CONFIG_CLEAN_CHARACTER_DB,
370 CONFIG_STATS_SAVE_ONLY_ON_LOGOUT,
371+ CONFIG_ALLOW_TWO_SIDE_ACCOUNTS,
372+ CONFIG_ALLOW_TWO_SIDE_INTERACTION_CALENDAR,
373+ CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT,
374+ CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL,
375+ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP,
376+ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD,
377+ CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION,
378+ CONFIG_ALLOW_TWO_SIDE_INTERACTION_MAIL,
379+ CONFIG_ALLOW_TWO_SIDE_WHO_LIST,
380+ CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND,
381+ CONFIG_ALLOW_TWO_SIDE_TRADE,
382 CONFIG_ALL_TAXI_PATHS,
383 CONFIG_INSTANT_TAXI,
384 CONFIG_INSTANCE_IGNORE_LEVEL,
385--
386libgit2 0.22.2
387
388=============================================================================================================================
389From ed6b7fdfba2f0fdb4f1ce884d9d5a9d0c82f33f5 Mon Sep 17 00:00:00 2001
390From: Callmephil <phil19-94@hotmail.fr>
391Date: Mon, 29 Feb 2016 00:01:40 -0800
392Subject: [PATCH] Core/Game/MiscHandler : Fixed Who List. @TrinityCore 2009.
393
394---
395 src/server/game/Handlers/MiscHandler.cpp | 306 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------------------------------------------------------------------------
396 1 file changed, 159 insertions(+), 147 deletions(-)
397
398diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
399index 922afa3..ba6c95b 100644
400--- a/src/server/game/Handlers/MiscHandler.cpp
401+++ b/src/server/game/Handlers/MiscHandler.cpp
402@@ -170,193 +170,205 @@ void WorldSession::HandleGossipSelectOptionOpcode(WorldPacket & recv_data)
403 }
404 }
405
406-void WorldSession::HandleWhoOpcode(WorldPacket & recv_data)
407-{
408- ;//sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd CMSG_WHO Message");
409-
410- time_t now = time(NULL);
411- if (now < timeWhoCommandAllowed)
412- return;
413- timeWhoCommandAllowed = now+3;
414-
415- uint32 matchcount = 0;
416
417- uint32 level_min, level_max, racemask, classmask, zones_count, str_count;
418- uint32 zoneids[10]; // 10 is client limit
419- std::string player_name, guild_name;
420-
421- recv_data >> level_min; // maximal player level, default 0
422- recv_data >> level_max; // minimal player level, default 100 (MAX_LEVEL)
423- recv_data >> player_name; // player name, case sensitive...
424-
425- recv_data >> guild_name; // guild name, case sensitive...
426+void WorldSession::HandleWhoOpcode(WorldPacket& recvData)
427+{
428+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd CMSG_WHO Message");
429
430- recv_data >> racemask; // race mask
431- recv_data >> classmask; // class mask
432- recv_data >> zones_count; // zones count, client limit = 10 (2.0.10)
433+ time_t now = time(NULL);
434+ if (now < timeWhoCommandAllowed)
435+ return;
436+ timeWhoCommandAllowed = now + 3;
437
438- if (zones_count > 10)
439- return; // can't be received from real client or broken packet
440+ uint32 matchcount = 0;
441
442- for (uint32 i = 0; i < zones_count; ++i)
443- {
444- uint32 temp;
445- recv_data >> temp; // zone id, 0 if zone is unknown...
446- zoneids[i] = temp;
447- ;//sLog->outDebug(LOG_FILTER_NETWORKIO, "Zone %u: %u", i, zoneids[i]);
448- }
449+ uint32 level_min, level_max, racemask, classmask, zones_count, str_count;
450+ uint32 zoneids[10]; // 10 is client limit
451+ std::string player_name, guild_name;
452
453- recv_data >> str_count; // user entered strings count, client limit=4 (checked on 2.0.10)
454+ recvData >> level_min; // maximal player level, default 0
455+ recvData >> level_max; // minimal player level, default 100 (MAX_LEVEL)
456+ recvData >> player_name; // player name, case sensitive...
457
458- if (str_count > 4)
459- return; // can't be received from real client or broken packet
460+ recvData >> guild_name; // guild name, case sensitive...
461
462- ;//sLog->outDebug(LOG_FILTER_NETWORKIO, "Minlvl %u, maxlvl %u, name %s, guild %s, racemask %u, classmask %u, zones %u, strings %u", level_min, level_max, player_name.c_str(), guild_name.c_str(), racemask, classmask, zones_count, str_count);
463+ recvData >> racemask; // race mask
464+ recvData >> classmask; // class mask
465+ recvData >> zones_count; // zones count, client limit = 10 (2.0.10)
466
467- std::wstring str[4]; // 4 is client limit
468- for (uint32 i = 0; i < str_count; ++i)
469- {
470- std::string temp;
471- recv_data >> temp; // user entered string, it used as universal search pattern(guild+player name)?
472+ if (zones_count > 10)
473+ return; // can't be received from real client or broken packet
474
475- if (!Utf8toWStr(temp, str[i]))
476- continue;
477+ for (uint32 i = 0; i < zones_count; ++i)
478+ {
479+ uint32 temp;
480+ recvData >> temp; // zone id, 0 if zone is unknown...
481+ zoneids[i] = temp;
482+ sLog->outDebug(LOG_FILTER_NETWORKIO, "Zone %u: %u", i, zoneids[i]);
483+ }
484
485- wstrToLower(str[i]);
486+ recvData >> str_count; // user entered strings count, client limit=4 (checked on 2.0.10)
487
488- ;//sLog->outDebug(LOG_FILTER_NETWORKIO, "String %u: %s", i, temp.c_str());
489- }
490+ if (str_count > 4)
491+ return; // can't be received from real client or broken packet
492
493- std::wstring wplayer_name;
494- std::wstring wguild_name;
495- if (!(Utf8toWStr(player_name, wplayer_name) && Utf8toWStr(guild_name, wguild_name)))
496- return;
497- wstrToLower(wplayer_name);
498- wstrToLower(wguild_name);
499+ sLog->outDebug(LOG_FILTER_NETWORKIO, "Minlvl %u, maxlvl %u, name %s, guild %s, racemask %u, classmask %u, zones %u, strings %u", level_min, level_max, player_name.c_str(), guild_name.c_str(), racemask, classmask, zones_count, str_count);
500
501- // client send in case not set max level value 100 but Trinity supports 255 max level,
502- // update it to show GMs with characters after 100 level
503- if (level_max >= MAX_LEVEL)
504- level_max = STRONG_MAX_LEVEL;
505+ std::wstring str[4]; // 4 is client limit
506+ for (uint32 i = 0; i < str_count; ++i)
507+ {
508+ std::string temp;
509+ recvData >> temp; // user entered string, it used as universal search pattern(guild+player name)?
510
511- TeamId teamId = _player->GetTeamId();
512- uint32 security = GetSecurity();
513- uint32 gmLevelInWhoList = sWorld->getIntConfig(CONFIG_GM_LEVEL_IN_WHO_LIST);
514- uint32 displaycount = 0;
515+ if (!Utf8toWStr(temp, str[i]))
516+ continue;
517
518- WorldPacket data(SMSG_WHO, 500); // guess size
519- data << uint32(matchcount); // placeholder, count of players matching criteria
520- data << uint32(displaycount); // placeholder, count of players displayed
521+ wstrToLower(str[i]);
522
523- std::vector<WhoListPlayerInfo> * m = WhoListCacheMgr::GetWhoList();
524- for (std::vector<WhoListPlayerInfo>::const_iterator itr = m->begin(); itr != m->end(); ++itr)
525- {
526- if (AccountMgr::IsPlayerAccount(security))
527- {
528- if ((*itr).teamId != teamId)
529- continue;
530+ sLog->outDebug(LOG_FILTER_NETWORKIO, "String %u: %s", i, temp.c_str());
531+ }
532
533- // player can see MODERATOR, GAME MASTER, ADMINISTRATOR only if CONFIG_GM_IN_WHO_LIST
534- //if ((*itr).security > AccountTypes(gmLevelInWhoList))
535- // continue;
536- }
537+ std::wstring wplayer_name;
538+ std::wstring wguild_name;
539+ if (!(Utf8toWStr(player_name, wplayer_name) && Utf8toWStr(guild_name, wguild_name)))
540+ return;
541+ wstrToLower(wplayer_name);
542+ wstrToLower(wguild_name);
543+
544+ // client send in case not set max level value 100 but Trinity supports 255 max level,
545+ // update it to show GMs with characters after 100 level
546+ if (level_max >= MAX_LEVEL)
547+ level_max = STRONG_MAX_LEVEL;
548+
549+ uint32 team = _player->GetTeamId();
550+ uint32 security = GetSecurity();
551+ //bool allowTwoSideWhoList = sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_WHO_LIST);
552+ uint32 gmLevelInWhoList = sWorld->getIntConfig(CONFIG_GM_LEVEL_IN_WHO_LIST);
553+ uint32 displaycount = 0;
554+
555+ WorldPacket data(SMSG_WHO, 50); // guess size
556+ data << uint32(matchcount); // placeholder, count of players matching criteria
557+ data << uint32(displaycount); // placeholder, count of players displayed
558+
559+ TRINITY_READ_GUARD(HashMapHolder<Player>::LockType, *HashMapHolder<Player>::GetLock());
560+ HashMapHolder<Player>::MapType const& m = sObjectAccessor->GetPlayers();
561+ for (HashMapHolder<Player>::MapType::const_iterator itr = m.begin(); itr != m.end(); ++itr)
562+ {
563+ if (AccountMgr::IsPlayerAccount(security))
564+ {
565+ // player can see member of other team only if CONFIG_ALLOW_TWO_SIDE_WHO_LIST
566+ if (itr->second->GetTeamId() != team /* && !allowTwoSideWhoList*/)
567+ continue;
568
569- //do not process players which are not in world
570- //if (!(itr->second->IsInWorld()))
571- // continue;
572+ // player can see MODERATOR, GAME MASTER, ADMINISTRATOR only if CONFIG_GM_IN_WHO_LIST
573+ if ((itr->second->GetSession()->GetSecurity() > AccountTypes(gmLevelInWhoList)))
574+ continue;
575+ }
576
577- // check if target is globally visible for player
578- //if (!(itr->second->IsVisibleGloballyFor(_player)))
579- // continue;
580+ //do not process players which are not in world
581+ if (!(itr->second->IsInWorld()))
582+ continue;
583
584- // check if target's level is in level range
585- uint8 lvl = (*itr).level;
586- if (lvl < level_min || lvl > level_max)
587- continue;
588+ // check if target is globally visible for player
589+ if (!(itr->second->IsVisibleGloballyFor(_player)))
590+ continue;
591
592- // check if class matches classmask
593- uint32 class_ = (*itr).clas;
594- if (!(classmask & (1 << class_)))
595- continue;
596+ // check if target's level is in level range
597+ uint8 lvl = itr->second->getLevel();
598+ if (lvl < level_min || lvl > level_max)
599+ continue;
600
601- // check if race matches racemask
602- uint32 race = (*itr).race;
603- if (!(racemask & (1 << race)))
604- continue;
605+ // check if class matches classmask
606+ uint32 class_ = itr->second->getClass();
607+ if (!(classmask & (1 << class_)))
608+ continue;
609
610- uint32 pzoneid = (*itr).zoneid;
611- uint8 gender = (*itr).gender;
612+ // check if race matches racemask
613+ uint32 race = itr->second->getRace();
614+ if (!(racemask & (1 << race)))
615+ continue;
616
617- bool z_show = true;
618- for (uint32 i = 0; i < zones_count; ++i)
619- {
620- if (zoneids[i] == pzoneid)
621- {
622- z_show = true;
623- break;
624- }
625+ uint32 pzoneid = itr->second->GetZoneId();
626+ uint8 gender = itr->second->getGender();
627
628- z_show = false;
629- }
630- if (!z_show)
631- continue;
632+ bool z_show = true;
633+ for (uint32 i = 0; i < zones_count; ++i)
634+ {
635+ if (zoneids[i] == pzoneid)
636+ {
637+ z_show = true;
638+ break;
639+ }
640
641- std::wstring wpname = (*itr).wpname;
642+ z_show = false;
643+ }
644+ if (!z_show)
645+ continue;
646
647- if (!(wplayer_name.empty() || wpname.find(wplayer_name) != std::wstring::npos))
648- continue;
649+ std::string pname = itr->second->GetName();
650+ std::wstring wpname;
651+ if (!Utf8toWStr(pname, wpname))
652+ continue;
653+ wstrToLower(wpname);
654
655- std::wstring wgname = (*itr).wgname;
656+ if (!(wplayer_name.empty() || wpname.find(wplayer_name) != std::wstring::npos))
657+ continue;
658
659- if (!(wguild_name.empty() || wgname.find(wguild_name) != std::wstring::npos))
660- continue;
661+ std::string gname = sGuildMgr->GetGuildNameById(itr->second->GetGuildId());
662+ std::wstring wgname;
663+ if (!Utf8toWStr(gname, wgname))
664+ continue;
665+ wstrToLower(wgname);
666
667- std::string aname = (*itr).aname;
668+ if (!(wguild_name.empty() || wgname.find(wguild_name) != std::wstring::npos))
669+ continue;
670
671- bool s_show = true;
672- for (uint32 i = 0; i < str_count; ++i)
673- {
674- if (!str[i].empty())
675- {
676- if (wgname.find(str[i]) != std::wstring::npos ||
677- wpname.find(str[i]) != std::wstring::npos ||
678- Utf8FitTo(aname, str[i]))
679- {
680- s_show = true;
681- break;
682- }
683- s_show = false;
684- }
685- }
686- if (!s_show)
687- continue;
688+ std::string aname;
689+ if (AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(itr->second->GetZoneId()))
690+ aname = areaEntry->area_name[GetSessionDbcLocale()];
691
692- // 50 is maximum player count sent to client
693- if (matchcount >= 50)
694+ bool s_show = true;
695+ for (uint32 i = 0; i < str_count; ++i)
696 {
697- ++matchcount;
698- continue;
699+ if (!str[i].empty())
700+ {
701+ if (wgname.find(str[i]) != std::wstring::npos ||
702+ wpname.find(str[i]) != std::wstring::npos ||
703+ Utf8FitTo(aname, str[i]))
704+ {
705+ s_show = true;
706+ break;
707+ }
708+ s_show = false;
709+ }
710 }
711+ if (!s_show)
712+ continue;
713
714- data << (*itr).pname; // player name
715- data << (*itr).gname; // guild name
716- data << uint32(lvl); // player level
717- data << uint32(class_); // player class
718- data << uint32(race); // player race
719- data << uint8(gender); // player gender
720- data << uint32(pzoneid); // player zone id
721+ // 49 is maximum player count sent to client - can be overridden
722+ // through config, but is unstable
723+ if ((matchcount++) >= 50 /*sWorld->getIntConfig(CONFIG_MAX_WHO)*/)
724+ continue;
725
726- ++matchcount;
727- ++displaycount;
728- }
729+ data << pname; // player name
730+ data << gname; // guild name
731+ data << uint32(lvl); // player level
732+ data << uint32(class_); // player class
733+ data << uint32(race); // player race
734+ data << uint8(gender); // player gender
735+ data << uint32(pzoneid); // player zone id
736
737- data.put(0, displaycount); // insert right count, count displayed
738- data.put(4, matchcount); // insert right count, count of matches
739+ ++displaycount;
740+ }
741
742- SendPacket(&data);
743- ;//sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Send SMSG_WHO Message");
744+ data.put(0, displaycount); // insert right count, count displayed
745+ data.put(4, matchcount); // insert right count, count of matches
746+
747+ SendPacket(&data);
748+ ;// sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Send SMSG_WHO Message");
749 }
750
751+
752 void WorldSession::HandleLogoutRequestOpcode(WorldPacket & /*recv_data*/)
753 {
754 ;//sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd CMSG_LOGOUT_REQUEST Message, security - %u", GetSecurity());
755--
756libgit2 0.22.2
757
758============================================================================================================================
759From 7685e04d64549661b03cb959cb0046c152f95d9f Mon Sep 17 00:00:00 2001
760From: Callmephil <phil19-94@hotmail.fr>
761Date: Tue, 15 Mar 2016 23:54:24 +0200
762Subject: [PATCH] Core/Guild : Fixed Crash Happening When Someone is adding a new item to Guild Bank #close https://github.com/callmephil/SunWellCore/issues/12
763
764---
765 src/server/game/Guilds/Guild.cpp | 4 ----
766 1 file changed, 0 insertions(+), 4 deletions(-)
767
768diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
769index f69d20f..1848f92 100644
770--- a/src/server/game/Guilds/Guild.cpp
771+++ b/src/server/game/Guilds/Guild.cpp
772@@ -2842,10 +2842,6 @@ void Guild::_BroadcastEvent(GuildEvents guildEvent, uint64 guid, const char* par
773
774 void Guild::_SendBankList(WorldSession* session /* = NULL*/, uint8 tabId /*= 0*/, bool sendAllSlots /*= false*/, SlotIds *slots /*= NULL*/) const
775 {
776- Member const* member = GetMember(session->GetPlayer()->GetGUID());
777- if (!member) // Shouldn't happen, just in case
778- return;
779-
780 WorldPacket data(SMSG_GUILD_BANK_LIST, 500);
781 data << uint64(m_bankMoney);
782 data << uint8(tabId);
783--
784libgit2 0.22.2
785
786=========================================================================================================================
787From 737ef90e44f293315e234187aa9bd59515516407 Mon Sep 17 00:00:00 2001
788From: Callmephil <phil19-94@hotmail.fr>
789Date: Thu, 3 Mar 2016 23:01:13 -0800
790Subject: [PATCH] Core/World - LoginDatabase : Implement Auto broadcast & Reload Auto BroadCast & Fix Random Auto BroadCast distribution. @alexkulya
791
792---
793 sql/logon fixes/logon.autobroadcast.sql | 14 ++++++++++++++
794 src/server/game/World/World.cpp | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
795 src/server/game/World/World.h | 8 +++++++-
796 src/server/scripts/Commands/cs_reload.cpp | 2 +-
797 src/server/shared/Database/Implementation/LoginDatabase.cpp | 1 +
798 src/server/shared/Database/Implementation/LoginDatabase.h | 1 +
799 6 files changed, 90 insertions(+), 3 deletions(-)
800 create mode 100644 sql/logon fixes/logon.autobroadcast.sql
801
802diff --git a/sql/logon fixes/logon.autobroadcast.sql b/sql/logon fixes/logon.autobroadcast.sql
803new file mode 100644
804index 0000000..7fcd150
805--- /dev/null
806+++ b/sql/logon fixes/logon.autobroadcast.sql
807@@ -0,0 +1,14 @@
808+DROP TABLE IF EXISTS `autobroadcast`;
809+CREATE TABLE `autobroadcast` (
810+ `realmid` int(10) NOT NULL,
811+ `id` int(11) NOT NULL AUTO_INCREMENT,
812+ `weight` tinyint(3) DEFAULT 1,
813+ `text` longtext NOT NULL,
814+ PRIMARY KEY (`id`, `realmid`)
815+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
816+
817+ALTER TABLE `autobroadcast`
818+ CHANGE `realmid` `realmid` INT(11) NOT NULL DEFAULT '-1',
819+ CHANGE `id` `id` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
820+ CHANGE `weight` `weight` TINYINT(3) UNSIGNED DEFAULT '1',
821+ENGINE=INNODB;
822\ No newline at end of file
823diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
824index 688380d..6ad431c 100644
825--- a/src/server/game/World/World.cpp
826+++ b/src/server/game/World/World.cpp
827@@ -1664,6 +1664,10 @@ void World::SetInitialWorldSettings()
828 ///- Handle outdated emails (delete/return)
829 sLog->outString("Returning old mails...");
830 sObjectMgr->ReturnOrDeleteOldMails(false);
831+
832+ ///- Load AutoBroadCast
833+ sLog->outString("Loading Autobroadcasts...");
834+ LoadAutobroadcasts();
835
836 ///- Load and initialize scripts
837 sObjectMgr->LoadSpellScripts(); // must be after load Creature/Gameobject(Template/Data)
838@@ -1842,6 +1846,40 @@ void World::DetectDBCLang()
839 sLog->outString();
840 }
841
842+void World::LoadAutobroadcasts()
843+{
844+ uint32 oldMSTime = getMSTime();
845+
846+ m_Autobroadcasts.clear();
847+ m_AutobroadcastsWeights.clear();
848+
849+ uint32 realmId = sConfigMgr->GetIntDefault("RealmID", 0);
850+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_AUTOBROADCAST);
851+ stmt->setInt32(0, realmId);
852+ PreparedQueryResult result = LoginDatabase.Query(stmt);
853+
854+ if (!result)
855+ {
856+ sLog->outString(">> Loaded 0 autobroadcasts definitions. DB table `autobroadcast` is empty for this realm!");
857+ return;
858+ }
859+
860+ uint32 count = 0;
861+
862+ do
863+ {
864+ Field* fields = result->Fetch();
865+ uint8 id = fields[0].GetUInt8();
866+
867+ m_Autobroadcasts[id] = fields[2].GetString();
868+ m_AutobroadcastsWeights[id] = fields[1].GetUInt8();
869+
870+ ++count;
871+ } while (result->NextRow());
872+
873+ sLog->outString(">> Loaded %u autobroadcast definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
874+}
875+
876 /// Update the World !
877 void World::Update(uint32 diff)
878 {
879@@ -2579,10 +2617,37 @@ void World::SendAutoBroadcast()
880 {
881 if (m_Autobroadcasts.empty())
882 return;
883+
884+ uint32 weight = 0;
885+ AutobroadcastsWeightMap selectionWeights;
886
887 std::string msg;
888
889- msg = Trinity::Containers::SelectRandomContainerElement(m_Autobroadcasts);
890+ for (AutobroadcastsWeightMap::const_iterator it = m_AutobroadcastsWeights.begin(); it != m_AutobroadcastsWeights.end(); ++it)
891+ {
892+ if (it->second)
893+ {
894+ weight += it->second;
895+ selectionWeights[it->first] = it->second;
896+ }
897+ }
898+
899+ if (weight)
900+ {
901+ uint32 selectedWeight = urand(0, weight - 1);
902+ weight = 0;
903+ for (AutobroadcastsWeightMap::const_iterator it = selectionWeights.begin(); it != selectionWeights.end(); ++it)
904+ {
905+ weight += it->second;
906+ if (selectedWeight < weight)
907+ {
908+ msg = m_Autobroadcasts[it->first];
909+ break;
910+ }
911+ }
912+ }
913+ else
914+ msg = m_Autobroadcasts[urand(0, m_Autobroadcasts.size())];
915
916 uint32 abcenter = sWorld->getIntConfig(CONFIG_AUTOBROADCAST_CENTER);
917
918diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
919index b9a5aae..bd6a611 100644
920--- a/src/server/game/World/World.h
921+++ b/src/server/game/World/World.h
922@@ -741,6 +741,8 @@ class World
923 void LoadDBVersion();
924 char const* GetDBVersion() const { return m_DBVersion.c_str(); }
925
926+ void LoadAutobroadcasts();
927+
928 void UpdateAreaDependentAuras();
929
930 uint32 GetCleaningFlags() const { return m_CleaningFlags; }
931@@ -841,7 +843,11 @@ class World
932 // used versions
933 std::string m_DBVersion;
934
935- std::list<std::string> m_Autobroadcasts;
936+ typedef std::map<uint8, std::string> AutobroadcastsMap;
937+ AutobroadcastsMap m_Autobroadcasts;
938+
939+ typedef std::map<uint8, uint8> AutobroadcastsWeightMap;
940+ AutobroadcastsWeightMap m_AutobroadcastsWeights;
941
942 void ProcessQueryCallbacks();
943 ACE_Future_Set<PreparedQueryResult> m_realmCharCallbacks;
944diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
945index dac7baf..3913adf 100644
946--- a/src/server/scripts/Commands/cs_reload.cpp
947+++ b/src/server/scripts/Commands/cs_reload.cpp
948@@ -363,7 +363,7 @@ public:
949 static bool HandleReloadAutobroadcastCommand(ChatHandler* handler, const char* /*args*/)
950 {
951 sLog->outString("Re-Loading Autobroadcasts...");
952- //sWorld->LoadAutobroadcasts();
953+ sWorld->LoadAutobroadcasts();
954 handler->SendGlobalGMSysMessage("DB table `autobroadcast` reloaded.");
955 return true;
956 }
957diff --git a/src/server/shared/Database/Implementation/LoginDatabase.cpp b/src/server/shared/Database/Implementation/LoginDatabase.cpp
958index 607e08f..660994c 100644
959--- a/src/server/shared/Database/Implementation/LoginDatabase.cpp
960+++ b/src/server/shared/Database/Implementation/LoginDatabase.cpp
961@@ -85,4 +85,5 @@ void LoginDatabaseConnection::DoPrepareStatements()
962 PrepareStatement(LOGIN_SEL_ACCOUNT_WHOIS, "SELECT username, email, last_ip FROM account WHERE id = ?", CONNECTION_SYNCH);
963 PrepareStatement(LOGIN_SEL_REALMLIST_SECURITY_LEVEL, "SELECT allowedSecurityLevel from realmlist WHERE id = ?", CONNECTION_SYNCH);
964 PrepareStatement(LOGIN_DEL_ACCOUNT, "DELETE FROM account WHERE id = ?", CONNECTION_ASYNC);
965+ PrepareStatement(LOGIN_SEL_AUTOBROADCAST, "SELECT id, weight, text FROM autobroadcast WHERE realmid = ? OR realmid = -1", CONNECTION_SYNCH);
966 }
967diff --git a/src/server/shared/Database/Implementation/LoginDatabase.h b/src/server/shared/Database/Implementation/LoginDatabase.h
968index 00832f7..8ccf28b 100644
969--- a/src/server/shared/Database/Implementation/LoginDatabase.h
970+++ b/src/server/shared/Database/Implementation/LoginDatabase.h
971@@ -105,6 +105,7 @@ enum LoginDatabaseStatements
972 LOGIN_SEL_ACCOUNT_WHOIS,
973 LOGIN_SEL_REALMLIST_SECURITY_LEVEL,
974 LOGIN_DEL_ACCOUNT,
975+ LOGIN_SEL_AUTOBROADCAST,
976
977 MAX_LOGINDATABASE_STATEMENTS
978 };
979--
980libgit2 0.22.2
981
982========================================================================================================================