From fb52e9ea035f6174e6925e97ed8eaf15f9867d6a Mon Sep 17 00:00:00 2001 From: Ascathor Date: Sun, 26 May 2013 01:52:28 +0200 Subject: Core/Command: Optimized .pinfo more * Moved some checks around * Added RBAC Permission for Email, last login and last ip (group 3 and 4) -- If missing RBAC permission, then it displays "Unauthorized (RBAC)" * Changed totalmail output from uint64 to uint32 * Level either puts Max level, or a list of information necessary * Only queries guild if the current xp query also detects guild membership * Incorporated recent changes into code * Commander requires higher than target to get sensitive data beside RBAC permission. --- src/server/game/Accounts/RBAC.h | 1 + src/server/game/Miscellaneous/Language.h | 6 +- src/server/scripts/Commands/cs_misc.cpp | 112 ++++++++++++--------- .../Database/Implementation/CharacterDatabase.cpp | 2 +- 4 files changed, 73 insertions(+), 48 deletions(-) (limited to 'src') 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 15673ffd0c5..0da63a61b43 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -812,7 +812,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, @@ -824,6 +824,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, @@ -842,7 +843,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/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 3051580a933..c49514cacc4 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1587,7 +1587,12 @@ public: std::string areaName = ""; std::string zoneName = ""; - // 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 @@ -1626,18 +1631,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 @@ -1655,13 +1661,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() >= security)) { - lastIp = fields[3].GetString(); + eMail = fields[2].GetString(); + lastIp = fields[3].GetString(); lastLogin = fields[4].GetString(); uint32 ip = inet_addr(lastIp.c_str()); @@ -1678,6 +1684,12 @@ public: lastIp.append(")"); } } + else + { + eMail = "Unauthorized"; + lastIp = "Unauthorized"; + lastLogin = "Unauthorized"; + } muteTime = fields[5].GetUInt64(); muteReason = fields[6].GetString(); muteBy = fields[7].GetString(); @@ -1728,7 +1740,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 @@ -1760,7 +1790,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); @@ -1795,27 +1828,15 @@ public: if (target) handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->name[locale], (!zoneName.empty() ? zoneName.c_str() : ""), (!areaName.empty() ? areaName.c_str() : "")); - // 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 @@ -1823,23 +1844,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/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 069f2127a72..fce78638414 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -427,7 +427,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); -- cgit v1.2.3 From 55b3819d12699ee5d255b8dea82ab6aaee093a07 Mon Sep 17 00:00:00 2001 From: Subv Date: Sat, 1 Jun 2013 12:57:37 -0500 Subject: Core/Database: Deleted characters will no longer be loaded when sending the SMSG_CHAR_ENUM packet. --- src/server/shared/Database/Implementation/CharacterDatabase.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 069f2127a72..a4494d5d53a 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 " "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 = ? ORDER BY c.guid", CONNECTION_ASYNC); + "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name = NULL ORDER BY c.guid", 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, 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 = ? ORDER BY c.guid", CONNECTION_ASYNC); + "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name = NULL ORDER BY c.guid", 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); -- cgit v1.2.3 From 15b055fe87b381c143341dca1686bfe0f9aef152 Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Sat, 1 Jun 2013 23:47:46 +0200 Subject: Core/Database: Fix bad sql query in 55b3819d12699ee5d255b8dea82ab6aaee093a07 (thx Shauren) --- src/server/shared/Database/Implementation/CharacterDatabase.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index a4494d5d53a..74602240ed7 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 " "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 = ? AND c.deleteInfos_Name = NULL ORDER BY c.guid", 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 ORDER BY c.guid", 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, 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 = ? AND c.deleteInfos_Name = NULL ORDER BY c.guid", 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 ORDER BY c.guid", 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); -- cgit v1.2.3 From 3e108f068026e6bc54828c2f829c728928c349c7 Mon Sep 17 00:00:00 2001 From: joschiwald Date: Sun, 2 Jun 2013 19:28:53 +0200 Subject: DB/Autobroadcast: Update correct db struktur and auth base --- sql/base/auth_database.sql | 14 ++++++++++++++ sql/updates/auth/2013_06_02_00_auth_autobroadcast.sql | 5 +++++ src/server/game/World/World.cpp | 2 -- 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 sql/updates/auth/2013_06_02_00_auth_autobroadcast.sql (limited to 'src') diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index 05e680f94eb..bf2d3f9256d 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -109,6 +109,20 @@ LOCK TABLES `account_banned` WRITE; /*!40000 ALTER TABLE `account_banned` ENABLE KEYS */; UNLOCK TABLES; +-- +-- Dumping data for table `autobroadcast` +-- + +DROP TABLE IF EXISTS `autobroadcast`; + +CREATE TABLE `autobroadcast` ( + `realmid` int(11) NOT NULL DEFAULT '-1', + `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, + `weight` tinyint(3) unsigned DEFAULT '1', + `text` longtext NOT NULL, + PRIMARY KEY (`id`,`realmid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + -- -- Table structure for table `ip_banned` -- diff --git a/sql/updates/auth/2013_06_02_00_auth_autobroadcast.sql b/sql/updates/auth/2013_06_02_00_auth_autobroadcast.sql new file mode 100644 index 00000000000..2e689ffd64d --- /dev/null +++ b/sql/updates/auth/2013_06_02_00_auth_autobroadcast.sql @@ -0,0 +1,5 @@ +ALTER TABLE `autobroadcast` + CHANGE `realmid` `realmid` INT(11) NOT NULL DEFAULT '-1', + CHANGE `id` `id` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT, + CHANGE `weight` `weight` TINYINT(3) UNSIGNED DEFAULT '1', + ENGINE=INNODB; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 80577c3462e..9d2ee2eb2ba 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -2675,14 +2675,12 @@ void World::SendAutoBroadcast() if (abcenter == 0) sWorld->SendWorldText(LANG_AUTO_BROADCAST, msg.c_str()); - else if (abcenter == 1) { WorldPacket data(SMSG_NOTIFICATION, (msg.size()+1)); data << msg; sWorld->SendGlobalMessage(&data); } - else if (abcenter == 2) { sWorld->SendWorldText(LANG_AUTO_BROADCAST, msg.c_str()); -- cgit v1.2.3 From 216827201ec604a25ea05d12e609f1f136e12b13 Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Sun, 2 Jun 2013 23:16:18 +0200 Subject: Script/Ulduar: Fix try for Assembly Of Iron achievement "I choose you, xxx" --- ...13_06_02_00_world_achievement_criteria_data.sql | 16 ++++++++ .../Ulduar/Ulduar/boss_assembly_of_iron.cpp | 48 +++++++++++++++++++--- 2 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 sql/updates/world/2013_06_02_00_world_achievement_criteria_data.sql (limited to 'src') diff --git a/sql/updates/world/2013_06_02_00_world_achievement_criteria_data.sql b/sql/updates/world/2013_06_02_00_world_achievement_criteria_data.sql new file mode 100644 index 00000000000..55ee9f6b954 --- /dev/null +++ b/sql/updates/world/2013_06_02_00_world_achievement_criteria_data.sql @@ -0,0 +1,16 @@ +DELETE FROM `disables` WHERE `sourceType` IN (10082,10083,10084,10085,10086,10087); + +DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (10082,10083,10084,10085,10086,10087); +INSERT INTO `achievement_criteria_data` (`criteria_id`, `type`, `value1`, `value2`, `ScriptName`) VALUES +(10082, 11, 0, 0, 'achievement_assembly_i_choose_you'), +(10082, 12, 0, 0, ''), +(10083, 11, 0, 0, 'achievement_assembly_i_choose_you'), +(10083, 12, 0, 0, ''), +(10084, 11, 0, 0, 'achievement_assembly_i_choose_you'), +(10084, 12, 0, 0, ''), +(10085, 11, 0, 0, 'achievement_assembly_i_choose_you'), +(10085, 12, 1, 0, ''), +(10086, 11, 0, 0, 'achievement_assembly_i_choose_you'), +(10086, 12, 1, 0, ''), +(10087, 11, 0, 0, 'achievement_assembly_i_choose_you'), +(10087, 12, 1, 0, ''); \ No newline at end of file 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(); } -- cgit v1.2.3 From f6c1a9a8c4c403996b5b40e565e807c807e47aaa Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Mon, 3 Jun 2013 18:04:42 +0200 Subject: Core: Fix warning --- sql/updates/world/2013_05_26_00_world_trinity_string.sql | 9 --------- sql/updates/world/2013_06_03_00_world_trinity_string.sql | 9 +++++++++ src/server/scripts/Commands/cs_misc.cpp | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) delete mode 100644 sql/updates/world/2013_05_26_00_world_trinity_string.sql create mode 100644 sql/updates/world/2013_06_03_00_world_trinity_string.sql (limited to 'src') diff --git a/sql/updates/world/2013_05_26_00_world_trinity_string.sql b/sql/updates/world/2013_05_26_00_world_trinity_string.sql deleted file mode 100644 index 80ad953b3b7..00000000000 --- a/sql/updates/world/2013_05_26_00_world_trinity_string.sql +++ /dev/null @@ -1,9 +0,0 @@ -DELETE FROM `trinity_string` WHERE `entry`=854 LIMIT 1; -INSERT INTO `trinity_string` (`entry`, `content_default`, content_loc1, content_loc2, content_loc3, content_loc4, content_loc5, content_loc6, content_loc7, content_loc8) VALUES -(854, '└ Mails: %d Read/%u Total', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - -DELETE FROM `trinity_string` WHERE `entry`=871 LIMIT 1; -INSERT INTO `trinity_string` (`entry`, `content_default`, content_loc1, content_loc2, content_loc3, content_loc4, content_loc5, content_loc6, content_loc7, content_loc8) VALUES -(871, '│ Level: %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - -UPDATE `trinity_string` SET `content_default`='│ Level: %u (%u/%u XP (%u XP left))' WHERE `entry`=843 LIMIT 1; diff --git a/sql/updates/world/2013_06_03_00_world_trinity_string.sql b/sql/updates/world/2013_06_03_00_world_trinity_string.sql new file mode 100644 index 00000000000..80ad953b3b7 --- /dev/null +++ b/sql/updates/world/2013_06_03_00_world_trinity_string.sql @@ -0,0 +1,9 @@ +DELETE FROM `trinity_string` WHERE `entry`=854 LIMIT 1; +INSERT INTO `trinity_string` (`entry`, `content_default`, content_loc1, content_loc2, content_loc3, content_loc4, content_loc5, content_loc6, content_loc7, content_loc8) VALUES +(854, '└ Mails: %d Read/%u Total', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +DELETE FROM `trinity_string` WHERE `entry`=871 LIMIT 1; +INSERT INTO `trinity_string` (`entry`, `content_default`, content_loc1, content_loc2, content_loc3, content_loc4, content_loc5, content_loc6, content_loc7, content_loc8) VALUES +(871, '│ Level: %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +UPDATE `trinity_string` SET `content_default`='│ Level: %u (%u/%u XP (%u XP left))' WHERE `entry`=843 LIMIT 1; diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index c49514cacc4..e6a7b096a34 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1664,7 +1664,7 @@ public: // 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() >= security)) + (!handler->GetSession() || handler->GetSession()->GetSecurity() >= AccountTypes(security))) { eMail = fields[2].GetString(); lastIp = fields[3].GetString(); -- cgit v1.2.3