aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVincent-Michael <Vincent_Michael@gmx.de>2013-06-03 18:19:18 +0200
committerVincent-Michael <Vincent_Michael@gmx.de>2013-06-03 18:19:18 +0200
commitefb4fb495971d6d4b9ee5666bef5e5dafbac6628 (patch)
tree48cd57614a5e2fd998ad577fa5b11f0238a6470c /src
parent6fed4f1f2fec3a1443af77ad381a44dda3b3d23b (diff)
parentf6c1a9a8c4c403996b5b40e565e807c807e47aaa (diff)
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts: src/server/shared/Database/Implementation/CharacterDatabase.cpp
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Accounts/RBAC.h1
-rw-r--r--src/server/game/Miscellaneous/Language.h6
-rw-r--r--src/server/game/World/World.cpp2
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp112
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp48
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.cpp6
6 files changed, 118 insertions, 57 deletions
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h
index 5a6514e5356..35024fc4152 100644
--- a/src/server/game/Accounts/RBAC.h
+++ b/src/server/game/Accounts/RBAC.h
@@ -95,6 +95,7 @@ enum RBACPermissions
RBAC_PERM_SILENTLY_JOIN_CHANNEL = 45,
RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR = 46,
RBAC_PERM_CHECK_FOR_LOWER_SECURITY = 47,
+ RBAC_PERM_COMMANDS_PINFO_CHECK_PERSONAL_DATA = 48,
RBAC_PERM_MAX
};
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index f3323682e1b..0c056d225c7 100644
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -820,7 +820,7 @@ enum TrinityStrings
LANG_PINFO_ACC_LASTLOGIN = 716,
LANG_PINFO_ACC_OS = 749,
LANG_PINFO_ACC_IP = 752,
- LANG_PINFO_CHR_LEVEL = 843,
+ LANG_PINFO_CHR_LEVEL_LOW = 843,
LANG_PINFO_CHR_RACE = 844,
LANG_PINFO_CHR_ALIVE = 845,
LANG_PINFO_CHR_PHASE = 846,
@@ -832,6 +832,7 @@ enum TrinityStrings
LANG_PINFO_CHR_GUILD_ONOTE = 852,
LANG_PINFO_CHR_PLAYEDTIME = 853,
LANG_PINFO_CHR_MAILS = 854,
+ LANG_PINFO_CHR_LEVEL_HIGH = 871,
LANG_CHARACTER_GENDER_MALE = 855,
LANG_CHARACTER_GENDER_FEMALE = 856,
@@ -850,7 +851,8 @@ enum TrinityStrings
LANG_ARENA_INFO_HEADER = 868,
LANG_ARENA_INFO_MEMBERS = 869,
LANG_ARENA_LOOKUP = 870,
- // Room for in-game strings 870-999 not used
+ // = 871, see LANG_PINFO_CHR_LEVEL_HIGH
+ // Room for in-game strings 872-999 not used
// Level 4 (CLI only commands)
LANG_COMMAND_EXIT = 1000,
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index b61c5ac5de3..700039983d3 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -2711,7 +2711,6 @@ void World::SendAutoBroadcast()
if (abcenter == 0)
sWorld->SendWorldText(LANG_AUTO_BROADCAST, msg.c_str());
-
else if (abcenter == 1)
{
WorldPacket data(SMSG_NOTIFICATION, 2 + msg.length());
@@ -2720,7 +2719,6 @@ void World::SendAutoBroadcast()
data.WriteString(msg);
sWorld->SendGlobalMessage(&data);
}
-
else if (abcenter == 2)
{
sWorld->SendWorldText(LANG_AUTO_BROADCAST, msg.c_str());
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 10b54d7ad39..0108bbc1487 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -1586,7 +1586,12 @@ public:
std::string areaName = "<unknown>";
std::string zoneName = "<unknown>";
- // Guild data print is only defined if part of Guild
+ // Guild data print variables defined so that they exist, but are not necessarily used
+ uint32 guildId = 0;
+ std::string guildName;
+ std::string guildRank;
+ std::string note;
+ std::string officeNote;
// Mail data print is only defined if you have a mail
@@ -1625,18 +1630,19 @@ public:
if (!result)
return false;
- Field* fields = result->Fetch();
- totalPlayerTime = fields[0].GetUInt32();
- level = fields[1].GetUInt8();
- money = fields[2].GetUInt32();
- accId = fields[3].GetUInt32();
- raceid = fields[4].GetUInt8();
- classid = fields[5].GetUInt8();
- mapId = fields[6].GetUInt16();
- areaId = fields[7].GetUInt16();
- gender = fields[8].GetUInt8();
- uint32 health = fields[9].GetUInt32();
+ Field* fields = result->Fetch();
+ totalPlayerTime = fields[0].GetUInt32();
+ level = fields[1].GetUInt8();
+ money = fields[2].GetUInt32();
+ accId = fields[3].GetUInt32();
+ raceid = fields[4].GetUInt8();
+ classid = fields[5].GetUInt8();
+ mapId = fields[6].GetUInt16();
+ areaId = fields[7].GetUInt16();
+ gender = fields[8].GetUInt8();
+ uint32 health = fields[9].GetUInt32();
uint32 playerFlags = fields[10].GetUInt32();
+
if (!health || playerFlags & PLAYER_FLAGS_GHOST)
alive = "No";
else
@@ -1654,13 +1660,13 @@ public:
Field* fields = result->Fetch();
userName = fields[0].GetString();
security = fields[1].GetUInt8();
- eMail = fields[2].GetString();
- // Only fetch these fields if commander has sufficient rights AND is online (prevent cheating)
- /// @TODO: Add RBAC for "Can query ip and login data"
- if (!handler->GetSession() || handler->GetSession()->GetSecurity() >= AccountTypes(security))
+ // Only fetch these fields if commander has sufficient rights)
+ if (handler->HasPermission(RBAC_PERM_COMMANDS_PINFO_CHECK_PERSONAL_DATA) && // RBAC Perm. 48, Role 39
+ (!handler->GetSession() || handler->GetSession()->GetSecurity() >= AccountTypes(security)))
{
- lastIp = fields[3].GetString();
+ eMail = fields[2].GetString();
+ lastIp = fields[3].GetString();
lastLogin = fields[4].GetString();
uint32 ip = inet_addr(lastIp.c_str());
@@ -1677,6 +1683,12 @@ public:
lastIp.append(")");
}
}
+ else
+ {
+ eMail = "Unauthorized";
+ lastIp = "Unauthorized";
+ lastLogin = "Unauthorized";
+ }
muteTime = fields[5].GetUInt64();
muteReason = fields[6].GetString();
muteBy = fields[7].GetString();
@@ -1727,7 +1739,25 @@ public:
if (result4)
{
Field* fields = result4->Fetch();
- xp = fields[0].GetUInt32();
+ xp = fields[0].GetUInt32(); // Used for "current xp" output and "%u XP Left" calculation
+ uint32 gguid = fields[1].GetUInt32(); // We check if have a guild for the person, so we might not require to query it at all
+
+ if (gguid != 0)
+ {
+ // Guild Data - an own query, because it may not happen.
+ PreparedStatement* stmt3 = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_MEMBER_EXTENDED);
+ stmt3->setUInt32(0, lowguid);
+ PreparedQueryResult result5 = CharacterDatabase.Query(stmt3);
+ if (result5)
+ {
+ Field* fields = result5->Fetch();
+ guildId = fields[0].GetUInt32();
+ guildName = fields[1].GetString();
+ guildRank = fields[2].GetString();
+ note = fields[3].GetString();
+ officeNote = fields[4].GetString();
+ }
+ }
}
// Initiate output
@@ -1759,7 +1789,10 @@ public:
handler->PSendSysMessage(LANG_PINFO_ACC_IP, lastIp.c_str(), locked ? "Yes" : "No");
// Output X. LANG_PINFO_CHR_LEVEL
- handler->PSendSysMessage(LANG_PINFO_CHR_LEVEL, level, xp, xptotal, (xptotal - xp));
+ if (level != sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
+ handler->PSendSysMessage(LANG_PINFO_CHR_LEVEL_LOW, level, xp, xptotal, (xptotal - xp));
+ else
+ handler->PSendSysMessage(LANG_PINFO_CHR_LEVEL_HIGH, level);
// Output XI. LANG_PINFO_CHR_RACE
raceStr = GetRaceName(raceid, locale);
@@ -1794,27 +1827,15 @@ public:
if (target)
handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->name[locale], (!zoneName.empty() ? zoneName.c_str() : "<Unknown>"), (!areaName.empty() ? areaName.c_str() : "<Unknown>"));
- // Guild Data - an own query, because it may not happen.
- PreparedStatement* stmt3 = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_MEMBER_EXTENDED);
- stmt3->setUInt32(0, lowguid);
- PreparedQueryResult result5 = CharacterDatabase.Query(stmt3);
- if (result5)
- {
- Field* fields = result5->Fetch();
- uint32 guildId = fields[0].GetUInt32();
- std::string guildName = fields[1].GetString();
- std::string guildRank = fields[2].GetString();
- std::string note = fields[3].GetString();
- std::string officeNote = fields[4].GetString();
-
- // Output XVII. - XX.
- handler->PSendSysMessage(LANG_PINFO_CHR_GUILD, guildName.c_str(), guildId);
- handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_RANK, guildRank.c_str());
- // Only output XIX and XX if they are not empty
- if (!note.empty())
- handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_NOTE, note.c_str());
- if (!officeNote.empty())
- handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_ONOTE, officeNote.c_str());
+ // Output XVII. - XX. if they are not empty
+ if (!guildName.empty())
+ {
+ handler->PSendSysMessage(LANG_PINFO_CHR_GUILD, guildName.c_str(), guildId);
+ handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_RANK, guildRank.c_str());
+ if (!note.empty())
+ handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_NOTE, note.c_str());
+ if (!officeNote.empty())
+ handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_ONOTE, officeNote.c_str());
}
// Output XXI. LANG_PINFO_CHR_PLAYEDTIME
@@ -1822,23 +1843,24 @@ public:
// Mail Data - an own query, because it may or may not be useful.
// SQL: "SELECT SUM(CASE WHEN (checked & 1) THEN 1 ELSE 0 END) AS 'readmail', COUNT(*) AS 'totalmail' FROM mail WHERE `receiver` = ?"
- stmt3 = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_MAILS);
- stmt3->setUInt32(0, lowguid);
- PreparedQueryResult result6 = CharacterDatabase.Query(stmt3);
+ PreparedStatement* stmt4 = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_MAILS);
+ stmt4->setUInt32(0, lowguid);
+ PreparedQueryResult result6 = CharacterDatabase.Query(stmt4);
if (result6)
{
// Define the variables, so the compiler knows they exist
uint32 rmailint = 0;
// Fetch the fields - readmail is a SUM(x) and given out as char! Thus...
+ // ... while totalmail is a COUNT(x), which is given out as INt64, which we just convert on fetch...
Field* fields = result6->Fetch();
std::string readmail = fields[0].GetString();
- uint64 totalmail = fields[1].GetUInt64();
+ uint32 totalmail = uint32(fields[1].GetUInt64());
// ... we have to convert it from Char to int. We can use totalmail as it is
rmailint = atol(readmail.c_str());
- // Output XXII. LANG_INFO_CHR_MAILS if at least one mails is given
+ // Output XXII. LANG_INFO_CHR_MAILS if at least one mail is given
if (totalmail >= 1)
handler->PSendSysMessage(LANG_PINFO_CHR_MAILS, rmailint, totalmail);
}
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
index 6ad70d38635..b3f5cc38c9f 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
@@ -122,9 +122,11 @@ enum AssemblyYells
EMOTE_BRUNDIR_OVERLOAD = 7
};
-enum AssemblyNPCs
+enum Misc
{
- NPC_WORLD_TRIGGER = 22515
+ NPC_WORLD_TRIGGER = 22515,
+
+ DATA_PHASE_3 = 1
};
#define FLOOR_Z 427.28f
@@ -158,6 +160,14 @@ class boss_steelbreaker : public CreatureScript
events.ScheduleEvent(EVENT_FUSION_PUNCH, 15000);
}
+ uint32 GetData(uint32 type) const
+ {
+ if (type == DATA_PHASE_3)
+ return (phase >= 3) ? 1 : 0;
+
+ return 0;
+ }
+
void DoAction(int32 action)
{
switch (action)
@@ -184,7 +194,7 @@ class boss_steelbreaker : public CreatureScript
if (instance->GetBossState(BOSS_ASSEMBLY_OF_IRON) == DONE)
{
- DoCastAOE(SPELL_KILL_CREDIT);
+ DoCastAOE(SPELL_KILL_CREDIT, true);
Talk(SAY_STEELBREAKER_ENCOUNTER_DEFEATED);
}
else
@@ -287,6 +297,14 @@ class boss_runemaster_molgeim : public CreatureScript
events.ScheduleEvent(EVENT_RUNE_OF_POWER, 20000);
}
+ uint32 GetData(uint32 type) const
+ {
+ if (type == DATA_PHASE_3)
+ return (phase >= 3) ? 1 : 0;
+
+ return 0;
+ }
+
void DoAction(int32 action)
{
switch (action)
@@ -313,7 +331,7 @@ class boss_runemaster_molgeim : public CreatureScript
if (instance->GetBossState(BOSS_ASSEMBLY_OF_IRON) == DONE)
{
- DoCastAOE(SPELL_KILL_CREDIT);
+ DoCastAOE(SPELL_KILL_CREDIT, true);
Talk(SAY_MOLGEIM_ENCOUNTER_DEFEATED);
}
else
@@ -429,6 +447,14 @@ class boss_stormcaller_brundir : public CreatureScript
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, false); // Reset immumity, Brundir should be stunnable by default
}
+ uint32 GetData(uint32 type) const
+ {
+ if (type == DATA_PHASE_3)
+ return (phase >= 3) ? 1 : 0;
+
+ return 0;
+ }
+
void EnterCombat(Unit* /*who*/)
{
_EnterCombat();
@@ -470,7 +496,7 @@ class boss_stormcaller_brundir : public CreatureScript
if (instance->GetBossState(BOSS_ASSEMBLY_OF_IRON) == DONE)
{
- DoCastAOE(SPELL_KILL_CREDIT);
+ DoCastAOE(SPELL_KILL_CREDIT, true);
Talk(SAY_BRUNDIR_ENCOUNTER_DEFEATED);
}
else
@@ -697,6 +723,17 @@ class spell_assembly_rune_of_summoning : public SpellScriptLoader
}
};
+class achievement_assembly_i_choose_you : public AchievementCriteriaScript
+{
+ public:
+ achievement_assembly_i_choose_you() : AchievementCriteriaScript("achievement_assembly_i_choose_you") { }
+
+ bool OnCheck(Player* /*player*/, Unit* target)
+ {
+ return target && target->GetAI()->GetData(DATA_PHASE_3);
+ }
+};
+
void AddSC_boss_assembly_of_iron()
{
new boss_steelbreaker();
@@ -705,4 +742,5 @@ void AddSC_boss_assembly_of_iron()
new spell_shield_of_runes();
new spell_assembly_meltdown();
new spell_assembly_rune_of_summoning();
+ new achievement_assembly_i_choose_you();
}
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index 4fb9c763f16..cc1a7f3fe32 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -45,12 +45,12 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, "
"gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot "
"FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid "
- "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ?", CONNECTION_ASYNC);
+ "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, c.level, c.zone, c.map, "
"c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, "
"cb.guid, c.slot, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? "
"LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid "
- "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ?", CONNECTION_ASYNC);
+ "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_FREE_NAME, "SELECT guid, name FROM characters WHERE guid = ? AND account = ? AND (at_login & ?) = ? AND NOT EXISTS (SELECT NULL FROM characters WHERE name = ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_GUID_RACE_ACC_BY_NAME, "SELECT guid, race, account FROM characters WHERE name = ?", CONNECTION_BOTH);
PrepareStatement(CHAR_SEL_CHAR_RACE, "SELECT race FROM characters WHERE guid = ?", CONNECTION_SYNCH);
@@ -445,7 +445,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
//0: lowGUID
PrepareStatement(CHAR_SEL_PINFO_MAILS, "SELECT SUM(CASE WHEN (checked & 1) THEN 1 ELSE 0 END) AS 'readmail', COUNT(*) AS 'totalmail' FROM mail WHERE `receiver` = ?", CONNECTION_SYNCH);
//0: lowGUID
- PrepareStatement(CHAR_SEL_PINFO_XP, "SELECT xp FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_PINFO_XP, "SELECT a.xp, b.guid FROM characters a LEFT JOIN guild_member b ON a.guid = b.guid WHERE a.guid = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_CHAR_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_CHAR_GUID_NAME_BY_ACC, "SELECT guid, name FROM characters WHERE account = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_POOL_QUEST_SAVE, "SELECT quest_id FROM pool_quest_save WHERE pool_id = ?", CONNECTION_SYNCH);